#include "stacking.h"
#include "extensions.h"
#include "timer.h"
-#include "dispatch.h"
#include "event.h"
#include <X11/Xlib.h>
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)
}
}
+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;
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)
+ menu_frame_select_next(f->child);
+ } 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);
+ }
+ break;
}
}