diff --git a/include/settings.hpp b/include/settings.hpp index 767e0cd8..ba27f917 100644 --- a/include/settings.hpp +++ b/include/settings.hpp @@ -38,6 +38,7 @@ extern float frameRateLimit; extern bool frameRateSync; extern float autosavePeriod; extern bool skipLoadOnLaunch; +extern bool pauseUnfocused; extern std::string patchPath; extern std::vector cableColors; diff --git a/include/window.hpp b/include/window.hpp index dbf4edcc..33816836 100644 --- a/include/window.hpp +++ b/include/window.hpp @@ -64,6 +64,7 @@ struct Window { int frame = 0; /** The last known absolute mouse position in the window */ math::Vec mousePos; + bool focused; std::shared_ptr uiFont; double frameTimeStart = 0.f; diff --git a/src/app/MenuBar.cpp b/src/app/MenuBar.cpp index a2bb9500..48feeddb 100644 --- a/src/app/MenuBar.cpp +++ b/src/app/MenuBar.cpp @@ -391,6 +391,12 @@ struct EnginePauseItem : ui::MenuItem { } }; +struct EnginePauseUnfocusedItem : ui::MenuItem { + void onAction(const event::Action& e) override { + settings::pauseUnfocused ^= true; + } +}; + struct SampleRateValueItem : ui::MenuItem { float sampleRate; void onAction(const event::Action& e) override { @@ -480,6 +486,11 @@ struct EngineButton : MenuButton { cpuMeterItem->rightText = CHECKMARK(settings::cpuMeter); menu->addChild(cpuMeterItem); + EnginePauseUnfocusedItem* enginePauseUnfocusedItem = new EnginePauseUnfocusedItem; + enginePauseUnfocusedItem->text = "Pause unfocused"; + enginePauseUnfocusedItem->rightText = CHECKMARK(settings::pauseUnfocused); + menu->addChild(enginePauseUnfocusedItem); + SampleRateItem* sampleRateItem = new SampleRateItem; sampleRateItem->text = "Sample rate"; sampleRateItem->rightText = RIGHT_ARROW; diff --git a/src/settings.cpp b/src/settings.cpp index 954a0952..45222033 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -33,6 +33,7 @@ float frameRateLimit = 70.0; bool frameRateSync = true; float autosavePeriod = 15.0; bool skipLoadOnLaunch = false; +bool pauseUnfocused = false; std::string patchPath; std::vector cableColors = { nvgRGB(0xc9, 0xb7, 0x0e), // yellow @@ -64,6 +65,7 @@ json_t* toJson() { json_object_set_new(rootJ, "allowCursorLock", json_boolean(allowCursorLock)); json_object_set_new(rootJ, "realTime", json_boolean(realTime)); + json_object_set_new(rootJ, "sampleRate", json_real(sampleRate)); @@ -85,6 +87,8 @@ json_t* toJson() { json_object_set_new(rootJ, "skipLoadOnLaunch", json_true()); } + json_object_set_new(rootJ, "pauseUnfocused", json_boolean(pauseUnfocused)); + json_object_set_new(rootJ, "patchPath", json_string(patchPath.c_str())); json_t* cableColorsJ = json_array(); @@ -176,6 +180,10 @@ void fromJson(json_t* rootJ) { if (skipLoadOnLaunchJ) skipLoadOnLaunch = json_boolean_value(skipLoadOnLaunchJ); + json_t *pauseUnfocusedJ = json_object_get(rootJ, "pauseUnfocused"); + if (pauseUnfocusedJ) + pauseUnfocused = json_boolean_value(pauseUnfocusedJ); + json_t* patchPathJ = json_object_get(rootJ, "patchPath"); if (patchPathJ) patchPath = json_string_value(patchPathJ); diff --git a/src/window.cpp b/src/window.cpp index 3cab776f..ba47c173 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -9,6 +9,7 @@ #include #include // used in Window::screenshot #include // used in Window::screenshot +#include #include #include @@ -97,6 +98,14 @@ struct Window::Internal { bool ignoreNextMouseDelta = false; }; +static void windowFocusCallback(GLFWwindow* win, int focused) { + Window* window = (Window*) glfwGetWindowUserPointer(win); + window->focused = focused == GLFW_TRUE; + + if (settings::pauseUnfocused) { + APP->engine->setPaused(!window->focused); + } +} static void windowSizeCallback(GLFWwindow* win, int width, int height) { // Do nothing. Window size is reset each frame anyway. @@ -252,6 +261,7 @@ Window::Window() { glfwSwapInterval(settings::frameRateSync ? 1 : 0); // Set window callbacks + glfwSetWindowFocusCallback(win, windowFocusCallback); glfwSetWindowSizeCallback(win, windowSizeCallback); glfwSetMouseButtonCallback(win, mouseButtonCallback); // Call this ourselves, but on every frame instead of only when the mouse moves