diff --git a/imgui.cpp b/imgui.cpp index 51c5be121..1a1330914 100644 --- a/imgui.cpp +++ b/imgui.cpp @@ -235,7 +235,6 @@ ================== - misc: merge or clarify ImVec4 / ImGuiAabb, they are essentially duplicate containers -!- i/o: avoid requesting mouse capture if button held and initial click was out of reach for imgui - window: add horizontal scroll - window: fix resize grip rendering scaling along with Rounding style setting - window: autofit feedback loop when user relies on any dynamic layout (window width multiplier, column). maybe just clearly drop manual autofit? @@ -1699,8 +1698,20 @@ void ImGui::NewFrame() else g.HoveredRootWindow = FindHoveredWindow(g.IO.MousePos, true); - // Are we using inputs? Tell user so they can capture/discard them. - g.IO.WantCaptureMouse = (g.HoveredWindow != NULL) || (g.ActiveId != 0); + // Are we using inputs? Tell user so they can capture/discard the inputs away from the rest of their application. + // When clicking outside of a window we assume the click is owned by the application and won't request capture. + // FIXME: For completeness we should completely disregard the mouse when 'mouse_owned_by_application' is set. + int mouse_earliest_button_down = -1; + for (size_t i = 0; i < IM_ARRAYSIZE(g.IO.MouseDown); i++) + { + if (g.IO.MouseClicked[i]) + g.IO.MouseDownOwned[i] = (g.HoveredWindow != NULL); + if (g.IO.MouseDown[i]) + if (mouse_earliest_button_down == -1 || g.IO.MouseClickedTime[mouse_earliest_button_down] > g.IO.MouseClickedTime[i]) + mouse_earliest_button_down = i; + } + bool mouse_owned_by_application = mouse_earliest_button_down != -1 && !g.IO.MouseDownOwned[mouse_earliest_button_down]; + g.IO.WantCaptureMouse = (!mouse_owned_by_application && g.HoveredWindow != NULL) || (g.ActiveId != 0); g.IO.WantCaptureKeyboard = (g.ActiveId != 0); // Scale & Scrolling @@ -7715,6 +7726,8 @@ void ImGui::ShowTestWindow(bool* opened) ImGui::Text("ImGui says hello."); //ImGui::Text("MousePos (%g, %g)", ImGui::GetIO().MousePos.x, ImGui::GetIO().MousePos.y); //ImGui::Text("MouseWheel %d", ImGui::GetIO().MouseWheel); + //ImGui::Text("WantCaptureMouse: %d", ImGui::GetIO().WantCaptureMouse); + //ImGui::Text("WantCaptureKeyboard: %d", ImGui::GetIO().WantCaptureKeyboard); ImGui::Spacing(); if (ImGui::CollapsingHeader("Help")) diff --git a/imgui.h b/imgui.h index 04db83096..0f0e8d6f5 100644 --- a/imgui.h +++ b/imgui.h @@ -566,14 +566,15 @@ struct ImGuiIO // [Internal] ImGui will maintain those fields for you //------------------------------------------------------------------ - ImVec2 MousePosPrev; - ImVec2 MouseDelta; - bool MouseClicked[5]; - ImVec2 MouseClickedPos[5]; - float MouseClickedTime[5]; - bool MouseDoubleClicked[5]; - float MouseDownTime[5]; - float KeysDownTime[512]; + ImVec2 MousePosPrev; // + ImVec2 MouseDelta; // Mouse delta. Note that this is zero if either current or previous position are negative to allow mouse enabling/disabling. + bool MouseClicked[5]; // Mouse button went from !Down to Down + ImVec2 MouseClickedPos[5]; // Position at time of clicking + float MouseClickedTime[5]; // Time of last click (used to figure out double-click) + bool MouseDoubleClicked[5]; // Has mouse button been double-clicked? + bool MouseDownOwned[5]; // Track if button was clicked inside a window. We don't request mouse capture from the application if click started outside ImGui bounds. + float MouseDownTime[5]; // Time the mouse button has been down + float KeysDownTime[512]; // Time the keyboard key has been down IMGUI_API ImGuiIO(); };