[Spice-devel] [PATCH win-vdagent] Adding ioctl operation to update Vdagent state

Sameeh Jubran sameeh at daynix.com
Wed Aug 3 15:45:29 UTC 2016


This patch adds new ioctl operation to Vdagent in order to update
the driver on Vdagent state. This allows the driver to know
when Vdagent is running and when it is off.

Spice supports two mouse modes: server and client. The server mouse
mode pointer should be enabled when vdagent is off and the client
mouse mode should be enabled  when it is on. The mouse mode
is updated by the driver and thus this patch is needed.

Signed-off-by: Sameeh Jubran <sameeh at daynix.com>
---
 vdagent/desktop_layout.cpp        | 21 +++++++++++++++++++++
 vdagent/desktop_layout.h          |  1 +
 vdagent/display_configuration.cpp | 16 ++++++++++++++++
 vdagent/display_configuration.h   |  3 ++-
 4 files changed, 40 insertions(+), 1 deletion(-)

diff --git a/vdagent/desktop_layout.cpp b/vdagent/desktop_layout.cpp
index 9c3e873..4d183e1 100644
--- a/vdagent/desktop_layout.cpp
+++ b/vdagent/desktop_layout.cpp
@@ -45,6 +45,7 @@ DesktopLayout::DesktopLayout()
 
 DesktopLayout::~DesktopLayout()
 {
+    set_vdagent_running_for_displays(false);
     clean_displays();
     delete _display_config;
 }
@@ -121,6 +122,8 @@ void DesktopLayout::set_displays()
     DWORD display_id = 0;
     int dev_sets = 0;
 
+    set_vdagent_running_for_displays(true);
+
     lock();
     if (!consistent_displays()) {
         unlock();
@@ -275,6 +278,22 @@ bool DesktopLayout::get_qxl_device_id(WCHAR* device_key, DWORD* device_id)
     return key_found;
 }
 
+void DesktopLayout::set_vdagent_running_for_displays(bool running)
+{
+    DISPLAY_DEVICE dev_info;
+    DWORD dev_id = 0;
+    lock();
+    ZeroMemory(&dev_info, sizeof(dev_info));
+    dev_info.cb = sizeof(dev_info);
+    while (EnumDisplayDevices(NULL, dev_id, &dev_info, 0)) {
+        dev_id++;
+        if (!(dev_info.StateFlags & DISPLAY_DEVICE_MIRRORING_DRIVER) && wcsstr(dev_info.DeviceString, L"QXL")) {
+            _display_config->set_vdagent_running(dev_info.DeviceName, running);
+        }
+    }
+    unlock();
+}
+
 bool DesktopLayout::init_dev_mode(LPCTSTR dev_name, DEVMODE* dev_mode, DisplayMode* mode)
 {
     ZeroMemory(dev_mode, sizeof(DEVMODE));
@@ -298,6 +317,8 @@ bool DesktopLayout::init_dev_mode(LPCTSTR dev_name, DEVMODE* dev_mode, DisplayMo
     // update current DisplayMode (so mouse scaling works properly)
     mode->_width = dev_mode->dmPelsWidth;
     mode->_height = dev_mode->dmPelsHeight;
+
+    set_vdagent_running_for_displays(true);
     return true;
 
 }
diff --git a/vdagent/desktop_layout.h b/vdagent/desktop_layout.h
index fd6af76..da5a40b 100644
--- a/vdagent/desktop_layout.h
+++ b/vdagent/desktop_layout.h
@@ -83,6 +83,7 @@ private:
     static bool consistent_displays();
     static bool is_attached(LPCTSTR dev_name);
     static bool get_qxl_device_id(WCHAR* device_key, DWORD* device_id);
+    void set_vdagent_running_for_displays(bool enable_pointer);
 private:
     mutex_t _mutex;
     Displays _displays;
diff --git a/vdagent/display_configuration.cpp b/vdagent/display_configuration.cpp
index 4565b15..7e617b6 100755
--- a/vdagent/display_configuration.cpp
+++ b/vdagent/display_configuration.cpp
@@ -248,6 +248,16 @@ struct WDDMMonitorConfigEscape {
     QXLHead     _head;
 };
 
+struct WDDMVDAgentRunningEscape {
+    WDDMVDAgentRunningEscape(bool running)
+    {
+        _ioctl = QXL_ESCAPE_VDAGENT_RUNNING;
+        _vdagent_state.running = running;
+    }
+    int                        _ioctl;
+    QXLEscapeVDAgentRunning    _vdagent_state;
+};
+
 DisplayConfig* DisplayConfig::create_config()
 {
     DisplayConfig* new_interface;
@@ -690,6 +700,12 @@ bool WDDMInterface::escape(LPCTSTR device_name, void* data, UINT size_data)
     return NT_SUCCESS(status);
 }
 
+bool WDDMInterface::set_vdagent_running(LPCTSTR device_name, bool running)
+{
+    WDDMVDAgentRunningEscape wddm_escape(running);
+    return escape(device_name, &wddm_escape, sizeof(wddm_escape));
+}
+
 CCD::CCD()
     :_NumPathElements(0)
     ,_NumModeElements(0)
diff --git a/vdagent/display_configuration.h b/vdagent/display_configuration.h
index b3d0198..e8ba2f0 100755
--- a/vdagent/display_configuration.h
+++ b/vdagent/display_configuration.h
@@ -107,7 +107,7 @@ public:
     virtual bool update_dev_mode_position(LPCTSTR dev_name, DEVMODE* dev_mode, LONG x, LONG y) = 0;
     void set_monitors_config(bool flag) { _send_monitors_config = flag; }
     virtual void update_config_path() {};
-
+    virtual bool set_vdagent_running(LPCTSTR device_name, bool running) { return false; };
 protected:
     bool _send_monitors_config;
 };
@@ -162,6 +162,7 @@ private:
 
     void close_adapter(D3D_HANDLE handle);
     bool escape(LPCTSTR device_name, void* data, UINT sizeData);
+    bool set_vdagent_running(LPCTSTR device_name, bool running);
 
     //GDI Function pointers
     PFND3DKMT_OPENADAPTERFROMHDC _pfnOpen_adapter_hdc;
-- 
2.5.5



More information about the Spice-devel mailing list