mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-10-31 05:01:05 +01:00 
			
		
		
		
	Backends: GLFW: Update mouse inputs using glfwSetCursorPosCallback() (breaking) + fallback to provide it when focused but not hovered/captured + update MousePos before MouseButtons.
+ Allegro5 remove unnecessary clear.
This commit is contained in:
		| @@ -16,6 +16,7 @@ | ||||
|  | ||||
| // CHANGELOG | ||||
| // (minor and older changes stripped away, please see git history for details) | ||||
| //  2022-01-12: *BREAKING CHANGE*: Now using glfwSetCursorPosCallback(). If you called ImGui_ImplGlfw_InitXXX() with install_callbacks = false, you MUST install glfwSetCursorPosCallback() and forward it to the backend via ImGui_ImplGlfw_CursorPosCallback(). | ||||
| //  2022-01-10: Inputs: calling new io.AddKeyEvent(), io.AddKeyModsEvent() + io.SetKeyEventNativeData() API (1.87+). Support for full ImGuiKey range. | ||||
| //  2022-01-05: Inputs: Converting GLFW untranslated keycodes back to translated keycodes (in the ImGui_ImplGlfw_KeyCallback() function) in order to match the behavior of every other backend, and facilitate the use of GLFW with lettered-shortcuts API. | ||||
| //  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(). | ||||
| @@ -90,6 +91,7 @@ struct ImGui_ImplGlfw_Data | ||||
|  | ||||
|     // Chain GLFW callbacks: our callbacks will call the user's previously installed callbacks, if any. | ||||
|     GLFWwindowfocusfun      PrevUserCallbackWindowFocus; | ||||
|     GLFWcursorposfun        PrevUserCallbackCursorPos; | ||||
|     GLFWcursorenterfun      PrevUserCallbackCursorEnter; | ||||
|     GLFWmousebuttonfun      PrevUserCallbackMousebutton; | ||||
|     GLFWscrollfun           PrevUserCallbackScroll; | ||||
| @@ -307,16 +309,30 @@ void ImGui_ImplGlfw_WindowFocusCallback(GLFWwindow* window, int focused) | ||||
|     io.AddFocusEvent(focused != 0); | ||||
| } | ||||
|  | ||||
| void ImGui_ImplGlfw_CursorPosCallback(GLFWwindow* window, double x, double y) | ||||
| { | ||||
|     ImGui_ImplGlfw_Data* bd = ImGui_ImplGlfw_GetBackendData(); | ||||
|     if (bd->PrevUserCallbackCursorPos != NULL && window == bd->Window) | ||||
|         bd->PrevUserCallbackCursorPos(window, x, y); | ||||
|  | ||||
|     ImGuiIO& io = ImGui::GetIO(); | ||||
|     io.MousePos = ImVec2((float)x, (float)y); | ||||
| } | ||||
|  | ||||
| void ImGui_ImplGlfw_CursorEnterCallback(GLFWwindow* window, int entered) | ||||
| { | ||||
|     ImGui_ImplGlfw_Data* bd = ImGui_ImplGlfw_GetBackendData(); | ||||
|     if (bd->PrevUserCallbackCursorEnter != NULL && window == bd->Window) | ||||
|         bd->PrevUserCallbackCursorEnter(window, entered); | ||||
|  | ||||
|     ImGuiIO& io = ImGui::GetIO(); | ||||
|     if (entered) | ||||
|         bd->MouseWindow = window; | ||||
|     if (!entered && bd->MouseWindow == window) | ||||
|     { | ||||
|         bd->MouseWindow = NULL; | ||||
|         io.MousePos = ImVec2(-FLT_MAX, -FLT_MAX); | ||||
|     } | ||||
| } | ||||
|  | ||||
| void ImGui_ImplGlfw_CharCallback(GLFWwindow* window, unsigned int c) | ||||
| @@ -394,6 +410,7 @@ static bool ImGui_ImplGlfw_Init(GLFWwindow* window, bool install_callbacks, Glfw | ||||
|         bd->InstalledCallbacks = true; | ||||
|         bd->PrevUserCallbackWindowFocus = glfwSetWindowFocusCallback(window, ImGui_ImplGlfw_WindowFocusCallback); | ||||
|         bd->PrevUserCallbackCursorEnter = glfwSetCursorEnterCallback(window, ImGui_ImplGlfw_CursorEnterCallback); | ||||
|         bd->PrevUserCallbackCursorPos = glfwSetCursorPosCallback(window, ImGui_ImplGlfw_CursorPosCallback); | ||||
|         bd->PrevUserCallbackMousebutton = glfwSetMouseButtonCallback(window, ImGui_ImplGlfw_MouseButtonCallback); | ||||
|         bd->PrevUserCallbackScroll = glfwSetScrollCallback(window, ImGui_ImplGlfw_ScrollCallback); | ||||
|         bd->PrevUserCallbackKey = glfwSetKeyCallback(window, ImGui_ImplGlfw_KeyCallback); | ||||
| @@ -430,6 +447,7 @@ void ImGui_ImplGlfw_Shutdown() | ||||
|     { | ||||
|         glfwSetWindowFocusCallback(bd->Window, bd->PrevUserCallbackWindowFocus); | ||||
|         glfwSetCursorEnterCallback(bd->Window, bd->PrevUserCallbackCursorEnter); | ||||
|         glfwSetCursorPosCallback(bd->Window, bd->PrevUserCallbackCursorPos); | ||||
|         glfwSetMouseButtonCallback(bd->Window, bd->PrevUserCallbackMousebutton); | ||||
|         glfwSetScrollCallback(bd->Window, bd->PrevUserCallbackScroll); | ||||
|         glfwSetKeyCallback(bd->Window, bd->PrevUserCallbackKey); | ||||
| @@ -445,40 +463,37 @@ void ImGui_ImplGlfw_Shutdown() | ||||
|     IM_DELETE(bd); | ||||
| } | ||||
|  | ||||
| static void ImGui_ImplGlfw_UpdateMousePosAndButtons() | ||||
| static void ImGui_ImplGlfw_UpdateMouseData() | ||||
| { | ||||
|     ImGui_ImplGlfw_Data* bd = ImGui_ImplGlfw_GetBackendData(); | ||||
|     ImGuiIO& io = ImGui::GetIO(); | ||||
|  | ||||
|     const ImVec2 mouse_pos_prev = io.MousePos; | ||||
|     io.MousePos = ImVec2(-FLT_MAX, -FLT_MAX); | ||||
| #ifdef __EMSCRIPTEN__ | ||||
|     const bool is_app_focused = true; | ||||
| #else | ||||
|     const bool is_app_focused = glfwGetWindowAttrib(bd->Window, GLFW_FOCUSED) != 0; | ||||
| #endif | ||||
|     if (is_app_focused) | ||||
|     { | ||||
|         // (Optional) Set OS mouse position from Dear ImGui if requested (rarely used, only when ImGuiConfigFlags_NavEnableSetMousePos is enabled by user) | ||||
|         if (io.WantSetMousePos) | ||||
|             glfwSetCursorPos(bd->Window, (double)io.MousePos.x, (double)io.MousePos.y); | ||||
|  | ||||
|     // 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) | ||||
|         // (Optional) Fallback to provide mouse position when focused (ImGui_ImplGlfw_CursorPosCallback already provides this when hovered or captured) | ||||
|         if (is_app_focused && bd->MouseWindow == NULL) | ||||
|         { | ||||
|             double mouse_x, mouse_y; | ||||
|             glfwGetCursorPos(bd->Window, &mouse_x, &mouse_y); | ||||
|             io.MousePos = ImVec2((float)mouse_x, (float)mouse_y); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     // Update buttons | ||||
|     for (int i = 0; i < IM_ARRAYSIZE(io.MouseDown); i++) | ||||
|     { | ||||
|         io.MouseDown[i] = bd->MouseJustPressed[i] || glfwGetMouseButton(bd->Window, i) != 0; | ||||
|         bd->MouseJustPressed[i] = false; | ||||
|     } | ||||
|  | ||||
| #ifdef __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; | ||||
|  | ||||
|     // 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); | ||||
|         io.MousePos = ImVec2((float)mouse_x, (float)mouse_y); | ||||
|     } | ||||
| } | ||||
|  | ||||
| static void ImGui_ImplGlfw_UpdateMouseCursor() | ||||
| @@ -572,10 +587,8 @@ void ImGui_ImplGlfw_NewFrame() | ||||
|     io.DeltaTime = bd->Time > 0.0 ? (float)(current_time - bd->Time) : (float)(1.0f / 60.0f); | ||||
|     bd->Time = current_time; | ||||
|  | ||||
|     // Update key modifiers | ||||
|     ImGui_ImplGlfw_UpdateKeyModifiers(); | ||||
|  | ||||
|     ImGui_ImplGlfw_UpdateMousePosAndButtons(); | ||||
|     ImGui_ImplGlfw_UpdateMouseData(); | ||||
|     ImGui_ImplGlfw_UpdateMouseCursor(); | ||||
|  | ||||
|     // Update game controllers (if enabled and available) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user