diff --git a/Userland/Libraries/LibGUI/Widget.h b/Userland/Libraries/LibGUI/Widget.h index f856f137b6..ee868b7d54 100644 --- a/Userland/Libraries/LibGUI/Widget.h +++ b/Userland/Libraries/LibGUI/Widget.h @@ -345,7 +345,7 @@ public: virtual Gfx::IntRect children_clip_rect() const; - AK::Variant> override_cursor() const { return m_override_cursor; } + AK::Variant> const& override_cursor() const { return m_override_cursor; } void set_override_cursor(AK::Variant>); bool load_from_gml(StringView); diff --git a/Userland/Libraries/LibGUI/Window.cpp b/Userland/Libraries/LibGUI/Window.cpp index a2e6ee831d..7857419ad4 100644 --- a/Userland/Libraries/LibGUI/Window.cpp +++ b/Userland/Libraries/LibGUI/Window.cpp @@ -1177,10 +1177,17 @@ void Window::update_cursor() { auto new_cursor = m_cursor; - if (m_hovered_widget) { - auto override_cursor = m_hovered_widget->override_cursor(); - if (override_cursor.has>() || override_cursor.get() != Gfx::StandardCursor::None) - new_cursor = move(override_cursor); + auto is_usable_cursor = [](auto& cursor) { + return cursor.template has>() || cursor.template get() != Gfx::StandardCursor::None; + }; + + // NOTE: If there's an automatic cursor tracking widget, we retain its cursor until tracking stops. + if (auto widget = m_automatic_cursor_tracking_widget) { + if (is_usable_cursor(widget->override_cursor())) + new_cursor = widget->override_cursor(); + } else if (auto widget = m_hovered_widget) { + if (is_usable_cursor(widget->override_cursor())) + new_cursor = widget->override_cursor(); } if (are_cursors_the_same(m_effective_cursor, new_cursor))