[Spice-devel] [PATCH][vdagent] x11-randr: Force a screen resize when a display is disabled
Fabiano FidĂȘncio
fabiano at fidencio.org
Wed Mar 4 14:41:29 PST 2015
NACK. The problem has been solved on the virt-viewer side.
On Wed, Mar 4, 2015 at 3:27 PM, Fabiano FidĂȘncio <fidencio at redhat.com> wrote:
> When a display is disabled the new monitors config is sent to the agent
> who should be responsible for re-arranging the apps on the non-disabled
> displays (at least when using the ums driver).
>
> Related: https://bugzilla.redhat.com/show_bug.cgi?id=1111425
> ---
> src/vdagent-x11-randr.c | 69 ++++++++++++++++++++++++++++++-------------------
> 1 file changed, 42 insertions(+), 27 deletions(-)
>
> diff --git a/src/vdagent-x11-randr.c b/src/vdagent-x11-randr.c
> index 46367bc..ed63908 100644
> --- a/src/vdagent-x11-randr.c
> +++ b/src/vdagent-x11-randr.c
> @@ -676,6 +676,42 @@ static void dump_monitors_config(struct vdagent_x11 *x11,
> }
> }
>
> +static int resize_randr_screen(struct vdagent_x11 *x11,
> + VDAgentMonitorsConfig *mon_config,
> + VDAgentMonitorsConfig *curr_config,
> + int width,
> + int height,
> + int fallback)
> +{
> + const int dpi = 96; /* FIXME: read settings from desktop or get from client dpi? */
> + int width_mm = (MM_PER_INCH * width) / dpi;
> + int height_mm = (MM_PER_INCH * height) / dpi;
> +
> + if (x11->debug)
> + syslog(LOG_DEBUG, "Changing screen size to %dx%d", width, height);
> +
> + vdagent_x11_set_error_handler(x11, error_handler);
> + XRRSetScreenSize(x11->display, x11->root_window[0], width, height, width_mm, height_mm);
> + if (vdagent_x11_restore_error_handler(x11)) {
> + syslog(LOG_ERR, "XRRSetScreenSize failed, not enough mem?");
> + if (!fallback && curr_config) {
> + syslog(LOG_WARNING, "Restoring previous config");
> + vdagent_x11_set_monitor_config(x11, curr_config, 1);
> + free(curr_config);
> + /* Remember this config failed, if the client is maximized or
> + fullscreen it will keep sending the failing config. */
> + free(x11->randr.failed_conf);
> + x11->randr.failed_conf =
> + malloc(config_size(mon_config->num_of_monitors));
> + if (x11->randr.failed_conf)
> + memcpy(x11->randr.failed_conf, mon_config,
> + config_size(mon_config->num_of_monitors));
> + return 0;
> + }
> + }
> + return 1;
> +}
> +
> /*
> * Set monitor configuration according to client request.
> *
> @@ -781,33 +817,8 @@ void vdagent_x11_set_monitor_config(struct vdagent_x11 *x11,
>
> /* Then we can resize the RandR screen. */
> if (primary_w != x11->width[0] || primary_h != x11->height[0]) {
> - const int dpi = 96; /* FIXME: read settings from desktop or get from client dpi? */
> - int width_mm = (MM_PER_INCH * primary_w) / dpi;
> - int height_mm = (MM_PER_INCH * primary_h) / dpi;
> -
> - if (x11->debug)
> - syslog(LOG_DEBUG, "Changing screen size to %dx%d",
> - primary_w, primary_h);
> - vdagent_x11_set_error_handler(x11, error_handler);
> - XRRSetScreenSize(x11->display, x11->root_window[0], primary_w, primary_h,
> - width_mm, height_mm);
> - if (vdagent_x11_restore_error_handler(x11)) {
> - syslog(LOG_ERR, "XRRSetScreenSize failed, not enough mem?");
> - if (!fallback && curr) {
> - syslog(LOG_WARNING, "Restoring previous config");
> - vdagent_x11_set_monitor_config(x11, curr, 1);
> - free(curr);
> - /* Remember this config failed, if the client is maximized or
> - fullscreen it will keep sending the failing config. */
> - free(x11->randr.failed_conf);
> - x11->randr.failed_conf =
> - malloc(config_size(mon_config->num_of_monitors));
> - if (x11->randr.failed_conf)
> - memcpy(x11->randr.failed_conf, mon_config,
> - config_size(mon_config->num_of_monitors));
> - return;
> - }
> - }
> + if (!resize_randr_screen(x11, mon_config, curr, primary_w, primary_h, fallback))
> + return;
> }
>
> /* Finally, we set the new resolutions on RandR CRTCs now that the
> @@ -832,6 +843,10 @@ void vdagent_x11_set_monitor_config(struct vdagent_x11 *x11,
> }
> }
>
> + /* Force a screen resize to re-arrange apps on non-disabled monitors */
> + if (!resize_randr_screen(x11, mon_config, curr, primary_w, primary_h, fallback))
> + return;
> +
> update_randr_res(x11,
> x11->randr.num_monitors != enabled_monitors(mon_config));
> x11->width[0] = primary_w;
> --
> 2.1.0
>
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/spice-devel
--
Fabiano FidĂȘncio
More information about the Spice-devel
mailing list