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. */
}
}
- if (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 focused window\n",
+ ob_debug("placement adding choice %d for normal focused window\n",
client_monitor(focus_client));
}
for (i = 0; i < screen_num_monitors; ++i)
area[i] = screen_area(c->desktop, choice[i], NULL);
+ g_free(choice);
+
return area;
}
guint i;
areas = pick_head(client);
- i = 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;
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;
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;
/* 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) {
+ /* try all monitors in order of preference, but only the first one
+ 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;
/* add the whole monitor */
g_free(areas);
}
- if (settings->center_x)
+ if (settings->position.x.center)
*x = screen->x + screen->width / 2 - client->area.width / 2;
- else if (settings->opposite_x)
+ else if (settings->position.x.opposite)
*x = screen->x + screen->width - client->frame->area.width -
- settings->position.x;
+ settings->position.x.pos;
else
- *x = screen->x + settings->position.x;
+ *x = screen->x + settings->position.x.pos;
- if (settings->center_y)
+ if (settings->position.y.center)
*y = screen->y + screen->height / 2 - client->area.height / 2;
- else if (settings->opposite_y)
+ else if (settings->position.y.opposite)
*y = screen->y + screen->height - client->frame->area.height -
- settings->position.y;
+ settings->position.y.pos;
else
- *y = screen->y + settings->position.y;
+ *y = screen->y + settings->position.y.pos;
g_free(screen);
return TRUE;
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;