Re: [vdagent PATCH] Add monitors_config driver escape.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, Jun 18, 2015 at 07:14:10PM -0400, sstutsma@xxxxxxxxxx wrote:
> From: Sandy Stutsman <sstutsma@xxxxxxxxxx>
> 
> 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

Attachment: pgpbhG_3QWb_X.pgp
Description: PGP signature

_______________________________________________
Spice-devel mailing list
Spice-devel@xxxxxxxxxxxxxxxxxxxxx
http://lists.freedesktop.org/mailman/listinfo/spice-devel

[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux]     [Linux OMAP]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]     [Monitors]