[client] implement support for KVMFR_FEATURE_SETCURSORPOS

This commit is contained in:
Geoffrey McRae 2021-08-05 22:19:35 +10:00
parent 95bbd67dea
commit afbee641b1
3 changed files with 25 additions and 11 deletions

View File

@ -407,13 +407,25 @@ void core_handleMouseNormal(double ex, double ey)
if (g_cursor.realign) if (g_cursor.realign)
{ {
g_cursor.realign = false; g_cursor.realign = false;
struct DoublePoint guest; struct DoublePoint guest;
util_localCurToGuest(&guest); util_localCurToGuest(&guest);
if (g_state.kvmfrFeatures & KVMFR_FEATURE_SETCURSORPOS)
{
const KVMFRSetCursorPos msg = {
.msg.type = KVMFR_MESSAGE_SETCURSORPOS,
.x = guest.x,
.y = guest.y
};
lgmpClientSendData(g_state.pointerQueue, &msg, sizeof(msg));
}
else
{
/* add the difference to the offset */ /* add the difference to the offset */
ex += guest.x - (g_cursor.guest.x + g_cursor.guest.hx); ex += guest.x - (g_cursor.guest.x + g_cursor.guest.hx);
ey += guest.y - (g_cursor.guest.y + g_cursor.guest.hy); ey += guest.y - (g_cursor.guest.y + g_cursor.guest.hy);
}
/* don't test for an exit as we just entered, we can get into a enter/exit /* don't test for an exit as we just entered, we can get into a enter/exit
* loop otherwise */ * loop otherwise */

View File

@ -299,7 +299,6 @@ static int renderThread(void * unused)
static int cursorThread(void * unused) static int cursorThread(void * unused)
{ {
LGMP_STATUS status; LGMP_STATUS status;
PLGMPClientQueue queue;
LG_RendererCursor cursorType = LG_CURSOR_COLOR; LG_RendererCursor cursorType = LG_CURSOR_COLOR;
lgWaitEvent(e_startup, TIMEOUT_INFINITE); lgWaitEvent(e_startup, TIMEOUT_INFINITE);
@ -307,7 +306,8 @@ static int cursorThread(void * unused)
// subscribe to the pointer queue // subscribe to the pointer queue
while(g_state.state == APP_STATE_RUNNING) while(g_state.state == APP_STATE_RUNNING)
{ {
status = lgmpClientSubscribe(g_state.lgmp, LGMP_Q_POINTER, &queue); status = lgmpClientSubscribe(g_state.lgmp, LGMP_Q_POINTER,
&g_state.pointerQueue);
if (status == LGMP_OK) if (status == LGMP_OK)
break; break;
@ -325,7 +325,7 @@ static int cursorThread(void * unused)
while(g_state.state == APP_STATE_RUNNING) while(g_state.state == APP_STATE_RUNNING)
{ {
LGMPMessage msg; LGMPMessage msg;
if ((status = lgmpClientProcess(queue, &msg)) != LGMP_OK) if ((status = lgmpClientProcess(g_state.pointerQueue, &msg)) != LGMP_OK)
{ {
if (status == LGMP_ERR_QUEUE_EMPTY) if (status == LGMP_ERR_QUEUE_EMPTY)
{ {
@ -375,7 +375,7 @@ static int cursorThread(void * unused)
char buffer[msg.size]; char buffer[msg.size];
memcpy(buffer, msg.mem, msg.size); memcpy(buffer, msg.mem, msg.size);
KVMFRCursor * cursor = (KVMFRCursor *)buffer; KVMFRCursor * cursor = (KVMFRCursor *)buffer;
lgmpClientMessageDone(queue); lgmpClientMessageDone(g_state.pointerQueue);
g_cursor.guest.visible = g_cursor.guest.visible =
msg.udata & CURSOR_FLAG_VISIBLE; msg.udata & CURSOR_FLAG_VISIBLE;
@ -389,7 +389,7 @@ static int cursorThread(void * unused)
case CURSOR_TYPE_MASKED_COLOR: cursorType = LG_CURSOR_MASKED_COLOR; break; case CURSOR_TYPE_MASKED_COLOR: cursorType = LG_CURSOR_MASKED_COLOR; break;
default: default:
DEBUG_ERROR("Invalid cursor type"); DEBUG_ERROR("Invalid cursor type");
lgmpClientMessageDone(queue); lgmpClientMessageDone(g_state.pointerQueue);
continue; continue;
} }
@ -443,7 +443,7 @@ static int cursorThread(void * unused)
lgSignalEvent(g_state.frameEvent); lgSignalEvent(g_state.frameEvent);
} }
lgmpClientUnsubscribe(&queue); lgmpClientUnsubscribe(&g_state.pointerQueue);
return 0; return 0;
} }
@ -1137,6 +1137,8 @@ restart:
DEBUG_INFO("Host ready, reported version: %s", udata->hostver); DEBUG_INFO("Host ready, reported version: %s", udata->hostver);
DEBUG_INFO("Starting session"); DEBUG_INFO("Starting session");
g_state.kvmfrFeatures = udata->features;
if (!lgCreateThread("cursorThread", cursorThread, NULL, &t_cursor)) if (!lgCreateThread("cursorThread", cursorThread, NULL, &t_cursor))
{ {
DEBUG_ERROR("cursor create thread failed"); DEBUG_ERROR("cursor create thread failed");

View File

@ -103,8 +103,8 @@ struct AppState
struct IVSHMEM shm; struct IVSHMEM shm;
PLGMPClient lgmp; PLGMPClient lgmp;
PLGMPClientQueue frameQueue;
PLGMPClientQueue pointerQueue; PLGMPClientQueue pointerQueue;
KVMFRFeatureFlags kvmfrFeatures;
LGThread * frameThread; LGThread * frameThread;
LGEvent * frameEvent; LGEvent * frameEvent;