| @@ -18,7 +18,6 @@ struct Scene : OpaqueWidget { | |||||
| RackWidget *rackWidget; | RackWidget *rackWidget; | ||||
| Toolbar *toolbar; | Toolbar *toolbar; | ||||
| bool devMode = false; | |||||
| // Version checking | // Version checking | ||||
| bool checkVersion = true; | bool checkVersion = true; | ||||
| bool checkedVersion = false; | bool checkedVersion = false; | ||||
| @@ -34,7 +33,4 @@ struct Scene : OpaqueWidget { | |||||
| }; | }; | ||||
| extern Scene *gScene; | |||||
| } // namespace rack | } // namespace rack | ||||
| @@ -7,7 +7,7 @@ namespace rack { | |||||
| namespace asset { | namespace asset { | ||||
| void init(bool devMode); | |||||
| void init(); | |||||
| /** Returns the path of a system resource. Should only read files from this location. */ | /** Returns the path of a system resource. Should only read files from this location. */ | ||||
| std::string system(std::string filename); | std::string system(std::string filename); | ||||
| /** Returns the path of a user resource. Can read and write files to this location. */ | /** Returns the path of a user resource. Can read and write files to this location. */ | ||||
| @@ -0,0 +1,28 @@ | |||||
| #pragma once | |||||
| #include "common.hpp" | |||||
| namespace rack { | |||||
| struct Scene; | |||||
| struct Engine; | |||||
| namespace event { | |||||
| struct Context; | |||||
| } | |||||
| struct Context { | |||||
| bool devMode = false; | |||||
| event::Context *event = NULL; | |||||
| Scene *scene = NULL; | |||||
| Engine *engine = NULL; | |||||
| }; | |||||
| Context *context(); | |||||
| } // namespace rack | |||||
| @@ -44,8 +44,4 @@ struct Engine { | |||||
| }; | }; | ||||
| // TODO Move to global state header | |||||
| extern Engine *gEngine; | |||||
| } // namespace rack | } // namespace rack | ||||
| @@ -230,9 +230,5 @@ struct Context { | |||||
| }; | }; | ||||
| // TODO Move this into a global context class | |||||
| extern Context *gContext; | |||||
| } // namespace event | } // namespace event | ||||
| } // namespace rack | } // namespace rack | ||||
| @@ -5,6 +5,7 @@ | |||||
| #include "ui/Menu.hpp" | #include "ui/Menu.hpp" | ||||
| #include "app/Port.hpp" | #include "app/Port.hpp" | ||||
| #include "engine/Module.hpp" | #include "engine/Module.hpp" | ||||
| #include "context.hpp" | |||||
| namespace rack { | namespace rack { | ||||
| @@ -148,7 +149,7 @@ inline Menu *createMenu() { | |||||
| MenuOverlay *menuOverlay = new MenuOverlay; | MenuOverlay *menuOverlay = new MenuOverlay; | ||||
| menuOverlay->addChild(o); | menuOverlay->addChild(o); | ||||
| event::gContext->rootWidget->addChild(menuOverlay); | |||||
| context()->event->rootWidget->addChild(menuOverlay); | |||||
| return o; | return o; | ||||
| } | } | ||||
| @@ -24,7 +24,7 @@ enum Level { | |||||
| FATAL_LEVEL | FATAL_LEVEL | ||||
| }; | }; | ||||
| void init(bool devMode); | |||||
| void init(); | |||||
| void destroy(); | void destroy(); | ||||
| /** Do not use this function directly. Use the macros below. */ | /** Do not use this function directly. Use the macros below. */ | ||||
| void log(Level level, const char *filename, int line, const char *format, ...); | void log(Level level, const char *filename, int line, const char *format, ...); | ||||
| @@ -17,7 +17,7 @@ struct PluginManager { | |||||
| std::string downloadName; | std::string downloadName; | ||||
| std::string loginStatus; | std::string loginStatus; | ||||
| PluginManager(bool devMode); | |||||
| PluginManager(); | |||||
| ~PluginManager(); | ~PluginManager(); | ||||
| void logIn(std::string email, std::string password); | void logIn(std::string email, std::string password); | ||||
| void logOut(); | void logOut(); | ||||
| @@ -9,6 +9,7 @@ | |||||
| #include "network.hpp" | #include "network.hpp" | ||||
| #include "asset.hpp" | #include "asset.hpp" | ||||
| #include "window.hpp" | #include "window.hpp" | ||||
| #include "context.hpp" | |||||
| #include "helpers.hpp" | #include "helpers.hpp" | ||||
| #include "widgets/Widget.hpp" | #include "widgets/Widget.hpp" | ||||
| @@ -3,6 +3,7 @@ | |||||
| #include "ui/Menu.hpp" | #include "ui/Menu.hpp" | ||||
| #include "ui/MenuEntry.hpp" | #include "ui/MenuEntry.hpp" | ||||
| #include "ui/MenuOverlay.hpp" | #include "ui/MenuOverlay.hpp" | ||||
| #include "context.hpp" | |||||
| namespace rack { | namespace rack { | ||||
| @@ -17,7 +18,7 @@ struct MenuItem : MenuEntry { | |||||
| void draw(NVGcontext *vg) override { | void draw(NVGcontext *vg) override { | ||||
| // Get state | // Get state | ||||
| BNDwidgetState state = (event::gContext->hoveredWidget == this) ? BND_HOVER : BND_DEFAULT; | |||||
| BNDwidgetState state = (context()->event->hoveredWidget == this) ? BND_HOVER : BND_DEFAULT; | |||||
| Menu *parentMenu = dynamic_cast<Menu*>(parent); | Menu *parentMenu = dynamic_cast<Menu*>(parent); | ||||
| if (parentMenu && parentMenu->activeEntry == this) { | if (parentMenu && parentMenu->activeEntry == this) { | ||||
| state = BND_ACTIVE; | state = BND_ACTIVE; | ||||
| @@ -2,6 +2,7 @@ | |||||
| #include "widgets/OpaqueWidget.hpp" | #include "widgets/OpaqueWidget.hpp" | ||||
| #include "ui/common.hpp" | #include "ui/common.hpp" | ||||
| #include "event.hpp" | #include "event.hpp" | ||||
| #include "context.hpp" | |||||
| namespace rack { | namespace rack { | ||||
| @@ -111,7 +112,7 @@ struct ScrollWidget : OpaqueWidget { | |||||
| void onHover(event::Hover &e) override { | void onHover(event::Hover &e) override { | ||||
| // Scroll with arrow keys | // Scroll with arrow keys | ||||
| if (!event::gContext->selectedWidget) { | |||||
| if (!context()->event->selectedWidget) { | |||||
| float arrowSpeed = 30.0; | float arrowSpeed = 30.0; | ||||
| if (windowIsShiftPressed() && windowIsModPressed()) | if (windowIsShiftPressed() && windowIsModPressed()) | ||||
| arrowSpeed /= 16.0; | arrowSpeed /= 16.0; | ||||
| @@ -2,6 +2,7 @@ | |||||
| #include "widgets/OpaqueWidget.hpp" | #include "widgets/OpaqueWidget.hpp" | ||||
| #include "ui/common.hpp" | #include "ui/common.hpp" | ||||
| #include "event.hpp" | #include "event.hpp" | ||||
| #include "context.hpp" | |||||
| namespace rack { | namespace rack { | ||||
| @@ -26,9 +27,9 @@ struct TextField : OpaqueWidget { | |||||
| nvgScissor(vg, 0, 0, box.size.x, box.size.y); | nvgScissor(vg, 0, 0, box.size.x, box.size.y); | ||||
| BNDwidgetState state; | BNDwidgetState state; | ||||
| if (this == event::gContext->selectedWidget) | |||||
| if (this == context()->event->selectedWidget) | |||||
| state = BND_ACTIVE; | state = BND_ACTIVE; | ||||
| else if (this == event::gContext->hoveredWidget) | |||||
| else if (this == context()->event->hoveredWidget) | |||||
| state = BND_HOVER; | state = BND_HOVER; | ||||
| else | else | ||||
| state = BND_DEFAULT; | state = BND_DEFAULT; | ||||
| @@ -52,7 +53,7 @@ struct TextField : OpaqueWidget { | |||||
| } | } | ||||
| void onHover(event::Hover &e) override { | void onHover(event::Hover &e) override { | ||||
| if (this == event::gContext->draggedWidget) { | |||||
| if (this == context()->event->draggedWidget) { | |||||
| int pos = getTextPosition(e.pos); | int pos = getTextPosition(e.pos); | ||||
| if (pos != selection) { | if (pos != selection) { | ||||
| cursor = pos; | cursor = pos; | ||||
| @@ -7,6 +7,7 @@ | |||||
| #include <thread> | #include <thread> | ||||
| #include <mutex> | #include <mutex> | ||||
| #include <condition_variable> | #include <condition_variable> | ||||
| #include "context.hpp" | |||||
| #define AUDIO_OUTPUTS 8 | #define AUDIO_OUTPUTS 8 | ||||
| @@ -144,7 +145,7 @@ struct AudioInterface : Module { | |||||
| void AudioInterface::step() { | void AudioInterface::step() { | ||||
| // Update SRC states | // Update SRC states | ||||
| int sampleRate = (int) gEngine->getSampleRate(); | |||||
| int sampleRate = (int) context()->engine->getSampleRate(); | |||||
| inputSrc.setRates(audioIO.sampleRate, sampleRate); | inputSrc.setRates(audioIO.sampleRate, sampleRate); | ||||
| outputSrc.setRates(sampleRate, audioIO.sampleRate); | outputSrc.setRates(sampleRate, audioIO.sampleRate); | ||||
| @@ -1,4 +1,5 @@ | |||||
| #include "Core.hpp" | #include "Core.hpp" | ||||
| #include "context.hpp" | |||||
| using namespace rack; | using namespace rack; | ||||
| @@ -17,14 +18,14 @@ struct ModuleResizeHandle : virtual Widget { | |||||
| // } | // } | ||||
| } | } | ||||
| void onDragStart(event::DragStart &e) override { | void onDragStart(event::DragStart &e) override { | ||||
| dragX = gScene->rackWidget->lastMousePos.x; | |||||
| dragX = context()->scene->rackWidget->lastMousePos.x; | |||||
| ModuleWidget *m = getAncestorOfType<ModuleWidget>(); | ModuleWidget *m = getAncestorOfType<ModuleWidget>(); | ||||
| originalBox = m->box; | originalBox = m->box; | ||||
| } | } | ||||
| void onDragMove(event::DragMove &e) override { | void onDragMove(event::DragMove &e) override { | ||||
| ModuleWidget *m = getAncestorOfType<ModuleWidget>(); | ModuleWidget *m = getAncestorOfType<ModuleWidget>(); | ||||
| float newDragX = gScene->rackWidget->lastMousePos.x; | |||||
| float newDragX = context()->scene->rackWidget->lastMousePos.x; | |||||
| float deltaX = newDragX - dragX; | float deltaX = newDragX - dragX; | ||||
| Rect newBox = originalBox; | Rect newBox = originalBox; | ||||
| @@ -40,7 +41,7 @@ struct ModuleResizeHandle : virtual Widget { | |||||
| newBox.size.x = roundf(newBox.size.x / RACK_GRID_WIDTH) * RACK_GRID_WIDTH; | newBox.size.x = roundf(newBox.size.x / RACK_GRID_WIDTH) * RACK_GRID_WIDTH; | ||||
| newBox.pos.x = originalBox.pos.x + originalBox.size.x - newBox.size.x; | newBox.pos.x = originalBox.pos.x + originalBox.size.x - newBox.size.x; | ||||
| } | } | ||||
| gScene->rackWidget->requestModuleBox(m, newBox); | |||||
| context()->scene->rackWidget->requestModuleBox(m, newBox); | |||||
| } | } | ||||
| void draw(NVGcontext *vg) override { | void draw(NVGcontext *vg) override { | ||||
| for (float x = 5.0; x <= 10.0; x += 5.0) { | for (float x = 5.0; x <= 10.0; x += 5.0) { | ||||
| @@ -46,7 +46,7 @@ struct MIDICCToCVInterface : Module { | |||||
| processMessage(msg); | processMessage(msg); | ||||
| } | } | ||||
| float lambda = 100.f * gEngine->getSampleTime(); | |||||
| float lambda = 100.f * context()->engine->getSampleTime(); | |||||
| for (int i = 0; i < 16; i++) { | for (int i = 0; i < 16; i++) { | ||||
| int learnedCc = learnedCcs[i]; | int learnedCc = learnedCcs[i]; | ||||
| float value = rescale(clamp(ccs[learnedCc], -127, 127), 0, 127, 0.f, 10.f); | float value = rescale(clamp(ccs[learnedCc], -127, 127), 0, 127, 0.f, 10.f); | ||||
| @@ -129,8 +129,8 @@ struct MidiCcChoice : GridChoice { | |||||
| else { | else { | ||||
| text = string::f("%d", module->learnedCcs[id]); | text = string::f("%d", module->learnedCcs[id]); | ||||
| color.a = 1.0; | color.a = 1.0; | ||||
| if (event::gContext->selectedWidget == this) | |||||
| event::gContext->selectedWidget = NULL; | |||||
| if (context()->event->selectedWidget == this) | |||||
| context()->event->selectedWidget = NULL; | |||||
| } | } | ||||
| } | } | ||||
| @@ -158,11 +158,11 @@ struct MidiCcChoice : GridChoice { | |||||
| } | } | ||||
| void onSelectKey(event::SelectKey &e) override { | void onSelectKey(event::SelectKey &e) override { | ||||
| if (event::gContext->selectedWidget == this) { | |||||
| if (context()->event->selectedWidget == this) { | |||||
| if (e.key == GLFW_KEY_ENTER || e.key == GLFW_KEY_KP_ENTER) { | if (e.key == GLFW_KEY_ENTER || e.key == GLFW_KEY_KP_ENTER) { | ||||
| event::Deselect eDeselect; | event::Deselect eDeselect; | ||||
| onDeselect(eDeselect); | onDeselect(eDeselect); | ||||
| event::gContext->selectedWidget = NULL; | |||||
| context()->event->selectedWidget = NULL; | |||||
| e.target = this; | e.target = this; | ||||
| } | } | ||||
| } | } | ||||
| @@ -146,7 +146,7 @@ struct MIDIToCVInterface : Module { | |||||
| while (midiInput.shift(&msg)) { | while (midiInput.shift(&msg)) { | ||||
| processMessage(msg); | processMessage(msg); | ||||
| } | } | ||||
| float deltaTime = gEngine->getSampleTime(); | |||||
| float deltaTime = context()->engine->getSampleTime(); | |||||
| outputs[CV_OUTPUT].value = (lastNote - 60) / 12.f; | outputs[CV_OUTPUT].value = (lastNote - 60) / 12.f; | ||||
| outputs[GATE_OUTPUT].value = gate ? 10.f : 0.f; | outputs[GATE_OUTPUT].value = gate ? 10.f : 0.f; | ||||
| @@ -71,7 +71,7 @@ struct MIDITriggerToCVInterface : Module { | |||||
| while (midiInput.shift(&msg)) { | while (midiInput.shift(&msg)) { | ||||
| processMessage(msg); | processMessage(msg); | ||||
| } | } | ||||
| float deltaTime = gEngine->getSampleTime(); | |||||
| float deltaTime = context()->engine->getSampleTime(); | |||||
| for (int i = 0; i < 16; i++) { | for (int i = 0; i < 16; i++) { | ||||
| if (gateTimes[i] > 0.f) { | if (gateTimes[i] > 0.f) { | ||||
| @@ -173,8 +173,8 @@ struct MidiTrigChoice : GridChoice { | |||||
| text = string::f("%s%d", noteNames[semi], oct); | text = string::f("%s%d", noteNames[semi], oct); | ||||
| color.a = 1.0; | color.a = 1.0; | ||||
| if (event::gContext->selectedWidget == this) | |||||
| event::gContext->selectedWidget = NULL; | |||||
| if (context()->event->selectedWidget == this) | |||||
| context()->event->selectedWidget = NULL; | |||||
| } | } | ||||
| } | } | ||||
| @@ -2,6 +2,7 @@ | |||||
| #include "asset.hpp" | #include "asset.hpp" | ||||
| #include "window.hpp" | #include "window.hpp" | ||||
| #include "event.hpp" | #include "event.hpp" | ||||
| #include "context.hpp" | |||||
| namespace rack { | namespace rack { | ||||
| @@ -85,7 +86,7 @@ void LedDisplayTextField::draw(NVGcontext *vg) { | |||||
| NVGcolor highlightColor = color; | NVGcolor highlightColor = color; | ||||
| highlightColor.a = 0.5; | highlightColor.a = 0.5; | ||||
| int begin = std::min(cursor, selection); | int begin = std::min(cursor, selection); | ||||
| int end = (this == event::gContext->selectedWidget) ? std::max(cursor, selection) : -1; | |||||
| int end = (this == context()->event->selectedWidget) ? std::max(cursor, selection) : -1; | |||||
| bndIconLabelCaret(vg, textOffset.x, textOffset.y, | bndIconLabelCaret(vg, textOffset.x, textOffset.y, | ||||
| box.size.x - 2*textOffset.x, box.size.y - 2*textOffset.y, | box.size.x - 2*textOffset.x, box.size.y - 2*textOffset.y, | ||||
| -1, color, 12, text.c_str(), highlightColor, begin, end); | -1, color, 12, text.c_str(), highlightColor, begin, end); | ||||
| @@ -11,6 +11,7 @@ | |||||
| #include "ui/List.hpp" | #include "ui/List.hpp" | ||||
| #include "ui/TextField.hpp" | #include "ui/TextField.hpp" | ||||
| #include "plugin/PluginManager.hpp" | #include "plugin/PluginManager.hpp" | ||||
| #include "context.hpp" | |||||
| static const float itemMargin = 2.0; | static const float itemMargin = 2.0; | ||||
| @@ -157,10 +158,10 @@ struct ModelItem : BrowserListItem { | |||||
| ModuleWidget *moduleWidget = model->createModuleWidget(); | ModuleWidget *moduleWidget = model->createModuleWidget(); | ||||
| if (!moduleWidget) | if (!moduleWidget) | ||||
| return; | return; | ||||
| gScene->rackWidget->addModule(moduleWidget); | |||||
| context()->scene->rackWidget->addModule(moduleWidget); | |||||
| // Move module nearest to the mouse position | // Move module nearest to the mouse position | ||||
| moduleWidget->box.pos = gScene->rackWidget->lastMousePos.minus(moduleWidget->box.size.div(2)); | |||||
| gScene->rackWidget->requestModuleBoxNearest(moduleWidget, moduleWidget->box); | |||||
| moduleWidget->box.pos = context()->scene->rackWidget->lastMousePos.minus(moduleWidget->box.size.div(2)); | |||||
| context()->scene->rackWidget->requestModuleBoxNearest(moduleWidget, moduleWidget->box); | |||||
| } | } | ||||
| }; | }; | ||||
| @@ -446,7 +447,7 @@ struct ModuleBrowser : OpaqueWidget { | |||||
| moduleScroll->box.size.y = std::min(box.size.y - moduleScroll->box.pos.y, moduleList->box.size.y); | moduleScroll->box.size.y = std::min(box.size.y - moduleScroll->box.pos.y, moduleList->box.size.y); | ||||
| box.size.y = std::min(box.size.y, moduleScroll->box.getBottomRight().y); | box.size.y = std::min(box.size.y, moduleScroll->box.getBottomRight().y); | ||||
| event::gContext->selectedWidget = searchField; | |||||
| context()->event->selectedWidget = searchField; | |||||
| Widget::step(); | Widget::step(); | ||||
| } | } | ||||
| }; | }; | ||||
| @@ -557,7 +558,7 @@ void moduleBrowserCreate() { | |||||
| ModuleBrowser *moduleBrowser = new ModuleBrowser; | ModuleBrowser *moduleBrowser = new ModuleBrowser; | ||||
| overlay->addChild(moduleBrowser); | overlay->addChild(moduleBrowser); | ||||
| gScene->addChild(overlay); | |||||
| context()->scene->addChild(overlay); | |||||
| } | } | ||||
| json_t *moduleBrowserToJson() { | json_t *moduleBrowserToJson() { | ||||
| @@ -5,6 +5,8 @@ | |||||
| #include "asset.hpp" | #include "asset.hpp" | ||||
| #include "app/Scene.hpp" | #include "app/Scene.hpp" | ||||
| #include "helpers.hpp" | #include "helpers.hpp" | ||||
| #include "context.hpp" | |||||
| #include "osdialog.h" | #include "osdialog.h" | ||||
| @@ -13,7 +15,7 @@ namespace rack { | |||||
| ModuleWidget::ModuleWidget(Module *module) { | ModuleWidget::ModuleWidget(Module *module) { | ||||
| if (module) { | if (module) { | ||||
| gEngine->addModule(module); | |||||
| context()->engine->addModule(module); | |||||
| } | } | ||||
| this->module = module; | this->module = module; | ||||
| } | } | ||||
| @@ -23,7 +25,7 @@ ModuleWidget::~ModuleWidget() { | |||||
| disconnect(); | disconnect(); | ||||
| // Remove and delete the Module instance | // Remove and delete the Module instance | ||||
| if (module) { | if (module) { | ||||
| gEngine->removeModule(module); | |||||
| context()->engine->removeModule(module); | |||||
| delete module; | delete module; | ||||
| module = NULL; | module = NULL; | ||||
| } | } | ||||
| @@ -217,10 +219,10 @@ void ModuleWidget::saveDialog() { | |||||
| void ModuleWidget::disconnect() { | void ModuleWidget::disconnect() { | ||||
| for (Port *input : inputs) { | for (Port *input : inputs) { | ||||
| gScene->rackWidget->wireContainer->removeAllWires(input); | |||||
| context()->scene->rackWidget->wireContainer->removeAllWires(input); | |||||
| } | } | ||||
| for (Port *output : outputs) { | for (Port *output : outputs) { | ||||
| gScene->rackWidget->wireContainer->removeAllWires(output); | |||||
| context()->scene->rackWidget->wireContainer->removeAllWires(output); | |||||
| } | } | ||||
| } | } | ||||
| @@ -235,7 +237,7 @@ void ModuleWidget::reset() { | |||||
| param->reset(); | param->reset(); | ||||
| } | } | ||||
| if (module) { | if (module) { | ||||
| gEngine->resetModule(module); | |||||
| context()->engine->resetModule(module); | |||||
| } | } | ||||
| } | } | ||||
| @@ -244,7 +246,7 @@ void ModuleWidget::randomize() { | |||||
| param->randomize(); | param->randomize(); | ||||
| } | } | ||||
| if (module) { | if (module) { | ||||
| gEngine->randomizeModule(module); | |||||
| context()->engine->randomizeModule(module); | |||||
| } | } | ||||
| } | } | ||||
| @@ -253,7 +255,7 @@ void ModuleWidget::draw(NVGcontext *vg) { | |||||
| Widget::draw(vg); | Widget::draw(vg); | ||||
| // Power meter | // Power meter | ||||
| if (module && gEngine->powerMeter) { | |||||
| if (module && context()->engine->powerMeter) { | |||||
| nvgBeginPath(vg); | nvgBeginPath(vg); | ||||
| nvgRect(vg, | nvgRect(vg, | ||||
| 0, box.size.y - 20, | 0, box.size.y - 20, | ||||
| @@ -297,7 +299,7 @@ void ModuleWidget::onHover(event::Hover &e) { | |||||
| // Instead of checking key-down events, delete the module even if key-repeat hasn't fired yet and the cursor is hovering over the widget. | // Instead of checking key-down events, delete the module even if key-repeat hasn't fired yet and the cursor is hovering over the widget. | ||||
| if (glfwGetKey(gWindow, GLFW_KEY_DELETE) == GLFW_PRESS || glfwGetKey(gWindow, GLFW_KEY_BACKSPACE) == GLFW_PRESS) { | if (glfwGetKey(gWindow, GLFW_KEY_DELETE) == GLFW_PRESS || glfwGetKey(gWindow, GLFW_KEY_BACKSPACE) == GLFW_PRESS) { | ||||
| if (!windowIsModPressed() && !windowIsShiftPressed()) { | if (!windowIsModPressed() && !windowIsShiftPressed()) { | ||||
| gScene->rackWidget->deleteModule(this); | |||||
| context()->scene->rackWidget->deleteModule(this); | |||||
| delete this; | delete this; | ||||
| // e.target = this; | // e.target = this; | ||||
| return; | return; | ||||
| @@ -346,7 +348,7 @@ void ModuleWidget::onHoverKey(event::HoverKey &e) { | |||||
| } break; | } break; | ||||
| case GLFW_KEY_D: { | case GLFW_KEY_D: { | ||||
| if (windowIsModPressed() && !windowIsShiftPressed()) { | if (windowIsModPressed() && !windowIsShiftPressed()) { | ||||
| gScene->rackWidget->cloneModule(this); | |||||
| context()->scene->rackWidget->cloneModule(this); | |||||
| e.target = this; | e.target = this; | ||||
| return; | return; | ||||
| } | } | ||||
| @@ -364,17 +366,17 @@ void ModuleWidget::onHoverKey(event::HoverKey &e) { | |||||
| } | } | ||||
| void ModuleWidget::onDragStart(event::DragStart &e) { | void ModuleWidget::onDragStart(event::DragStart &e) { | ||||
| dragPos = gScene->rackWidget->lastMousePos.minus(box.pos); | |||||
| dragPos = context()->scene->rackWidget->lastMousePos.minus(box.pos); | |||||
| } | } | ||||
| void ModuleWidget::onDragEnd(event::DragEnd &e) { | void ModuleWidget::onDragEnd(event::DragEnd &e) { | ||||
| } | } | ||||
| void ModuleWidget::onDragMove(event::DragMove &e) { | void ModuleWidget::onDragMove(event::DragMove &e) { | ||||
| if (!gScene->rackWidget->lockModules) { | |||||
| if (!context()->scene->rackWidget->lockModules) { | |||||
| Rect newBox = box; | Rect newBox = box; | ||||
| newBox.pos = gScene->rackWidget->lastMousePos.minus(dragPos); | |||||
| gScene->rackWidget->requestModuleBoxNearest(this, newBox); | |||||
| newBox.pos = context()->scene->rackWidget->lastMousePos.minus(dragPos); | |||||
| context()->scene->rackWidget->requestModuleBoxNearest(this, newBox); | |||||
| } | } | ||||
| } | } | ||||
| @@ -431,14 +433,14 @@ struct ModuleLoadItem : MenuItem { | |||||
| struct ModuleCloneItem : MenuItem { | struct ModuleCloneItem : MenuItem { | ||||
| ModuleWidget *moduleWidget; | ModuleWidget *moduleWidget; | ||||
| void onAction(event::Action &e) override { | void onAction(event::Action &e) override { | ||||
| gScene->rackWidget->cloneModule(moduleWidget); | |||||
| context()->scene->rackWidget->cloneModule(moduleWidget); | |||||
| } | } | ||||
| }; | }; | ||||
| struct ModuleDeleteItem : MenuItem { | struct ModuleDeleteItem : MenuItem { | ||||
| ModuleWidget *moduleWidget; | ModuleWidget *moduleWidget; | ||||
| void onAction(event::Action &e) override { | void onAction(event::Action &e) override { | ||||
| gScene->rackWidget->deleteModule(moduleWidget); | |||||
| context()->scene->rackWidget->deleteModule(moduleWidget); | |||||
| delete moduleWidget; | delete moduleWidget; | ||||
| } | } | ||||
| }; | }; | ||||
| @@ -1,6 +1,7 @@ | |||||
| #include "app/Port.hpp" | #include "app/Port.hpp" | ||||
| #include "app/Scene.hpp" | #include "app/Scene.hpp" | ||||
| #include "window.hpp" | #include "window.hpp" | ||||
| #include "context.hpp" | |||||
| #include "componentlibrary.hpp" | #include "componentlibrary.hpp" | ||||
| @@ -24,7 +25,7 @@ Port::Port() { | |||||
| Port::~Port() { | Port::~Port() { | ||||
| // plugLight is not a child and is thus owned by the Port, so we need to delete it here | // plugLight is not a child and is thus owned by the Port, so we need to delete it here | ||||
| delete plugLight; | delete plugLight; | ||||
| gScene->rackWidget->wireContainer->removeAllWires(this); | |||||
| context()->scene->rackWidget->wireContainer->removeAllWires(this); | |||||
| } | } | ||||
| void Port::step() { | void Port::step() { | ||||
| @@ -41,7 +42,7 @@ void Port::step() { | |||||
| } | } | ||||
| void Port::draw(NVGcontext *vg) { | void Port::draw(NVGcontext *vg) { | ||||
| WireWidget *activeWire = gScene->rackWidget->wireContainer->activeWire; | |||||
| WireWidget *activeWire = context()->scene->rackWidget->wireContainer->activeWire; | |||||
| if (activeWire) { | if (activeWire) { | ||||
| // Dim the Port if the active wire cannot plug into this Port | // Dim the Port if the active wire cannot plug into this Port | ||||
| if (type == INPUT ? activeWire->inputPort : activeWire->outputPort) | if (type == INPUT ? activeWire->inputPort : activeWire->outputPort) | ||||
| @@ -51,7 +52,7 @@ void Port::draw(NVGcontext *vg) { | |||||
| void Port::onButton(event::Button &e) { | void Port::onButton(event::Button &e) { | ||||
| if (e.action == GLFW_PRESS && e.button == GLFW_MOUSE_BUTTON_LEFT) { | if (e.action == GLFW_PRESS && e.button == GLFW_MOUSE_BUTTON_LEFT) { | ||||
| gScene->rackWidget->wireContainer->removeTopWire(this); | |||||
| context()->scene->rackWidget->wireContainer->removeTopWire(this); | |||||
| // HACK | // HACK | ||||
| // Update hovered*Port of active wire if applicable | // Update hovered*Port of active wire if applicable | ||||
| @@ -63,7 +64,7 @@ void Port::onButton(event::Button &e) { | |||||
| void Port::onDragStart(event::DragStart &e) { | void Port::onDragStart(event::DragStart &e) { | ||||
| // Try to grab wire on top of stack | // Try to grab wire on top of stack | ||||
| WireWidget *wire = gScene->rackWidget->wireContainer->getTopWire(this); | |||||
| WireWidget *wire = context()->scene->rackWidget->wireContainer->getTopWire(this); | |||||
| if (type == OUTPUT && windowIsModPressed()) { | if (type == OUTPUT && windowIsModPressed()) { | ||||
| wire = NULL; | wire = NULL; | ||||
| } | } | ||||
| @@ -84,13 +85,13 @@ void Port::onDragStart(event::DragStart &e) { | |||||
| else | else | ||||
| wire->outputPort = this; | wire->outputPort = this; | ||||
| } | } | ||||
| gScene->rackWidget->wireContainer->setActiveWire(wire); | |||||
| context()->scene->rackWidget->wireContainer->setActiveWire(wire); | |||||
| } | } | ||||
| void Port::onDragEnd(event::DragEnd &e) { | void Port::onDragEnd(event::DragEnd &e) { | ||||
| // FIXME | // FIXME | ||||
| // If the source Port is deleted, this will be called, removing the cable | // If the source Port is deleted, this will be called, removing the cable | ||||
| gScene->rackWidget->wireContainer->commitActiveWire(); | |||||
| context()->scene->rackWidget->wireContainer->commitActiveWire(); | |||||
| } | } | ||||
| void Port::onDragDrop(event::DragDrop &e) { | void Port::onDragDrop(event::DragDrop &e) { | ||||
| @@ -99,12 +100,12 @@ void Port::onDragDrop(event::DragDrop &e) { | |||||
| void Port::onDragEnter(event::DragEnter &e) { | void Port::onDragEnter(event::DragEnter &e) { | ||||
| // Reject ports if this is an input port and something is already plugged into it | // Reject ports if this is an input port and something is already plugged into it | ||||
| if (type == INPUT) { | if (type == INPUT) { | ||||
| WireWidget *topWire = gScene->rackWidget->wireContainer->getTopWire(this); | |||||
| WireWidget *topWire = context()->scene->rackWidget->wireContainer->getTopWire(this); | |||||
| if (topWire) | if (topWire) | ||||
| return; | return; | ||||
| } | } | ||||
| WireWidget *activeWire = gScene->rackWidget->wireContainer->activeWire; | |||||
| WireWidget *activeWire = context()->scene->rackWidget->wireContainer->activeWire; | |||||
| if (activeWire) { | if (activeWire) { | ||||
| if (type == INPUT) | if (type == INPUT) | ||||
| activeWire->hoveredInputPort = this; | activeWire->hoveredInputPort = this; | ||||
| @@ -114,7 +115,7 @@ void Port::onDragEnter(event::DragEnter &e) { | |||||
| } | } | ||||
| void Port::onDragLeave(event::DragLeave &e) { | void Port::onDragLeave(event::DragLeave &e) { | ||||
| WireWidget *activeWire = gScene->rackWidget->wireContainer->activeWire; | |||||
| WireWidget *activeWire = context()->scene->rackWidget->wireContainer->activeWire; | |||||
| if (activeWire) { | if (activeWire) { | ||||
| if (type == INPUT) | if (type == INPUT) | ||||
| activeWire->hoveredInputPort = NULL; | activeWire->hoveredInputPort = NULL; | ||||
| @@ -1,6 +1,7 @@ | |||||
| #include "app/RackScrollWidget.hpp" | #include "app/RackScrollWidget.hpp" | ||||
| #include "app/Scene.hpp" | #include "app/Scene.hpp" | ||||
| #include "window.hpp" | #include "window.hpp" | ||||
| #include "context.hpp" | |||||
| namespace rack { | namespace rack { | ||||
| @@ -10,7 +11,7 @@ void RackScrollWidget::step() { | |||||
| Vec pos = gMousePos; | Vec pos = gMousePos; | ||||
| Rect viewport = getViewport(box.zeroPos()); | Rect viewport = getViewport(box.zeroPos()); | ||||
| // Scroll rack if dragging cable near the edge of the screen | // Scroll rack if dragging cable near the edge of the screen | ||||
| if (gScene->rackWidget->wireContainer->activeWire) { | |||||
| if (context()->scene->rackWidget->wireContainer->activeWire) { | |||||
| float margin = 20.0; | float margin = 20.0; | ||||
| float speed = 15.0; | float speed = 15.0; | ||||
| if (pos.x <= viewport.pos.x + margin) | if (pos.x <= viewport.pos.x + margin) | ||||
| @@ -10,6 +10,7 @@ | |||||
| #include "system.hpp" | #include "system.hpp" | ||||
| #include "logger.hpp" | #include "logger.hpp" | ||||
| #include "plugin/PluginManager.hpp" | #include "plugin/PluginManager.hpp" | ||||
| #include "context.hpp" | |||||
| namespace rack { | namespace rack { | ||||
| @@ -59,7 +60,7 @@ void RackWidget::clear() { | |||||
| wireContainer->clearChildren(); | wireContainer->clearChildren(); | ||||
| moduleContainer->clearChildren(); | moduleContainer->clearChildren(); | ||||
| gScene->scrollWidget->offset = Vec(0, 0); | |||||
| context()->scene->scrollWidget->offset = Vec(0, 0); | |||||
| } | } | ||||
| void RackWidget::reset() { | void RackWidget::reset() { | ||||
| @@ -4,6 +4,7 @@ | |||||
| #include "app/Scene.hpp" | #include "app/Scene.hpp" | ||||
| #include "app/ModuleBrowser.hpp" | #include "app/ModuleBrowser.hpp" | ||||
| #include "app/RackScrollWidget.hpp" | #include "app/RackScrollWidget.hpp" | ||||
| #include "context.hpp" | |||||
| #include <thread> | #include <thread> | ||||
| @@ -43,7 +44,7 @@ void Scene::step() { | |||||
| zoomWidget->box.size = rackWidget->box.size.mult(zoomWidget->zoom); | zoomWidget->box.size = rackWidget->box.size.mult(zoomWidget->zoom); | ||||
| // Request latest version from server | // Request latest version from server | ||||
| if (!devMode && checkVersion && !checkedVersion) { | |||||
| if (!context()->devMode && checkVersion && !checkedVersion) { | |||||
| std::thread t(&Scene::runCheckVersion, this); | std::thread t(&Scene::runCheckVersion, this); | ||||
| t.detach(); | t.detach(); | ||||
| checkedVersion = true; | checkedVersion = true; | ||||
| @@ -149,7 +150,4 @@ void Scene::runCheckVersion() { | |||||
| } | } | ||||
| Scene *gScene = NULL; | |||||
| } // namespace rack | } // namespace rack | ||||
| @@ -8,6 +8,7 @@ | |||||
| #include "ui/Slider.hpp" | #include "ui/Slider.hpp" | ||||
| #include "app/PluginManagerWidget.hpp" | #include "app/PluginManagerWidget.hpp" | ||||
| #include "app/Scene.hpp" | #include "app/Scene.hpp" | ||||
| #include "context.hpp" | |||||
| #include "helpers.hpp" | #include "helpers.hpp" | ||||
| @@ -21,13 +22,13 @@ struct TooltipIconButton : IconButton { | |||||
| tooltip = new Tooltip; | tooltip = new Tooltip; | ||||
| tooltip->box.pos = getAbsoluteOffset(Vec(0, BND_WIDGET_HEIGHT)); | tooltip->box.pos = getAbsoluteOffset(Vec(0, BND_WIDGET_HEIGHT)); | ||||
| tooltip->text = getTooltipText(); | tooltip->text = getTooltipText(); | ||||
| gScene->addChild(tooltip); | |||||
| context()->scene->addChild(tooltip); | |||||
| } | } | ||||
| IconButton::onEnter(e); | IconButton::onEnter(e); | ||||
| } | } | ||||
| void onLeave(event::Leave &e) override { | void onLeave(event::Leave &e) override { | ||||
| if (tooltip) { | if (tooltip) { | ||||
| gScene->removeChild(tooltip); | |||||
| context()->scene->removeChild(tooltip); | |||||
| delete tooltip; | delete tooltip; | ||||
| tooltip = NULL; | tooltip = NULL; | ||||
| } | } | ||||
| @@ -42,7 +43,7 @@ struct NewButton : TooltipIconButton { | |||||
| } | } | ||||
| std::string getTooltipText() override {return "New patch (" WINDOW_MOD_KEY_NAME "+N)";} | std::string getTooltipText() override {return "New patch (" WINDOW_MOD_KEY_NAME "+N)";} | ||||
| void onAction(event::Action &e) override { | void onAction(event::Action &e) override { | ||||
| gScene->rackWidget->reset(); | |||||
| context()->scene->rackWidget->reset(); | |||||
| } | } | ||||
| }; | }; | ||||
| @@ -52,7 +53,7 @@ struct OpenButton : TooltipIconButton { | |||||
| } | } | ||||
| std::string getTooltipText() override {return "Open patch (" WINDOW_MOD_KEY_NAME "+O)";} | std::string getTooltipText() override {return "Open patch (" WINDOW_MOD_KEY_NAME "+O)";} | ||||
| void onAction(event::Action &e) override { | void onAction(event::Action &e) override { | ||||
| gScene->rackWidget->loadDialog(); | |||||
| context()->scene->rackWidget->loadDialog(); | |||||
| } | } | ||||
| }; | }; | ||||
| @@ -62,7 +63,7 @@ struct SaveButton : TooltipIconButton { | |||||
| } | } | ||||
| std::string getTooltipText() override {return "Save patch (" WINDOW_MOD_KEY_NAME "+S)";} | std::string getTooltipText() override {return "Save patch (" WINDOW_MOD_KEY_NAME "+S)";} | ||||
| void onAction(event::Action &e) override { | void onAction(event::Action &e) override { | ||||
| gScene->rackWidget->saveDialog(); | |||||
| context()->scene->rackWidget->saveDialog(); | |||||
| } | } | ||||
| }; | }; | ||||
| @@ -72,7 +73,7 @@ struct SaveAsButton : TooltipIconButton { | |||||
| } | } | ||||
| std::string getTooltipText() override {return "Save patch as (" WINDOW_MOD_KEY_NAME "+Shift+S)";} | std::string getTooltipText() override {return "Save patch as (" WINDOW_MOD_KEY_NAME "+Shift+S)";} | ||||
| void onAction(event::Action &e) override { | void onAction(event::Action &e) override { | ||||
| gScene->rackWidget->saveAsDialog(); | |||||
| context()->scene->rackWidget->saveAsDialog(); | |||||
| } | } | ||||
| }; | }; | ||||
| @@ -82,7 +83,7 @@ struct RevertButton : TooltipIconButton { | |||||
| } | } | ||||
| std::string getTooltipText() override {return "Revert patch";} | std::string getTooltipText() override {return "Revert patch";} | ||||
| void onAction(event::Action &e) override { | void onAction(event::Action &e) override { | ||||
| gScene->rackWidget->revert(); | |||||
| context()->scene->rackWidget->revert(); | |||||
| } | } | ||||
| }; | }; | ||||
| @@ -92,7 +93,7 @@ struct DisconnectCablesButton : TooltipIconButton { | |||||
| } | } | ||||
| std::string getTooltipText() override {return "Disconnect cables";} | std::string getTooltipText() override {return "Disconnect cables";} | ||||
| void onAction(event::Action &e) override { | void onAction(event::Action &e) override { | ||||
| gScene->rackWidget->disconnect(); | |||||
| context()->scene->rackWidget->disconnect(); | |||||
| } | } | ||||
| }; | }; | ||||
| @@ -102,21 +103,21 @@ struct PowerMeterButton : TooltipIconButton { | |||||
| } | } | ||||
| std::string getTooltipText() override {return "Toggle power meter (see manual for explanation)";} | std::string getTooltipText() override {return "Toggle power meter (see manual for explanation)";} | ||||
| void onAction(event::Action &e) override { | void onAction(event::Action &e) override { | ||||
| gEngine->powerMeter ^= true; | |||||
| context()->engine->powerMeter ^= true; | |||||
| } | } | ||||
| }; | }; | ||||
| struct EnginePauseItem : MenuItem { | struct EnginePauseItem : MenuItem { | ||||
| void onAction(event::Action &e) override { | void onAction(event::Action &e) override { | ||||
| gEngine->paused ^= true; | |||||
| context()->engine->paused ^= true; | |||||
| } | } | ||||
| }; | }; | ||||
| struct SampleRateItem : MenuItem { | struct SampleRateItem : MenuItem { | ||||
| float sampleRate; | float sampleRate; | ||||
| void onAction(event::Action &e) override { | void onAction(event::Action &e) override { | ||||
| gEngine->setSampleRate(sampleRate); | |||||
| gEngine->paused = false; | |||||
| context()->engine->setSampleRate(sampleRate); | |||||
| context()->engine->paused = false; | |||||
| } | } | ||||
| }; | }; | ||||
| @@ -133,14 +134,14 @@ struct SampleRateButton : TooltipIconButton { | |||||
| menu->addChild(createMenuLabel("Engine sample rate")); | menu->addChild(createMenuLabel("Engine sample rate")); | ||||
| EnginePauseItem *pauseItem = new EnginePauseItem; | EnginePauseItem *pauseItem = new EnginePauseItem; | ||||
| pauseItem->text = gEngine->paused ? "Resume engine" : "Pause engine"; | |||||
| pauseItem->text = context()->engine->paused ? "Resume engine" : "Pause engine"; | |||||
| menu->addChild(pauseItem); | menu->addChild(pauseItem); | ||||
| std::vector<float> sampleRates = {44100, 48000, 88200, 96000, 176400, 192000}; | std::vector<float> sampleRates = {44100, 48000, 88200, 96000, 176400, 192000}; | ||||
| for (float sampleRate : sampleRates) { | for (float sampleRate : sampleRates) { | ||||
| SampleRateItem *item = new SampleRateItem; | SampleRateItem *item = new SampleRateItem; | ||||
| item->text = string::f("%.0f Hz", sampleRate); | item->text = string::f("%.0f Hz", sampleRate); | ||||
| item->rightText = CHECKMARK(gEngine->getSampleRate() == sampleRate); | |||||
| item->rightText = CHECKMARK(context()->engine->getSampleRate() == sampleRate); | |||||
| item->sampleRate = sampleRate; | item->sampleRate = sampleRate; | ||||
| menu->addChild(item); | menu->addChild(item); | ||||
| } | } | ||||
| @@ -153,7 +154,7 @@ struct RackLockButton : TooltipIconButton { | |||||
| } | } | ||||
| std::string getTooltipText() override {return "Lock modules";} | std::string getTooltipText() override {return "Lock modules";} | ||||
| void onAction(event::Action &e) override { | void onAction(event::Action &e) override { | ||||
| gScene->rackWidget->lockModules ^= true; | |||||
| context()->scene->rackWidget->lockModules ^= true; | |||||
| } | } | ||||
| }; | }; | ||||
| @@ -185,10 +186,10 @@ struct WireTensionQuantity : Quantity { | |||||
| struct ZoomQuantity : Quantity { | struct ZoomQuantity : Quantity { | ||||
| void setValue(float value) override { | void setValue(float value) override { | ||||
| gScene->zoomWidget->setZoom(std::round(value) / 100); | |||||
| context()->scene->zoomWidget->setZoom(std::round(value) / 100); | |||||
| } | } | ||||
| float getValue() override { | float getValue() override { | ||||
| return gScene->zoomWidget->zoom * 100; | |||||
| return context()->scene->zoomWidget->zoom * 100; | |||||
| } | } | ||||
| float getMinValue() override {return 25;} | float getMinValue() override {return 25;} | ||||
| float getMaxValue() override {return 200;} | float getMaxValue() override {return 200;} | ||||
| @@ -4,6 +4,7 @@ | |||||
| #include "componentlibrary.hpp" | #include "componentlibrary.hpp" | ||||
| #include "window.hpp" | #include "window.hpp" | ||||
| #include "event.hpp" | #include "event.hpp" | ||||
| #include "context.hpp" | |||||
| namespace rack { | namespace rack { | ||||
| @@ -108,12 +109,12 @@ void WireWidget::updateWire() { | |||||
| wire->outputId = outputPort->portId; | wire->outputId = outputPort->portId; | ||||
| wire->inputModule = inputPort->module; | wire->inputModule = inputPort->module; | ||||
| wire->inputId = inputPort->portId; | wire->inputId = inputPort->portId; | ||||
| gEngine->addWire(wire); | |||||
| context()->engine->addWire(wire); | |||||
| } | } | ||||
| } | } | ||||
| else { | else { | ||||
| if (wire) { | if (wire) { | ||||
| gEngine->removeWire(wire); | |||||
| context()->engine->removeWire(wire); | |||||
| delete wire; | delete wire; | ||||
| wire = NULL; | wire = NULL; | ||||
| } | } | ||||
| @@ -122,25 +123,25 @@ void WireWidget::updateWire() { | |||||
| Vec WireWidget::getOutputPos() { | Vec WireWidget::getOutputPos() { | ||||
| if (outputPort) { | if (outputPort) { | ||||
| return outputPort->getRelativeOffset(outputPort->box.zeroPos().getCenter(), gScene->rackWidget); | |||||
| return outputPort->getRelativeOffset(outputPort->box.zeroPos().getCenter(), context()->scene->rackWidget); | |||||
| } | } | ||||
| else if (hoveredOutputPort) { | else if (hoveredOutputPort) { | ||||
| return hoveredOutputPort->getRelativeOffset(hoveredOutputPort->box.zeroPos().getCenter(), gScene->rackWidget); | |||||
| return hoveredOutputPort->getRelativeOffset(hoveredOutputPort->box.zeroPos().getCenter(), context()->scene->rackWidget); | |||||
| } | } | ||||
| else { | else { | ||||
| return gScene->rackWidget->lastMousePos; | |||||
| return context()->scene->rackWidget->lastMousePos; | |||||
| } | } | ||||
| } | } | ||||
| Vec WireWidget::getInputPos() { | Vec WireWidget::getInputPos() { | ||||
| if (inputPort) { | if (inputPort) { | ||||
| return inputPort->getRelativeOffset(inputPort->box.zeroPos().getCenter(), gScene->rackWidget); | |||||
| return inputPort->getRelativeOffset(inputPort->box.zeroPos().getCenter(), context()->scene->rackWidget); | |||||
| } | } | ||||
| else if (hoveredInputPort) { | else if (hoveredInputPort) { | ||||
| return hoveredInputPort->getRelativeOffset(hoveredInputPort->box.zeroPos().getCenter(), gScene->rackWidget); | |||||
| return hoveredInputPort->getRelativeOffset(hoveredInputPort->box.zeroPos().getCenter(), context()->scene->rackWidget); | |||||
| } | } | ||||
| else { | else { | ||||
| return gScene->rackWidget->lastMousePos; | |||||
| return context()->scene->rackWidget->lastMousePos; | |||||
| } | } | ||||
| } | } | ||||
| @@ -166,14 +167,14 @@ void WireWidget::draw(NVGcontext *vg) { | |||||
| float opacity = 0.5; | float opacity = 0.5; | ||||
| float tension = 0.5; | float tension = 0.5; | ||||
| WireWidget *activeWire = gScene->rackWidget->wireContainer->activeWire; | |||||
| WireWidget *activeWire = context()->scene->rackWidget->wireContainer->activeWire; | |||||
| if (activeWire) { | if (activeWire) { | ||||
| // Draw as opaque if the wire is active | // Draw as opaque if the wire is active | ||||
| if (activeWire == this) | if (activeWire == this) | ||||
| opacity = 1.0; | opacity = 1.0; | ||||
| } | } | ||||
| else { | else { | ||||
| Port *hoveredPort = dynamic_cast<Port*>(event::gContext->hoveredWidget); | |||||
| Port *hoveredPort = dynamic_cast<Port*>(context()->event->hoveredWidget); | |||||
| if (hoveredPort && (hoveredPort == outputPort || hoveredPort == inputPort)) | if (hoveredPort && (hoveredPort == outputPort || hoveredPort == inputPort)) | ||||
| opacity = 1.0; | opacity = 1.0; | ||||
| } | } | ||||
| @@ -1,5 +1,6 @@ | |||||
| #include "asset.hpp" | #include "asset.hpp" | ||||
| #include "system.hpp" | #include "system.hpp" | ||||
| #include "context.hpp" | |||||
| #if ARCH_MAC | #if ARCH_MAC | ||||
| #include <CoreFoundation/CoreFoundation.h> | #include <CoreFoundation/CoreFoundation.h> | ||||
| @@ -27,9 +28,10 @@ std::string systemDir; | |||||
| std::string userDir; | std::string userDir; | ||||
| void init(bool devMode) { | |||||
| void init() { | |||||
| // Get system dir | |||||
| if (systemDir.empty()) { | if (systemDir.empty()) { | ||||
| if (devMode) { | |||||
| if (context()->devMode) { | |||||
| systemDir = "."; | systemDir = "."; | ||||
| } | } | ||||
| else { | else { | ||||
| @@ -57,8 +59,9 @@ void init(bool devMode) { | |||||
| } | } | ||||
| } | } | ||||
| // Get user dir | |||||
| if (userDir.empty()) { | if (userDir.empty()) { | ||||
| if (devMode) { | |||||
| if (context()->devMode) { | |||||
| userDir = "."; | userDir = "."; | ||||
| } | } | ||||
| else { | else { | ||||
| @@ -0,0 +1,15 @@ | |||||
| #include "context.hpp" | |||||
| namespace rack { | |||||
| static Context c; | |||||
| Context *context() { | |||||
| return &c; | |||||
| } | |||||
| } // namespace rack | |||||
| @@ -325,7 +325,4 @@ float Engine::getSampleTime() { | |||||
| } | } | ||||
| Engine *gEngine = NULL; | |||||
| } // namespace rack | } // namespace rack | ||||
| @@ -1,5 +1,6 @@ | |||||
| #include "engine/Light.hpp" | #include "engine/Light.hpp" | ||||
| #include "engine/Engine.hpp" | #include "engine/Engine.hpp" | ||||
| #include "context.hpp" | |||||
| namespace rack { | namespace rack { | ||||
| @@ -15,7 +16,7 @@ void Light::setBrightnessSmooth(float brightness, float frames) { | |||||
| float v = (brightness > 0.f) ? std::pow(brightness, 2) : 0.f; | float v = (brightness > 0.f) ? std::pow(brightness, 2) : 0.f; | ||||
| if (v < value) { | if (v < value) { | ||||
| // Fade out light with lambda = framerate | // Fade out light with lambda = framerate | ||||
| value += (v - value) * gEngine->getSampleTime() * frames * 60.f; | |||||
| value += (v - value) * context()->engine->getSampleTime() * frames * 60.f; | |||||
| } | } | ||||
| else { | else { | ||||
| // Immediately illuminate light | // Immediately illuminate light | ||||
| @@ -1,5 +1,6 @@ | |||||
| #include "logger.hpp" | #include "logger.hpp" | ||||
| #include "asset.hpp" | #include "asset.hpp" | ||||
| #include "context.hpp" | |||||
| #include <chrono> | #include <chrono> | ||||
| @@ -11,9 +12,9 @@ static FILE *outputFile = NULL; | |||||
| static std::chrono::high_resolution_clock::time_point startTime; | static std::chrono::high_resolution_clock::time_point startTime; | ||||
| void init(bool devMode) { | |||||
| void init() { | |||||
| startTime = std::chrono::high_resolution_clock::now(); | startTime = std::chrono::high_resolution_clock::now(); | ||||
| if (devMode) { | |||||
| if (context()->devMode) { | |||||
| outputFile = stderr; | outputFile = stderr; | ||||
| } | } | ||||
| else { | else { | ||||
| @@ -11,6 +11,7 @@ | |||||
| #include "app/Scene.hpp" | #include "app/Scene.hpp" | ||||
| #include "tags.hpp" | #include "tags.hpp" | ||||
| #include "plugin/PluginManager.hpp" | #include "plugin/PluginManager.hpp" | ||||
| #include "context.hpp" | |||||
| #include <unistd.h> | #include <unistd.h> | ||||
| #include <osdialog.h> | #include <osdialog.h> | ||||
| @@ -26,7 +27,7 @@ int main(int argc, char *argv[]) { | |||||
| #ifdef ARCH_WIN | #ifdef ARCH_WIN | ||||
| // Windows global mutex to prevent multiple instances | // Windows global mutex to prevent multiple instances | ||||
| // Handle will be closed by Windows when the process ends | // Handle will be closed by Windows when the process ends | ||||
| HANDLE instanceMutex = CreateMutex(NULL, true, gApplicationName.c_str()); | |||||
| HANDLE instanceMutex = CreateMutex(NULL, true, APP_NAME.c_str()); | |||||
| if (GetLastError() == ERROR_ALREADY_EXISTS) { | if (GetLastError() == ERROR_ALREADY_EXISTS) { | ||||
| osdialog_message(OSDIALOG_ERROR, OSDIALOG_OK, "Rack is already running. Multiple Rack instances are not supported."); | osdialog_message(OSDIALOG_ERROR, OSDIALOG_OK, "Rack is already running. Multiple Rack instances are not supported."); | ||||
| exit(1); | exit(1); | ||||
| @@ -34,7 +35,6 @@ int main(int argc, char *argv[]) { | |||||
| (void) instanceMutex; | (void) instanceMutex; | ||||
| #endif | #endif | ||||
| bool devMode = false; | |||||
| std::string patchFile; | std::string patchFile; | ||||
| // Parse command line arguments | // Parse command line arguments | ||||
| @@ -43,7 +43,7 @@ int main(int argc, char *argv[]) { | |||||
| while ((c = getopt(argc, argv, "ds:u:")) != -1) { | while ((c = getopt(argc, argv, "ds:u:")) != -1) { | ||||
| switch (c) { | switch (c) { | ||||
| case 'd': { | case 'd': { | ||||
| devMode = true; | |||||
| context()->devMode = true; | |||||
| } break; | } break; | ||||
| case 's': { | case 's': { | ||||
| asset::systemDir = optarg; | asset::systemDir = optarg; | ||||
| @@ -60,28 +60,27 @@ int main(int argc, char *argv[]) { | |||||
| // Initialize environment | // Initialize environment | ||||
| random::init(); | random::init(); | ||||
| asset::init(devMode); | |||||
| logger::init(devMode); | |||||
| asset::init(); | |||||
| logger::init(); | |||||
| // Log environment | // Log environment | ||||
| INFO("%s %s", APP_NAME.c_str(), APP_VERSION.c_str()); | INFO("%s %s", APP_NAME.c_str(), APP_VERSION.c_str()); | ||||
| if (devMode) | |||||
| if (context()->devMode) | |||||
| INFO("Development mode"); | INFO("Development mode"); | ||||
| INFO("System directory: %s", asset::system("").c_str()); | INFO("System directory: %s", asset::system("").c_str()); | ||||
| INFO("User directory: %s", asset::user("").c_str()); | INFO("User directory: %s", asset::user("").c_str()); | ||||
| // Initialize app | // Initialize app | ||||
| tagsInit(); | tagsInit(); | ||||
| gPluginManager = new PluginManager(devMode); | |||||
| gEngine = new Engine; | |||||
| gPluginManager = new PluginManager; | |||||
| context()->engine = new Engine; | |||||
| rtmidiInit(); | rtmidiInit(); | ||||
| bridgeInit(); | bridgeInit(); | ||||
| keyboard::init(); | keyboard::init(); | ||||
| gamepad::init(); | gamepad::init(); | ||||
| event::gContext = new event::Context; | |||||
| gScene = new Scene; | |||||
| gScene->devMode = devMode; | |||||
| event::gContext->rootWidget = gScene; | |||||
| context()->event = new event::Context; | |||||
| context()->scene = new Scene; | |||||
| context()->event->rootWidget = context()->scene; | |||||
| windowInit(); | windowInit(); | ||||
| settings::load(asset::user("settings.json")); | settings::load(asset::user("settings.json")); | ||||
| @@ -92,36 +91,36 @@ int main(int argc, char *argv[]) { | |||||
| settings::save(asset::user("settings.json")); | settings::save(asset::user("settings.json")); | ||||
| settings::gSkipAutosaveOnLaunch = false; | settings::gSkipAutosaveOnLaunch = false; | ||||
| if (oldSkipAutosaveOnLaunch && osdialog_message(OSDIALOG_INFO, OSDIALOG_YES_NO, "Rack has recovered from a crash, possibly caused by a faulty module in your patch. Clear your patch and start over?")) { | if (oldSkipAutosaveOnLaunch && osdialog_message(OSDIALOG_INFO, OSDIALOG_YES_NO, "Rack has recovered from a crash, possibly caused by a faulty module in your patch. Clear your patch and start over?")) { | ||||
| gScene->rackWidget->lastPath = ""; | |||||
| context()->scene->rackWidget->lastPath = ""; | |||||
| } | } | ||||
| else { | else { | ||||
| // Load autosave | // Load autosave | ||||
| std::string oldLastPath = gScene->rackWidget->lastPath; | |||||
| gScene->rackWidget->load(asset::user("autosave.vcv")); | |||||
| gScene->rackWidget->lastPath = oldLastPath; | |||||
| std::string oldLastPath = context()->scene->rackWidget->lastPath; | |||||
| context()->scene->rackWidget->load(asset::user("autosave.vcv")); | |||||
| context()->scene->rackWidget->lastPath = oldLastPath; | |||||
| } | } | ||||
| } | } | ||||
| else { | else { | ||||
| // Load patch | // Load patch | ||||
| gScene->rackWidget->load(patchFile); | |||||
| gScene->rackWidget->lastPath = patchFile; | |||||
| context()->scene->rackWidget->load(patchFile); | |||||
| context()->scene->rackWidget->lastPath = patchFile; | |||||
| } | } | ||||
| gEngine->start(); | |||||
| context()->engine->start(); | |||||
| windowRun(); | windowRun(); | ||||
| gEngine->stop(); | |||||
| context()->engine->stop(); | |||||
| // Destroy namespaces | // Destroy namespaces | ||||
| gScene->rackWidget->save(asset::user("autosave.vcv")); | |||||
| context()->scene->rackWidget->save(asset::user("autosave.vcv")); | |||||
| settings::save(asset::user("settings.json")); | settings::save(asset::user("settings.json")); | ||||
| delete gScene; | |||||
| gScene = NULL; | |||||
| delete event::gContext; | |||||
| event::gContext = NULL; | |||||
| delete context()->scene; | |||||
| context()->scene = NULL; | |||||
| delete context()->event; | |||||
| context()->event = NULL; | |||||
| windowDestroy(); | windowDestroy(); | ||||
| bridgeDestroy(); | bridgeDestroy(); | ||||
| delete gEngine; | |||||
| gEngine = NULL; | |||||
| delete context()->engine; | |||||
| context()->engine = NULL; | |||||
| midiDestroy(); | midiDestroy(); | ||||
| delete gPluginManager; | delete gPluginManager; | ||||
| gPluginManager = NULL; | gPluginManager = NULL; | ||||
| @@ -4,6 +4,7 @@ | |||||
| #include "network.hpp" | #include "network.hpp" | ||||
| #include "asset.hpp" | #include "asset.hpp" | ||||
| #include "string.hpp" | #include "string.hpp" | ||||
| #include "context.hpp" | |||||
| #include "app/common.hpp" | #include "app/common.hpp" | ||||
| #include <unistd.h> | #include <unistd.h> | ||||
| @@ -299,7 +300,7 @@ static void extractPackages(std::string path) { | |||||
| // public API | // public API | ||||
| //////////////////// | //////////////////// | ||||
| PluginManager::PluginManager(bool devMode) { | |||||
| PluginManager::PluginManager() { | |||||
| // Load core | // Load core | ||||
| // This function is defined in core.cpp | // This function is defined in core.cpp | ||||
| Plugin *corePlugin = new Plugin; | Plugin *corePlugin = new Plugin; | ||||
| @@ -310,7 +311,7 @@ PluginManager::PluginManager(bool devMode) { | |||||
| std::string userPlugins = asset::user("plugins"); | std::string userPlugins = asset::user("plugins"); | ||||
| mkdir(userPlugins.c_str(), 0755); | mkdir(userPlugins.c_str(), 0755); | ||||
| if (!devMode) { | |||||
| if (!context()->devMode) { | |||||
| // Copy Fundamental package to plugins directory if folder does not exist | // Copy Fundamental package to plugins directory if folder does not exist | ||||
| std::string fundamentalSrc = asset::system("Fundamental.zip"); | std::string fundamentalSrc = asset::system("Fundamental.zip"); | ||||
| std::string fundamentalDest = asset::user("plugins/Fundamental.zip"); | std::string fundamentalDest = asset::user("plugins/Fundamental.zip"); | ||||
| @@ -5,6 +5,7 @@ | |||||
| #include "app/Scene.hpp" | #include "app/Scene.hpp" | ||||
| #include "app/ModuleBrowser.hpp" | #include "app/ModuleBrowser.hpp" | ||||
| #include "engine/Engine.hpp" | #include "engine/Engine.hpp" | ||||
| #include "context.hpp" | |||||
| #include <jansson.h> | #include <jansson.h> | ||||
| @@ -36,17 +37,17 @@ static json_t *settingsToJson() { | |||||
| } | } | ||||
| // opacity | // opacity | ||||
| float opacity = gScene->toolbar->wireOpacity; | |||||
| float opacity = context()->scene->toolbar->wireOpacity; | |||||
| json_t *opacityJ = json_real(opacity); | json_t *opacityJ = json_real(opacity); | ||||
| json_object_set_new(rootJ, "wireOpacity", opacityJ); | json_object_set_new(rootJ, "wireOpacity", opacityJ); | ||||
| // tension | // tension | ||||
| float tension = gScene->toolbar->wireTension; | |||||
| float tension = context()->scene->toolbar->wireTension; | |||||
| json_t *tensionJ = json_real(tension); | json_t *tensionJ = json_real(tension); | ||||
| json_object_set_new(rootJ, "wireTension", tensionJ); | json_object_set_new(rootJ, "wireTension", tensionJ); | ||||
| // zoom | // zoom | ||||
| float zoom = gScene->zoomWidget->zoom; | |||||
| float zoom = context()->scene->zoomWidget->zoom; | |||||
| json_t *zoomJ = json_real(zoom); | json_t *zoomJ = json_real(zoom); | ||||
| json_object_set_new(rootJ, "zoom", zoomJ); | json_object_set_new(rootJ, "zoom", zoomJ); | ||||
| @@ -55,11 +56,11 @@ static json_t *settingsToJson() { | |||||
| json_object_set_new(rootJ, "allowCursorLock", allowCursorLockJ); | json_object_set_new(rootJ, "allowCursorLock", allowCursorLockJ); | ||||
| // sampleRate | // sampleRate | ||||
| json_t *sampleRateJ = json_real(gEngine->getSampleRate()); | |||||
| json_t *sampleRateJ = json_real(context()->engine->getSampleRate()); | |||||
| json_object_set_new(rootJ, "sampleRate", sampleRateJ); | json_object_set_new(rootJ, "sampleRate", sampleRateJ); | ||||
| // lastPath | // lastPath | ||||
| json_t *lastPathJ = json_string(gScene->rackWidget->lastPath.c_str()); | |||||
| json_t *lastPathJ = json_string(context()->scene->rackWidget->lastPath.c_str()); | |||||
| json_object_set_new(rootJ, "lastPath", lastPathJ); | json_object_set_new(rootJ, "lastPath", lastPathJ); | ||||
| // skipAutosaveOnLaunch | // skipAutosaveOnLaunch | ||||
| @@ -71,10 +72,10 @@ static json_t *settingsToJson() { | |||||
| json_object_set_new(rootJ, "moduleBrowser", moduleBrowserToJson()); | json_object_set_new(rootJ, "moduleBrowser", moduleBrowserToJson()); | ||||
| // powerMeter | // powerMeter | ||||
| json_object_set_new(rootJ, "powerMeter", json_boolean(gEngine->powerMeter)); | |||||
| json_object_set_new(rootJ, "powerMeter", json_boolean(context()->engine->powerMeter)); | |||||
| // checkVersion | // checkVersion | ||||
| json_object_set_new(rootJ, "checkVersion", json_boolean(gScene->checkVersion)); | |||||
| json_object_set_new(rootJ, "checkVersion", json_boolean(context()->scene->checkVersion)); | |||||
| return rootJ; | return rootJ; | ||||
| } | } | ||||
| @@ -104,17 +105,17 @@ static void settingsFromJson(json_t *rootJ) { | |||||
| // opacity | // opacity | ||||
| json_t *opacityJ = json_object_get(rootJ, "wireOpacity"); | json_t *opacityJ = json_object_get(rootJ, "wireOpacity"); | ||||
| if (opacityJ) | if (opacityJ) | ||||
| gScene->toolbar->wireOpacity = json_number_value(opacityJ); | |||||
| context()->scene->toolbar->wireOpacity = json_number_value(opacityJ); | |||||
| // tension | // tension | ||||
| json_t *tensionJ = json_object_get(rootJ, "wireTension"); | json_t *tensionJ = json_object_get(rootJ, "wireTension"); | ||||
| if (tensionJ) | if (tensionJ) | ||||
| gScene->toolbar->wireTension = json_number_value(tensionJ); | |||||
| context()->scene->toolbar->wireTension = json_number_value(tensionJ); | |||||
| // zoom | // zoom | ||||
| json_t *zoomJ = json_object_get(rootJ, "zoom"); | json_t *zoomJ = json_object_get(rootJ, "zoom"); | ||||
| if (zoomJ) { | if (zoomJ) { | ||||
| gScene->zoomWidget->setZoom(clamp((float) json_number_value(zoomJ), 0.25f, 4.0f)); | |||||
| context()->scene->zoomWidget->setZoom(clamp((float) json_number_value(zoomJ), 0.25f, 4.0f)); | |||||
| } | } | ||||
| // allowCursorLock | // allowCursorLock | ||||
| @@ -126,13 +127,13 @@ static void settingsFromJson(json_t *rootJ) { | |||||
| json_t *sampleRateJ = json_object_get(rootJ, "sampleRate"); | json_t *sampleRateJ = json_object_get(rootJ, "sampleRate"); | ||||
| if (sampleRateJ) { | if (sampleRateJ) { | ||||
| float sampleRate = json_number_value(sampleRateJ); | float sampleRate = json_number_value(sampleRateJ); | ||||
| gEngine->setSampleRate(sampleRate); | |||||
| context()->engine->setSampleRate(sampleRate); | |||||
| } | } | ||||
| // lastPath | // lastPath | ||||
| json_t *lastPathJ = json_object_get(rootJ, "lastPath"); | json_t *lastPathJ = json_object_get(rootJ, "lastPath"); | ||||
| if (lastPathJ) | if (lastPathJ) | ||||
| gScene->rackWidget->lastPath = json_string_value(lastPathJ); | |||||
| context()->scene->rackWidget->lastPath = json_string_value(lastPathJ); | |||||
| // skipAutosaveOnLaunch | // skipAutosaveOnLaunch | ||||
| json_t *skipAutosaveOnLaunchJ = json_object_get(rootJ, "skipAutosaveOnLaunch"); | json_t *skipAutosaveOnLaunchJ = json_object_get(rootJ, "skipAutosaveOnLaunch"); | ||||
| @@ -147,12 +148,12 @@ static void settingsFromJson(json_t *rootJ) { | |||||
| // powerMeter | // powerMeter | ||||
| json_t *powerMeterJ = json_object_get(rootJ, "powerMeter"); | json_t *powerMeterJ = json_object_get(rootJ, "powerMeter"); | ||||
| if (powerMeterJ) | if (powerMeterJ) | ||||
| gEngine->powerMeter = json_boolean_value(powerMeterJ); | |||||
| context()->engine->powerMeter = json_boolean_value(powerMeterJ); | |||||
| // checkVersion | // checkVersion | ||||
| json_t *checkVersionJ = json_object_get(rootJ, "checkVersion"); | json_t *checkVersionJ = json_object_get(rootJ, "checkVersion"); | ||||
| if (checkVersionJ) | if (checkVersionJ) | ||||
| gScene->checkVersion = json_boolean_value(checkVersionJ); | |||||
| context()->scene->checkVersion = json_boolean_value(checkVersionJ); | |||||
| } | } | ||||
| @@ -1,5 +1,6 @@ | |||||
| #include "widgets/Widget.hpp" | #include "widgets/Widget.hpp" | ||||
| #include "event.hpp" | #include "event.hpp" | ||||
| #include "context.hpp" | |||||
| #include <algorithm> | #include <algorithm> | ||||
| @@ -8,7 +9,7 @@ namespace rack { | |||||
| Widget::~Widget() { | Widget::~Widget() { | ||||
| // You should only delete orphaned widgets | // You should only delete orphaned widgets | ||||
| assert(!parent); | assert(!parent); | ||||
| event::gContext->finalizeWidget(this); | |||||
| context()->event->finalizeWidget(this); | |||||
| clearChildren(); | clearChildren(); | ||||
| } | } | ||||
| @@ -5,6 +5,7 @@ | |||||
| #include "keyboard.hpp" | #include "keyboard.hpp" | ||||
| #include "gamepad.hpp" | #include "gamepad.hpp" | ||||
| #include "event.hpp" | #include "event.hpp" | ||||
| #include "context.hpp" | |||||
| #include <map> | #include <map> | ||||
| #include <queue> | #include <queue> | ||||
| @@ -62,7 +63,7 @@ static void mouseButtonCallback(GLFWwindow *window, int button, int action, int | |||||
| } | } | ||||
| #endif | #endif | ||||
| event::gContext->handleButton(gMousePos, button, action, mods); | |||||
| context()->event->handleButton(gMousePos, button, action, mods); | |||||
| } | } | ||||
| struct MouseButtonArguments { | struct MouseButtonArguments { | ||||
| @@ -109,12 +110,12 @@ void cursorPosCallback(GLFWwindow* window, double xpos, double ypos) { | |||||
| gMousePos = mousePos; | gMousePos = mousePos; | ||||
| event::gContext->handleHover(mousePos, mouseDelta); | |||||
| context()->event->handleHover(mousePos, mouseDelta); | |||||
| } | } | ||||
| void cursorEnterCallback(GLFWwindow* window, int entered) { | void cursorEnterCallback(GLFWwindow* window, int entered) { | ||||
| if (!entered) { | if (!entered) { | ||||
| event::gContext->handleLeave(); | |||||
| context()->event->handleLeave(); | |||||
| } | } | ||||
| } | } | ||||
| @@ -126,15 +127,15 @@ void scrollCallback(GLFWwindow *window, double x, double y) { | |||||
| #endif | #endif | ||||
| scrollDelta = scrollDelta.mult(50.0); | scrollDelta = scrollDelta.mult(50.0); | ||||
| event::gContext->handleScroll(gMousePos, scrollDelta); | |||||
| context()->event->handleScroll(gMousePos, scrollDelta); | |||||
| } | } | ||||
| void charCallback(GLFWwindow *window, unsigned int codepoint) { | void charCallback(GLFWwindow *window, unsigned int codepoint) { | ||||
| event::gContext->handleText(gMousePos, codepoint); | |||||
| context()->event->handleText(gMousePos, codepoint); | |||||
| } | } | ||||
| void keyCallback(GLFWwindow *window, int key, int scancode, int action, int mods) { | void keyCallback(GLFWwindow *window, int key, int scancode, int action, int mods) { | ||||
| event::gContext->handleKey(gMousePos, key, scancode, action, mods); | |||||
| context()->event->handleKey(gMousePos, key, scancode, action, mods); | |||||
| // Keyboard MIDI driver | // Keyboard MIDI driver | ||||
| if (!(mods & (GLFW_MOD_SHIFT | GLFW_MOD_CONTROL | GLFW_MOD_ALT | GLFW_MOD_SUPER))) { | if (!(mods & (GLFW_MOD_SHIFT | GLFW_MOD_CONTROL | GLFW_MOD_ALT | GLFW_MOD_SUPER))) { | ||||
| @@ -152,7 +153,7 @@ void dropCallback(GLFWwindow *window, int count, const char **paths) { | |||||
| for (int i = 0; i < count; i++) { | for (int i = 0; i < count; i++) { | ||||
| pathsVec.push_back(paths[i]); | pathsVec.push_back(paths[i]); | ||||
| } | } | ||||
| event::gContext->handleDrop(gMousePos, pathsVec); | |||||
| context()->event->handleDrop(gMousePos, pathsVec); | |||||
| } | } | ||||
| void errorCallback(int error, const char *description) { | void errorCallback(int error, const char *description) { | ||||
| @@ -168,7 +169,7 @@ void renderGui() { | |||||
| nvgReset(gVg); | nvgReset(gVg); | ||||
| nvgScale(gVg, gPixelRatio, gPixelRatio); | nvgScale(gVg, gPixelRatio, gPixelRatio); | ||||
| event::gContext->rootWidget->draw(gVg); | |||||
| context()->event->rootWidget->draw(gVg); | |||||
| glViewport(0, 0, width, height); | glViewport(0, 0, width, height); | ||||
| glClearColor(0.0, 0.0, 0.0, 1.0); | glClearColor(0.0, 0.0, 0.0, 1.0); | ||||
| @@ -307,9 +308,9 @@ void windowRun() { | |||||
| windowTitle = APP_NAME; | windowTitle = APP_NAME; | ||||
| windowTitle += " "; | windowTitle += " "; | ||||
| windowTitle += APP_VERSION; | windowTitle += APP_VERSION; | ||||
| if (!gScene->rackWidget->lastPath.empty()) { | |||||
| if (!context()->scene->rackWidget->lastPath.empty()) { | |||||
| windowTitle += " - "; | windowTitle += " - "; | ||||
| windowTitle += string::filename(gScene->rackWidget->lastPath); | |||||
| windowTitle += string::filename(context()->scene->rackWidget->lastPath); | |||||
| } | } | ||||
| if (windowTitle != lastWindowTitle) { | if (windowTitle != lastWindowTitle) { | ||||
| glfwSetWindowTitle(gWindow, windowTitle.c_str()); | glfwSetWindowTitle(gWindow, windowTitle.c_str()); | ||||
| @@ -321,7 +322,7 @@ void windowRun() { | |||||
| glfwGetWindowContentScale(gWindow, &pixelRatio, NULL); | glfwGetWindowContentScale(gWindow, &pixelRatio, NULL); | ||||
| pixelRatio = roundf(pixelRatio); | pixelRatio = roundf(pixelRatio); | ||||
| if (pixelRatio != gPixelRatio) { | if (pixelRatio != gPixelRatio) { | ||||
| event::gContext->handleZoom(); | |||||
| context()->event->handleZoom(); | |||||
| gPixelRatio = pixelRatio; | gPixelRatio = pixelRatio; | ||||
| } | } | ||||
| @@ -332,10 +333,10 @@ void windowRun() { | |||||
| glfwGetWindowSize(gWindow, &windowWidth, &windowHeight); | glfwGetWindowSize(gWindow, &windowWidth, &windowHeight); | ||||
| gWindowRatio = (float)width / windowWidth; | gWindowRatio = (float)width / windowWidth; | ||||
| event::gContext->rootWidget->box.size = Vec(width, height).div(gPixelRatio); | |||||
| context()->event->rootWidget->box.size = Vec(width, height).div(gPixelRatio); | |||||
| // Step scene | // Step scene | ||||
| event::gContext->rootWidget->step(); | |||||
| context()->event->rootWidget->step(); | |||||
| // Render | // Render | ||||
| bool visible = glfwGetWindowAttrib(gWindow, GLFW_VISIBLE) && !glfwGetWindowAttrib(gWindow, GLFW_ICONIFIED); | bool visible = glfwGetWindowAttrib(gWindow, GLFW_VISIBLE) && !glfwGetWindowAttrib(gWindow, GLFW_ICONIFIED); | ||||