| @@ -129,28 +129,6 @@ void mouseButtonCallback(GLFWwindow *window, int button, int action, int mods) { | |||||
| } | } | ||||
| } | } | ||||
| struct MouseButtonArguments { | |||||
| GLFWwindow *window; | |||||
| int button; | |||||
| int action; | |||||
| int mods; | |||||
| }; | |||||
| static std::queue<MouseButtonArguments> 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) { | void cursorPosCallback(GLFWwindow* window, double xpos, double ypos) { | ||||
| Vec mousePos = Vec(xpos, ypos).div(gPixelRatio / gWindowRatio).round(); | Vec mousePos = Vec(xpos, ypos).div(gPixelRatio / gWindowRatio).round(); | ||||
| Vec mouseRel = mousePos.minus(gMousePos); | Vec mouseRel = mousePos.minus(gMousePos); | ||||
| @@ -280,11 +258,13 @@ void keyCallback(GLFWwindow *window, int key, int scancode, int action, int mods | |||||
| } | } | ||||
| // Keyboard MIDI driver | // Keyboard MIDI driver | ||||
| if (action == GLFW_PRESS) { | |||||
| keyboardPress(key); | |||||
| } | |||||
| else if (action == GLFW_RELEASE) { | |||||
| keyboardRelease(key); | |||||
| if (!(mods & (GLFW_MOD_SHIFT | GLFW_MOD_CONTROL | GLFW_MOD_ALT | GLFW_MOD_SUPER))) { | |||||
| if (action == GLFW_PRESS) { | |||||
| keyboardPress(key); | |||||
| } | |||||
| else if (action == GLFW_RELEASE) { | |||||
| keyboardRelease(key); | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| @@ -353,10 +333,12 @@ void windowInit() { | |||||
| glfwSwapInterval(1); | glfwSwapInterval(1); | ||||
| glfwSetInputMode(gWindow, GLFW_STICKY_MOUSE_BUTTONS, 1); | |||||
| glfwSetInputMode(gWindow, GLFW_STICKY_KEYS, 1); | |||||
| glfwSetInputMode(gWindow, GLFW_LOCK_KEY_MODS, 1); | glfwSetInputMode(gWindow, GLFW_LOCK_KEY_MODS, 1); | ||||
| glfwSetWindowSizeCallback(gWindow, windowSizeCallback); | glfwSetWindowSizeCallback(gWindow, windowSizeCallback); | ||||
| glfwSetMouseButtonCallback(gWindow, mouseButtonStickyCallback); | |||||
| glfwSetMouseButtonCallback(gWindow, mouseButtonCallback); | |||||
| // Call this ourselves, but on every frame instead of only when the mouse moves | // Call this ourselves, but on every frame instead of only when the mouse moves | ||||
| // glfwSetCursorPosCallback(gWindow, cursorPosCallback); | // glfwSetCursorPosCallback(gWindow, cursorPosCallback); | ||||
| glfwSetCursorEnterCallback(gWindow, cursorEnterCallback); | glfwSetCursorEnterCallback(gWindow, cursorEnterCallback); | ||||
| @@ -442,7 +424,6 @@ void windowRun() { | |||||
| glfwGetCursorPos(gWindow, &xpos, &ypos); | glfwGetCursorPos(gWindow, &xpos, &ypos); | ||||
| cursorPosCallback(gWindow, xpos, ypos); | cursorPosCallback(gWindow, xpos, ypos); | ||||
| } | } | ||||
| mouseButtonStickyPop(); | |||||
| gamepadStep(); | gamepadStep(); | ||||
| // Set window title | // Set window title | ||||