From 3606a4af6f75b5e35ce540bf083b776a097d096f Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Thu, 6 Mar 2008 02:35:26 -0500 Subject: [PATCH] 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 --- openbox/client.c | 24 ++++++++++++++++++++++-- openbox/client.h | 12 +++++++++--- 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/openbox/client.c b/openbox/client.c index 82976f6a..f55af2b8 100644 --- a/openbox/client.c +++ b/openbox/client.c @@ -495,7 +495,10 @@ void client_manage(Window window, ObPrompt *prompt) 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 @@ void client_manage(Window window, ObPrompt *prompt) 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 @@ void client_manage(Window window, ObPrompt *prompt) 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) */ @@ -4049,6 +4054,21 @@ ObClient *client_search_focus_parent(ObClient *self) 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) { GSList *it; diff --git a/openbox/client.h b/openbox/client.h index c2461cb9..a3d50b0e 100644 --- a/openbox/client.h +++ b/openbox/client.h @@ -643,12 +643,18 @@ RrImage* client_icon(ObClient *self); 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. If no focused transient is found, NULL is returned.