[Spice-devel] [PATCH win-agent] Try harder to enable monitors

agilboa at redhat.com agilboa at redhat.com
Mon Apr 22 23:50:30 PDT 2013


ack. although the temp res change, it's still much better instead of the 
quick&dirty patch i posted for 910634.

On 04/23/2013 12:08 AM, Marc-André Lureau wrote:
> 0ba6e2936 was trying to fix CreateDC() failing when the monitor is
> disabled, unfortunately, enabling monitor with an arbitrary resolution
> may still fail (the previous resolution, or the current one).
>
> This patch address the issue by first trying the current resolution, and
> falling back to a well-known resolution. This causes a temporary client
> resolution change (bad), which is immediately adjusted to the arbitrary
> resolution.
>
> We may want to improve agent->driver communication of arbitrary
> resolution before the driver is loaded, perhaps using registry or via
> the spice server. Any of these solution will unfortunately take some more
> time which we are missing.
>
> https://bugzilla.redhat.com/show_bug.cgi?id=922394
>
> (seem to solve related bugs, like mouse offset, or flashing monitors)
> ---
>   vdagent/desktop_layout.cpp | 35 ++++++++++++++++++++++++++---------
>   1 file changed, 26 insertions(+), 9 deletions(-)
>
> diff --git a/vdagent/desktop_layout.cpp b/vdagent/desktop_layout.cpp
> index bce9ac0..c474edb 100644
> --- a/vdagent/desktop_layout.cpp
> +++ b/vdagent/desktop_layout.cpp
> @@ -253,19 +253,36 @@ bool DesktopLayout::init_dev_mode(LPCTSTR dev_name, DEVMODE* dev_mode, DisplayMo
>           return true;
>       }
>   
> -    // attach
> -    EnumDisplaySettings(dev_name, ENUM_CURRENT_SETTINGS, dev_mode);
> -    ret = ChangeDisplaySettingsEx(dev_name, dev_mode, NULL, CDS_UPDATEREGISTRY, NULL);
> -    vd_printf("attach %d", ret);
> -
> -    // Update custom resolution
> -    custom.xres = mode->_width;
> -    custom.yres = mode->_height;
> -    custom.bpp = mode->_depth;
>       hdc = CreateDC(dev_name, NULL, NULL, NULL);
>       if (!hdc) {
> +        // for some reason, windows want those 3 flags to enable monitor
> +        dev_mode->dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_POSITION;
> +        dev_mode->dmPelsWidth = mode->_width;
> +        dev_mode->dmPelsHeight = mode->_height;
> +        ret = ChangeDisplaySettingsEx(dev_name, dev_mode, NULL, CDS_UPDATEREGISTRY, NULL);
> +        if (ret == DISP_CHANGE_BADMODE) {
> +            // custom resolution might not be set yet, use known resolution
> +            // FIXME: this causes client temporary resize... a
> +            // solution would involve passing custom resolution before
> +            // driver initialization, perhaps through registry
> +            dev_mode->dmPelsWidth = 640;
> +            dev_mode->dmPelsHeight = 480;
> +            ret = ChangeDisplaySettingsEx(dev_name, dev_mode, NULL, CDS_UPDATEREGISTRY, NULL);
> +        }, and replace it
> +
> +        vd_printf("attach %d", ret);
> +        hdc = CreateDC(dev_name, NULL, NULL, NULL);
> +    }
> +
> +    if (!hdc) {
>           vd_printf("failed to create DC");
> +        return false;
>       } else {
> +        // Update custom resolution
> +        custom.xres = mode->_width;
> +        custom.yres = mode->_height;
> +        custom.bpp = mode->_depth;
> +
>           int err = ExtEscape(hdc, QXL_ESCAPE_SET_CUSTOM_DISPLAY,
>                               sizeof(QXLEscapeSetCustomDisplay), (LPCSTR)&custom, 0, NULL);
>           if (err <= 0) {



More information about the Spice-devel mailing list