diff options
-rw-r--r-- | src/vdagent-x11-randr.c | 31 |
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); |