self->type == OB_CLIENT_TYPE_SPLASH);
}
-gboolean client_application(ObClient *self)
+gboolean client_helper(ObClient *self)
{
- return (self->type == OB_CLIENT_TYPE_NORMAL ||
- self->type == OB_CLIENT_TYPE_DIALOG);
+ return (self->type == OB_CLIENT_TYPE_UTILITY ||
+ self->type == OB_CLIENT_TYPE_MENU ||
+ self->type == OB_CLIENT_TYPE_TOOLBAR);
}
static void client_apply_startup_state(ObClient *self, gint x, gint y)
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_non_application_windows_recursive(ObClient *self,
- guint desktop)
+static void client_bring_helper_windows_recursive(ObClient *self,
+ guint desktop)
{
GSList *it;
for (it = self->transients; it; it = g_slist_next(it))
- client_bring_non_application_windows_recursive(it->data, desktop);
+ client_bring_helper_windows_recursive(it->data, desktop);
- if (client_normal(self) && !client_application(self) &&
+ if (client_helper(self) &&
self->desktop != desktop && self->desktop != DESKTOP_ALL)
{
client_set_desktop(self, desktop, FALSE, TRUE);
}
}
-void client_bring_non_application_windows(ObClient *self)
+void client_bring_helper_windows(ObClient *self)
{
- client_bring_non_application_windows_recursive(self, self->desktop);
+ client_bring_helper_windows_recursive(self, self->desktop);
}
void client_raise(ObClient *self)
return self->group && self->group->members->next;
}
-gboolean client_has_application_group_siblings(ObClient *self)
+gboolean client_has_non_helper_group_siblings(ObClient *self)
{
GSList *it;
for (it = self->group->members; it; it = g_slist_next(it)) {
ObClient *c = it->data;
- if (c != self && client_application(c))
+ if (c != self && client_normal(c) && !client_helper(c))
return TRUE;
}
return FALSE;