]> Dogcows Code - chaz/openbox/commitdiff
a number for placing windows, to keep them on screen, but let you place them off...
authorDana Jansens <danakj@orodu.net>
Sun, 15 Jul 2007 16:35:10 +0000 (12:35 -0400)
committerDana Jansens <danakj@orodu.net>
Sun, 15 Jul 2007 16:35:10 +0000 (12:35 -0400)
1. when a window is not on any monitor, don't just ignore it, stick it on the first monitor arbitrarily (rather than the closest monitor - room for improvement?)
2. when placing a window with per-app settings, don't rudely force it back on screen fully.

openbox/client.c
openbox/place.c

index 8b2087d068927d3168b127a83901818d6a35bad8..b8a2ea2454e7d3a384b434d061189b158d36f31c 100644 (file)
@@ -382,7 +382,8 @@ void client_manage(Window window)
                              */
                              ob_state() == OB_STATE_RUNNING &&
                              (transient ||
-                              (!(self->positioned & USPosition) &&
+                              (!((self->positioned & USPosition) ||
+                                 (settings && settings->pos_given)) &&
                                client_normal(self) &&
                                !self->session)));
     }
@@ -983,10 +984,15 @@ gboolean client_find_onscreen(ObClient *self, gint *x, gint *y, gint w, gint h,
     for (i = 0; i < screen_num_monitors; ++i) {
         Rect *a;
 
-        if (!screen_physical_area_monitor_contains(i, &desired))
-            continue;
+        if (!screen_physical_area_monitor_contains(i, &desired)) {
+            if (i < screen_num_monitors - 1)
+                continue;
 
-        a = screen_area(self->desktop, SCREEN_AREA_ONE_MONITOR, &desired);
+            /* the window is not inside any monitor! so just use the first
+               one */
+            a = screen_area(self->desktop, 0, NULL);
+        } else
+            a = screen_area(self->desktop, SCREEN_AREA_ONE_MONITOR, &desired);
 
         /* This makes sure windows aren't entirely outside of the screen so you
            can't see them at all.
index 37626231330c8637ca8ccb5f68d43a746241365b..9991196621018cfcf7bee2fc34d275fc14fb7b98 100644 (file)
@@ -411,8 +411,6 @@ static gboolean place_per_app_setting(ObClient *client, gint *x, gint *y,
     else
         *x = screen->x + settings->position.x;
 
-    ob_debug("x %d settings %d\n", *x, settings->position.x);
-
     if (settings->center_y)
         *y = screen->y + screen->height / 2 - client->area.height / 2;
     else if (settings->opposite_y)
@@ -480,6 +478,7 @@ gboolean place_client(ObClient *client, gint *x, gint *y,
                       ObAppSettings *settings)
 {
     gboolean ret;
+    gboolean userplaced = FALSE;
 
     /* per-app settings override program specified position
      * but not user specified */
@@ -490,7 +489,7 @@ gboolean place_client(ObClient *client, gint *x, gint *y,
 
     /* try a number of methods */
     ret = place_transient_splash(client, x, y) ||
-        place_per_app_setting(client, x, y, settings) ||
+        (userplaced = place_per_app_setting(client, x, y, settings)) ||
         (config_place_policy == OB_PLACE_POLICY_MOUSE &&
          place_under_mouse(client, x, y)) ||
         place_nooverlap(client, x, y) ||
@@ -499,5 +498,5 @@ gboolean place_client(ObClient *client, gint *x, gint *y,
 
     /* get where the client should be */
     frame_frame_gravity(client->frame, x, y);
-    return ret;
+    return !userplaced;
 }
This page took 0.027264 seconds and 4 git commands to generate.