don't give focus to transient when it is ambiguous, but only if they have a parent
authorDana Jansens <danakj@orodu.net>
Mon, 28 May 2007 02:12:36 +0000 (02:12 +0000)
committerDana Jansens <danakj@orodu.net>
Mon, 28 May 2007 02:12:36 +0000 (02:12 +0000)
openbox/client.c
openbox/client.h

index 2974083..e7877c7 100644 (file)
@@ -498,7 +498,7 @@ void client_manage(Window window)
                is ambiguous (either the current focus target doesn't have
                a timestamp, or they are the same (we probably inherited it
                from them) */
-            else if (self->transient_for != NULL &&
+            else if (client_has_parent(self) &&
                      (!last_time || self->user_time == last_time))
             {
                 activate = FALSE;
@@ -2374,6 +2374,13 @@ ObClient *client_search_focus_tree_full(ObClient *self)
     return client_search_focus_tree(self);
 }
 
+gboolean client_has_parent(ObClient *self)
+{
+    return (self->transient_for &&
+            (self->transient_for != TRAN_GROUP ||
+             self->group && self->group->members->next));
+}
+
 static ObStackingLayer calc_layer(ObClient *self)
 {
     ObStackingLayer l;
index 3d81b27..55b684f 100644 (file)
@@ -612,6 +612,11 @@ void client_get_type_and_transientness(ObClient *self);
 
 const ObClientIcon *client_icon(ObClient *self, gint w, gint h);
 
+/*! Return TRUE if the client is transient for some other window. Return
+  FALSE if it's not transient or there is no window for it to be
+  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.