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@xxxxxxxxxx> --- 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 4db093f..ea86859 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; @@ -679,6 +689,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 e5ee90d..91a3de4 100755 --- a/vdagent/display_configuration.h +++ b/vdagent/display_configuration.h @@ -105,7 +105,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; }; @@ -160,6 +160,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.7.4 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/spice-devel