Browse Source

Add option to pause engine when window loses focus

pull/1562/head
Dmitry Wolf 5 years ago
parent
commit
a3bc3a7a1c
5 changed files with 31 additions and 0 deletions
  1. +1
    -0
      include/settings.hpp
  2. +1
    -0
      include/window.hpp
  3. +11
    -0
      src/app/MenuBar.cpp
  4. +8
    -0
      src/settings.cpp
  5. +10
    -0
      src/window.cpp

+ 1
- 0
include/settings.hpp View File

@@ -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<NVGcolor> cableColors;



+ 1
- 0
include/window.hpp View File

@@ -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<Font> uiFont;
double frameTimeStart = 0.f;



+ 11
- 0
src/app/MenuBar.cpp View File

@@ -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;


+ 8
- 0
src/settings.cpp View File

@@ -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<NVGcolor> 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);


+ 10
- 0
src/window.cpp View File

@@ -9,6 +9,7 @@
#include <settings.hpp>
#include <plugin.hpp> // used in Window::screenshot
#include <system.hpp> // used in Window::screenshot
#include <engine/Engine.hpp>

#include <map>
#include <queue>
@@ -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


Loading…
Cancel
Save