mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-10-31 13:11:05 +01:00 
			
		
		
		
	Backends: Win32, SDL, GLFW: only honor io.WantSetMousePos when focused + fix GLFW uninstalling handler + tweaks to reduce branch drift with docking. (#787, #2445, #2696, #3751, #4377)
This commit is contained in:
		| @@ -55,7 +55,7 @@ | ||||
| #define GLFW_HAS_WINDOW_ALPHA         (GLFW_VERSION_MAJOR * 1000 + GLFW_VERSION_MINOR * 100 >= 3300) // 3.3+ glfwSetWindowOpacity | ||||
| #define GLFW_HAS_PER_MONITOR_DPI      (GLFW_VERSION_MAJOR * 1000 + GLFW_VERSION_MINOR * 100 >= 3300) // 3.3+ glfwGetMonitorContentScale | ||||
| #define GLFW_HAS_VULKAN               (GLFW_VERSION_MAJOR * 1000 + GLFW_VERSION_MINOR * 100 >= 3200) // 3.2+ glfwCreateWindowSurface | ||||
| #ifdef GLFW_RESIZE_NESW_CURSOR  // let's be nice to people who pulled GLFW between 2019-04-16 (3.4 define) and 2019-11-29 (cursors defines) // FIXME: Remove when GLFW 3.4 is released? | ||||
| #ifdef GLFW_RESIZE_NESW_CURSOR        // Let's be nice to people who pulled GLFW between 2019-04-16 (3.4 define) and 2019-11-29 (cursors defines) // FIXME: Remove when GLFW 3.4 is released? | ||||
| #define GLFW_HAS_NEW_CURSORS          (GLFW_VERSION_MAJOR * 1000 + GLFW_VERSION_MINOR * 100 >= 3400) // 3.4+ GLFW_RESIZE_ALL_CURSOR, GLFW_RESIZE_NESW_CURSOR, GLFW_RESIZE_NWSE_CURSOR, GLFW_NOT_ALLOWED_CURSOR | ||||
| #else | ||||
| #define GLFW_HAS_NEW_CURSORS          (0) | ||||
| @@ -116,7 +116,7 @@ static void ImGui_ImplGlfw_SetClipboardText(void* user_data, const char* text) | ||||
| void ImGui_ImplGlfw_MouseButtonCallback(GLFWwindow* window, int button, int action, int mods) | ||||
| { | ||||
|     ImGui_ImplGlfw_Data* bd = ImGui_ImplGlfw_GetBackendData(); | ||||
|     if (bd->PrevUserCallbackMousebutton != NULL) | ||||
|     if (bd->PrevUserCallbackMousebutton != NULL && window == bd->Window) | ||||
|         bd->PrevUserCallbackMousebutton(window, button, action, mods); | ||||
|  | ||||
|     if (action == GLFW_PRESS && button >= 0 && button < IM_ARRAYSIZE(bd->MouseJustPressed)) | ||||
| @@ -126,7 +126,7 @@ void ImGui_ImplGlfw_MouseButtonCallback(GLFWwindow* window, int button, int acti | ||||
| void ImGui_ImplGlfw_ScrollCallback(GLFWwindow* window, double xoffset, double yoffset) | ||||
| { | ||||
|     ImGui_ImplGlfw_Data* bd = ImGui_ImplGlfw_GetBackendData(); | ||||
|     if (bd->PrevUserCallbackScroll != NULL) | ||||
|     if (bd->PrevUserCallbackScroll != NULL && window == bd->Window) | ||||
|         bd->PrevUserCallbackScroll(window, xoffset, yoffset); | ||||
|  | ||||
|     ImGuiIO& io = ImGui::GetIO(); | ||||
| @@ -137,7 +137,7 @@ void ImGui_ImplGlfw_ScrollCallback(GLFWwindow* window, double xoffset, double yo | ||||
| void ImGui_ImplGlfw_KeyCallback(GLFWwindow* window, int key, int scancode, int action, int mods) | ||||
| { | ||||
|     ImGui_ImplGlfw_Data* bd = ImGui_ImplGlfw_GetBackendData(); | ||||
|     if (bd->PrevUserCallbackKey != NULL) | ||||
|     if (bd->PrevUserCallbackKey != NULL && window == bd->Window) | ||||
|         bd->PrevUserCallbackKey(window, key, scancode, action, mods); | ||||
|  | ||||
|     ImGuiIO& io = ImGui::GetIO(); | ||||
| @@ -174,7 +174,7 @@ void ImGui_ImplGlfw_CursorEnterCallback(GLFWwindow* window, int entered) | ||||
| void ImGui_ImplGlfw_CharCallback(GLFWwindow* window, unsigned int c) | ||||
| { | ||||
|     ImGui_ImplGlfw_Data* bd = ImGui_ImplGlfw_GetBackendData(); | ||||
|     if (bd->PrevUserCallbackChar != NULL) | ||||
|     if (bd->PrevUserCallbackChar != NULL && window == bd->Window) | ||||
|         bd->PrevUserCallbackChar(window, c); | ||||
|  | ||||
|     ImGuiIO& io = ImGui::GetIO(); | ||||
| @@ -298,6 +298,7 @@ void ImGui_ImplGlfw_Shutdown() | ||||
|  | ||||
|     if (bd->InstalledCallbacks) | ||||
|     { | ||||
|         glfwSetCursorEnterCallback(bd->Window, bd->PrevUserCallbackCursorEnter); | ||||
|         glfwSetMouseButtonCallback(bd->Window, bd->PrevUserCallbackMousebutton); | ||||
|         glfwSetScrollCallback(bd->Window, bd->PrevUserCallbackScroll); | ||||
|         glfwSetKeyCallback(bd->Window, bd->PrevUserCallbackKey); | ||||
| @@ -316,32 +317,32 @@ void ImGui_ImplGlfw_Shutdown() | ||||
| static void ImGui_ImplGlfw_UpdateMousePosAndButtons() | ||||
| { | ||||
|     ImGui_ImplGlfw_Data* bd = ImGui_ImplGlfw_GetBackendData(); | ||||
|  | ||||
|     // Update buttons | ||||
|     ImGuiIO& io = ImGui::GetIO(); | ||||
|  | ||||
|     const ImVec2 mouse_pos_prev = io.MousePos; | ||||
|     io.MousePos = ImVec2(-FLT_MAX, -FLT_MAX); | ||||
|  | ||||
|     // Update mouse buttons | ||||
|     // (if a mouse press event came, always pass it as "mouse held this frame", so we don't miss click-release events that are shorter than 1 frame) | ||||
|     for (int i = 0; i < IM_ARRAYSIZE(io.MouseDown); i++) | ||||
|     { | ||||
|         // If a mouse press event came, always pass it as "mouse held this frame", so we don't miss click-release events that are shorter than 1 frame. | ||||
|         io.MouseDown[i] = bd->MouseJustPressed[i] || glfwGetMouseButton(bd->Window, i) != 0; | ||||
|         bd->MouseJustPressed[i] = false; | ||||
|     } | ||||
|  | ||||
| #ifdef __EMSCRIPTEN__ | ||||
|     const bool focused = true; // Emscripten | ||||
|     const bool focused = true; | ||||
| #else | ||||
|     const bool focused = glfwGetWindowAttrib(bd->Window, GLFW_FOCUSED) != 0; | ||||
| #endif | ||||
|     GLFWwindow* mouse_window = (bd->MouseWindow == bd->Window || focused) ? bd->Window : NULL; | ||||
|  | ||||
|     // Update mouse position | ||||
|     const ImVec2 mouse_pos_backup = io.MousePos; | ||||
|     io.MousePos = ImVec2(-FLT_MAX, -FLT_MAX); | ||||
|     if (io.WantSetMousePos) | ||||
|     { | ||||
|         if (focused) | ||||
|             glfwSetCursorPos(bd->Window, (double)mouse_pos_backup.x, (double)mouse_pos_backup.y); | ||||
|     } | ||||
|     else if (mouse_window != NULL) | ||||
|     // Set OS mouse position from Dear ImGui if requested (rarely used, only when ImGuiConfigFlags_NavEnableSetMousePos is enabled by user) | ||||
|     if (io.WantSetMousePos && focused) | ||||
|         glfwSetCursorPos(bd->Window, (double)mouse_pos_prev.x, (double)mouse_pos_prev.y); | ||||
|  | ||||
|     // Set Dear ImGui mouse position from OS position | ||||
|     if (mouse_window != NULL) | ||||
|     { | ||||
|         double mouse_x, mouse_y; | ||||
|         glfwGetCursorPos(mouse_window, &mouse_x, &mouse_y); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user