If a window places itself at (0,0) and there are struts there, assume it is a bug...
[dana/openbox.git] / openbox / place.c
index 9e38bde..c396e8f 100644 (file)
@@ -43,20 +43,7 @@ static void add_choice(guint *choice, guint mychoice)
 
 static Rect *pick_pointer_head(ObClient *c)
 {
-    guint i;
-    gint px, py;
-
-    if (screen_pointer_pos(&px, &py)) {
-        for (i = 0; i < screen_num_monitors; ++i) {
-            Rect *monitor = screen_physical_area_monitor(i);
-            gboolean contain = RECT_CONTAINS(*monitor, px, py);
-            g_free(monitor);
-            if (contain)
-                return screen_area(c->desktop, i, NULL);
-        }
-        g_assert_not_reached();
-    } else
-        return NULL;
+    return screen_area(c->desktop, screen_monitor_pointer(), NULL);
 }
 
 /*! Pick a monitor to place a window on. */
@@ -481,23 +468,24 @@ static gboolean place_transient_splash(ObClient *client, gint *x, gint *y)
     return FALSE;
 }
 
-/* Return TRUE if we want client.c to enforce on-screen-keeping */
+/*! Return TRUE if openbox chose the position for the window, and FALSE if
+  the application chose it */
 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 */
-    if ((client->positioned & USPosition) ||
+     * but not user specified, unless pos_force is enabled */
+    if (((client->positioned & USPosition) &&
+         !(settings && settings->pos_given && settings->pos_force)) ||
         ((client->positioned & PPosition) &&
          !(settings && settings->pos_given)))
         return FALSE;
 
     /* try a number of methods */
-    ret = place_transient_splash(client, x, y) ||
-        (userplaced = place_per_app_setting(client, x, y, settings)) ||
+    ret = place_per_app_setting(client, x, y, settings) ||
+        place_transient_splash(client, x, y) ||
         (config_place_policy == OB_PLACE_POLICY_MOUSE &&
          place_under_mouse(client, x, y)) ||
         place_nooverlap(client, x, y) ||
@@ -506,5 +494,5 @@ gboolean place_client(ObClient *client, gint *x, gint *y,
 
     /* get where the client should be */
     frame_frame_gravity(client->frame, x, y);
-    return !userplaced;
+    return TRUE;
 }