summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDana Jansens <danakj@orodu.net>2008-03-06 02:35:26 -0500
committerDana Jansens <danakj@orodu.net>2008-03-06 02:35:26 -0500
commit3606a4af6f75b5e35ce540bf083b776a097d096f (patch)
treea3b2baa2dd731280f5abc2d65123078e025e44c5
parentc4e55ad27e886c592fa033e63d83724fda636952 (diff)
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
-rw-r--r--openbox/client.c24
-rw-r--r--openbox/client.h12
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.