X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;ds=sidebyside;f=openbox%2Fplace.c;h=f9da57629a39722db7c6d9a7e881ff3ec4809acc;hb=aa852556c0bc12e41a24da01df031d1eb886f9fa;hp=071e44be0ca163551f65197a3f6efd0c3e93365e;hpb=d9f14c1d010860e658f4a9adc6682e0264b410aa;p=chaz%2Fopenbox diff --git a/openbox/place.c b/openbox/place.c index 071e44be..f9da5762 100644 --- a/openbox/place.c +++ b/openbox/place.c @@ -24,8 +24,12 @@ #include "focus.h" #include "config.h" -static Rect* pick_head(ObClient *c) +static Rect *pick_head(ObClient *c) { + Rect *area = NULL; + guint i; + gint px, py; + /* try direct parent first */ if (c->transient_for && c->transient_for != OB_TRAN_GROUP) { return screen_area_monitor(c->desktop, @@ -55,7 +59,22 @@ static Rect* pick_head(ObClient *c) } } - return NULL; + screen_pointer_pos(&px, &py); + + for (i = 0; i < screen_num_monitors; i++) { + area = screen_area_monitor(c->desktop, i); + if (RECT_CONTAINS(*area, px, py)) + break; + } + if (i == screen_num_monitors) + area = screen_area_monitor(c->desktop, 0); + + /* Last resort */ + if (!area) + area = screen_area_monitor(c->desktop, + g_random_int_range(0, screen_num_monitors)); + + return area; } static gboolean place_random(ObClient *client, gint *x, gint *y) @@ -64,9 +83,6 @@ static gboolean place_random(ObClient *client, gint *x, gint *y) Rect *area; area = pick_head(client); - if (!area) - area = screen_area_monitor(client->desktop, - g_random_int_range(0, screen_num_monitors)); l = area->x; t = area->y; @@ -205,13 +221,11 @@ typedef enum static gboolean place_smart(ObClient *client, gint *x, gint *y, ObSmartType type) { - guint i; gboolean ret = FALSE; GSList *spaces = NULL, *sit; GList *it; - for (i = 0; i < screen_num_monitors; ++i) - spaces = area_add(spaces, screen_area_monitor(client->desktop, i)); + spaces = area_add(spaces, pick_head(client)); /* stay out from under windows in higher layers */ for (it = stacking_list; it; it = g_list_next(it)) { @@ -306,21 +320,13 @@ static gboolean place_smart(ObClient *client, gint *x, gint *y, static gboolean place_under_mouse(ObClient *client, gint *x, gint *y) { - guint i; gint l, r, t, b; gint px, py; Rect *area; + area = pick_head(client); screen_pointer_pos(&px, &py); - for (i = 0; i < screen_num_monitors; ++i) { - area = screen_area_monitor(client->desktop, i); - if (RECT_CONTAINS(*area, px, py)) - break; - } - if (i == screen_num_monitors) - area = screen_area_monitor(client->desktop, 0); - l = area->x; t = area->y; r = area->x + area->width - client->frame->area.width; @@ -334,27 +340,17 @@ static gboolean place_under_mouse(ObClient *client, gint *x, gint *y) return TRUE; } -static gboolean place_per_app_setting(ObClient *client, gint *x, gint *y, ObAppSettings *settings) +static gboolean place_per_app_setting(ObClient *client, gint *x, gint *y, + ObAppSettings *settings) { - gint px, py, i; Rect *screen; if (!settings || (settings && !settings->pos_given)) return FALSE; /* Find which head the pointer is on */ - if (settings->head == -1 && screen_num_monitors > 1) { - screen_pointer_pos(&px, &py); - - for (i = 0; i < screen_num_monitors; i++) { - screen = screen_area_monitor(client->desktop, i); - if (RECT_CONTAINS(*screen, px, py)) - break; - } - - if (i == screen_num_monitors) - screen = screen_area_monitor(client->desktop, 0); - } + if (settings->head == -1) + screen = pick_head(client); else screen = screen_area_monitor(client->desktop, settings->head); @@ -414,7 +410,8 @@ static gboolean place_transient(ObClient *client, gint *x, gint *y) } /* Return TRUE if we want client.c to enforce on-screen-keeping */ -gboolean place_client(ObClient *client, gint *x, gint *y, ObAppSettings *settings) +gboolean place_client(ObClient *client, gint *x, gint *y, + ObAppSettings *settings) { gboolean ret = FALSE; if (client->positioned)