a number for placing windows, to keep them on screen, but let you place them off-screen
1. when a window is not on any monitor, don't just ignore it, stick it on the first monitor arbitrarily (rather than the closest monitor - room for improvement?) 2. when placing a window with per-app settings, don't rudely force it back on screen fully.
This commit is contained in:
parent
2ff02fc55e
commit
a9f2b2c681
2 changed files with 13 additions and 8 deletions
|
@ -382,7 +382,8 @@ void client_manage(Window window)
|
||||||
*/
|
*/
|
||||||
ob_state() == OB_STATE_RUNNING &&
|
ob_state() == OB_STATE_RUNNING &&
|
||||||
(transient ||
|
(transient ||
|
||||||
(!(self->positioned & USPosition) &&
|
(!((self->positioned & USPosition) ||
|
||||||
|
(settings && settings->pos_given)) &&
|
||||||
client_normal(self) &&
|
client_normal(self) &&
|
||||||
!self->session)));
|
!self->session)));
|
||||||
}
|
}
|
||||||
|
@ -983,9 +984,14 @@ gboolean client_find_onscreen(ObClient *self, gint *x, gint *y, gint w, gint h,
|
||||||
for (i = 0; i < screen_num_monitors; ++i) {
|
for (i = 0; i < screen_num_monitors; ++i) {
|
||||||
Rect *a;
|
Rect *a;
|
||||||
|
|
||||||
if (!screen_physical_area_monitor_contains(i, &desired))
|
if (!screen_physical_area_monitor_contains(i, &desired)) {
|
||||||
|
if (i < screen_num_monitors - 1)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
/* the window is not inside any monitor! so just use the first
|
||||||
|
one */
|
||||||
|
a = screen_area(self->desktop, 0, NULL);
|
||||||
|
} else
|
||||||
a = screen_area(self->desktop, SCREEN_AREA_ONE_MONITOR, &desired);
|
a = screen_area(self->desktop, SCREEN_AREA_ONE_MONITOR, &desired);
|
||||||
|
|
||||||
/* This makes sure windows aren't entirely outside of the screen so you
|
/* This makes sure windows aren't entirely outside of the screen so you
|
||||||
|
|
|
@ -411,8 +411,6 @@ static gboolean place_per_app_setting(ObClient *client, gint *x, gint *y,
|
||||||
else
|
else
|
||||||
*x = screen->x + settings->position.x;
|
*x = screen->x + settings->position.x;
|
||||||
|
|
||||||
ob_debug("x %d settings %d\n", *x, settings->position.x);
|
|
||||||
|
|
||||||
if (settings->center_y)
|
if (settings->center_y)
|
||||||
*y = screen->y + screen->height / 2 - client->area.height / 2;
|
*y = screen->y + screen->height / 2 - client->area.height / 2;
|
||||||
else if (settings->opposite_y)
|
else if (settings->opposite_y)
|
||||||
|
@ -480,6 +478,7 @@ gboolean place_client(ObClient *client, gint *x, gint *y,
|
||||||
ObAppSettings *settings)
|
ObAppSettings *settings)
|
||||||
{
|
{
|
||||||
gboolean ret;
|
gboolean ret;
|
||||||
|
gboolean userplaced = FALSE;
|
||||||
|
|
||||||
/* per-app settings override program specified position
|
/* per-app settings override program specified position
|
||||||
* but not user specified */
|
* but not user specified */
|
||||||
|
@ -490,7 +489,7 @@ gboolean place_client(ObClient *client, gint *x, gint *y,
|
||||||
|
|
||||||
/* try a number of methods */
|
/* try a number of methods */
|
||||||
ret = place_transient_splash(client, x, y) ||
|
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 &&
|
(config_place_policy == OB_PLACE_POLICY_MOUSE &&
|
||||||
place_under_mouse(client, x, y)) ||
|
place_under_mouse(client, x, y)) ||
|
||||||
place_nooverlap(client, x, y) ||
|
place_nooverlap(client, x, y) ||
|
||||||
|
@ -499,5 +498,5 @@ gboolean place_client(ObClient *client, gint *x, gint *y,
|
||||||
|
|
||||||
/* get where the client should be */
|
/* get where the client should be */
|
||||||
frame_frame_gravity(client->frame, x, y);
|
frame_frame_gravity(client->frame, x, y);
|
||||||
return ret;
|
return !userplaced;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue