X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=openbox%2Fevent.c;h=fd70c972611e1ef06e95629f50ca0a06c475ce3b;hb=ae269d77ca816dd6b05f20017dab012750636b90;hp=9d10698b8b7dd17980108e3e14ffbec7add574fa;hpb=361bf6af5c7de09f30f3cf4a220b3f84a3fe451d;p=chaz%2Fopenbox diff --git a/openbox/event.c b/openbox/event.c index 9d10698b..fd70c972 100644 --- a/openbox/event.c +++ b/openbox/event.c @@ -28,6 +28,7 @@ #include "config.h" #include "screen.h" #include "frame.h" +#include "grab.h" #include "menu.h" #include "menuframe.h" #include "keyboard.h" @@ -358,7 +359,7 @@ static Bool event_look_for_focusin(Display *d, XEvent *e, XPointer arg) return e->type == FocusIn && wanted_focusevent(e, FALSE); } -Bool event_look_for_focusin_client(Display *d, XEvent *e, XPointer arg) +static Bool event_look_for_focusin_client(Display *d, XEvent *e, XPointer arg) { return e->type == FocusIn && wanted_focusevent(e, TRUE); } @@ -515,7 +516,7 @@ static void event_process(const XEvent *ec, gpointer data) "Focus went to a window that is already gone\n"); /* If you send focus to a window and then it disappears, you can - get the FocusIn FocusOut for it, after it is unmanaged. + get the FocusIn for it, after it is unmanaged. Just wait for the next FocusOut/FocusIn pair. */ } else if (client != focus_client) { @@ -573,7 +574,6 @@ static void event_process(const XEvent *ec, gpointer data) frame_adjust_focus(client->frame, FALSE); if (client == focus_client) focus_set_client(NULL); - /* focus_set_client has already been called for sure */ client_calc_layer(client); } } else if (timewinclients) @@ -1081,7 +1081,10 @@ static void event_handle_client(ObClient *client, XEvent *e) if (config) { client_find_onscreen(client, &x, &y, w, h, FALSE); - client_configure_full(client, x, y, w, h, FALSE, TRUE); + client_configure(client, x, y, w, h, FALSE, TRUE); + + /* ignore enter events caused by these like ob actions do */ + event_ignore_queued_enters(); } break; } @@ -1175,6 +1178,9 @@ static void event_handle_client(ObClient *client, XEvent *e) client->window); client_set_state(client, e->xclient.data.l[0], e->xclient.data.l[1], e->xclient.data.l[2]); + + /* ignore enter events caused by these like ob actions do */ + event_ignore_queued_enters(); } else if (msgtype == prop_atoms.net_close_window) { ob_debug("net_close_window for 0x%lx\n", client->window); client_close(client); @@ -1258,7 +1264,11 @@ static void event_handle_client(ObClient *client, XEvent *e) e->xclient.data.l[0] & 1 << 9, y); client_convert_gravity(client, grav, &x, &y, w, h); client_find_onscreen(client, &x, &y, w, h, FALSE); + client_configure(client, x, y, w, h, FALSE, TRUE); + + /* ignore enter events caused by these like ob actions do */ + event_ignore_queued_enters(); } else if (msgtype == prop_atoms.net_restack_window) { if (e->xclient.data.l[0] != 2) { ob_debug_type(OB_DEBUG_APP_BUGS, @@ -1292,11 +1302,7 @@ static void event_handle_client(ObClient *client, XEvent *e) e->xclient.data.l[2], FALSE); /* send a synthetic ConfigureNotify, cuz this is supposed to be like a ConfigureRequest. */ - client_configure_full(client, client->area.x, - client->area.y, - client->area.width, - client->area.height, - FALSE, TRUE); + client_reconfigure(client); } else ob_debug_type(OB_DEBUG_APP_BUGS, "_NET_RESTACK_WINDOW sent for window %s " @@ -1693,7 +1699,7 @@ static gboolean focus_delay_func(gpointer data) event_curtime = d->time; if (focus_client != d->client) { - if (client_focus(d->client, FALSE) && config_focus_raise) + if (client_focus(d->client) && config_focus_raise) stacking_raise(CLIENT_AS_WINDOW(d->client)); } event_curtime = old; @@ -1711,35 +1717,29 @@ void event_halt_focus_delay() ob_main_loop_timeout_remove(ob_main_loop, focus_delay_func); } +static Bool event_look_for_enters(Display *d, XEvent *e, XPointer arg) +{ + guint *count = (guint*)arg; + if (e->type == EnterNotify) { + ObWindow *win; + + win = g_hash_table_lookup(window_map, &e->xany.window); + if (win && WINDOW_IS_CLIENT(win)) + ++(*count); + } + return False; /* don't disrupt the queue order, just count them */ +} + void event_ignore_queued_enters() { - GSList *saved = NULL, *it; - XEvent *e; + XEvent e; XSync(ob_display, FALSE); - /* count the events */ - while (TRUE) { - e = g_new(XEvent, 1); - if (XCheckTypedEvent(ob_display, EnterNotify, e)) { - ObWindow *win; - - win = g_hash_table_lookup(window_map, &e->xany.window); - if (win && WINDOW_IS_CLIENT(win)) - ++ignore_enter_focus; - - saved = g_slist_append(saved, e); - } else { - g_free(e); - break; - } - } - /* put the events back */ - for (it = saved; it; it = g_slist_next(it)) { - XPutBackEvent(ob_display, it->data); - g_free(it->data); - } - g_slist_free(saved); + /* count the events without disrupting them */ + XCheckIfEvent(ob_display, &e, event_look_for_enters, + (XPointer)&ignore_enter_focus); + } gboolean event_time_after(Time t1, Time t2)