[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 typedef struct CapturePointer
{ {
bool positionUpdate;
int x, y; int x, y;
bool visible; bool visible;
@ -94,4 +95,4 @@ typedef struct CaptureInterface
CaptureResult (*waitFrame )(CaptureFrame * frame); CaptureResult (*waitFrame )(CaptureFrame * frame);
CaptureResult (*getFrame )(FrameBuffer * frame); CaptureResult (*getFrame )(FrameBuffer * frame);
} }
CaptureInterface; CaptureInterface;

View File

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

View File

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

View File

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

View File

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