From fa0120ea5eadd1c35aeb7ec6f9be93b0af2135ab Mon Sep 17 00:00:00 2001 From: ocornut Date: Thu, 18 Apr 2024 21:10:05 +0200 Subject: [PATCH] Windows: Fixed subsequent Begin() append calls from setting last item information for title-bar. (#7506, #823) Amend 067605052, 27fd1b913b --- docs/CHANGELOG.txt | 3 +++ imgui.cpp | 10 +++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/docs/CHANGELOG.txt b/docs/CHANGELOG.txt index f299674f3..6c4102ec9 100644 --- a/docs/CHANGELOG.txt +++ b/docs/CHANGELOG.txt @@ -56,6 +56,9 @@ Breaking changes: Other changes: +- Windows: Fixed subsequent Begin() append calls from setting last item information + for title bar, making it impossible to use IsItemHovered() on a Begin()-to-append, + and causing issue bypassing hover detection on collapsed windows. (#7506, #823) - Fonts: Fixed font ascent and descent calculation when a font hits exact integer values. It is possible that some prior manual use of ImFontConfig::GlyphOffset may become duplicate with this fix. (#7399, #7404) [@GamingMinds-DanielC] diff --git a/imgui.cpp b/imgui.cpp index 1a5a8ba8a..181d846e6 100644 --- a/imgui.cpp +++ b/imgui.cpp @@ -1139,6 +1139,7 @@ static void RenderWindowDecorations(ImGuiWindow* window, const ImRec static void RenderWindowTitleBarContents(ImGuiWindow* window, const ImRect& title_bar_rect, const char* name, bool* p_open); static void RenderDimmedBackgroundBehindWindow(ImGuiWindow* window, ImU32 col); static void RenderDimmedBackgrounds(); +static void SetLastItemDataForWindow(ImGuiWindow* window, const ImRect& rect); // Viewports const ImGuiID IMGUI_VIEWPORT_DEFAULT_ID = 0x11111111; // Using an arbitrary constant instead of e.g. ImHashStr("ViewportDefault", 0); so it's easier to spot in the debugger. The exact value doesn't matter. @@ -6992,7 +6993,7 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) // We fill last item data based on Title Bar/Tab, in order for IsItemHovered() and IsItemActive() to be usable after Begin(). // This is useful to allow creating context menus on title bar only, etc. - SetLastItemData(window->MoveId, g.CurrentItemFlags, IsMouseHoveringRect(title_bar_rect.Min, title_bar_rect.Max, false) ? ImGuiItemStatusFlags_HoveredRect : 0, title_bar_rect); + SetLastItemDataForWindow(window, title_bar_rect); // [DEBUG] #ifndef IMGUI_DISABLE_DEBUG_TOOLS @@ -7010,6 +7011,7 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) { // Append SetCurrentWindow(window); + SetLastItemDataForWindow(window, window->TitleBarRect()); } PushClipRect(window->InnerClipRect.Min, window->InnerClipRect.Max, true); @@ -7082,6 +7084,12 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) return !window->SkipItems; } +static void ImGui::SetLastItemDataForWindow(ImGuiWindow* window, const ImRect& rect) +{ + ImGuiContext& g = *GImGui; + SetLastItemData(window->MoveId, g.CurrentItemFlags, IsMouseHoveringRect(rect.Min, rect.Max, false) ? ImGuiItemStatusFlags_HoveredRect : 0, rect); +} + void ImGui::End() { ImGuiContext& g = *GImGui;