X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=openbox%2Fclient.c;h=8592aa93506a023bce7a2a0070aaa3842b15e587;hb=cc2ad0a823a918e826c7cf77f0b61e63c21910c3;hp=b38a8e079645a3435b5fca34a6145e91a500b34f;hpb=de82c4a5dfd771b89b6f48b56fcb578d91bd6bed;p=chaz%2Fopenbox diff --git a/openbox/client.c b/openbox/client.c index b38a8e07..8592aa93 100644 --- a/openbox/client.c +++ b/openbox/client.c @@ -3411,27 +3411,53 @@ static void client_present(ObClient *self, gboolean here, gboolean raise) void client_activate(ObClient *self, gboolean here, gboolean user) { guint32 last_time = focus_client ? focus_client->user_time : CurrentTime; + 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)); + } + - /* XXX do some stuff here if user is false to determine if we really want - to activate it or not (a parent or group member is currently - active)? - */ ob_debug_type(OB_DEBUG_FOCUS, "Want to activate window 0x%x with time %u (last time %u), " - "source=%s\n", + "source=%s allowing? %d\n", self->window, event_curtime, last_time, - (user ? "user" : "application")); + (user ? "user" : "application"), allow); - if (!user && event_curtime && last_time && - !event_time_after(event_curtime, last_time)) - { - client_hilite(self, TRUE); - } else { + if (allow) { if (event_curtime != CurrentTime) self->user_time = event_curtime; client_present(self, here, TRUE); - } + } else + /* don't focus it but tell the user it wants attention */ + client_hilite(self, TRUE); } static void client_bring_helper_windows_recursive(ObClient *self,