summaryrefslogtreecommitdiff
path: root/openbox/client.c
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 /openbox/client.c
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
Diffstat (limited to 'openbox/client.c')
-rw-r--r--openbox/client.c24
1 files changed, 22 insertions, 2 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;