From: Dana Jansens Date: Thu, 24 May 2007 21:50:35 +0000 (+0000) Subject: some focus changes... X-Git-Url: https://git.dogcows.com/gitweb?a=commitdiff_plain;h=f638c5b8fac29cffb62de1f6cab351b48afda918;p=chaz%2Fopenbox some focus changes... 1) listen for inferiornotify. that way when iconify animating reverts to parent, we see it. 2) set client to null when falling back and update the root window property 3) get rid of the "focus didnt move anywhere" business, and just process the envents in the right order. --- diff --git a/openbox/event.c b/openbox/event.c index c19f7017..6e11f82e 100644 --- a/openbox/event.c +++ b/openbox/event.c @@ -319,6 +319,12 @@ static gboolean wanted_focusevent(XEvent *e, gboolean in_client_only) if (!w || !WINDOW_IS_CLIENT(w)) return FALSE; } + else { + /* This means focus reverted to parent from the client (this + happens often during iconify animation) */ + if (detail == NotifyInferior) + return TRUE; + } /* This means focus moved from the root window to a client */ if (detail == NotifyVirtual) @@ -480,7 +486,8 @@ static void event_process(const XEvent *ec, gpointer data) { XEvent ce; - ob_debug_type(OB_DEBUG_FOCUS, "Focus went to pointer root/none\n"); + ob_debug_type(OB_DEBUG_FOCUS, "Focus went to pointer root/none or" + " the frame window\n"); /* If another FocusIn is in the queue then don't fallback yet. This fixes the fun case of: @@ -502,7 +509,7 @@ static void event_process(const XEvent *ec, gpointer data) ob_debug_type(OB_DEBUG_FOCUS, " but another FocusIn is coming\n"); } else { - /* Focus has been reverted to the root window or nothing. + /* Focus has been reverted. FocusOut events come after UnmapNotify, so we don't need to worry about focusing an invalid window @@ -532,6 +539,13 @@ static void event_process(const XEvent *ec, gpointer data) gboolean nomove = FALSE; XEvent ce; + if (client) { + frame_adjust_focus(client->frame, FALSE); + /* focus_set_client(NULL) has already been called in this + section or by focus_fallback */ + client_calc_layer(client); + } + /* Look for the followup FocusIn */ if (!XCheckIfEvent(ob_display, &ce, event_look_for_focusin, NULL)) { /* There is no FocusIn, this means focus went to a window that @@ -554,12 +568,8 @@ static void event_process(const XEvent *ec, gpointer data) xerror_set_ignore(FALSE); /* nothing is focused */ focus_set_client(NULL); - } else if (ce.xany.window == e->xany.window) { - ob_debug_type(OB_DEBUG_FOCUS, "Focus didn't go anywhere\n"); - /* If focus didn't actually move anywhere, there is nothing to do*/ - nomove = TRUE; } else { - /* Focus did move, so process the FocusIn event */ + /* Focus moved, so process the FocusIn event */ ObEventData ed = { .ignored = FALSE }; event_process(&ce, &ed); if (ed.ignored) { @@ -571,13 +581,6 @@ static void event_process(const XEvent *ec, gpointer data) focus_fallback(TRUE); } } - - if (client && !nomove) { - frame_adjust_focus(client->frame, FALSE); - if (client == focus_client) - focus_set_client(NULL); - client_calc_layer(client); - } } else if (timewinclients) event_handle_user_time_window_clients(timewinclients, e); else if (client) diff --git a/openbox/focus.c b/openbox/focus.c index 42241224..40e18872 100644 --- a/openbox/focus.c +++ b/openbox/focus.c @@ -186,12 +186,8 @@ void focus_nothing() screen_install_colormap(NULL, TRUE); } - /* Don't set focus_client to NULL here. It will be set to NULL when the - FocusOut event comes. Otherwise, if we focus nothing and then focus the - same window again, The focus code says nothing changed, but focus_client - ends up being NULL anyways. - focus_client = NULL; - */ + /* nothing is focused, update the colormap and _the root property_ */ + focus_set_client(NULL); /* if there is a grab going on, then we need to cancel it. if we move focus during the grab, applications will get NotifyWhileGrabbed events