summaryrefslogtreecommitdiff
path: root/Userland/Services
diff options
context:
space:
mode:
authorSergiy Stupar <owner@sestolab.pp.ua>2022-11-07 20:17:38 +0200
committerAndreas Kling <kling@serenityos.org>2022-11-08 11:48:37 +0100
commit288d75fdabf161cc47d7326d63334702969673ae (patch)
tree578d18222fb1e01c3e56f257f9a7f4236826b058 /Userland/Services
parent892186d0585e18ad636a157e82f6f89f753dedcd (diff)
downloadserenity-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.
Diffstat (limited to 'Userland/Services')
-rw-r--r--Userland/Services/WindowServer/Menu.h1
-rw-r--r--Userland/Services/WindowServer/MenuManager.cpp7
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