From 4b4aca841c7d017b39bff8df34d12f8330ac7164 Mon Sep 17 00:00:00 2001 From: Geoffrey McRae Date: Wed, 13 Dec 2017 02:29:53 +1100 Subject: [PATCH] [host] don't spam the client with mouse updates when nothing has changed --- host/Capture/DXGI.cpp | 26 ++++++++++++++++++++------ host/Capture/DXGI.h | 2 ++ host/Service.cpp | 2 ++ 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/host/Capture/DXGI.cpp b/host/Capture/DXGI.cpp index 755f17ee..2a781688 100644 --- a/host/Capture/DXGI.cpp +++ b/host/Capture/DXGI.cpp @@ -248,11 +248,25 @@ GrabStatus DXGI::GrabFrame(FrameInfo & frame) // if we have a mouse update if (frameInfo.LastMouseUpdateTime.QuadPart) { - cursorUpdate = true; - frame.cursor.hasPos = true; - frame.cursor.visible = frameInfo.PointerPosition.Visible; - frame.cursor.x = frameInfo.PointerPosition.Position.x; - frame.cursor.y = frameInfo.PointerPosition.Position.x; + if ( + m_lastMousePos.x != frameInfo.PointerPosition.Position.x || + m_lastMousePos.y != frameInfo.PointerPosition.Position.y + ) { + cursorUpdate = true; + frame.cursor.hasPos = true; + frame.cursor.x = frameInfo.PointerPosition.Position.x; + frame.cursor.y = frameInfo.PointerPosition.Position.y; + m_lastMousePos.x = frameInfo.PointerPosition.Position.x; + m_lastMousePos.y = frameInfo.PointerPosition.Position.y; + } + + if (m_lastMouseVis != frameInfo.PointerPosition.Visible) + { + cursorUpdate = true; + m_lastMouseVis = frameInfo.PointerPosition.Visible; + } + + frame.cursor.visible = m_lastMouseVis; } // if the pointer shape has changed @@ -293,7 +307,7 @@ GrabStatus DXGI::GrabFrame(FrameInfo & frame) frame.cursor.dataSize = m_pointerSize; } - if (frameInfo.AccumulatedFrames == 1) + if (frameInfo.AccumulatedFrames > 0) break; m_dup->ReleaseFrame(); diff --git a/host/Capture/DXGI.h b/host/Capture/DXGI.h index 7b1939f9..11e4afcd 100644 --- a/host/Capture/DXGI.h +++ b/host/Capture/DXGI.h @@ -72,5 +72,7 @@ namespace Capture BYTE * m_pointer; UINT m_pointerBufSize; UINT m_pointerSize; + BOOL m_lastMouseVis; + POINT m_lastMousePos; }; }; \ No newline at end of file diff --git a/host/Service.cpp b/host/Service.cpp index bbed8172..057357f8 100644 --- a/host/Service.cpp +++ b/host/Service.cpp @@ -240,6 +240,8 @@ bool Service::Process() // tell the host where the cursor is m_header->flags |= KVMFR_HEADER_FLAG_CURSOR; m_header->cursor.flags |= KVMFR_CURSOR_FLAG_POS; + if (frame.cursor.visible) + m_header->cursor.flags |= KVMFR_CURSOR_FLAG_VISIBLE; m_header->cursor.x = frame.cursor.x; m_header->cursor.y = frame.cursor.y; }