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
2 files changed,
31 insertions(+),
5 deletions(-)
M
openbox/client.c
→
openbox/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.h
→
openbox/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.