[Spice-devel] [PATCH v2 2/2] qxl-wdm-dod: Fix double mouse pointer when moving window
Frediano Ziglio
fziglio at redhat.com
Mon Nov 21 14:08:10 UTC 2016
>
> The driver saves 'visible' state of the pointer and sends
> HIDE command when the pointer becomes invisible.
>
> Signed-off-by: Yuri Benditovich <yuri.benditovich at daynix.com>
This is already done by Windows.
Also please don't strip other people signed off
Frediano
> ---
> qxldod/QxlDod.cpp | 38 +++++++++++++++++++++++++-------------
> qxldod/QxlDod.h | 2 ++
> 2 files changed, 27 insertions(+), 13 deletions(-)
>
> diff --git a/qxldod/QxlDod.cpp b/qxldod/QxlDod.cpp
> index 724e89f..1fd2941 100755
> --- a/qxldod/QxlDod.cpp
> +++ b/qxldod/QxlDod.cpp
> @@ -434,11 +434,6 @@ NTSTATUS QxlDod::SetPointerPosition(_In_ CONST
> DXGKARG_SETPOINTERPOSITION* pSetP
> QXL_ASSERT(pSetPointerPosition != NULL);
> QXL_ASSERT(pSetPointerPosition->VidPnSourceId < MAX_VIEWS);
>
> - if (!(pSetPointerPosition->Flags.Visible))
> - {
> - DbgPrint(TRACE_LEVEL_INFORMATION, ("<--- %s Cursor is not
> visible\n", __FUNCTION__));
> - return STATUS_SUCCESS;
> - }
> return m_pHWDevice->SetPointerPosition(pSetPointerPosition);
> }
>
> @@ -2970,6 +2965,7 @@ QxlDevice::QxlDevice(_In_ QxlDod* pQxlDod)
> m_CustomMode = 0;
> m_FreeOutputs = 0;
> m_Pending = 0;
> + m_bPointerVisible = TRUE;
> }
>
> QxlDevice::~QxlDevice(void)
> @@ -4499,6 +4495,13 @@ NTSTATUS QxlDevice::SetPointerShape(_In_ CONST
> DXGKARG_SETPOINTERSHAPE* pSetPoi
>
> NTSTATUS QxlDevice::SetPointerPosition(_In_ CONST
> DXGKARG_SETPOINTERPOSITION* pSetPointerPosition)
> {
> + BOOLEAN bIsVisible =
> + pSetPointerPosition->Flags.Visible &&
> + pSetPointerPosition->X >= 0;
> + BOOLEAN bTurnOff = !bIsVisible && m_bPointerVisible;
> + BOOLEAN bSkip = !bIsVisible && !m_bPointerVisible;
> + m_bPointerVisible = bIsVisible;
> +
> PAGED_CODE();
> DbgPrint(TRACE_LEVEL_VERBOSE, ("---> %s\n", __FUNCTION__));
> DbgPrint(TRACE_LEVEL_INFORMATION, ("<--> %s flag = %d id = %d, x = %d, y
> = %d\n", __FUNCTION__,
> @@ -4506,15 +4509,24 @@ NTSTATUS QxlDevice::SetPointerPosition(_In_ CONST
> DXGKARG_SETPOINTERPOSITION* pS
> pSetPointerPosition->VidPnSourceId,
> pSetPointerPosition->X,
> pSetPointerPosition->Y));
> - QXLCursorCmd *cursor_cmd = CursorCmd();
> - if (pSetPointerPosition->X < 0) {
> - cursor_cmd->type = QXL_CURSOR_HIDE;
> - } else {
> - cursor_cmd->type = QXL_CURSOR_MOVE;
> - cursor_cmd->u.position.x = (INT16)pSetPointerPosition->X;
> - cursor_cmd->u.position.y = (INT16)pSetPointerPosition->Y;
> +
> + if (!bSkip) {
> + QXLCursorCmd *cursor_cmd = CursorCmd();
> +
> + if (bTurnOff) {
> + cursor_cmd->type = QXL_CURSOR_HIDE;
> + }
> + else {
> + cursor_cmd->type = QXL_CURSOR_MOVE;
> + cursor_cmd->u.position.x = (INT16)pSetPointerPosition->X;
> + cursor_cmd->u.position.y = (INT16)pSetPointerPosition->Y;
> + }
> + PushCursorCmd(cursor_cmd);
> }
> - PushCursorCmd(cursor_cmd);
> + else {
> + DbgPrint(TRACE_LEVEL_VERBOSE, ("Skip command\n", __FUNCTION__));
> + }
> +
> DbgPrint(TRACE_LEVEL_VERBOSE, ("<--- %s\n", __FUNCTION__));
> return STATUS_SUCCESS;
> }
> diff --git a/qxldod/QxlDod.h b/qxldod/QxlDod.h
> index 8503f29..1610fe6 100755
> --- a/qxldod/QxlDod.h
> +++ b/qxldod/QxlDod.h
> @@ -601,6 +601,8 @@ private:
>
> QXLMonitorsConfig* m_monitor_config;
> QXLPHYSICAL* m_monitor_config_pa;
> +
> + BOOLEAN m_bPointerVisible;
> };
>
> class QxlDod {
More information about the Spice-devel
mailing list