From 68d5b399429738a8b39dd242fa228c7077052bbb Mon Sep 17 00:00:00 2001 From: Shannon Booth Date: Mon, 20 Jan 2020 22:03:57 +1300 Subject: [PATCH] WindowServer: Simplify WSMenu MouseWheel event A mouse move event needs to do a bit more work than what a mouse wheel event does. Mouse wheel just needs to update the hovered item, and update for a new hovered item. This also stops us from calling redraw() twice on a wheel event. --- Servers/WindowServer/WSMenu.cpp | 21 +++++++++++---------- Servers/WindowServer/WSMenu.h | 2 +- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/Servers/WindowServer/WSMenu.cpp b/Servers/WindowServer/WSMenu.cpp index fac6d8abe4..fa622f8c89 100644 --- a/Servers/WindowServer/WSMenu.cpp +++ b/Servers/WindowServer/WSMenu.cpp @@ -300,11 +300,9 @@ void WSMenu::decend_into_submenu_at_hovered_item() m_in_submenu = true; } -void WSMenu::handle_hover_event(const WSMouseEvent& event) +void WSMenu::handle_mouse_move_event(const WSMouseEvent& mouse_event) { ASSERT(menu_window()); - auto mouse_event = static_cast(event); - if (hovered_item() && hovered_item()->is_submenu()) { auto item = *hovered_item(); @@ -333,7 +331,7 @@ void WSMenu::handle_hover_event(const WSMouseEvent& event) void WSMenu::event(CEvent& event) { if (event.type() == WSEvent::MouseMove) { - handle_hover_event(static_cast(event)); + handle_mouse_move_event(static_cast(event)); return; } @@ -343,14 +341,17 @@ void WSMenu::event(CEvent& event) } if (event.type() == WSEvent::MouseWheel && is_scrollable()) { + ASSERT(menu_window()); auto& mouse_event = static_cast(event); m_scroll_offset += mouse_event.wheel_delta(); - if (m_scroll_offset < 0) - m_scroll_offset = 0; - if (m_scroll_offset >= m_max_scroll_offset) - m_scroll_offset = m_max_scroll_offset; - handle_hover_event(mouse_event); - redraw(); + m_scroll_offset = clamp(m_scroll_offset, 0, m_max_scroll_offset); + + int index = item_index_at(mouse_event.position()); + if (m_hovered_item_index == index) + return; + + m_hovered_item_index = index; + update_for_new_hovered_item(); return; } diff --git a/Servers/WindowServer/WSMenu.h b/Servers/WindowServer/WSMenu.h index 78dab04495..e59eec5cbb 100644 --- a/Servers/WindowServer/WSMenu.h +++ b/Servers/WindowServer/WSMenu.h @@ -117,7 +117,7 @@ public: private: virtual void event(CEvent&) override; - void handle_hover_event(const WSMouseEvent&); + void handle_mouse_move_event(const WSMouseEvent&); int visible_item_count() const; int item_index_at(const Point&);