From f86286548ef248a60e9a3d815cfa9c10628cecd9 Mon Sep 17 00:00:00 2001 From: ocornut Date: Tue, 30 Sep 2014 09:57:44 +0100 Subject: [PATCH] OpenGL example: Tentative fix for missed tap-to-click events on MacBook trackpad --- examples/opengl_example/main.cpp | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/examples/opengl_example/main.cpp b/examples/opengl_example/main.cpp index 3007c05ab..465c4aea6 100644 --- a/examples/opengl_example/main.cpp +++ b/examples/opengl_example/main.cpp @@ -19,6 +19,7 @@ static GLFWwindow* window; static GLuint fontTex; +static bool mousePressed[2] = { false, false }; static ImVec2 mousePosScale(1.0f, 1.0f); // This is the main rendering function that you have to implement and provide to ImGui (via setting up 'RenderDrawListsFn' in the ImGuiIO structure) @@ -112,6 +113,12 @@ static void glfw_error_callback(int error, const char* description) fputs(description, stderr); } +static void glfw_mouse_button_callback(GLFWwindow* window, int button, int action, int mods) +{ + if (action == GLFW_PRESS && button >= 0 && button < 2) + mousePressed[button] = true; +} + static void glfw_scroll_callback(GLFWwindow* window, double xoffset, double yoffset) { ImGuiIO& io = ImGui::GetIO(); @@ -147,6 +154,7 @@ void InitGL() window = glfwCreateWindow(1280, 720, "ImGui OpenGL example", NULL, NULL); glfwMakeContextCurrent(window); glfwSetKeyCallback(window, glfw_key_callback); + glfwSetMouseButtonCallback(window, glfw_mouse_button_callback); glfwSetScrollCallback(window, glfw_scroll_callback); glfwSetCharCallback(window, glfw_char_callback); @@ -243,9 +251,9 @@ void UpdateImGui() // (we already got mouse wheel, keyboard keys & characters from glfw callbacks polled in glfwPollEvents()) double mouse_x, mouse_y; glfwGetCursorPos(window, &mouse_x, &mouse_y); - io.MousePos = ImVec2((float)mouse_x * mousePosScale.x, (float)mouse_y * mousePosScale.y); // Mouse position, in pixels (set to -1,-1 if no mouse / on another screen, etc.) - io.MouseDown[0] = glfwGetMouseButton(window, GLFW_MOUSE_BUTTON_LEFT) != 0; - io.MouseDown[1] = glfwGetMouseButton(window, GLFW_MOUSE_BUTTON_RIGHT) != 0; + io.MousePos = ImVec2((float)mouse_x * mousePosScale.x, (float)mouse_y * mousePosScale.y); // Mouse position, in pixels (set to -1,-1 if no mouse / on another screen, etc.) + io.MouseDown[0] = mousePressed[0] || glfwGetMouseButton(window, GLFW_MOUSE_BUTTON_LEFT) != 0; // If a mouse press event came, always pass it, so we don't miss click-release events that are shorted than our frame. + io.MouseDown[1] = mousePressed[1] || glfwGetMouseButton(window, GLFW_MOUSE_BUTTON_RIGHT) != 0; // Start the frame ImGui::NewFrame(); @@ -260,6 +268,7 @@ int main(int argc, char** argv) while (!glfwWindowShouldClose(window)) { ImGuiIO& io = ImGui::GetIO(); + mousePressed[0] = mousePressed[1] = false; io.MouseWheel = 0; glfwPollEvents(); UpdateImGui();