summaryrefslogtreecommitdiff
path: root/openbox/event.c
diff options
context:
space:
mode:
authorDana Jansens <danakj@orodu.net>2003-08-29 08:44:55 +0000
committerDana Jansens <danakj@orodu.net>2003-08-29 08:44:55 +0000
commitdcdc325f5c8c946df696d17a6da329aeac149586 (patch)
tree2790687d65f79bf5b81712d97756e5032c3a2bc4 /openbox/event.c
parent43fded6a10351a8f9f99344a102d79ece6afe8a8 (diff)
ultra-keyboard-controlled-menus
Diffstat (limited to 'openbox/event.c')
-rw-r--r--openbox/event.c38
1 files changed, 38 insertions, 0 deletions
diff --git a/openbox/event.c b/openbox/event.c
index f71fdf57..8d1380d4 100644
--- a/openbox/event.c
+++ b/openbox/event.c
@@ -1147,6 +1147,19 @@ static void event_handle_dockapp(ObDockApp *app, XEvent *e)
}
}
+ObMenuFrame* find_active_menu()
+{
+ GList *it;
+ ObMenuFrame *f;
+
+ for (it = menu_frame_visible; it; it = g_list_next(it)) {
+ f = it->data;
+ if (f->selected)
+ break;
+ }
+ return it ? it->data : NULL;
+}
+
static void event_handle_menu(XEvent *ev)
{
ObMenuFrame *f;
@@ -1173,5 +1186,30 @@ static void event_handle_menu(XEvent *ev)
menu_frame_select(f, e);
}
break;
+ case KeyPress:
+ if (ev->xkey.keycode == ob_keycode(OB_KEY_ESCAPE))
+ menu_frame_hide_all();
+ else if (ev->xkey.keycode == ob_keycode(OB_KEY_RETURN)) {
+ ObMenuFrame *f;
+ if ((f = find_active_menu()))
+ menu_entry_frame_execute(f->selected,
+ !(ev->xkey.state & ControlMask));
+ } else if (ev->xkey.keycode == ob_keycode(OB_KEY_LEFT)) {
+ ObMenuFrame *f;
+ if ((f = find_active_menu()) && f->parent)
+ menu_frame_select(f, NULL);
+ } else if (ev->xkey.keycode == ob_keycode(OB_KEY_RIGHT)) {
+ ObMenuFrame *f;
+ if ((f = find_active_menu()) && f->child && f->child->entries)
+ menu_frame_select(f->child, f->child->entries->data);
+ } else if (ev->xkey.keycode == ob_keycode(OB_KEY_UP)) {
+ ObMenuFrame *f;
+ if ((f = find_active_menu()))
+ menu_frame_select_previous(f);
+ } else if (ev->xkey.keycode == ob_keycode(OB_KEY_DOWN)) {
+ ObMenuFrame *f;
+ if ((f = find_active_menu()))
+ menu_frame_select_next(f);
+ }
}
}