The driver saves 'visible' state of the pointer and sends HIDE command when the pointer becomes invisible. Signed-off-by: Yuri Benditovich <yuri.benditovich@xxxxxxxxxx> --- 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 { -- 2.7.0.windows.1 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/spice-devel