1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 04:37:34 +00:00

WindowServer: Reorder and annotate the mouse event processing code

Hopefully people can now follow and understand how this works. :^)
This commit is contained in:
Andreas Kling 2021-06-18 17:14:39 +02:00
parent fa9846ec6f
commit b5251a70c6

View file

@ -994,23 +994,36 @@ void WindowManager::process_mouse_event_for_window(HitTestResult& result, MouseE
void WindowManager::process_mouse_event(MouseEvent& event)
{
if (process_ongoing_active_input_mouse_event(event))
return;
// We need to process ongoing drag events first. Otherwise, global tracking
// and dnd collides, leading to duplicate GUI::DragOperation instances
// 1. Process ongoing drag events. This is done first to avoid clashing with global cursor tracking.
if (process_ongoing_drag(event))
return;
// 2. Send the mouse event to all windows with global cursor tracking enabled.
m_window_stack.for_each_visible_window_from_front_to_back([&](Window& window) {
if (window.global_cursor_tracking())
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.
if (process_ongoing_active_input_mouse_event(event))
return;
// 4. If there's a window being moved around, take care of that.
if (process_ongoing_window_move(event))
return;
// 5. If there's a window being resized, take care of that.
if (process_ongoing_window_resize(event))
return;
// 6. If the event is inside a titlebar button, WindowServer implements all
// the behavior for those buttons internally.
if (process_mouse_event_for_titlebar_buttons(event))
return;
// 7. If there are menus open, deal with them now. (FIXME: This needs to be cleaned up & simplified!)
bool hitting_menu_in_window_with_active_menu = [&] {
if (!m_window_with_active_menu)
return false;
@ -1033,11 +1046,11 @@ void WindowManager::process_mouse_event(MouseEvent& event)
}
}
// Hit test the window stack to see what's under the cursor.
// 8. Hit test the window stack to see what's under the cursor.
auto result = m_window_stack.hit_test(event.position());
if (!result.has_value()) {
// No window is outside the cursor.
// No window is under the cursor.
if (event.type() == Event::MouseDown) {
// Clicked outside of any window -> no active window.
// FIXME: Is this actually necessary? The desktop window should catch everything anyway.
@ -1047,13 +1060,6 @@ void WindowManager::process_mouse_event(MouseEvent& event)
return;
}
m_window_stack.for_each_visible_window_from_front_to_back([&](Window& window) {
if (window.global_cursor_tracking()) {
deliver_mouse_event(window, event, false);
}
return IterationDecision::Continue;
});
process_mouse_event_for_window(result.value(), event);
}