Prechádzať zdrojové kódy

LibGUI: Retain the active input tracking widget's cursor

Until the tracking stops, we want to keep displaying the same cursor.
Andreas Kling 3 rokov pred
rodič
commit
6548ae8afd

+ 1 - 1
Userland/Libraries/LibGUI/Widget.h

@@ -345,7 +345,7 @@ public:
 
     virtual Gfx::IntRect children_clip_rect() const;
 
-    AK::Variant<Gfx::StandardCursor, NonnullRefPtr<Gfx::Bitmap>> override_cursor() const { return m_override_cursor; }
+    AK::Variant<Gfx::StandardCursor, NonnullRefPtr<Gfx::Bitmap>> const& override_cursor() const { return m_override_cursor; }
     void set_override_cursor(AK::Variant<Gfx::StandardCursor, NonnullRefPtr<Gfx::Bitmap>>);
 
     bool load_from_gml(StringView);

+ 11 - 4
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<NonnullRefPtr<Gfx::Bitmap>>() || override_cursor.get<Gfx::StandardCursor>() != Gfx::StandardCursor::None)
-            new_cursor = move(override_cursor);
+    auto is_usable_cursor = [](auto& cursor) {
+        return cursor.template has<NonnullRefPtr<Gfx::Bitmap>>() || cursor.template get<Gfx::StandardCursor>() != 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))