X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fplace.c;h=851e4f8f10301ffac548ef06740e9d04f5df66c3;hb=d3ff019f53f02afe0c7116a99f65ffb8d622e889;hp=37626231330c8637ca8ccb5f68d43a746241365b;hpb=2ff02fc55e2007dd4a04b3fb6561049a07a13e8a;p=chaz%2Fopenbox diff --git a/openbox/place.c b/openbox/place.c index 37626231..851e4f8f 100644 --- a/openbox/place.c +++ b/openbox/place.c @@ -86,7 +86,7 @@ static Rect **pick_head(ObClient *c) /* try on the client's desktop */ for (it = c->group->members; it; it = g_slist_next(it)) { - ObClient *itc = it->data; + ObClient *itc = it->data; if (itc != c && (itc->desktop == c->desktop || itc->desktop == DESKTOP_ALL || c->desktop == DESKTOP_ALL)) @@ -99,7 +99,7 @@ static Rect **pick_head(ObClient *c) /* try on all desktops */ for (it = c->group->members; it; it = g_slist_next(it)) { - ObClient *itc = it->data; + ObClient *itc = it->data; if (itc != c) { add_choice(choice, client_monitor(it->data)); ob_debug("placement adding choice %d for group sibling on " @@ -134,6 +134,8 @@ static Rect **pick_head(ObClient *c) for (i = 0; i < screen_num_monitors; ++i) area[i] = screen_area(c->desktop, choice[i], NULL); + g_free(choice); + return area; } @@ -180,7 +182,7 @@ static GSList* area_remove(GSList *list, Rect *a) if (!RECT_INTERSECTS_RECT(*r, *a)) { result = g_slist_prepend(result, r); - r = NULL; /* dont free it */ + /* dont free r, it's moved to the result list */ } else { Rect isect, extra; @@ -215,9 +217,10 @@ static GSList* area_remove(GSList *list, Rect *a) r->width, RECT_BOTTOM(*r) - RECT_BOTTOM(isect)); result = area_add(result, &extra); } - } - g_free(r); + /* 'r' is not being added to the result list, so free it */ + g_free(r); + } } g_slist_free(list); return result; @@ -316,9 +319,9 @@ static gboolean place_nooverlap(ObClient *c, gint *x, gint *y) if (r->width >= c->frame->area.width && r->height >= c->frame->area.height && - r->width > maxsize) + r->width * r->height > maxsize) { - maxsize = r->width; + maxsize = r->width * r->height; maxit = sit; } } @@ -411,8 +414,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) @@ -448,7 +449,7 @@ static gboolean place_transient_splash(ObClient *client, gint *x, gint *y) } } if (!first) { - *x = ((r + 1 - l) - client->frame->area.width) / 2 + l; + *x = ((r + 1 - l) - client->frame->area.width) / 2 + l; *y = ((b + 1 - t) - client->frame->area.height) / 2 + t; return TRUE; } @@ -480,6 +481,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 +492,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 +501,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; }