summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Wiederhake <BenWiederhake.GitHub@gmx.de>2021-09-10 21:58:57 +0200
committerAndreas Kling <kling@serenityos.org>2021-09-10 22:09:23 +0200
commit7684e4f7269b698947569b830f943f4dc10f7630 (patch)
tree6eb8dfdb90ac57bc37cb46587ee97a313fbc6476
parent61f573fa67267de4277001dc7969dbccbf0821d4 (diff)
downloadserenity-7684e4f7269b698947569b830f943f4dc10f7630.zip
WindowServer: Fix 'sticky' mouse after resize
This fixes #9933 and some dead code I accidentally left over. Thanks, @Maato!
-rw-r--r--Userland/Services/WindowServer/Window.cpp5
-rw-r--r--Userland/Services/WindowServer/Window.h3
-rw-r--r--Userland/Services/WindowServer/WindowManager.cpp10
3 files changed, 10 insertions, 8 deletions
diff --git a/Userland/Services/WindowServer/Window.cpp b/Userland/Services/WindowServer/Window.cpp
index 60c52b3bf6..aa066301b8 100644
--- a/Userland/Services/WindowServer/Window.cpp
+++ b/Userland/Services/WindowServer/Window.cpp
@@ -597,11 +597,6 @@ void Window::handle_keydown_event(const KeyEvent& event)
m_client->async_key_down(m_window_id, (u32)event.code_point(), (u32)event.key(), event.modifiers(), (u32)event.scancode());
}
-void Window::set_global_cursor_tracking_enabled(bool enabled)
-{
- m_global_cursor_tracking_enabled = enabled;
-}
-
void Window::set_visible(bool b)
{
if (m_visible == b)
diff --git a/Userland/Services/WindowServer/Window.h b/Userland/Services/WindowServer/Window.h
index edf8669095..e3f66e9e70 100644
--- a/Userland/Services/WindowServer/Window.h
+++ b/Userland/Services/WindowServer/Window.h
@@ -242,7 +242,7 @@ public:
void set_global_cursor_tracking_enabled(bool);
void set_automatic_cursor_tracking_enabled(bool enabled) { m_automatic_cursor_tracking_enabled = enabled; }
- bool global_cursor_tracking() const { return m_global_cursor_tracking_enabled || m_automatic_cursor_tracking_enabled; }
+ bool is_automatic_cursor_tracking() const { return m_automatic_cursor_tracking_enabled; }
bool has_alpha_channel() const { return m_has_alpha_channel; }
void set_has_alpha_channel(bool value);
@@ -409,7 +409,6 @@ private:
Gfx::DisjointRectSet m_transparency_wallpaper_rects;
HashMap<Window*, Gfx::DisjointRectSet> m_affected_transparency_rects;
WindowType m_type { WindowType::Normal };
- bool m_global_cursor_tracking_enabled { false };
bool m_automatic_cursor_tracking_enabled { false };
bool m_visible { true };
bool m_has_alpha_channel { false };
diff --git a/Userland/Services/WindowServer/WindowManager.cpp b/Userland/Services/WindowServer/WindowManager.cpp
index a49ef0c3cb..c91c943526 100644
--- a/Userland/Services/WindowServer/WindowManager.cpp
+++ b/Userland/Services/WindowServer/WindowManager.cpp
@@ -1182,7 +1182,7 @@ void WindowManager::process_mouse_event_for_window(HitTestResult& result, MouseE
return;
}
- if (!window.global_cursor_tracking()) {
+ if (!window.is_automatic_cursor_tracking()) {
deliver_mouse_event(window, event, true);
}
@@ -1206,6 +1206,14 @@ void WindowManager::process_mouse_event(MouseEvent& event)
conn.async_track_mouse_move(event.position());
}
});
+ // The active input tracking window is excluded here because we're sending the event to it
+ // in the next step.
+ auto& window_stack = current_window_stack();
+ for_each_visible_window_from_front_to_back([&](Window& window) {
+ if (window.is_automatic_cursor_tracking() && &window != window_stack.active_input_tracking_window())
+ deliver_mouse_event(window, event, false);
+ return IterationDecision::Continue;
+ });
// 3. If there's an active input tracking window, all mouse events go there.
// Tracking ends after all mouse buttons have been released.