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

Dmitry Fleytman dmitry at daynix.com
Thu Aug 4 14:07:35 UTC 2016


> On 4 Aug 2016, at 17:02 PM, Victor Toso <lists at victortoso.com> wrote:
> 
> Hi,
> 
> On Thu, Aug 04, 2016 at 05:00:33PM +0300, Dmitry Fleytman wrote:
>> 
>>> On 4 Aug 2016, at 16:44 PM, Victor Toso <lists at victortoso.com> wrote:
>>> 
>>> Hi,
>>> 
>>> On Thu, Aug 04, 2016 at 06:34:14AM -0700, Dmitry Fleytman wrote:
>>>> Hi Victor,
>>>> 
>>>> How do we configure server mouse with VDAgent running?
>>> 
>>> You mean the host/VM configuration? What I mean by my question is that
>>> we can send a SpiceMsgcMainMouseModeRequest from client to change mouse
>>> mode and I would like to know if that would still be possible with this
>>> patch.
>>> 
>>> Check:
>>> https://cgit.freedesktop.org/spice/spice-gtk/commit/?id=5f89a4df037f6a1f2
>> 
>> I mean, is there any tool/command line switch that we can use to check this case?
> 
> Yes! spicy has a `toggle mouse mode` in the options (shift + F7)

Cool, I did not know this.
Is there pre-compiled spicy binary that we can use somewhere?

> 
>> 
>>> 
>>>> 
>>>> Thanks,
>>>> Dmitry
>>>> 
>>>> 
>>>> On Thu, Aug 4, 2016 at 6:30 AM, Victor Toso <lists at victortoso.com> wrote:
>>>> 
>>>>> Hi,
>>>>> 
>>>>> On Wed, Aug 03, 2016 at 06:45:29PM +0300, Sameeh Jubran wrote:
>>>>>> 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.
>>>>> 
>>>>> Just to be sure. I can still have mouse in server mode when VDAgent is
>>>>> running?
>>>>> 
>>>>> toso
>>>>> 
>>>>>> 
>>>>>> 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
>>>>>> 
>>>>>> _______________________________________________
>>>>>> Spice-devel mailing list
>>>>>> Spice-devel at lists.freedesktop.org
>>>>>> https://lists.freedesktop.org/mailman/listinfo/spice-devel
>>>>> _______________________________________________
>>>>> Spice-devel mailing list
>>>>> Spice-devel at lists.freedesktop.org
>>>>> https://lists.freedesktop.org/mailman/listinfo/spice-devel
>>>>> 
>> 



More information about the Spice-devel mailing list