From d6d1df093082cb5ed975530ac3fd6fbea29ef8fd Mon Sep 17 00:00:00 2001 From: Andrew Belt Date: Wed, 6 Jun 2018 17:18:25 -0400 Subject: [PATCH] Revert "Use GLFW sticky key implementation" This reverts commit a5dac7d8772399f1a59a6f7f7b2b1e72791f48f5. --- src/window.cpp | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/src/window.cpp b/src/window.cpp index c97217d8..986ba294 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -129,6 +129,28 @@ void mouseButtonCallback(GLFWwindow *window, int button, int action, int mods) { } } +struct MouseButtonArguments { + GLFWwindow *window; + int button; + int action; + int mods; +}; + +static std::queue mouseButtonQueue; +void mouseButtonStickyPop() { + if (!mouseButtonQueue.empty()) { + MouseButtonArguments args = mouseButtonQueue.front(); + mouseButtonQueue.pop(); + mouseButtonCallback(args.window, args.button, args.action, args.mods); + } +} + +void mouseButtonStickyCallback(GLFWwindow *window, int button, int action, int mods) { + // Defer multiple clicks per frame to future frames + MouseButtonArguments args = {window, button, action, mods}; + mouseButtonQueue.push(args); +} + void cursorPosCallback(GLFWwindow* window, double xpos, double ypos) { Vec mousePos = Vec(xpos, ypos).div(gPixelRatio / gWindowRatio).round(); Vec mouseRel = mousePos.minus(gMousePos); @@ -333,12 +355,10 @@ void windowInit() { glfwSwapInterval(1); - glfwSetInputMode(gWindow, GLFW_STICKY_MOUSE_BUTTONS, 1); - glfwSetInputMode(gWindow, GLFW_STICKY_KEYS, 1); glfwSetInputMode(gWindow, GLFW_LOCK_KEY_MODS, 1); glfwSetWindowSizeCallback(gWindow, windowSizeCallback); - glfwSetMouseButtonCallback(gWindow, mouseButtonCallback); + glfwSetMouseButtonCallback(gWindow, mouseButtonStickyCallback); // Call this ourselves, but on every frame instead of only when the mouse moves // glfwSetCursorPosCallback(gWindow, cursorPosCallback); glfwSetCursorEnterCallback(gWindow, cursorEnterCallback); @@ -424,6 +444,7 @@ void windowRun() { glfwGetCursorPos(gWindow, &xpos, &ypos); cursorPosCallback(gWindow, xpos, ypos); } + mouseButtonStickyPop(); gamepadStep(); // Set window title