MCPcopy Create free account
hub / github.com/DISTRHO/Cardinal / FindHoveredWindow

Function FindHoveredWindow

plugins/Cardinal/src/DearImGui/imgui.cpp:4712–4762  ·  view source on GitHub ↗

Find window given position, search front-to-back FIXME: Note that we have an inconsequential lag here: OuterRectClipped is updated in Begin(), so windows moved programmatically with SetWindowPos() and not SetNextWindowPos() will have that rectangle lagging by a frame at the time FindHoveredWindow() is called, aka before the next Begin(). Moving window isn't affected.

Source from the content-addressed store, hash-verified

4710// with SetWindowPos() and not SetNextWindowPos() will have that rectangle lagging by a frame at the time FindHoveredWindow() is
4711// called, aka before the next Begin(). Moving window isn't affected.
4712static void FindHoveredWindow()
4713{
4714 ImGuiContext& g = *GImGui;
4715
4716 ImGuiWindow* hovered_window = NULL;
4717 ImGuiWindow* hovered_window_ignoring_moving_window = NULL;
4718 if (g.MovingWindow && !(g.MovingWindow->Flags & ImGuiWindowFlags_NoMouseInputs))
4719 hovered_window = g.MovingWindow;
4720
4721 ImVec2 padding_regular = g.Style.TouchExtraPadding;
4722 ImVec2 padding_for_resize = g.IO.ConfigWindowsResizeFromEdges ? g.WindowsHoverPadding : padding_regular;
4723 for (int i = g.Windows.Size - 1; i >= 0; i--)
4724 {
4725 ImGuiWindow* window = g.Windows[i];
4726 IM_MSVC_WARNING_SUPPRESS(28182); // [Static Analyzer] Dereferencing NULL pointer.
4727 if (!window->Active || window->Hidden)
4728 continue;
4729 if (window->Flags & ImGuiWindowFlags_NoMouseInputs)
4730 continue;
4731
4732 // Using the clipped AABB, a child window will typically be clipped by its parent (not always)
4733 ImRect bb(window->OuterRectClipped);
4734 if (window->Flags & (ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_AlwaysAutoResize))
4735 bb.Expand(padding_regular);
4736 else
4737 bb.Expand(padding_for_resize);
4738 if (!bb.Contains(g.IO.MousePos))
4739 continue;
4740
4741 // Support for one rectangular hole in any given window
4742 // FIXME: Consider generalizing hit-testing override (with more generic data, callback, etc.) (#1512)
4743 if (window->HitTestHoleSize.x != 0)
4744 {
4745 ImVec2 hole_pos(window->Pos.x + (float)window->HitTestHoleOffset.x, window->Pos.y + (float)window->HitTestHoleOffset.y);
4746 ImVec2 hole_size((float)window->HitTestHoleSize.x, (float)window->HitTestHoleSize.y);
4747 if (ImRect(hole_pos, hole_pos + hole_size).Contains(g.IO.MousePos))
4748 continue;
4749 }
4750
4751 if (hovered_window == NULL)
4752 hovered_window = window;
4753 IM_MSVC_WARNING_SUPPRESS(28182); // [Static Analyzer] Dereferencing NULL pointer.
4754 if (hovered_window_ignoring_moving_window == NULL && (!g.MovingWindow || window->RootWindow != g.MovingWindow->RootWindow))
4755 hovered_window_ignoring_moving_window = window;
4756 if (hovered_window && hovered_window_ignoring_moving_window)
4757 break;
4758 }
4759
4760 g.HoveredWindow = hovered_window;
4761 g.HoveredWindowUnderMovingWindow = hovered_window_ignoring_moving_window;
4762}
4763
4764// Test if mouse cursor is hovering given rectangle
4765// NB- Rectangle is clipped by our current clip setting

Callers 1

Calls 1

ImRectFunction · 0.70

Tested by

no test coverage detected