1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-24 14:17:42 +00:00

WindowServer: Factor out ongoing drag/resize from process_mouse_event().

The mouse event processing code is getting unwieldy. Break out two huge
chunks into separate functions so the code becomes easier to work with.
This commit is contained in:
Andreas Kling 2019-03-24 13:00:12 +01:00
parent 900a3966e2
commit 56ee8bfe2a
2 changed files with 134 additions and 118 deletions

View file

@ -656,20 +656,18 @@ void WSWindowManager::start_window_resize(WSWindow& window, WSMouseEvent& event)
invalidate(window); invalidate(window);
} }
void WSWindowManager::process_mouse_event(WSMouseEvent& event, WSWindow*& event_window) bool WSWindowManager::process_ongoing_window_drag(WSMouseEvent& event, WSWindow*& event_window)
{ {
event_window = nullptr; if (!m_drag_window)
return false;
if (m_drag_window) {
if (event.type() == WSMessage::MouseUp && event.button() == MouseButton::Left) { if (event.type() == WSMessage::MouseUp && event.button() == MouseButton::Left) {
#ifdef DRAG_DEBUG #ifdef DRAG_DEBUG
printf("[WM] Finish dragging WSWindow{%p}\n", m_drag_window.ptr()); printf("[WM] Finish dragging WSWindow{%p}\n", m_drag_window.ptr());
#endif #endif
invalidate(*m_drag_window); invalidate(*m_drag_window);
m_drag_window = nullptr; m_drag_window = nullptr;
return; return true;
} }
if (event.type() == WSMessage::MouseMove) { if (event.type() == WSMessage::MouseMove) {
auto old_window_rect = m_drag_window->rect(); auto old_window_rect = m_drag_window->rect();
Point pos = m_drag_window_origin; Point pos = m_drag_window_origin;
@ -680,11 +678,16 @@ void WSWindowManager::process_mouse_event(WSMouseEvent& event, WSWindow*& event_
m_drag_window->set_position_without_repaint(pos); m_drag_window->set_position_without_repaint(pos);
invalidate(outer_window_rect(old_window_rect)); invalidate(outer_window_rect(old_window_rect));
invalidate(outer_window_rect(m_drag_window->rect())); invalidate(outer_window_rect(m_drag_window->rect()));
return; return true;
}
} }
return false;
}
bool WSWindowManager::process_ongoing_window_resize(WSMouseEvent& event, WSWindow*& event_window)
{
if (!m_resize_window)
return false;
if (m_resize_window) {
if (event.type() == WSMessage::MouseUp && event.button() == MouseButton::Right) { if (event.type() == WSMessage::MouseUp && event.button() == MouseButton::Right) {
#ifdef RESIZE_DEBUG #ifdef RESIZE_DEBUG
printf("[WM] Finish resizing WSWindow{%p}\n", m_resize_window.ptr()); printf("[WM] Finish resizing WSWindow{%p}\n", m_resize_window.ptr());
@ -692,10 +695,12 @@ void WSWindowManager::process_mouse_event(WSMouseEvent& event, WSWindow*& event_
WSMessageLoop::the().post_message(*m_resize_window, make<WSResizeEvent>(m_resize_window->rect(), m_resize_window->rect())); WSMessageLoop::the().post_message(*m_resize_window, make<WSResizeEvent>(m_resize_window->rect(), m_resize_window->rect()));
invalidate(*m_resize_window); invalidate(*m_resize_window);
m_resize_window = nullptr; m_resize_window = nullptr;
return; return true;
} }
if (event.type() == WSMessage::MouseMove) { if (event.type() != WSMessage::MouseMove)
return false;
auto old_rect = m_resize_window->rect(); auto old_rect = m_resize_window->rect();
int diff_x = event.x() - m_resize_origin.x(); int diff_x = event.x() - m_resize_origin.x();
@ -761,7 +766,7 @@ void WSWindowManager::process_mouse_event(WSMouseEvent& event, WSWindow*& event_
} }
if (m_resize_window->rect() == new_rect) if (m_resize_window->rect() == new_rect)
return; return true;
#ifdef RESIZE_DEBUG #ifdef RESIZE_DEBUG
dbgprintf("[WM] Resizing [original: %s] now: %s\n", dbgprintf("[WM] Resizing [original: %s] now: %s\n",
m_resize_window_original_rect.to_string().characters(), m_resize_window_original_rect.to_string().characters(),
@ -776,9 +781,18 @@ void WSWindowManager::process_mouse_event(WSMouseEvent& event, WSWindow*& event_
m_resize_window->set_last_lazy_resize_rect(new_rect); m_resize_window->set_last_lazy_resize_rect(new_rect);
WSMessageLoop::the().post_message(*m_resize_window, make<WSResizeEvent>(old_rect, new_rect)); WSMessageLoop::the().post_message(*m_resize_window, make<WSResizeEvent>(old_rect, new_rect));
} }
return true;
}
void WSWindowManager::process_mouse_event(WSMouseEvent& event, WSWindow*& event_window)
{
event_window = nullptr;
if (process_ongoing_window_drag(event, event_window))
return;
if (process_ongoing_window_resize(event, event_window))
return; return;
}
}
for (auto* window = m_windows_in_order.tail(); window; window = window->prev()) { for (auto* window = m_windows_in_order.tail(); window; window = window->prev()) {
if (!window->global_cursor_tracking()) if (!window->global_cursor_tracking())

View file

@ -86,6 +86,8 @@ public:
private: private:
void process_mouse_event(WSMouseEvent&, WSWindow*& event_window); void process_mouse_event(WSMouseEvent&, WSWindow*& event_window);
bool process_ongoing_window_resize(WSMouseEvent&, WSWindow*& event_window);
bool process_ongoing_window_drag(WSMouseEvent&, WSWindow*& event_window);
void handle_menu_mouse_event(WSMenu&, WSMouseEvent&); void handle_menu_mouse_event(WSMenu&, WSMouseEvent&);
void handle_menubar_mouse_event(WSMouseEvent&); void handle_menubar_mouse_event(WSMouseEvent&);
void handle_close_button_mouse_event(WSWindow&, WSMouseEvent&); void handle_close_button_mouse_event(WSWindow&, WSMouseEvent&);