X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fevent.c;h=a1a09c301e67a31b418c22295606e00f6141dbe5;hb=caca123b908c24b9ff280b2958fcd60708cd117e;hp=4f2a1513d746cdc1ee3fd90e32cc4b2ed2dceaad;hpb=fe3fbbf21085722462ad4b0937f71c3e1d27bd5e;p=chaz%2Fopenbox diff --git a/openbox/event.c b/openbox/event.c index 4f2a1513..a1a09c30 100644 --- a/openbox/event.c +++ b/openbox/event.c @@ -97,7 +97,6 @@ static const int mask_table[] = { static int mask_table_size; static guint ignore_enter_focus = 0; -static ObClient *focus_delay_client; static gboolean menu_can_hide; @@ -304,6 +303,11 @@ static void event_hack_mods(XEvent *e) static gboolean event_ignore(XEvent *e, ObClient *client) { switch(e->type) { + case EnterNotify: + case LeaveNotify: + if (e->xcrossing.detail == NotifyInferior) + return TRUE; + break; case FocusIn: /* NotifyAncestor is not ignored in FocusIn like it is in FocusOut because of RevertToPointerRoot. If the focus ends up reverting to @@ -602,6 +606,22 @@ static void event_handle_group(ObGroup *group, XEvent *e) event_handle_client(it->data, e); } +void event_enter_client(ObClient *client) +{ + g_assert(config_focus_follow); + + if (client_normal(client) && client_can_focus(client)) { + if (config_focus_delay) { + ob_main_loop_timeout_remove(ob_main_loop, focus_delay_func); + ob_main_loop_timeout_add(ob_main_loop, + config_focus_delay, + focus_delay_func, + client, NULL); + } else + focus_delay_func(client); + } +} + static void event_handle_client(ObClient *client, XEvent *e) { XEvent ce; @@ -694,12 +714,13 @@ static void event_handle_client(ObClient *client, XEvent *e) frame_adjust_state(client->frame); break; case OB_FRAME_CONTEXT_FRAME: - if (client == focus_delay_client) { + /* + if (config_focus_follow && config_focus_delay) ob_main_loop_timeout_remove_data(ob_main_loop, focus_delay_func, - focus_delay_client); - focus_delay_client = NULL; - } + client); + */ + break; default: break; } @@ -736,39 +757,25 @@ static void event_handle_client(ObClient *client, XEvent *e) frame_adjust_state(client->frame); break; case OB_FRAME_CONTEXT_FRAME: - if (!nofocus && config_focus_follow && - client_normal(client) && client_can_focus(client)) { - if (e->xcrossing.mode == NotifyGrab || - e->xcrossing.detail == NotifyInferior || - e->xcrossing.mode == NotifyUngrab) - { + if (e->xcrossing.mode == NotifyGrab || + e->xcrossing.mode == NotifyUngrab) + { #ifdef DEBUG_FOCUS - ob_debug("%sNotify mode %d detail %d on %lx IGNORED\n", - (e->type == EnterNotify ? "Enter" : "Leave"), - e->xcrossing.mode, - e->xcrossing.detail, client?client->window:0); + ob_debug("%sNotify mode %d detail %d on %lx IGNORED\n", + (e->type == EnterNotify ? "Enter" : "Leave"), + e->xcrossing.mode, + e->xcrossing.detail, client?client->window:0); #endif - } else { + } else { #ifdef DEBUG_FOCUS - ob_debug("%sNotify mode %d detail %d on %lx, " - "focusing window\n", - (e->type == EnterNotify ? "Enter" : "Leave"), - e->xcrossing.mode, - e->xcrossing.detail, client?client->window:0); + ob_debug("%sNotify mode %d detail %d on %lx, " + "focusing window\n", + (e->type == EnterNotify ? "Enter" : "Leave"), + e->xcrossing.mode, + e->xcrossing.detail, client?client->window:0); #endif - if (config_focus_delay) { - ob_main_loop_timeout_add(ob_main_loop, - config_focus_delay, - focus_delay_func, - client, NULL); - focus_delay_client = client; - } else { - client_focus(client); - if (config_focus_raise) - stacking_raise - (CLIENT_AS_WINDOW(focus_delay_client)); - } - } + if (!nofocus && config_focus_follow) + event_enter_client(client); } break; default: @@ -1252,25 +1259,43 @@ static gboolean menu_hide_delay_func(gpointer data) static gboolean focus_delay_func(gpointer data) { - if (data == focus_delay_client) { - client_focus(focus_delay_client); - if (config_focus_raise) - stacking_raise(CLIENT_AS_WINDOW(focus_delay_client)); - } + ObClient *c = data; + + client_focus(c); + if (config_focus_raise) + stacking_raise(CLIENT_AS_WINDOW(c)); return FALSE; /* no repeat */ } static void focus_delay_client_dest(gpointer data) { ObClient *c = data; - if (c == focus_delay_client) { - ob_main_loop_timeout_remove_data(ob_main_loop, focus_delay_func, - focus_delay_client); - focus_delay_client = NULL; - } + + ob_main_loop_timeout_remove_data(ob_main_loop, focus_delay_func, c); } -void event_ignore_enter_focus(guint num) +void event_ignore_queued_enters() { - ignore_enter_focus += num; + GSList *saved = NULL, *it; + XEvent *e; + + XSync(ob_display, FALSE); + + /* count the events */ + while (TRUE) { + e = g_new(XEvent, 1); + if (XCheckTypedEvent(ob_display, EnterNotify, e)) { + saved = g_slist_append(saved, e); + ++ignore_enter_focus; + } 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); }