all repos — openbox @ 1d6c07c24be25b2de4d36dfb0cc6e5f2d3518bf8

openbox fork - make it a bit more like ryudo

try catch weird racey corner case where we try fallback to a window but it unmaps as we do so, so focus ends up going to nowhere
Dana Jansens danakj@orodu.net
commit

1d6c07c24be25b2de4d36dfb0cc6e5f2d3518bf8

parent

3bee91aaf9c9893fb4a516432ad195a117baf1ce

3 files changed, 32 insertions(+), 5 deletions(-)

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

@@ -98,6 +98,7 @@

static guint ignore_enter_focus = 0; static gboolean menu_can_hide; static gboolean focus_left_screen = FALSE; +static ObClient *focus_tried = NULL; #ifdef USE_SM static void ice_handler(gint fd, gpointer conn)

@@ -498,7 +499,7 @@ if (e->xfocus.detail == NotifyInferior)

focus_left_screen = FALSE; if (!focus_left_screen) - focus_fallback(TRUE); + focus_tried = focus_fallback(TRUE); } } else if (client && client != focus_client) { focus_left_screen = FALSE;

@@ -506,6 +507,8 @@ frame_adjust_focus(client->frame, TRUE);

focus_set_client(client); client_calc_layer(client); client_bring_helper_windows(client); + + focus_tried = NULL; /* focus isn't "trying" to go anywhere now */ } } else if (e->type == FocusOut) { gboolean nomove = FALSE;

@@ -547,7 +550,7 @@ that isn't a client. */

ob_debug_type(OB_DEBUG_FOCUS, "Focus went to an unmanaged window 0x%x !\n", ce.xfocus.window); - focus_fallback(TRUE); + focus_tried = focus_fallback(TRUE); } }

@@ -1075,10 +1078,24 @@ "ignores left %d\n",

client->window, e->xunmap.event, e->xunmap.from_configure, client->ignore_unmaps); client_unmanage(client); + + /* we were trying to focus this window but it's gone */ + if (client == focus_tried) { + ob_debug_type(OB_DEBUG_FOCUS, "Tried to focus window 0x%x but it " + "is being unmanaged. Falling back focus again.\n"); + focus_tried = focus_fallback(TRUE); + } break; case DestroyNotify: ob_debug("DestroyNotify for window 0x%x\n", client->window); client_unmanage(client); + + /* we were trying to focus this window but it's gone */ + if (client == focus_tried) { + ob_debug_type(OB_DEBUG_FOCUS, "Tried to focus window 0x%x but it " + "is being unmanaged. Falling back focus again.\n"); + focus_tried = focus_fallback(TRUE); + } break; case ReparentNotify: /* this is when the client is first taken captive in the frame */

@@ -1097,6 +1114,13 @@ XPutBackEvent(ob_display, e);

ob_debug("ReparentNotify for window 0x%x\n", client->window); client_unmanage(client); + + /* we were trying to focus this window but it's gone */ + if (client == focus_tried) { + ob_debug_type(OB_DEBUG_FOCUS, "Tried to focus window 0x%x but it " + "is being unmanaged. Falling back focus again.\n"); + focus_tried = focus_fallback(TRUE); + } break; case MapRequest: ob_debug("MapRequest for 0x%lx\n", client->window);
M openbox/focus.copenbox/focus.c

@@ -255,7 +255,7 @@ ob_debug_type(OB_DEBUG_FOCUS, "found desktop: \n", !!desktop);

return desktop; } -void focus_fallback(gboolean allow_refocus) +ObClient* focus_fallback(gboolean allow_refocus) { ObClient *new; ObClient *old = focus_client;

@@ -266,8 +266,11 @@ at all for them.

*/ focus_nothing(); - if ((new = focus_fallback_target(allow_refocus, old))) + if ((new = focus_fallback_target(allow_refocus, old))) { client_focus(new); + return new; + } else + return NULL; } void focus_nothing()
M openbox/focus.hopenbox/focus.h

@@ -49,7 +49,7 @@ struct _ObClient* focus_fallback_target(gboolean allow_refocus,

struct _ObClient *old); /*! Call this when you need to focus something! */ -void focus_fallback(gboolean allow_refocus); +struct _ObClient* focus_fallback(gboolean allow_refocus); /*! Cycle focus amongst windows. */ void focus_cycle(gboolean forward, gboolean all_desktops,