diff options
author | Andreas Kling <awesomekling@gmail.com> | 2019-02-12 10:08:35 +0100 |
---|---|---|
committer | Andreas Kling <awesomekling@gmail.com> | 2019-02-12 10:08:35 +0100 |
commit | db98327bdc24b3306961cde5036ea73e766008c3 (patch) | |
tree | 3980dd4690778151318bc28e7d5ae85aeecda28e /LibGUI/GEventLoop.cpp | |
parent | 9c1c8854831005cee601d73bba3a0737f350c236 (diff) | |
download | serenity-db98327bdc24b3306961cde5036ea73e766008c3.zip |
Plumb menu item activation events from WindowServer to clients.
GMenu now has an "on_item_activation" callback that fires whenever one
of its items are activated. The menu item identifier is used to distinguish
between items.
Use this to implement font switching in Terminal. :^)
Diffstat (limited to 'LibGUI/GEventLoop.cpp')
-rw-r--r-- | LibGUI/GEventLoop.cpp | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/LibGUI/GEventLoop.cpp b/LibGUI/GEventLoop.cpp index e3db469230..70f38eb9ea 100644 --- a/LibGUI/GEventLoop.cpp +++ b/LibGUI/GEventLoop.cpp @@ -3,6 +3,7 @@ #include "GObject.h" #include "GWindow.h" #include <LibGUI/GNotifier.h> +#include <LibGUI/GMenu.h> #include <LibC/unistd.h> #include <LibC/stdio.h> #include <LibC/fcntl.h> @@ -147,6 +148,21 @@ void GEventLoop::handle_mouse_event(const GUI_Event& event, GWindow& window) post_event(&window, make<GMouseEvent>(type, event.mouse.position, event.mouse.buttons, button)); } +void GEventLoop::handle_menu_event(const GUI_Event& event) +{ + if (event.type == GUI_Event::Type::MenuItemActivated) { + auto* menu = GMenu::from_menu_id(event.menu.menu_id); + if (!menu) { + dbgprintf("GEventLoop received event for invalid window ID %d\n", event.window_id); + return; + } + if (menu->on_item_activation) + menu->on_item_activation(event.menu.identifier); + return; + } + ASSERT_NOT_REACHED(); +} + void GEventLoop::wait_for_event() { fd_set rfds; @@ -219,6 +235,13 @@ void GEventLoop::wait_for_event() if (nread == 0) break; assert(nread == sizeof(event)); + + switch (event.type) { + case GUI_Event::MenuItemActivated: + handle_menu_event(event); + continue; + } + auto* window = GWindow::from_window_id(event.window_id); if (!window) { dbgprintf("GEventLoop received event for invalid window ID %d\n", event.window_id); @@ -244,6 +267,8 @@ void GEventLoop::wait_for_event() case GUI_Event::Type::KeyUp: handle_key_event(event, *window); break; + default: + break; } } } |