#include "screen.h"
#include "frame.h"
#include "menu.h"
+#include "menuframe.h"
#include "keyboard.h"
#include "mouse.h"
#include "framerender.h"
#include "stacking.h"
#include "extensions.h"
#include "timer.h"
-#include "dispatch.h"
#include "event.h"
#include <X11/Xlib.h>
static void event_process(XEvent *e);
static void event_handle_root(XEvent *e);
+static void event_handle_menu(XEvent *e);
static void event_handle_dock(ObDock *s, XEvent *e);
static void event_handle_dockapp(ObDockApp *app, XEvent *e);
static void event_handle_client(ObClient *c, XEvent *e);
-static void event_handle_menu(ObClient *c, XEvent *e);
static void fd_event_handle();
#ifdef USE_SM
static void ice_watch(IceConn conn, IcePointer data, Bool opening,
break;
case MotionNotify:
STRIP_MODS(e->xmotion.state);
+#if 0
/* compress events */
{
XEvent ce;
e->xmotion.y_root = ce.xmotion.y_root;
}
}
+#endif
break;
}
}
ObClient *client = NULL;
ObDock *dock = NULL;
ObDockApp *dockapp = NULL;
- ObMenu *menu = NULL;
ObWindow *obwin = NULL;
window = event_get_window(e);
case Window_DockApp:
dockapp = WINDOW_AS_DOCKAPP(obwin);
break;
- case Window_Menu:
- menu = WINDOW_AS_MENU(obwin);
- break;
case Window_Client:
client = WINDOW_AS_CLIENT(obwin);
break;
+ case Window_Menu:
case Window_Internal:
/* not to be used for events */
g_assert_not_reached();
xerror_set_ignore(FALSE);
}
- if (menu_visible)
- if (e->type == MotionNotify || e->type == ButtonRelease ||
- e->type == ButtonPress ||
- e->type == KeyPress || e->type == KeyRelease) {
- event_handle_menu(client, 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)
int fh = h +
client->frame->size.top + client->frame->size.bottom;
client_find_onscreen(client, &newx, &newy, fw, fh,
- client_noral(self));
+ client_normal(client));
if (e->xconfigurerequest.value_mask & CWX)
x = newx;
if (e->xconfigurerequest.value_mask & CWY)
int fh = h +
client->frame->size.top + client->frame->size.bottom;
client_find_onscreen(client, &newx, &newy, fw, fh,
- client_normal(self));
+ client_normal(client));
if (e->xclient.data.l[0] & 1 << 8)
x = newx;
if (e->xclient.data.l[0] & 1 << 9)
}
}
-static void event_handle_menu(ObClient *client, XEvent *e)
-{
- ObMenuEntry *entry;
- ObMenu *top;
- GList *it = NULL;
-
- top = g_list_nth_data(menu_visible, 0);
-
- ob_debug("EVENT %d\n", e->type);
- switch (e->type) {
- case KeyPress:
- menu_control_keyboard_nav(e->xkey.keycode);
- break;
- case ButtonPress:
- ob_debug("BUTTON PRESS\n");
-
- break;
- case ButtonRelease:
- ob_debug("BUTTON RELEASED\n");
-
- for (it = menu_visible; it; it = g_list_next(it)) {
- ObMenu *m = it->data;
- if (e->xbutton.x_root >= m->location.x - ob_rr_theme->bwidth &&
- e->xbutton.y_root >= m->location.y - ob_rr_theme->bwidth &&
- e->xbutton.x_root < m->location.x + m->size.width +
- ob_rr_theme->bwidth &&
- e->xbutton.y_root < m->location.y + m->size.height +
- ob_rr_theme->bwidth) {
- if ((entry = menu_find_entry_by_pos(it->data,
- e->xbutton.x_root -
- m->location.x,
- e->xbutton.y_root -
- m->location.y))) {
- m->selected(entry, e->xbutton.button,
- e->xbutton.x_root,
- e->xbutton.y_root);
- break;
- }
- break;
- }
- }
-
- /* will call the menu_hide() for each submenu as well */
- if (!it)
- menu_control_keyboard_nav(ob_keycode(OB_KEY_ESCAPE));
-
- break;
- case MotionNotify:
- ob_debug("motion\n");
- for (it = menu_visible; it; it = g_list_next(it)) {
- ObMenu *m = it->data;
- if ((entry = menu_find_entry_by_pos(it->data,
- e->xmotion.x_root -
- m->location.x,
- e->xmotion.y_root -
- m->location.y))) {
- if (m->over && m->over->data != entry)
- m->mouseover(m->over->data, FALSE);
-
- m->mouseover(entry, TRUE);
- break;
- }
- }
-
- break;
- }
-}
-
void event_add_fd_handler(event_fd_handler *h) {
g_datalist_id_set_data(&fd_handler_list, h->fd, h);
FD_SET(h->fd, &allset);
#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;
break;
}
}
+
+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;
+ ObMenuEntryFrame *e;
+
+ switch (ev->type) {
+ case ButtonRelease:
+ 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->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)))
+ 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);
+ }
+ }
+}