diff options
author | Sergiy Stupar <owner@sestolab.pp.ua> | 2022-11-07 20:17:38 +0200 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2022-11-08 11:48:37 +0100 |
commit | 288d75fdabf161cc47d7326d63334702969673ae (patch) | |
tree | 578d18222fb1e01c3e56f257f9a7f4236826b058 | |
parent | 892186d0585e18ad636a157e82f6f89f753dedcd (diff) | |
download | serenity-288d75fdabf161cc47d7326d63334702969673ae.zip |
WindowServer: Cycle through menu items with the same Alt shortcut
If there are multiple items with the same Alt shortcut, cycle through
them with each keypress instead of activating immediately.
-rw-r--r-- | Userland/Services/WindowServer/Menu.h | 1 | ||||
-rw-r--r-- | Userland/Services/WindowServer/MenuManager.cpp | 7 |
2 files changed, 5 insertions, 3 deletions
diff --git a/Userland/Services/WindowServer/Menu.h b/Userland/Services/WindowServer/Menu.h index 2da0cc6e32..3225bf4c30 100644 --- a/Userland/Services/WindowServer/Menu.h +++ b/Userland/Services/WindowServer/Menu.h @@ -105,6 +105,7 @@ public: void redraw(MenuItem const&); MenuItem* hovered_item() const; + int hovered_item_index() const { return m_hovered_item_index; }; void set_hovered_index(int index, bool make_input = false); diff --git a/Userland/Services/WindowServer/MenuManager.cpp b/Userland/Services/WindowServer/MenuManager.cpp index ad0750c637..83dbbe72ea 100644 --- a/Userland/Services/WindowServer/MenuManager.cpp +++ b/Userland/Services/WindowServer/MenuManager.cpp @@ -68,11 +68,12 @@ void MenuManager::event(Core::Event& event) if (auto* shortcut_item_indices = m_current_menu->items_with_alt_shortcut(key_event.code_point())) { VERIFY(!shortcut_item_indices->is_empty()); - // FIXME: If there are multiple items with the same Alt shortcut, we should cycle through them - // with each keypress instead of activating immediately. - auto index = shortcut_item_indices->at(0); + auto it = shortcut_item_indices->find_if([&](int const& i) { return i > m_current_menu->hovered_item_index(); }); + auto index = shortcut_item_indices->at(it.is_end() ? 0 : it.index()); auto& item = m_current_menu->item(index); m_current_menu->set_hovered_index(index); + if (shortcut_item_indices->size() > 1) + return; if (item.is_submenu()) m_current_menu->descend_into_submenu_at_hovered_item(); else |