X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=openbox%2Fevent.c;h=0250bfc8174d348d24a5c8a895a5c6bc00c49d5b;hb=bba37f0cd103e033d77ed24cc1da92aa3d57f778;hp=e265f4deabbad83e6aadf94cbb0b898f3ca1089f;hpb=cfce6b8f4d432f804f1e6d5c972a35df56ec0df0;p=chaz%2Fopenbox diff --git a/openbox/event.c b/openbox/event.c index e265f4de..0250bfc8 100644 --- a/openbox/event.c +++ b/openbox/event.c @@ -359,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); } @@ -574,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) @@ -1082,11 +1081,10 @@ static void event_handle_client(ObClient *client, XEvent *e) if (config) { client_find_onscreen(client, &x, &y, w, h, FALSE); + client_configure(client, x, y, w, h, FALSE, TRUE); - /* don't create enter events from clients moving themselves */ - grab_pointer(FALSE, FALSE, OB_CURSOR_NONE); - client_configure_full(client, x, y, w, h, FALSE, TRUE); - ungrab_pointer(); + /* ignore enter events caused by these like ob actions do */ + event_ignore_queued_enters(); } break; } @@ -1180,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); @@ -1264,10 +1265,10 @@ static void event_handle_client(ObClient *client, XEvent *e) client_convert_gravity(client, grav, &x, &y, w, h); client_find_onscreen(client, &x, &y, w, h, FALSE); - /* don't create enter events from clients moving themselves */ - grab_pointer(FALSE, FALSE, OB_CURSOR_NONE); - client_configure_full(client, x, y, w, h, FALSE, TRUE); - ungrab_pointer(); + 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, @@ -1716,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 focus 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)