maybe fix transients placed offscreen under certain conditions
authorMikael Magnusson <mikachu@comhem.se>
Mon, 21 Aug 2006 20:39:42 +0000 (20:39 +0000)
committerMikael Magnusson <mikachu@comhem.se>
Mon, 21 Aug 2006 20:39:42 +0000 (20:39 +0000)
openbox/client.c
openbox/place.c
openbox/place.h

index e80b84f..7efc0e9 100644 (file)
@@ -415,8 +415,9 @@ void client_manage(Window window)
     if (ob_state() == OB_STATE_RUNNING) {
         gint x = self->area.x, ox = x;
         gint y = self->area.y, oy = y;
+        gboolean transient;
 
-        place_client(self, &x, &y, settings);
+        transient = place_client(self, &x, &y, settings);
 
         /* make sure the window is visible. */
         client_find_onscreen(self, &x, &y,
@@ -432,10 +433,11 @@ void client_manage(Window window)
                                 off-screen and on xinerama divides (ie,
                                 it is up to the placement routines to avoid
                                 the xinerama divides) */
-                             ((self->positioned & PPosition) &&
-                              !(self->positioned & USPosition)) &&
-                             client_normal(self) &&
-                             !self->session);
+                             transient ||
+                             (((self->positioned & PPosition) &&
+                               !(self->positioned & USPosition)) &&
+                              client_normal(self) &&
+                              !self->session));
         if (x != ox || y != oy)         
             client_move(self, x, y);
     }
index 95763d0..a76086e 100644 (file)
@@ -412,21 +412,24 @@ static gboolean place_transient(ObClient *client, gint *x, gint *y)
     return FALSE;
 }
 
-void place_client(ObClient *client, gint *x, gint *y, ObAppSettings *settings)
+/* Return TRUE if we want client.c to enforce on-screen-keeping */
+gboolean place_client(ObClient *client, gint *x, gint *y, ObAppSettings *settings)
 {
+    gboolean ret = FALSE;
     if (client->positioned)
-        return;
-    if (place_transient(client, x, y)             ||
+        return FALSE;
+    if (place_transient(client, x, y))
+        ret = TRUE;;
+    else if (!(
         place_per_app_setting(client, x, y, settings) ||
         ((config_place_policy == OB_PLACE_POLICY_MOUSE) ?
          place_under_mouse(client, x, y) :
          place_smart(client, x, y, SMART_FULL)    ||
          place_smart(client, x, y, SMART_GROUP)   ||
          place_smart(client, x, y, SMART_FOCUSED) ||
-         place_random(client, x, y)))
-    {
-        /* get where the client should be */
-        frame_frame_gravity(client->frame, x, y);
-    } else
+         place_random(client, x, y))))
         g_assert_not_reached(); /* the last one better succeed */
+    /* get where the client should be */
+    frame_frame_gravity(client->frame, x, y);
+    return ret;
 }
index e4ac2de..dd8831b 100644 (file)
@@ -30,6 +30,7 @@ typedef enum
     OB_PLACE_POLICY_MOUSE
 } ObPlacePolicy;
 
-void place_client(struct _ObClient *client, gint *x, gint *y, struct _ObAppSettings *settings);
+gboolean place_client(struct _ObClient *client, gint *x, gint *y,
+                      struct _ObAppSettings *settings);
 
 #endif