Переглянути джерело

WindowServer: Don't include frame when determining hovered window

We only consider a window "hovered" if its *content area* is hovered.
Andreas Kling 4 роки тому
батько
коміт
82f1ac7390

+ 1 - 1
Userland/Services/WindowServer/WindowManager.cpp

@@ -1149,7 +1149,7 @@ void WindowManager::event(Core::Event& event)
             m_previous_event_was_super_keydown = false;
 
         process_mouse_event(mouse_event);
-        set_hovered_window(m_window_stack.window_at(mouse_event.position()));
+        set_hovered_window(m_window_stack.window_at(mouse_event.position(), WindowStack::IncludeWindowFrame::No));
         return;
     }
 

+ 3 - 1
Userland/Services/WindowServer/WindowStack.cpp

@@ -38,11 +38,13 @@ void WindowStack::move_to_front(Window& window)
     m_windows.append(window);
 }
 
-Window* WindowStack::window_at(Gfx::IntPoint const& position) const
+Window* WindowStack::window_at(Gfx::IntPoint const& position, IncludeWindowFrame include_window_frame) const
 {
     auto result = hit_test(position);
     if (!result.has_value())
         return nullptr;
+    if (include_window_frame == IncludeWindowFrame::No && result->is_frame_hit)
+        return nullptr;
     return result->window;
 }
 

+ 5 - 1
Userland/Services/WindowServer/WindowStack.h

@@ -20,7 +20,11 @@ public:
     void remove(Window&);
     void move_to_front(Window&);
 
-    Window* window_at(Gfx::IntPoint const&) const;
+    enum class IncludeWindowFrame {
+        Yes,
+        No,
+    };
+    Window* window_at(Gfx::IntPoint const&, IncludeWindowFrame = IncludeWindowFrame::Yes) const;
 
     template<typename Callback>
     IterationDecision for_each_visible_window_from_back_to_front(Callback);