[c-host] inform the client if we have positional cursor information

This commit is contained in:
Geoffrey McRae 2020-01-26 17:25:14 +11:00
parent b4cf8f76c8
commit b7e4426002
5 changed files with 45 additions and 26 deletions

View File

@ -61,6 +61,7 @@ CaptureFrame;
typedef struct CapturePointer
{
bool positionUpdate;
int x, y;
bool visible;

View File

@ -710,9 +710,15 @@ static CaptureResult dxgi_capture()
frameInfo.PointerPosition.Visible != this->lastPointerVisible
)
{
pointer.positionUpdate = true;
this->lastPointerX = frameInfo.PointerPosition.Position.x;
this->lastPointerY = frameInfo.PointerPosition.Position.y;
this->lastPointerVisible = frameInfo.PointerPosition.Visible;
pointer.x = this->lastPointerX;
pointer.y = this->lastPointerY;
pointer.visible = this->lastPointerVisible;
postPointer = true;
}
}
@ -754,12 +760,7 @@ static CaptureResult dxgi_capture()
// post back the pointer information
if (postPointer)
{
pointer.x = this->lastPointerX;
pointer.y = this->lastPointerY;
pointer.visible = this->lastPointerVisible;
this->postPointerBufferFn(pointer);
}
return CAPTURE_RESULT_OK;
}

View File

@ -316,9 +316,9 @@ static int pointerThread(void * unused)
if (this->stop)
break;
CaptureResult result;
CaptureResult result;
CapturePointer pointer = { 0 };
pointer.shapeUpdate = false;
if (this->seperateCursor && events[1])
{
void * data;
@ -341,9 +341,13 @@ static int pointerThread(void * unused)
this->mouseHotY = pointer.y;
}
pointer.visible = this->mouseVisible;
pointer.x = this->mouseX - this->mouseHotX;
pointer.y = this->mouseY - this->mouseHotY;
if (events[0])
{
pointer.positionUpdate = true;
pointer.visible = this->mouseVisible;
pointer.x = this->mouseX - this->mouseHotX;
pointer.y = this->mouseY - this->mouseHotY;
}
this->postPointerBufferFn(pointer);
}

View File

@ -312,10 +312,16 @@ void capturePostPointerBuffer(CapturePointer pointer)
app.pointerIndex = 0;
}
uint32_t flags = 0;
KVMFRCursor *cursor = lgmpHostMemPtr(mem);
cursor->x = pointer.x;
cursor->y = pointer.y;
cursor->visible = pointer.visible;
if (pointer.positionUpdate)
{
flags |= CURSOR_FLAG_POSITION;
cursor->x = pointer.x;
cursor->y = pointer.y;
cursor->visible = pointer.visible;
}
if (pointer.shapeUpdate)
{
@ -337,11 +343,11 @@ void capturePostPointerBuffer(CapturePointer pointer)
app.pointerShapeValid = true;
}
const uint32_t sendShape =
((pointer.shapeUpdate || newClient) && app.pointerShapeValid) ? 1 : 0;
if ((pointer.shapeUpdate || newClient) && app.pointerShapeValid)
flags |= CURSOR_FLAG_SHAPE;
LGMP_STATUS status;
while ((status = lgmpHostQueuePost(app.pointerQueue, sendShape, mem)) != LGMP_OK)
while ((status = lgmpHostQueuePost(app.pointerQueue, flags, mem)) != LGMP_OK)
{
if (status == LGMP_ERR_QUEUE_FULL)
continue;

View File

@ -34,6 +34,13 @@ typedef enum FrameType
}
FrameType;
enum
{
CURSOR_FLAG_POSITION = 0x1,
CURSOR_FLAG_SHAPE = 0x2
};
typedef uint32_t KVMFRCursorFlags;
typedef enum CursorType
{
CURSOR_TYPE_COLOR ,
@ -55,11 +62,11 @@ KVMFRCursor;
typedef struct KVMFRFrame
{
FrameType type; // the frame data type
uint32_t width; // the width
uint32_t height; // the height
uint32_t stride; // the row stride (zero if compressed data)
uint32_t pitch; // the row pitch (stride in bytes or the compressed frame size)
uint32_t offset; // offset from the start of this header to the FrameBuffer header
FrameType type; // the frame data type
uint32_t width; // the width
uint32_t height; // the height
uint32_t stride; // the row stride (zero if compressed data)
uint32_t pitch; // the row pitch (stride in bytes or the compressed frame size)
uint32_t offset; // offset from the start of this header to the FrameBuffer header
}
KVMFRFrame;