|
@@ -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,39 +463,36 @@ 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);
|
|
|
-
|
|
|
- // 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++)
|
|
|
- {
|
|
|
- io.MouseDown[i] = bd->MouseJustPressed[i] || glfwGetMouseButton(bd->Window, i) != 0;
|
|
|
- bd->MouseJustPressed[i] = false;
|
|
|
- }
|
|
|
-
|
|
|
#ifdef __EMSCRIPTEN__
|
|
|
- const bool focused = true;
|
|
|
+ const bool is_app_focused = true;
|
|
|
#else
|
|
|
- const bool focused = glfwGetWindowAttrib(bd->Window, GLFW_FOCUSED) != 0;
|
|
|
+ const bool is_app_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);
|
|
|
+ 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);
|
|
|
+
|
|
|
+ // (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);
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- // Set Dear ImGui mouse position from OS position
|
|
|
- if (mouse_window != NULL)
|
|
|
+ // Update buttons
|
|
|
+ for (int i = 0; i < IM_ARRAYSIZE(io.MouseDown); i++)
|
|
|
{
|
|
|
- double mouse_x, mouse_y;
|
|
|
- glfwGetCursorPos(mouse_window, &mouse_x, &mouse_y);
|
|
|
- io.MousePos = ImVec2((float)mouse_x, (float)mouse_y);
|
|
|
+ io.MouseDown[i] = bd->MouseJustPressed[i] || glfwGetMouseButton(bd->Window, i) != 0;
|
|
|
+ bd->MouseJustPressed[i] = false;
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -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)
|