+ gboolean allow = FALSE;
+ gboolean relative = FALSE;
+
+ if (user || !focus_client)
+ allow = TRUE;
+ /* if the request came from an application and something already has focus
+ then do some checks; */
+ else {
+ GSList *it;
+
+ /* search if someone related to us by transience already has focus */
+ for (it = client_search_all_top_parents(self); it && !relative;
+ it = g_slist_next(it))
+ {
+ if (client_search_transient(it->data, focus_client))
+ relative = TRUE;
+ }
+
+ /* search if someone in the group already has focus */
+ for (it = client_search_all_top_parents(self); it && !relative;
+ it = g_slist_next(it))
+ {
+ if (client_search_transient(it->data, focus_client))
+ relative = TRUE;
+ }
+
+ /* if a relative has focus, then if the time is newer (or we can't
+ check the time - very lenient), allow focus to move */
+ allow = relative && (!event_curtime || !last_time ||
+ event_time_after(event_curtime, last_time));
+ }
+