|
@@ -418,7 +418,7 @@ static bool ImGui_ImplGlfw_Init(GLFWwindow* window, bool install_callbacks, Glfw
|
|
|
io.BackendFlags |= ImGuiBackendFlags_HasSetMousePos; // We can honor io.WantSetMousePos requests (optional, rarely used)
|
|
|
io.BackendFlags |= ImGuiBackendFlags_PlatformHasViewports; // We can create multi-viewports on the Platform side (optional)
|
|
|
#if GLFW_HAS_MOUSE_PASSTHROUGH || (GLFW_HAS_WINDOW_HOVERED && defined(_WIN32))
|
|
|
- io.BackendFlags |= ImGuiBackendFlags_HasMouseHoveredViewport; // We can set io.MouseHoveredViewport correctly (optional, not easy)
|
|
|
+ io.BackendFlags |= ImGuiBackendFlags_HasMouseHoveredViewport; // We can call io.AddMouseViewportEvent() with correct data (optional)
|
|
|
#endif
|
|
|
|
|
|
bd->Window = window;
|
|
@@ -539,8 +539,7 @@ static void ImGui_ImplGlfw_UpdateMouseData()
|
|
|
ImGuiIO& io = ImGui::GetIO();
|
|
|
ImGuiPlatformIO& platform_io = ImGui::GetPlatformIO();
|
|
|
|
|
|
- io.MouseHoveredViewport = 0;
|
|
|
-
|
|
|
+ ImGuiID mouse_viewport_id = 0;
|
|
|
const ImVec2 mouse_pos_prev = io.MousePos;
|
|
|
for (int n = 0; n < platform_io.Viewports.Size; n++)
|
|
|
{
|
|
@@ -577,7 +576,7 @@ static void ImGui_ImplGlfw_UpdateMouseData()
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- // (Optional) When using multiple viewports: set io.MouseHoveredViewport to the viewport the OS mouse cursor is hovering.
|
|
|
+ // (Optional) When using multiple viewports: call io.AddMouseViewportEvent() with the viewport the OS mouse cursor is hovering.
|
|
|
// If ImGuiBackendFlags_HasMouseHoveredViewport is not set by the backend, Dear imGui will ignore this field and infer the information using its flawed heuristic.
|
|
|
// - [X] GLFW >= 3.3 backend ON WINDOWS ONLY does correctly ignore viewports with the _NoInputs flag.
|
|
|
// - [!] GLFW <= 3.2 backend CANNOT correctly ignore viewports with the _NoInputs flag, and CANNOT reported Hovered Viewport because of mouse capture.
|
|
@@ -593,11 +592,14 @@ static void ImGui_ImplGlfw_UpdateMouseData()
|
|
|
glfwSetWindowAttrib(window, GLFW_MOUSE_PASSTHROUGH, window_no_input);
|
|
|
#endif
|
|
|
if (glfwGetWindowAttrib(window, GLFW_HOVERED) && !window_no_input)
|
|
|
- io.MouseHoveredViewport = viewport->ID;
|
|
|
+ mouse_viewport_id = viewport->ID;
|
|
|
#else
|
|
|
// We cannot use bd->MouseWindow maintained from CursorEnter/Leave callbacks, because it is locked to the window capturing mouse.
|
|
|
#endif
|
|
|
}
|
|
|
+
|
|
|
+ if (io.BackendFlags & ImGuiBackendFlags_HasMouseHoveredViewport)
|
|
|
+ io.AddMouseViewportEvent(mouse_viewport_id);
|
|
|
}
|
|
|
|
|
|
static void ImGui_ImplGlfw_UpdateMouseCursor()
|
|
@@ -866,7 +868,7 @@ static LRESULT CALLBACK WndProcNoInputs(HWND hWnd, UINT msg, WPARAM wParam, LPAR
|
|
|
{
|
|
|
if (msg == WM_NCHITTEST)
|
|
|
{
|
|
|
- // Let mouse pass-through the window. This will allow the backend to set io.MouseHoveredViewport properly (which is OPTIONAL).
|
|
|
+ // Let mouse pass-through the window. This will allow the backend to call io.AddMouseViewportEvent() properly (which is OPTIONAL).
|
|
|
// The ImGuiViewportFlags_NoInputs flag is set while dragging a viewport, as want to detect the window behind the one we are dragging.
|
|
|
// If you cannot easily access those viewport flags from your windowing/event code: you may manually synchronize its state e.g. in
|
|
|
// your main loop after calling UpdatePlatformWindows(). Iterate all viewports/platform windows and pass the flag to your windowing system.
|