diff options
Diffstat (limited to 'openbox')
| -rw-r--r-- | openbox/client.c | 37 | ||||
| -rw-r--r-- | openbox/client.h | 12 |
2 files changed, 40 insertions, 9 deletions
diff --git a/openbox/client.c b/openbox/client.c index e9443d49..a055e632 100644 --- a/openbox/client.c +++ b/openbox/client.c @@ -414,12 +414,14 @@ void client_manage(Window window, ObPrompt *prompt) activate ? "yes" : "no"); if (activate) { gboolean raise = FALSE; - gboolean relative_focused = FALSE; + gboolean relative_focused; + gboolean parent_focused; + 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); - + (client_search_focus_tree_full(self) != NULL || + client_search_focus_group_full(self) != NULL)); /* This is focus stealing prevention */ ob_debug_type(OB_DEBUG_FOCUS, @@ -427,6 +429,12 @@ void client_manage(Window window, ObPrompt *prompt) "launched at %u (last user interaction time %u)", self->window, map_time, launch_time, event_last_user_time); + ob_debug_type(OB_DEBUG_FOCUS, + "Current focus_client: %s", + (focus_client ? focus_client->title : "(none)")); + ob_debug_type(OB_DEBUG_FOCUS, + "parent focuesed: %d relative focused: %d", + parent_focused, relative_focused); if (menu_frame_visible || moveresize_in_progress) { activate = FALSE; @@ -454,7 +462,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, @@ -463,7 +472,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"); + "working in another window that is not " + "its parent"); } /* If the new window is a transient (and its relatives aren't focused) */ @@ -3958,6 +3968,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 6a396cf4..5e26ef30 100644 --- a/openbox/client.h +++ b/openbox/client.h @@ -641,12 +641,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. |
