#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)
#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;
}
}
+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;
switch (ev->type) {
case ButtonRelease:
- if (!(f = menu_frame_under(ev->xmotion.x_root,
- ev->xmotion.y_root)))
+ if (!(f = menu_frame_under(ev->xbutton.x_root,
+ ev->xbutton.y_root)))
menu_frame_hide_all();
else {
- if ((e = menu_entry_frame_under(ev->xmotion.x_root,
- ev->xmotion.y_root)))
- menu_entry_frame_execute(e);
+ if ((e = menu_entry_frame_under(ev->xbutton.x_root,
+ ev->xbutton.y_root)))
+ menu_entry_frame_execute(e,
+ !(ev->xbutton.state & ControlMask));
}
break;
case MotionNotify:
if ((f = menu_frame_under(ev->xmotion.x_root,
ev->xmotion.y_root))) {
menu_frame_move_on_screen(f);
- if (e = menu_entry_frame_under(ev->xmotion.x_root,
- ev->xmotion.y_root))
+ if ((e = menu_entry_frame_under(ev->xmotion.x_root,
+ ev->xmotion.y_root)))
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);
+ }
}
}