all repos — openbox @ 3606a4af6f75b5e35ce540bf083b776a097d096f

openbox fork - make it a bit more like ryudo

when a window pops up a child, don't avoid focusing it because you were working in its parent window before this.  that's probably what made the window appear in the first place
Dana Jansens danakj@orodu.net
commit

3606a4af6f75b5e35ce540bf083b776a097d096f

parent

c4e55ad27e886c592fa033e63d83724fda636952

2 files changed, 31 insertions(+), 5 deletions(-)

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

@@ -495,7 +495,10 @@ activate ? "yes" : "no");

if (activate) { gboolean raise = FALSE; gboolean relative_focused = FALSE; + gboolean parent_focused = FALSE; + parent_focused = (focus_client != NULL && + client_search_focus_parent(self)); relative_focused = (focus_client != NULL && client_search_focus_tree_full(self) != NULL && client_search_focus_group_full(self) != NULL);

@@ -534,7 +537,8 @@ /* If something is focused... */

else if (focus_client) { /* If the user is working in another window right now, then don't steal focus */ - if (event_last_user_time && launch_time && + if (!parent_focused && + event_last_user_time && launch_time && event_time_after(event_last_user_time, launch_time) && event_last_user_time != launch_time && event_time_after(event_last_user_time,

@@ -543,7 +547,8 @@ {

activate = FALSE; ob_debug_type(OB_DEBUG_FOCUS, "Not focusing the window because the user is " - "working in another window\n"); + "working in another window that is not " + "its parent\n"); } /* If the new window is a transient (and its relatives aren't focused) */

@@ -4047,6 +4052,21 @@ for (it = self->parents; it; it = g_slist_next(it))

if (client_focused(it->data)) return it->data; return NULL; +} + +ObClient *client_search_focus_parent_full(ObClient *self) +{ + GSList *it; + ObClient *ret = NULL; + + for (it = self->parents; it; it = g_slist_next(it)) { + if (client_focused(it->data)) + ret = it->data; + else + ret = client_search_focus_parent_full(it->data); + if (ret) break; + } + return ret; } ObClient *client_search_parent(ObClient *self, ObClient *search)
M openbox/client.hopenbox/client.h

@@ -643,11 +643,17 @@ FALSE if it's not transient or there is no window for it to be

transient for */ gboolean client_has_parent(ObClient *self); -/*! Searches a client's direct parents for a focused window. The function does - not check for the passed client, only for *ONE LEVEL* of its parents. - If no focused parentt is found, NULL is returned. +/*! Searches a client's immediate parents for a focused window. The function + does not check for the passed client, only for *ONE LEVEL* of its parents. + If no focused parent is found, NULL is returned. */ ObClient *client_search_focus_parent(ObClient *self); + +/*! Searches a client's parents for a focused window. The function + does not check for the passed client, but searches through all of its + parents. If no focused parent is found, NULL is returned. +*/ +ObClient *client_search_focus_parent_full(ObClient *self); /*! Searches a client's transients for a focused window. The function does not check for the passed client, only for its transients.