all repos — openbox @ f638c5b8fac29cffb62de1f6cab351b48afda918

openbox fork - make it a bit more like ryudo

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.
Dana Jansens danakj@orodu.net
commit

f638c5b8fac29cffb62de1f6cab351b48afda918

parent

70fc99f90eac59498e603a38cdb583e9f4536cba

2 files changed, 19 insertions(+), 20 deletions(-)

jump to
M openbox/event.copenbox/event.c

@@ -319,6 +319,12 @@ ObWindow *w = g_hash_table_lookup(window_map, &e->xfocus.window);

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 @@ e->xfocus.detail == NotifyInferior)

{ 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 @@ XPutBackEvent(ob_display, &ce);

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 @@ } else if (e->type == FocusOut) {

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 @@ "Focus went to a black hole !\n");

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) {

@@ -570,13 +580,6 @@ "Focus went to an unmanaged window 0x%x !\n",

ce.xfocus.window); 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);
M openbox/focus.copenbox/focus.c

@@ -186,12 +186,8 @@ screen_install_colormap(focus_client, FALSE);

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