X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fplace.c;h=c396e8fa64677675509790e5d1ef860780295de7;hb=6c760c5a63a2e49bc2a5a4f39f8b4b9ed285bd7e;hp=058bbfbe5866457b1b9229a8684010d4d5926e90;hpb=c2e495c720d93521bdb0e1bfd7e76584a1b329b7;p=chaz%2Fopenbox diff --git a/openbox/place.c b/openbox/place.c index 058bbfbe..c396e8fa 100644 --- a/openbox/place.c +++ b/openbox/place.c @@ -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. */ @@ -76,7 +63,7 @@ static Rect **pick_head(ObClient *c) /* try direct parent first */ if ((p = client_direct_parent(c))) { add_choice(choice, client_monitor(p)); - ob_debug("placement adding choice %d for parent\n", + ob_debug("placement adding choice %d for parent", client_monitor(p)); } @@ -92,7 +79,7 @@ static Rect **pick_head(ObClient *c) itc->desktop == DESKTOP_ALL || c->desktop == DESKTOP_ALL)) { add_choice(choice, client_monitor(it->data)); - ob_debug("placement adding choice %d for group sibling\n", + ob_debug("placement adding choice %d for group sibling", client_monitor(it->data)); } } @@ -103,14 +90,17 @@ static Rect **pick_head(ObClient *c) if (itc != c) { add_choice(choice, client_monitor(it->data)); ob_debug("placement adding choice %d for group sibling on " - "another desktop\n", client_monitor(it->data)); + "another desktop", client_monitor(it->data)); } } } - if (focus_client && client_normal(focus_client)) { + /* skip this if placing by the mouse position */ + if (focus_client && client_normal(focus_client) && + config_place_monitor != OB_PLACE_MONITOR_MOUSE) + { add_choice(choice, client_monitor(focus_client)); - ob_debug("placement adding choice %d for normal focused window\n", + ob_debug("placement adding choice %d for normal focused window", client_monitor(focus_client)); } @@ -122,7 +112,7 @@ static Rect **pick_head(ObClient *c) g_free(monitor); if (contain) { add_choice(choice, i); - ob_debug("placement adding choice %d for mouse pointer\n", i); + ob_debug("placement adding choice %d for mouse pointer", i); break; } } @@ -146,7 +136,8 @@ static gboolean place_random(ObClient *client, gint *x, gint *y) guint i; areas = pick_head(client); - i = config_place_active ? 0 : g_random_int_range(0, screen_num_monitors); + i = (config_place_monitor != OB_PLACE_MONITOR_ANY) ? + 0 : g_random_int_range(0, screen_num_monitors); l = areas[i]->x; t = areas[i]->y; @@ -255,9 +246,9 @@ 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++) { /* try all monitors in order of preference, but only the first one - if config_place_active is true */ - for (i = 0; (i < (config_place_active ? 1 : screen_num_monitors) && - !ret); ++i) + if config_place_monitor is MOUSE or ACTIVE */ + for (i = 0; (i < (config_place_monitor != OB_PLACE_MONITOR_ANY ? + 1 : screen_num_monitors) && !ret); ++i) { GList *it; @@ -477,23 +468,24 @@ 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 */ - if ((client->positioned & USPosition) || + * but not user specified, unless pos_force is enabled */ + if (((client->positioned & USPosition) && + !(settings && settings->pos_given && settings->pos_force)) || ((client->positioned & PPosition) && !(settings && settings->pos_given))) 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) || @@ -502,5 +494,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; }