From: Sameeh Jubran <sameeh@xxxxxxxxxx> 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. Signed-off-by: Sameeh Jubran <sameeh@xxxxxxxxxx> Signed-off-by: Dmitry Fleytman <dmitry@xxxxxxxxxx> --- vdagent/desktop_layout.cpp | 21 +++++++++++++++++++++ vdagent/desktop_layout.h | 1 + vdagent/display_configuration.cpp | 15 +++++++++++++++ vdagent/display_configuration.h | 2 ++ 4 files changed, 39 insertions(+) diff --git a/vdagent/desktop_layout.cpp b/vdagent/desktop_layout.cpp index 7aff7e7..a8d9e2d 100644 --- a/vdagent/desktop_layout.cpp +++ b/vdagent/desktop_layout.cpp @@ -44,6 +44,7 @@ DesktopLayout::DesktopLayout() DesktopLayout::~DesktopLayout() { + set_vdagent_running_for_displays(false); clean_displays(); if (_display_config){ delete _display_config; @@ -122,6 +123,8 @@ void DesktopLayout::set_displays() DWORD display_id = 0; int dev_sets = 0; + set_vdagent_running_for_displays(true); + lock(); if (!consistent_displays()) { unlock(); @@ -276,6 +279,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)); @@ -299,6 +318,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 f20605a..95fd4c3 100644 --- a/vdagent/display_configuration.cpp +++ b/vdagent/display_configuration.cpp @@ -67,6 +67,15 @@ typedef struct WDDM_MONITOR_CONFIG_ESCAPE { int _ioctl; QXLHead _head; } WDDM_MONITOR_CONFIG_ESCAPE; +typedef struct WDDM_VDAGENT_RUNNING_ESCAPE{ + WDDM_VDAGENT_RUNNING_ESCAPE(bool running) + { + _ioctl = QXL_ESCAPE_VDAGENT_RUNNING; + _vdagent_state.running = running; + } + int _ioctl; + QXLEscapeVDAgentRunning _vdagent_state; +} WDDM_VDAGENT_RUNNING_ESCAPE; #endif DisplayConfig* DisplayConfig::create_config() { @@ -529,6 +538,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) +{ + WDDM_VDAGENT_RUNNING_ESCAPE 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 eeba1c2..06f592a 100644 --- a/vdagent/display_configuration.h +++ b/vdagent/display_configuration.h @@ -132,6 +132,7 @@ public: DRIVER_TYPE type() { return _driver_type; }; 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: DRIVER_TYPE _driver_type; @@ -176,6 +177,7 @@ private: void close_adapter(D3DKMT_HANDLE handle); bool escape(LPCTSTR device_name, void* data, UINT sizeData); + bool set_vdagent_running(LPCTSTR device_name, bool running); private: //GDI Function pointers -- 1.8.3.1 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/spice-devel