X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fplace.c;h=aa572db2aff2a34eb804bdffc15eff0a79b0657f;hb=2b80e4e8ef56bb4fba614139601e750344418e5b;hp=845becdb93d67fe74036f37757aa28de7c664458;hpb=e048751f914d16cb6346f7e7ca6532eaae44ce31;p=chaz%2Fopenbox diff --git a/openbox/place.c b/openbox/place.c index 845becdb..aa572db2 100644 --- a/openbox/place.c +++ b/openbox/place.c @@ -46,16 +46,17 @@ static Rect *pick_pointer_head(ObClient *c) guint i; gint px, py; - 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(); + 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; } /*! Pick a monitor to place a window on. */ @@ -85,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)) @@ -98,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 " @@ -133,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; } @@ -179,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; @@ -214,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; @@ -250,8 +254,6 @@ static gboolean place_nooverlap(ObClient *c, gint *x, gint *y) /* try ignoring different things to find empty space */ for (ignore = 0; ignore < IGNORE_END && !ret; ignore++) { - guint i; - /* try all monitors in order of preference */ for (i = 0; i < screen_num_monitors && !ret; ++i) { GList *it; @@ -315,9 +317,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; } } @@ -381,19 +383,23 @@ static gboolean place_per_app_setting(ObClient *client, gint *x, gint *y, /* Find which head the pointer is on */ if (settings->monitor == 0) + /* this can return NULL */ screen = pick_pointer_head(client); else if (settings->monitor > 0 && (guint)settings->monitor <= screen_num_monitors) screen = screen_area(client->desktop, (guint)settings->monitor - 1, NULL); - else { + + /* if we have't found a screen yet.. */ + if (!screen) { Rect **areas; guint i; areas = pick_head(client); screen = areas[0]; - for (i = 0; i < screen_num_monitors; ++i) + /* 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_free(areas); } @@ -414,6 +420,7 @@ static gboolean place_per_app_setting(ObClient *client, gint *x, gint *y, else *y = screen->y + settings->position.y; + g_free(screen); return TRUE; } @@ -440,7 +447,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; } @@ -472,13 +479,18 @@ gboolean place_client(ObClient *client, gint *x, gint *y, ObAppSettings *settings) { gboolean ret; + gboolean userplaced = FALSE; - if (client->positioned) + /* per-app settings override program specified position + * but not user specified */ + if ((client->positioned & USPosition) || + ((client->positioned & PPosition) && + !(settings && settings->pos_given))) return FALSE; /* 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) || @@ -486,7 +498,6 @@ gboolean place_client(ObClient *client, gint *x, gint *y, g_assert(ret); /* get where the client should be */ - frame_frame_gravity(client->frame, x, y, - client->area.width, client->area.height); - return ret; + frame_frame_gravity(client->frame, x, y); + return !userplaced; }