]> Dogcows Code - chaz/openbox/blobdiff - openbox/place.c
mem leak in config.c
[chaz/openbox] / openbox / place.c
index aac40e8a099249c0620e7513269f556b766c56d8..d9919d0cadd3ed09c53e23a820d1642f006fad07 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. */
@@ -120,9 +107,8 @@ static Rect **pick_head(ObClient *c)
     screen_pointer_pos(&px, &py);
 
     for (i = 0; i < screen_num_monitors; i++) {
-        Rect *monitor = screen_physical_area_monitor(i);
+        const Rect *monitor = screen_physical_area_monitor(i);
         gboolean contain = RECT_CONTAINS(*monitor, px, py);
-        g_free(monitor);
         if (contain) {
             add_choice(choice, i);
             ob_debug("placement adding choice %d for mouse pointer", i);
@@ -163,7 +149,7 @@ static gboolean place_random(ObClient *client, gint *x, gint *y)
     else       *y = areas[i]->y;
 
     for (i = 0; i < screen_num_monitors; ++i)
-        g_free(areas[i]);
+        g_slice_free(Rect, areas[i]);
     g_free(areas);
 
     return TRUE;
@@ -171,7 +157,7 @@ static gboolean place_random(ObClient *client, gint *x, gint *y)
 
 static GSList* area_add(GSList *list, Rect *a)
 {
-    Rect *r = g_new(Rect, 1);
+    Rect *r = g_slice_new(Rect);
     *r = *a;
     return g_slist_prepend(list, r);
 }
@@ -223,7 +209,7 @@ static GSList* area_remove(GSList *list, Rect *a)
             }
 
             /* 'r' is not being added to the result list, so free it */
-            g_free(r);
+            g_slice_free(Rect, r);
         }
     }
     g_slist_free(list);
@@ -345,14 +331,14 @@ static gboolean place_nooverlap(ObClient *c, gint *x, gint *y)
             }
 
             while (spaces) {
-                g_free(spaces->data);
+                g_slice_free(Rect, spaces->data);
                 spaces = g_slist_delete_link(spaces, spaces);
             }
         }
     }
 
     for (i = 0; i < screen_num_monitors; ++i)
-        g_free(areas[i]);
+        g_slice_free(Rect, areas[i]);
     g_free(areas);
     return ret;
 }
@@ -377,6 +363,8 @@ static gboolean place_under_mouse(ObClient *client, gint *x, gint *y)
     *y = py - client->area.height / 2 - client->frame->size.top;
     *y = MIN(MAX(*y, t), b);
 
+    g_slice_free(Rect, area);
+
     return TRUE;
 }
 
@@ -407,7 +395,7 @@ static gboolean place_per_app_setting(ObClient *client, gint *x, gint *y,
 
         /* don't free the first one, it's being set as "screen" */
         for (i = 1; i < screen_num_monitors; ++i)
-            g_free(areas[i]);
+            g_slice_free(Rect, areas[i]);
         g_free(areas);
     }
 
@@ -418,6 +406,8 @@ static gboolean place_per_app_setting(ObClient *client, gint *x, gint *y,
             settings->position.x.pos;
     else
         *x = screen->x + settings->position.x.pos;
+    if (settings->position.x.denom)
+        *x = (*x * screen->width) / settings->position.x.denom;
 
     if (settings->position.y.center)
         *y = screen->y + screen->height / 2 - client->area.height / 2;
@@ -426,8 +416,10 @@ static gboolean place_per_app_setting(ObClient *client, gint *x, gint *y,
             settings->position.y.pos;
     else
         *y = screen->y + settings->position.y.pos;
+    if (settings->position.y.denom)
+        *y = (*y * screen->height) / settings->position.y.denom;
 
-    g_free(screen);
+    g_slice_free(Rect, screen);
     return TRUE;
 }
 
@@ -473,7 +465,7 @@ static gboolean place_transient_splash(ObClient *client, gint *x, gint *y)
         *y = (areas[0]->height - client->frame->area.height) / 2 + areas[0]->y;
 
         for (i = 0; i < screen_num_monitors; ++i)
-            g_free(areas[i]);
+            g_slice_free(Rect, areas[i]);
         g_free(areas);
         return TRUE;
     }
@@ -481,12 +473,12 @@ 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, unless pos_force is enabled */
@@ -497,8 +489,8 @@ gboolean place_client(ObClient *client, gint *x, gint *y,
         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) ||
@@ -507,5 +499,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;
 }
This page took 0.027393 seconds and 4 git commands to generate.