X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fevent.c;h=2e7feab76b128639ee1fbd8e4125441e2c4e049f;hb=452627a51ce38229533dfe5d8eeb877b0918d02c;hp=cc3ea68fe261a2cb6b7d1d5413de604f2db2357a;hpb=bf259be653b9c37c79f9cd8ababffe225857ce9f;p=chaz%2Fopenbox diff --git a/openbox/event.c b/openbox/event.c index cc3ea68f..2e7feab7 100644 --- a/openbox/event.c +++ b/openbox/event.c @@ -35,7 +35,6 @@ #include "keyboard.h" #include "modkeys.h" #include "mouse.h" -#include "mainloop.h" #include "focus.h" #include "focus_cycle.h" #include "moveresize.h" @@ -43,6 +42,7 @@ #include "stacking.h" #include "extensions.h" #include "translate.h" +#include "ping.h" #include #include @@ -102,8 +102,8 @@ static void focus_delay_client_dest(ObClient *client, gpointer data); Time event_curtime = CurrentTime; Time event_last_user_time = CurrentTime; /*! The serial of the current X event */ -gulong event_curserial; +static gulong event_curserial; static gboolean focus_left_screen = FALSE; /*! A list of ObSerialRanges which are to be ignored for mouse enter events */ static GSList *ignore_serials = NULL; @@ -122,9 +122,9 @@ static void ice_watch(IceConn conn, IcePointer data, Bool opening, if (opening) { fd = IceConnectionNumber(conn); - ob_main_loop_fd_add(ob_main_loop, fd, ice_handler, conn, NULL); + obt_main_loop_fd_add(ob_main_loop, fd, ice_handler, conn, NULL); } else { - ob_main_loop_fd_remove(ob_main_loop, fd); + obt_main_loop_fd_remove(ob_main_loop, fd); fd = -1; } } @@ -134,7 +134,7 @@ void event_startup(gboolean reconfig) { if (reconfig) return; - ob_main_loop_x_add(ob_main_loop, event_process, NULL, NULL); + obt_main_loop_x_add(ob_main_loop, event_process, NULL, NULL); #ifdef USE_SM IceAddConnectionWatch(ice_watch, NULL); @@ -475,10 +475,12 @@ static void event_process(const XEvent *ec, gpointer data) client = WINDOW_AS_CLIENT(obwin); break; case Window_Menu: - case Window_Internal: /* not to be used for events */ g_assert_not_reached(); break; + case Window_Internal: + /* we don't do anything with events directly on these windows */ + break; } } @@ -639,9 +641,12 @@ static void event_process(const XEvent *ec, gpointer data) else if (e->type == MapRequest) client_manage(window); else if (e->type == MappingNotify) { - /* keyboard layout changes, reconfigure openbox. need to restart the - modkeys system, but also to reload the key bindings. */ - ob_reconfigure(); + /* keyboard layout changes for modifier mapping changes. reload the + modifier map, and rebind all the key bindings as appropriate */ + ob_debug("Kepboard map changed. Reloading keyboard bindings.\n"); + modkeys_shutdown(TRUE); + modkeys_startup(TRUE); + keyboard_rebind(); } else if (e->type == ClientMessage) { /* This is for _NET_WM_REQUEST_FRAME_EXTENTS messages. They come for @@ -705,30 +710,9 @@ static void event_process(const XEvent *ec, gpointer data) /* Otherwise only process it if it was physically on an openbox internal window */ else { - Window target, parent, root, *children; - unsigned int nchildren; ObWindow *w; - /* Find the top level ancestor of the subwindow, besides the - root */ - target = e->xbutton.subwindow; - ob_debug("subwindow 0x%x\n", target); - while (XQueryTree(ob_display, target, &root, &parent, &children, - &nchildren) != 0) - { - XFree(children); - if (parent == root) { - ob_debug("parent is root\n"); - break; - } - target = parent; - } - ob_debug("toplevel 0x%x\n", target); - - w = g_hash_table_lookup(window_map, &target); - ob_debug("w 0x%x\n", w); - - if ((w = g_hash_table_lookup(window_map, &target)) && + if ((w = g_hash_table_lookup(window_map, &e->xbutton.subwindow)) && WINDOW_IS_INTERNAL(w)) { event_handle_user_input(client, e); @@ -783,6 +767,9 @@ static void event_handle_root(XEvent *e) ob_restart(); else if (e->xclient.data.l[0] == 3) ob_exit(0); + } else if (msgtype == prop_atoms.wm_protocols) { + if ((Atom)e->xclient.data.l[0] == prop_atoms.net_wm_ping) + ping_got_pong(e->xclient.data.l[1]); } break; case PropertyNotify: @@ -812,17 +799,17 @@ void event_enter_client(ObClient *client) if (config_focus_delay) { ObFocusDelayData *data; - ob_main_loop_timeout_remove(ob_main_loop, focus_delay_func); + obt_main_loop_timeout_remove(ob_main_loop, focus_delay_func); data = g_new(ObFocusDelayData, 1); data->client = client; data->time = event_curtime; data->serial = event_curserial; - ob_main_loop_timeout_add(ob_main_loop, - config_focus_delay * 1000, - focus_delay_func, - data, focus_delay_cmp, focus_delay_dest); + obt_main_loop_timeout_add(ob_main_loop, + config_focus_delay * 1000, + focus_delay_func, + data, focus_delay_cmp, focus_delay_dest); } else { ObFocusDelayData data; data.client = client; @@ -1012,9 +999,9 @@ static void event_handle_client(ObClient *client, XEvent *e) delay is up */ e->xcrossing.detail != NotifyInferior) { - ob_main_loop_timeout_remove_data(ob_main_loop, - focus_delay_func, - client, FALSE); + obt_main_loop_timeout_remove_data(ob_main_loop, + focus_delay_func, + client, FALSE); } break; default: @@ -1692,6 +1679,8 @@ static gboolean event_handle_menu_keyboard(XEvent *ev) /* Allow control while going thru the menu */ else if (ev->type == KeyPress && (state & ~ControlMask) == 0) { + frame->got_press = TRUE; + if (keycode == ob_keycode(OB_KEY_ESCAPE)) { menu_frame_hide_all(); ret = TRUE; @@ -1725,7 +1714,7 @@ static gboolean event_handle_menu_keyboard(XEvent *ev) Allow ControlMask only, and don't bother if the menu is empty */ else if (ev->type == KeyRelease && (state & ~ControlMask) == 0 && - frame->entries) + frame->entries && frame->got_press) { if (keycode == ob_keycode(OB_KEY_RETURN)) { /* Enter runs the active item or goes into the submenu. @@ -1924,15 +1913,15 @@ static gboolean focus_delay_func(gpointer data) static void focus_delay_client_dest(ObClient *client, gpointer data) { - ob_main_loop_timeout_remove_data(ob_main_loop, focus_delay_func, - client, FALSE); + obt_main_loop_timeout_remove_data(ob_main_loop, focus_delay_func, + client, FALSE); } -void event_halt_focus_delay() +void event_halt_focus_delay(void) { /* ignore all enter events up till the event which caused this to occur */ if (event_curserial) event_ignore_enter_range(1, event_curserial); - ob_main_loop_timeout_remove(ob_main_loop, focus_delay_func); + obt_main_loop_timeout_remove(ob_main_loop, focus_delay_func); } gulong event_start_ignore_all_enters(void) @@ -2011,6 +2000,8 @@ void event_cancel_all_key_grabs(void) } else ungrab_passive_key(); + + XSync(ob_display, FALSE); } gboolean event_time_after(Time t1, Time t2)