[Spice-devel] [vdagent PATCH] Add monitors_config driver escape.

Christophe Fergeau cfergeau at redhat.com
Mon Jun 22 09:59:33 PDT 2015


On Thu, Jun 18, 2015 at 07:14:10PM -0400, sstutsma at redhat.com wrote:
> From: Sandy Stutsman <sstutsma at redhat.com>
> 
> When a Windows guest uses the "Set Resolution" applet to change
> resolutions and/or monitor positions, this escape sends the new monitor
> configurations to the client via a new QXL driver escape.
> 
> Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1202419
> ---
> Depends on spice-protocol patch for qxl_windows.h
> ---
>  vdagent/desktop_layout.cpp | 30 ++++++++++++++++++++++++++++--
>  vdagent/desktop_layout.h   |  2 +-
>  vdagent/vdagent.cpp        |  4 +++-
>  3 files changed, 32 insertions(+), 4 deletions(-)
> 
> diff --git a/vdagent/desktop_layout.cpp b/vdagent/desktop_layout.cpp
> index f71abd0..3a97194 100644
> --- a/vdagent/desktop_layout.cpp
> +++ b/vdagent/desktop_layout.cpp
> @@ -142,8 +142,8 @@ void DesktopLayout::set_displays()
>              vd_printf("display_id %lu out of range, #displays %zu" , display_id, _displays.size());
>              break;
>          }
> -        if (!init_dev_mode(dev_info.DeviceName, &dev_mode, _displays.at(display_id),
> -                           normal_x, normal_y, true)) {
> +        DisplayMode * mode(_displays.at(display_id));
> +        if (!init_dev_mode(dev_info.DeviceName, &dev_mode, mode, normal_x, normal_y, true)) {
>              vd_printf("No suitable mode found for display %S", dev_info.DeviceName);
>              break;
>          }
> @@ -152,6 +152,7 @@ void DesktopLayout::set_displays()
>                                             CDS_UPDATEREGISTRY | CDS_NORESET, NULL);
>          if (ret == DISP_CHANGE_SUCCESSFUL) {
>              dev_sets++;
> +            update_monitor_config(dev_info.DeviceName, mode);
>          }
>          if (!is_qxl) {
>              display_id++;
> @@ -355,3 +356,28 @@ bool DesktopLayout::init_dev_mode(LPCTSTR dev_name, DEVMODE* dev_mode, DisplayMo
>      return true;
>  }
>  
> +bool DesktopLayout::update_monitor_config(LPCTSTR dev_name, DisplayMode* mode)
> +{
> +    QXLEscapeMonitorConfig MonitorConfig;
> +
> +    if (!mode || !mode->get_attached())
> +        return false;
> +
> +    HDC hdc = CreateDC(dev_name, NULL, NULL, NULL);
> +
> +    MonitorConfig.bpp = mode->_depth;
> +    MonitorConfig.xpos = mode->_pos_x;
> +    MonitorConfig.ypos = mode->_pos_y;
> +    MonitorConfig.xres = mode->_width;
> +    MonitorConfig.yres = mode->_height;
> +
> +    int err = ExtEscape(hdc, QXL_ESCAPE_MONITOR_CONFIG,
> +        sizeof(QXLEscapeMonitorConfig), (LPCSTR) &MonitorConfig, 0, NULL);
> +
> +    if (err < 0){
> +        vd_printf("can't update monitor config, may have an older driver");
> +    }
> +
> +    DeleteDC(hdc);
> +    return (err >= 0);
> +}
> diff --git a/vdagent/desktop_layout.h b/vdagent/desktop_layout.h
> index 4f6a042..0e310e3 100644
> --- a/vdagent/desktop_layout.h
> +++ b/vdagent/desktop_layout.h
> @@ -83,7 +83,7 @@ private:
>      static bool get_qxl_device_id(WCHAR* device_key, DWORD* device_id);
>      static bool init_dev_mode(LPCTSTR dev_name, DEVMODE* dev_mode, DisplayMode* mode,
>                                LONG normal_x, LONG normal_y, bool set_pos);
> -
> +    static bool update_monitor_config(LPCTSTR dev_name, DisplayMode* mode);
>  private:
>      mutex_t _mutex;
>      Displays _displays;
> diff --git a/vdagent/vdagent.cpp b/vdagent/vdagent.cpp
> index efce981..22860f4 100644
> --- a/vdagent/vdagent.cpp
> +++ b/vdagent/vdagent.cpp
> @@ -1447,8 +1447,10 @@ LRESULT CALLBACK VDAgent::wnd_proc(HWND hwnd, UINT message, WPARAM wparam, LPARA
>          vd_printf("Display change");
>          // the desktop layout needs to be updated for the mouse
>          // position to be scaled correctly
> -        if (!a->_updating_display_config)
> +        if (!a->_updating_display_config) {
>              a->_desktop_layout->get_displays();
> +            a->_desktop_layout->set_displays();

A bit wary of that change, the linux agent has had its share of issues
with getting notified of guest display changes, and then the agent
overriding the change which just happened with some stale information
and stuff like that. Would it be possible to only trigger a send of the
driver escape without trying to set anything ?

Christophe
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 819 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/spice-devel/attachments/20150622/9dde4303/attachment-0001.sig>


More information about the Spice-devel mailing list