X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=openbox%2Fplace.c;h=b56998b2208da636d5516fa926945f1a92837125;hb=1aa9c7e95ef3da351a7459ed79cacd439db353e8;hp=a76086e01ffea8341b65be6e5e56d846f0a53834;hpb=c234ed9ecd9d5228744aae018768ff0c04f2d217;p=chaz%2Fopenbox diff --git a/openbox/place.c b/openbox/place.c index a76086e0..b56998b2 100644 --- a/openbox/place.c +++ b/openbox/place.c @@ -1,6 +1,7 @@ /* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*- place.c for the Openbox window manager + Copyright (c) 2006 Mikael Magnusson Copyright (c) 2003 Ben Jansens This program is free software; you can redistribute it and/or modify @@ -23,8 +24,11 @@ #include "focus.h" #include "config.h" -static Rect* pick_head(ObClient *c) +static Rect *pick_head(ObClient *c) { + Rect *area = NULL; + gint i, px, py; + /* try direct parent first */ if (c->transient_for && c->transient_for != OB_TRAN_GROUP) { return screen_area_monitor(c->desktop, @@ -54,7 +58,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) @@ -63,9 +82,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; @@ -209,8 +225,7 @@ static gboolean place_smart(ObClient *client, gint *x, gint *y, 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)) { @@ -310,16 +325,9 @@ static gboolean place_under_mouse(ObClient *client, gint *x, gint *y) 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; @@ -333,27 +341,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); @@ -413,13 +411,14 @@ 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) return FALSE; if (place_transient(client, x, y)) - ret = TRUE;; + ret = TRUE; else if (!( place_per_app_setting(client, x, y, settings) || ((config_place_policy == OB_PLACE_POLICY_MOUSE) ?