mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-10-31 13:11:05 +01:00 
			
		
		
		
	Backends, Viewports: GLFW: Add a workaround for stuck keys after closing a GLFW window (#3837).
This commit is contained in:
		| @@ -84,6 +84,7 @@ static GlfwClientApi        g_ClientApi = GlfwClientApi_Unknown; | ||||
| static double               g_Time = 0.0; | ||||
| static bool                 g_MouseJustPressed[ImGuiMouseButton_COUNT] = {}; | ||||
| static GLFWcursor*          g_MouseCursors[ImGuiMouseCursor_COUNT] = {}; | ||||
| static GLFWwindow*          g_KeyOwnerWindows[512] = {}; | ||||
| static bool                 g_InstalledCallbacks = false; | ||||
| static bool                 g_WantUpdateMonitors = true; | ||||
|  | ||||
| @@ -135,9 +136,15 @@ void ImGui_ImplGlfw_KeyCallback(GLFWwindow* window, int key, int scancode, int a | ||||
|  | ||||
|     ImGuiIO& io = ImGui::GetIO(); | ||||
|     if (action == GLFW_PRESS) | ||||
|     { | ||||
|         io.KeysDown[key] = true; | ||||
|         g_KeyOwnerWindows[key] = window; | ||||
|     } | ||||
|     if (action == GLFW_RELEASE) | ||||
|     { | ||||
|         io.KeysDown[key] = false; | ||||
|         g_KeyOwnerWindows[key] = NULL; | ||||
|     } | ||||
|  | ||||
|     // Modifiers are not reliable across systems | ||||
|     io.KeyCtrl = io.KeysDown[GLFW_KEY_LEFT_CONTROL] || io.KeysDown[GLFW_KEY_RIGHT_CONTROL]; | ||||
| @@ -607,6 +614,13 @@ static void ImGui_ImplGlfw_DestroyWindow(ImGuiViewport* viewport) | ||||
|             HWND hwnd = (HWND)viewport->PlatformHandleRaw; | ||||
|             ::RemovePropA(hwnd, "IMGUI_VIEWPORT"); | ||||
| #endif | ||||
|  | ||||
|             // Release any keys that were pressed in the window being destroyed and are still held down, | ||||
|             // because we will not receive any release events after window is destroyed. | ||||
|             for (int i = 0; i < IM_ARRAYSIZE(g_KeyOwnerWindows); i++) | ||||
|                 if (g_KeyOwnerWindows[i] == data->Window) | ||||
|                     ImGui_ImplGlfw_KeyCallback(data->Window, i, 0, GLFW_RELEASE, 0); // Later params are only used for main viewport, on which this function is never called. | ||||
|  | ||||
|             glfwDestroyWindow(data->Window); | ||||
|         } | ||||
|         data->Window = NULL; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user