when a transient maps on another desktop, give it focus when it deserves it
authorDana Jansens <danakj@orodu.net>
Fri, 11 Jul 2003 15:32:03 +0000 (15:32 +0000)
committerDana Jansens <danakj@orodu.net>
Fri, 11 Jul 2003 15:32:03 +0000 (15:32 +0000)
openbox/client.c

index 3ed2e9d..6d1a8f8 100644 (file)
@@ -257,36 +257,54 @@ void client_manage(Window window)
 
     /* focus the new window? */
     if (ob_state() != OB_STATE_STARTING && config_focus_new &&
-        (self->type == OB_CLIENT_TYPE_NORMAL || self->type == OB_CLIENT_TYPE_DIALOG)) {
-        gboolean group_foc = FALSE;
-        
-        if (self->group) {
-            GSList *it;
-
-            for (it = self->group->members; it; it = it->next) {
-                if (client_focused(it->data)) {
-                    group_foc = TRUE;
-                    break;
-                }
-            }
-        }
         /* note the check against Type_Normal/Dialog, not client_normal(self),
            which would also include other types. in this case we want more
            strict rules for focus */
-        if ((group_foc ||
-             (!self->transient_for && (!self->group ||
-                                       !self->group->members->next))) ||
-            client_search_focus_tree_full(self) ||
-            !focus_client ||
-            !client_normal(focus_client)) {
+        (self->type == OB_CLIENT_TYPE_NORMAL ||
+         self->type == OB_CLIENT_TYPE_DIALOG))
+    {        
+        if (self->desktop != screen_desktop)
+        {
             /* activate the window */
             stacking_add(CLIENT_AS_WINDOW(self));
             activate = TRUE;
-        } else {
-            /* try to not get in the way */
-            stacking_add_nonintrusive(CLIENT_AS_WINDOW(self));
         }
-    } else {
+        else
+        {
+            gboolean group_foc = FALSE;
+
+            if (self->group) {
+                GSList *it;
+
+                for (it = self->group->members; it; it = it->next)
+                {
+                    if (client_focused(it->data))
+                    {
+                        group_foc = TRUE;
+                        break;
+                    }
+                }
+            }
+            if ((group_foc ||
+                 (!self->transient_for && (!self->group ||
+                                           !self->group->members->next))) ||
+                client_search_focus_tree_full(self) ||
+                !focus_client ||
+                !client_normal(focus_client))
+            {
+                /* activate the window */
+                stacking_add(CLIENT_AS_WINDOW(self));
+                activate = TRUE;
+            }
+            else
+            {
+                /* try to not get in the way */
+                stacking_add_nonintrusive(CLIENT_AS_WINDOW(self));
+            }
+        }
+    }
+    else
+    {
         stacking_add(CLIENT_AS_WINDOW(self));
     }
 
@@ -299,7 +317,12 @@ void client_manage(Window window)
 
     client_showhide(self);
 
-    if (activate) client_activate(self);
+    /* use client_focus instead of client_activate cuz client_activate does
+       stuff like switch desktops etc and I'm not interested in all that when
+       a window maps since its not based on an action from the user like
+       clicking a window to activate is. so keep the new window out of the way
+       but do focus it. */
+    if (activate) client_focus(self);
 
     /* update the list hints */
     client_set_list();