summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/vdagent-x11-randr.c31
1 files changed, 25 insertions, 6 deletions
diff --git a/src/vdagent-x11-randr.c b/src/vdagent-x11-randr.c
index a41e4e7..3ab2dd9 100644
--- a/src/vdagent-x11-randr.c
+++ b/src/vdagent-x11-randr.c
@@ -505,7 +505,8 @@ void constrain_to_screen(struct vdagent_x11 *x11, int *w, int *h)
*/
static void zero_base_monitors(struct vdagent_x11 *x11,
VDAgentMonitorsConfig *mon_config,
- int *width, int *height)
+ int *width, int *height,
+ int reset_positions)
{
int i = 0;
int min_x;
@@ -514,6 +515,8 @@ static void zero_base_monitors(struct vdagent_x11 *x11,
int max_y;
int *mon_height;
int *mon_width;
+ int total_width = 0;
+ int x, y;
mon_width = &mon_config->monitors[i].width;
mon_height = &mon_config->monitors[i].height;
@@ -526,10 +529,25 @@ static void zero_base_monitors(struct vdagent_x11 *x11,
mon_width = &mon_config->monitors[i].width;
mon_height = &mon_config->monitors[i].height;
constrain_to_screen(x11, mon_width, mon_height);
- min_x = min_int(mon_config->monitors[i].x, min_x);
- min_y = min_int(mon_config->monitors[i].y, min_y);
- max_x = max_int(mon_config->monitors[i].x + *mon_width, max_x);
- max_y = max_int(mon_config->monitors[i].y + *mon_height, max_y);
+ if (reset_positions) {
+ if (total_width + *mon_width > x11->randr.max_width)
+ break;
+ x = total_width;
+ y = 0;
+ } else {
+ x = mon_config->monitors[i].x;
+ y = mon_config->monitors[i].y;
+ }
+ min_x = min_int(x, min_x);
+ min_y = min_int(y, min_y);
+ max_x = max_int(x + *mon_width, max_x);
+ max_y = max_int(y + *mon_height, max_y);
+ total_width += *mon_width;
+ }
+ for (; i < mon_config->num_of_monitors; ++i) {
+ fprintf(x11->errfile, "%s: ignoring out of screen bounds monitor %d\n",
+ __FUNCTION__, i);
+ mon_config->monitors[i].width = mon_config->monitors[i].height = 0;
}
if (min_x != 0 || min_y != 0) {
fprintf(x11->errfile,
@@ -692,7 +710,8 @@ void vdagent_x11_set_monitor_config(struct vdagent_x11 *x11,
dump_monitors_config(x11, mon_config, "from guest");
}
- zero_base_monitors(x11, mon_config, &primary_w, &primary_h);
+ zero_base_monitors(x11, mon_config, &primary_w, &primary_h,
+ ! (mon_config->flags & VD_AGENT_CONFIG_MONITORS_FLAG_USE_POS));
constrain_to_screen(x11, &primary_w, &primary_h);