]> Dogcows Code - chaz/openbox/blobdiff - openbox/event.c
ultra-keyboard-controlled-menus
[chaz/openbox] / openbox / event.c
index bbde397e7789c90efbb157e3ac9e5630a1525f37..8d1380d48d6ff0f23b5f20f7a9ac399cf922c2d9 100644 (file)
@@ -17,7 +17,6 @@
 #include "stacking.h"
 #include "extensions.h"
 #include "timer.h"
-#include "dispatch.h"
 #include "event.h"
 
 #include <X11/Xlib.h>
@@ -523,45 +522,29 @@ static void event_process(XEvent *e)
        xerror_set_ignore(FALSE);
     }
 
-    if (menu_frame_visible)
-        if (e->type == MotionNotify || e->type == ButtonRelease ||
-            e->type == ButtonPress ||
-            e->type == KeyPress || e->type == KeyRelease) {
-            event_handle_menu(e);
-
-            return; /* no dispatch! */
-        }
-
-    if (moveresize_in_progress)
-        if (e->type == MotionNotify || e->type == ButtonRelease ||
-            e->type == ButtonPress ||
-            e->type == KeyPress || e->type == KeyRelease) {
-            moveresize_event(e);
-
-            return; /* no dispatch! */
-        }
-
     /* user input (action-bound) events */
     if (e->type == ButtonPress || e->type == ButtonRelease ||
         e->type == MotionNotify || e->type == KeyPress ||
         e->type == KeyRelease)
     {
-        ObFrameContext context;
-
-        context = frame_context(client, e->xany.window);
+        if (menu_frame_visible)
+            event_handle_menu(e);
+        else if (moveresize_in_progress)
+            moveresize_event(e);
+        else {
+            ObFrameContext context;
 
-        if (!keyboard_process_interactive_grab(e, &client, &context)) {
+            context = frame_context(client, e->xany.window);
 
-            if (e->type == ButtonPress || e->type == ButtonRelease ||
-                e->type == MotionNotify)
-                mouse_event(client, context, e);
-            else if (e->type == KeyPress)
-                keyboard_event(client, e);
+            if (!keyboard_process_interactive_grab(e, &client, &context)) {
+                if (e->type == ButtonPress || e->type == ButtonRelease ||
+                    e->type == MotionNotify)
+                    mouse_event(client, context, e);
+                else if (e->type == KeyPress)
+                    keyboard_event(client, e);
+            }
         }
     }
-
-    /* dispatch the event to registered handlers */
-    dispatch_x(e, client);
 }
 
 static void event_handle_root(XEvent *e)
@@ -1102,14 +1085,15 @@ static void find_max_fd()
 #endif
 }
 
-void event_remove_fd(int n)
+void event_remove_fd(gint n)
 {
     FD_CLR(n, &allset);
     g_datalist_id_remove_data(&fd_handler_list, (GQuark)n);
     find_max_fd();
 }
 
-static void fd_event_handle_foreach(GQuark n, gpointer data, gpointer user_data)
+static void fd_event_handle_foreach(GQuark n,
+                                    gpointer data, gpointer user_data)
 {
     if (FD_ISSET( (int)n, &selset)) {
         event_fd_handler *h = (event_fd_handler *)data;
@@ -1163,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;
@@ -1189,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);
+        }
     }
 }
This page took 0.027512 seconds and 4 git commands to generate.