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);
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,
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) */
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;
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.