mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-10-31 05:01:05 +01:00 
			
		
		
		
	IO, Backends: add io.AddFocusEvent(). Clear pressed keys after loosing input focus (#3532)
Amend/fix #2445, #2696, #3751, #4377
This commit is contained in:
		| @@ -16,7 +16,8 @@ | ||||
|  | ||||
| // CHANGELOG | ||||
| // (minor and older changes stripped away, please see git history for details) | ||||
| //  2021-07-29: *BREAKING CHANGE*: Inputs: MousePos is correctly reported when the host platform window is hovered but not focused (using glfwSetCursorEnterCallback). If you called ImGui_ImplGlfw_InitXXX() with install_callbacks = false, you MUST install the glfwSetCursorEnterCallback() callback and the forward to the backend via ImGui_ImplGlfw_CursorEnterCallback(). | ||||
| //  2021-08-17: *BREAKING CHANGE*: Now using glfwSetWindowFocusCallback() to calling io.AddFocusEvent(). If you called ImGui_ImplGlfw_InitXXX() with install_callbacks = false, you MUST install glfwSetWindowFocusCallback() and forward it to the backend via ImGui_ImplGlfw_WindowFocusCallback(). | ||||
| //  2021-07-29: *BREAKING CHANGE*: Now using glfwSetCursorEnterCallback(). MousePos is correctly reported when the host platform window is hovered but not focused. If you called ImGui_ImplGlfw_InitXXX() with install_callbacks = false, you MUST install glfwSetWindowFocusCallback() callback and forward it to the backend via ImGui_ImplGlfw_CursorEnterCallback(). | ||||
| //  2021-06-29: Reorganized backend to pull data from a single structure to facilitate usage with multiple-contexts (all g_XXXX access changed to bd->XXXX). | ||||
| //  2020-01-17: Inputs: Disable error callback while assigning mouse cursors because some X11 setup don't have them and it generates errors. | ||||
| //  2019-12-05: Inputs: Added support for new mouse cursors added in GLFW 3.4+ (resizing cursors, not allowed cursor). | ||||
| @@ -80,6 +81,7 @@ struct ImGui_ImplGlfw_Data | ||||
|     bool                    InstalledCallbacks; | ||||
|  | ||||
|     // Chain GLFW callbacks: our callbacks will call the user's previously installed callbacks, if any. | ||||
|     GLFWwindowfocusfun      PrevUserCallbackWindowFocus; | ||||
|     GLFWcursorenterfun      PrevUserCallbackCursorEnter; | ||||
|     GLFWmousebuttonfun      PrevUserCallbackMousebutton; | ||||
|     GLFWscrollfun           PrevUserCallbackScroll; | ||||
| @@ -160,11 +162,22 @@ void ImGui_ImplGlfw_KeyCallback(GLFWwindow* window, int key, int scancode, int a | ||||
| #endif | ||||
| } | ||||
|  | ||||
| void ImGui_ImplGlfw_WindowFocusCallback(GLFWwindow* window, int focused) | ||||
| { | ||||
|     ImGui_ImplGlfw_Data* bd = ImGui_ImplGlfw_GetBackendData(); | ||||
|     if (bd->PrevUserCallbackWindowFocus != NULL && window == bd->Window) | ||||
|         bd->PrevUserCallbackWindowFocus(window, focused); | ||||
|  | ||||
|     ImGuiIO& io = ImGui::GetIO(); | ||||
|     io.AddFocusEvent(focused != 0); | ||||
| } | ||||
|  | ||||
| void ImGui_ImplGlfw_CursorEnterCallback(GLFWwindow* window, int entered) | ||||
| { | ||||
|     ImGui_ImplGlfw_Data* bd = ImGui_ImplGlfw_GetBackendData(); | ||||
|     if (bd->PrevUserCallbackCursorEnter != NULL) | ||||
|     if (bd->PrevUserCallbackCursorEnter != NULL && window == bd->Window) | ||||
|         bd->PrevUserCallbackCursorEnter(window, entered); | ||||
|  | ||||
|     if (entered) | ||||
|         bd->MouseWindow = window; | ||||
|     if (!entered && bd->MouseWindow == window) | ||||
| @@ -256,6 +269,7 @@ static bool ImGui_ImplGlfw_Init(GLFWwindow* window, bool install_callbacks, Glfw | ||||
|     glfwSetErrorCallback(prev_error_callback); | ||||
|  | ||||
|     // Chain GLFW callbacks: our callbacks will call the user's previously installed callbacks, if any. | ||||
|     bd->PrevUserCallbackWindowFocus = NULL; | ||||
|     bd->PrevUserCallbackMousebutton = NULL; | ||||
|     bd->PrevUserCallbackScroll = NULL; | ||||
|     bd->PrevUserCallbackKey = NULL; | ||||
| @@ -264,6 +278,7 @@ static bool ImGui_ImplGlfw_Init(GLFWwindow* window, bool install_callbacks, Glfw | ||||
|     if (install_callbacks) | ||||
|     { | ||||
|         bd->InstalledCallbacks = true; | ||||
|         bd->PrevUserCallbackWindowFocus = glfwSetWindowFocusCallback(window, ImGui_ImplGlfw_WindowFocusCallback); | ||||
|         bd->PrevUserCallbackCursorEnter = glfwSetCursorEnterCallback(window, ImGui_ImplGlfw_CursorEnterCallback); | ||||
|         bd->PrevUserCallbackMousebutton = glfwSetMouseButtonCallback(window, ImGui_ImplGlfw_MouseButtonCallback); | ||||
|         bd->PrevUserCallbackScroll = glfwSetScrollCallback(window, ImGui_ImplGlfw_ScrollCallback); | ||||
| @@ -298,6 +313,7 @@ void ImGui_ImplGlfw_Shutdown() | ||||
|  | ||||
|     if (bd->InstalledCallbacks) | ||||
|     { | ||||
|         glfwSetWindowFocusCallback(bd->Window, bd->PrevUserCallbackWindowFocus); | ||||
|         glfwSetCursorEnterCallback(bd->Window, bd->PrevUserCallbackCursorEnter); | ||||
|         glfwSetMouseButtonCallback(bd->Window, bd->PrevUserCallbackMousebutton); | ||||
|         glfwSetScrollCallback(bd->Window, bd->PrevUserCallbackScroll); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user