[c-host] use the correct buffer for the cursor shape

This commit is contained in:
Geoffrey McRae 2020-01-09 20:27:55 +11:00
parent b0fb7177bb
commit 7a98a886b6
2 changed files with 13 additions and 14 deletions

View file

@ -699,7 +699,7 @@ static CaptureResult dxgi_capture()
// if the pointer has moved or changed state // if the pointer has moved or changed state
bool postPointer = false; bool postPointer = false;
CapturePointer pointer = { 0 }; CapturePointer pointer = { 0 };
void * pointerShape = NULL; void * pointerShape = NULL;
UINT pointerShapeSize = 0; UINT pointerShapeSize = 0;
if (frameInfo.LastMouseUpdateTime.QuadPart) if (frameInfo.LastMouseUpdateTime.QuadPart)

View file

@ -261,6 +261,7 @@ bool captureGetPointerBuffer(void ** data, uint32_t * size)
// spin until there is room // spin until there is room
while(lgmpHostQueuePending(app.pointerQueue) == LGMP_Q_POINTER_LEN) while(lgmpHostQueuePending(app.pointerQueue) == LGMP_Q_POINTER_LEN)
{ {
DEBUG_INFO("pending");
if (!app.running) if (!app.running)
return false; return false;
} }
@ -273,19 +274,12 @@ bool captureGetPointerBuffer(void ** data, uint32_t * size)
void capturePostPointerBuffer(CapturePointer pointer) void capturePostPointerBuffer(CapturePointer pointer)
{ {
// spin until there is room
while(lgmpHostQueuePending(app.pointerQueue) == LGMP_Q_POINTER_LEN)
{
if (!app.running)
return;
}
PLGMPMemory mem; PLGMPMemory mem;
const bool newClient = lgmpHostNewSubCount(app.pointerQueue) > 0; const bool newClient = lgmpHostNewSubCount(app.pointerQueue) > 0;
if (pointer.shapeUpdate || newClient) if (pointer.shapeUpdate || newClient)
{ {
if (!newClient) if (pointer.shapeUpdate)
{ {
// swap the latest shape buffer out of rotation // swap the latest shape buffer out of rotation
PLGMPMemory tmp = app.pointerShape; PLGMPMemory tmp = app.pointerShape;
@ -297,7 +291,11 @@ void capturePostPointerBuffer(CapturePointer pointer)
mem = app.pointerShape; mem = app.pointerShape;
} }
else else
{
mem = app.pointerMemory[app.pointerIndex]; mem = app.pointerMemory[app.pointerIndex];
if (++app.pointerIndex == LGMP_Q_POINTER_LEN)
app.pointerIndex = 0;
}
KVMFRCursor *cursor = lgmpHostMemPtr(mem); KVMFRCursor *cursor = lgmpHostMemPtr(mem);
cursor->x = pointer.x; cursor->x = pointer.x;
@ -324,17 +322,18 @@ void capturePostPointerBuffer(CapturePointer pointer)
app.pointerShapeValid = true; app.pointerShapeValid = true;
} }
const bool sendShape = (pointer.shapeUpdate || newClient) && app.pointerShapeValid; const uint32_t sendShape =
((pointer.shapeUpdate || newClient) && app.pointerShapeValid) ? 1 : 0;
LGMP_STATUS status; LGMP_STATUS status;
if ((status = lgmpHostPost(app.pointerQueue, sendShape ? 1 : 0, mem)) != LGMP_OK) while ((status = lgmpHostPost(app.pointerQueue, sendShape, mem)) != LGMP_OK)
{ {
if (status == LGMP_ERR_QUEUE_FULL)
continue;
DEBUG_ERROR("lgmpHostPost Failed (Pointer): %s", lgmpStatusString(status)); DEBUG_ERROR("lgmpHostPost Failed (Pointer): %s", lgmpStatusString(status));
return; return;
} }
if (++app.pointerIndex == LGMP_Q_POINTER_LEN)
app.pointerIndex = 0;
} }
// this is called from the platform specific startup routine // this is called from the platform specific startup routine