summaryrefslogtreecommitdiff
path: root/LibGUI/GEventLoop.cpp
diff options
context:
space:
mode:
authorAndreas Kling <awesomekling@gmail.com>2019-02-12 10:08:35 +0100
committerAndreas Kling <awesomekling@gmail.com>2019-02-12 10:08:35 +0100
commitdb98327bdc24b3306961cde5036ea73e766008c3 (patch)
tree3980dd4690778151318bc28e7d5ae85aeecda28e /LibGUI/GEventLoop.cpp
parent9c1c8854831005cee601d73bba3a0737f350c236 (diff)
downloadserenity-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.cpp25
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;
}
}
}