mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-10-31 21:21:06 +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:
		| @@ -414,8 +414,6 @@ bool ImGui_ImplAllegro5_Init(ALLEGRO_DISPLAY* display) | |||||||
|     }; |     }; | ||||||
|     bd->VertexDecl = al_create_vertex_decl(elems, sizeof(ImDrawVertAllegro)); |     bd->VertexDecl = al_create_vertex_decl(elems, sizeof(ImDrawVertAllegro)); | ||||||
|  |  | ||||||
|     io.MousePos = ImVec2(-FLT_MAX, -FLT_MAX); |  | ||||||
|  |  | ||||||
| #if ALLEGRO_HAS_CLIPBOARD | #if ALLEGRO_HAS_CLIPBOARD | ||||||
|     io.SetClipboardTextFn = ImGui_ImplAllegro5_SetClipboardText; |     io.SetClipboardTextFn = ImGui_ImplAllegro5_SetClipboardText; | ||||||
|     io.GetClipboardTextFn = ImGui_ImplAllegro5_GetClipboardText; |     io.GetClipboardTextFn = ImGui_ImplAllegro5_GetClipboardText; | ||||||
|   | |||||||
| @@ -16,6 +16,7 @@ | |||||||
|  |  | ||||||
| // CHANGELOG | // CHANGELOG | ||||||
| // (minor and older changes stripped away, please see git history for details) | // (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-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. | //  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(). | //  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. |     // Chain GLFW callbacks: our callbacks will call the user's previously installed callbacks, if any. | ||||||
|     GLFWwindowfocusfun      PrevUserCallbackWindowFocus; |     GLFWwindowfocusfun      PrevUserCallbackWindowFocus; | ||||||
|  |     GLFWcursorposfun        PrevUserCallbackCursorPos; | ||||||
|     GLFWcursorenterfun      PrevUserCallbackCursorEnter; |     GLFWcursorenterfun      PrevUserCallbackCursorEnter; | ||||||
|     GLFWmousebuttonfun      PrevUserCallbackMousebutton; |     GLFWmousebuttonfun      PrevUserCallbackMousebutton; | ||||||
|     GLFWscrollfun           PrevUserCallbackScroll; |     GLFWscrollfun           PrevUserCallbackScroll; | ||||||
| @@ -307,16 +309,30 @@ void ImGui_ImplGlfw_WindowFocusCallback(GLFWwindow* window, int focused) | |||||||
|     io.AddFocusEvent(focused != 0); |     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) | void ImGui_ImplGlfw_CursorEnterCallback(GLFWwindow* window, int entered) | ||||||
| { | { | ||||||
|     ImGui_ImplGlfw_Data* bd = ImGui_ImplGlfw_GetBackendData(); |     ImGui_ImplGlfw_Data* bd = ImGui_ImplGlfw_GetBackendData(); | ||||||
|     if (bd->PrevUserCallbackCursorEnter != NULL && window == bd->Window) |     if (bd->PrevUserCallbackCursorEnter != NULL && window == bd->Window) | ||||||
|         bd->PrevUserCallbackCursorEnter(window, entered); |         bd->PrevUserCallbackCursorEnter(window, entered); | ||||||
|  |  | ||||||
|  |     ImGuiIO& io = ImGui::GetIO(); | ||||||
|     if (entered) |     if (entered) | ||||||
|         bd->MouseWindow = window; |         bd->MouseWindow = window; | ||||||
|     if (!entered && bd->MouseWindow == window) |     if (!entered && bd->MouseWindow == window) | ||||||
|  |     { | ||||||
|         bd->MouseWindow = NULL; |         bd->MouseWindow = NULL; | ||||||
|  |         io.MousePos = ImVec2(-FLT_MAX, -FLT_MAX); | ||||||
|  |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| void ImGui_ImplGlfw_CharCallback(GLFWwindow* window, unsigned int c) | 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->InstalledCallbacks = true; | ||||||
|         bd->PrevUserCallbackWindowFocus = glfwSetWindowFocusCallback(window, ImGui_ImplGlfw_WindowFocusCallback); |         bd->PrevUserCallbackWindowFocus = glfwSetWindowFocusCallback(window, ImGui_ImplGlfw_WindowFocusCallback); | ||||||
|         bd->PrevUserCallbackCursorEnter = glfwSetCursorEnterCallback(window, ImGui_ImplGlfw_CursorEnterCallback); |         bd->PrevUserCallbackCursorEnter = glfwSetCursorEnterCallback(window, ImGui_ImplGlfw_CursorEnterCallback); | ||||||
|  |         bd->PrevUserCallbackCursorPos = glfwSetCursorPosCallback(window, ImGui_ImplGlfw_CursorPosCallback); | ||||||
|         bd->PrevUserCallbackMousebutton = glfwSetMouseButtonCallback(window, ImGui_ImplGlfw_MouseButtonCallback); |         bd->PrevUserCallbackMousebutton = glfwSetMouseButtonCallback(window, ImGui_ImplGlfw_MouseButtonCallback); | ||||||
|         bd->PrevUserCallbackScroll = glfwSetScrollCallback(window, ImGui_ImplGlfw_ScrollCallback); |         bd->PrevUserCallbackScroll = glfwSetScrollCallback(window, ImGui_ImplGlfw_ScrollCallback); | ||||||
|         bd->PrevUserCallbackKey = glfwSetKeyCallback(window, ImGui_ImplGlfw_KeyCallback); |         bd->PrevUserCallbackKey = glfwSetKeyCallback(window, ImGui_ImplGlfw_KeyCallback); | ||||||
| @@ -430,6 +447,7 @@ void ImGui_ImplGlfw_Shutdown() | |||||||
|     { |     { | ||||||
|         glfwSetWindowFocusCallback(bd->Window, bd->PrevUserCallbackWindowFocus); |         glfwSetWindowFocusCallback(bd->Window, bd->PrevUserCallbackWindowFocus); | ||||||
|         glfwSetCursorEnterCallback(bd->Window, bd->PrevUserCallbackCursorEnter); |         glfwSetCursorEnterCallback(bd->Window, bd->PrevUserCallbackCursorEnter); | ||||||
|  |         glfwSetCursorPosCallback(bd->Window, bd->PrevUserCallbackCursorPos); | ||||||
|         glfwSetMouseButtonCallback(bd->Window, bd->PrevUserCallbackMousebutton); |         glfwSetMouseButtonCallback(bd->Window, bd->PrevUserCallbackMousebutton); | ||||||
|         glfwSetScrollCallback(bd->Window, bd->PrevUserCallbackScroll); |         glfwSetScrollCallback(bd->Window, bd->PrevUserCallbackScroll); | ||||||
|         glfwSetKeyCallback(bd->Window, bd->PrevUserCallbackKey); |         glfwSetKeyCallback(bd->Window, bd->PrevUserCallbackKey); | ||||||
| @@ -445,40 +463,37 @@ void ImGui_ImplGlfw_Shutdown() | |||||||
|     IM_DELETE(bd); |     IM_DELETE(bd); | ||||||
| } | } | ||||||
|  |  | ||||||
| static void ImGui_ImplGlfw_UpdateMousePosAndButtons() | static void ImGui_ImplGlfw_UpdateMouseData() | ||||||
| { | { | ||||||
|     ImGui_ImplGlfw_Data* bd = ImGui_ImplGlfw_GetBackendData(); |     ImGui_ImplGlfw_Data* bd = ImGui_ImplGlfw_GetBackendData(); | ||||||
|     ImGuiIO& io = ImGui::GetIO(); |     ImGuiIO& io = ImGui::GetIO(); | ||||||
|  |  | ||||||
|     const ImVec2 mouse_pos_prev = io.MousePos; | #ifdef __EMSCRIPTEN__ | ||||||
|     io.MousePos = ImVec2(-FLT_MAX, -FLT_MAX); |     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 |         // (Optional) Fallback to provide mouse position when focused (ImGui_ImplGlfw_CursorPosCallback already provides this when hovered or captured) | ||||||
|     // (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) |         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++) |     for (int i = 0; i < IM_ARRAYSIZE(io.MouseDown); i++) | ||||||
|     { |     { | ||||||
|         io.MouseDown[i] = bd->MouseJustPressed[i] || glfwGetMouseButton(bd->Window, i) != 0; |         io.MouseDown[i] = bd->MouseJustPressed[i] || glfwGetMouseButton(bd->Window, i) != 0; | ||||||
|         bd->MouseJustPressed[i] = false; |         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() | 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); |     io.DeltaTime = bd->Time > 0.0 ? (float)(current_time - bd->Time) : (float)(1.0f / 60.0f); | ||||||
|     bd->Time = current_time; |     bd->Time = current_time; | ||||||
|  |  | ||||||
|     // Update key modifiers |  | ||||||
|     ImGui_ImplGlfw_UpdateKeyModifiers(); |     ImGui_ImplGlfw_UpdateKeyModifiers(); | ||||||
|  |     ImGui_ImplGlfw_UpdateMouseData(); | ||||||
|     ImGui_ImplGlfw_UpdateMousePosAndButtons(); |  | ||||||
|     ImGui_ImplGlfw_UpdateMouseCursor(); |     ImGui_ImplGlfw_UpdateMouseCursor(); | ||||||
|  |  | ||||||
|     // Update game controllers (if enabled and available) |     // Update game controllers (if enabled and available) | ||||||
|   | |||||||
| @@ -32,8 +32,9 @@ IMGUI_IMPL_API void     ImGui_ImplGlfw_NewFrame(); | |||||||
| // GLFW callbacks | // GLFW callbacks | ||||||
| // - When calling Init with 'install_callbacks=true': GLFW callbacks will be installed for you. They will call user's previously installed callbacks, if any. | // - When calling Init with 'install_callbacks=true': GLFW callbacks will be installed for you. They will call user's previously installed callbacks, if any. | ||||||
| // - When calling Init with 'install_callbacks=false': GLFW callbacks won't be installed. You will need to call those function yourself from your own GLFW callbacks. | // - When calling Init with 'install_callbacks=false': GLFW callbacks won't be installed. You will need to call those function yourself from your own GLFW callbacks. | ||||||
| IMGUI_IMPL_API void     ImGui_ImplGlfw_WindowFocusCallback(GLFWwindow* window, int focused); | IMGUI_IMPL_API void     ImGui_ImplGlfw_WindowFocusCallback(GLFWwindow* window, int focused);        // Since 1.84 | ||||||
| IMGUI_IMPL_API void     ImGui_ImplGlfw_CursorEnterCallback(GLFWwindow* window, int entered); | IMGUI_IMPL_API void     ImGui_ImplGlfw_CursorEnterCallback(GLFWwindow* window, int entered);        // Since 1.84 | ||||||
|  | IMGUI_IMPL_API void     ImGui_ImplGlfw_CursorPosCallback(GLFWwindow* window, double x, double y);   // Since 1.87 | ||||||
| IMGUI_IMPL_API void     ImGui_ImplGlfw_MouseButtonCallback(GLFWwindow* window, int button, int action, int mods); | IMGUI_IMPL_API void     ImGui_ImplGlfw_MouseButtonCallback(GLFWwindow* window, int button, int action, int mods); | ||||||
| IMGUI_IMPL_API void     ImGui_ImplGlfw_ScrollCallback(GLFWwindow* window, double xoffset, double yoffset); | IMGUI_IMPL_API void     ImGui_ImplGlfw_ScrollCallback(GLFWwindow* window, double xoffset, double yoffset); | ||||||
| IMGUI_IMPL_API void     ImGui_ImplGlfw_KeyCallback(GLFWwindow* window, int key, int scancode, int action, int mods); | IMGUI_IMPL_API void     ImGui_ImplGlfw_KeyCallback(GLFWwindow* window, int key, int scancode, int action, int mods); | ||||||
|   | |||||||
| @@ -66,6 +66,10 @@ Breaking Changes: | |||||||
|      - io.AddKeyEvent() will later be turned into a trickling IO queue (for all inputs) to handle very low framerate better. (#2525, #2787, #3383) |      - io.AddKeyEvent() will later be turned into a trickling IO queue (for all inputs) to handle very low framerate better. (#2525, #2787, #3383) | ||||||
|      - io.SetKeyEventNativeData() include native keycode/scancode which will later be exposed. (#3141, #2959) |      - io.SetKeyEventNativeData() include native keycode/scancode which will later be exposed. (#3141, #2959) | ||||||
| - Renamed ImGuiKey_KeyPadEnter to ImGuiKey_KeypadEnter to align with new symbols. Kept redirection enum. (#2625) | - Renamed ImGuiKey_KeyPadEnter to ImGuiKey_KeypadEnter to align with new symbols. Kept redirection enum. (#2625) | ||||||
|  | - Backends: GLFW: backend now uses glfwSetCursorPosCallback(). | ||||||
|  |   - If calling ImGui_ImplGlfw_InitXXX with install_callbacks=true: nothing to do. is already done for you. | ||||||
|  |   - If calling ImGui_ImplGlfw_InitXXX with install_callbacks=false: you WILL NEED to register the GLFW callback | ||||||
|  |     using glfwSetCursorPosCallback() and forward it to the backend function ImGui_ImplGlfw_CursorPosCallback(). | ||||||
| - Commented out redirecting functions/enums names that were marked obsolete in 1.69, 1.70, 1.71, 1.72 (March-July 2019) | - Commented out redirecting functions/enums names that were marked obsolete in 1.69, 1.70, 1.71, 1.72 (March-July 2019) | ||||||
|   - ImGui::SetNextTreeNodeOpen()        -> use ImGui::SetNextItemOpen() |   - ImGui::SetNextTreeNodeOpen()        -> use ImGui::SetNextItemOpen() | ||||||
|   - ImGui::GetContentRegionAvailWidth() -> use ImGui::GetContentRegionAvail().x |   - ImGui::GetContentRegionAvailWidth() -> use ImGui::GetContentRegionAvail().x | ||||||
| @@ -96,6 +100,7 @@ Other Changes: | |||||||
| - Backends: GLFW: Pass localized keys (matching keyboard layout). Fix e.g. CTRL+A, CTRL+Z, CTRL+Y shortcuts. | - Backends: GLFW: Pass localized keys (matching keyboard layout). Fix e.g. CTRL+A, CTRL+Z, CTRL+Y shortcuts. | ||||||
|   We are now converting GLFW untranslated keycodes back to translated keycodes in order to match the behavior of every |   We are now converting GLFW untranslated keycodes back to translated keycodes in order to match the behavior of every | ||||||
|   other backend, and facilitate the use of GLFW with lettered-shortcuts API. (#456, #2625) |   other backend, and facilitate the use of GLFW with lettered-shortcuts API. (#456, #2625) | ||||||
|  | - Backends: GLFW: Update mouse position using glfwSetCursorPosCallback() + fallback when focused but not hovered/captured. | ||||||
| - Backends: Win32: Update mouse position using WM_MOUSEMOVE/WM_MOUSELEAVE + fallback when focused but not hovered/captured. | - Backends: Win32: Update mouse position using WM_MOUSEMOVE/WM_MOUSELEAVE + fallback when focused but not hovered/captured. | ||||||
| - Backends: Win32: Maintain a MouseButtonsDown mask instead of using ImGui::IsAnyMouseDown() which will be obsoleted. | - Backends: Win32: Maintain a MouseButtonsDown mask instead of using ImGui::IsAnyMouseDown() which will be obsoleted. | ||||||
| - Backends: SDL: Pass localized keys (matching keyboard layout). Fix e.g. CTRL+A, CTRL+Z, CTRL+Y shortcuts. | - Backends: SDL: Pass localized keys (matching keyboard layout). Fix e.g. CTRL+A, CTRL+Z, CTRL+Y shortcuts. | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user