Fix relative mouse and controller batching after 74377a06

This commit is contained in:
Cameron Gutman 2021-08-05 22:14:35 -05:00
parent 8cac195fcf
commit a290ec032b
2 changed files with 30 additions and 15 deletions

View File

@ -29,6 +29,7 @@ typedef struct _NV_UNICODE_PACKET {
} NV_UNICODE_PACKET, *PNV_UNICODE_PACKET;
#define MOUSE_MOVE_REL_MAGIC 0x00000006
#define MOUSE_MOVE_REL_MAGIC_GEN5 0x00000007
typedef struct _NV_REL_MOUSE_MOVE_PACKET {
NV_INPUT_HEADER header;
short deltaX;
@ -75,6 +76,7 @@ typedef struct _NV_CONTROLLER_PACKET {
} NV_CONTROLLER_PACKET, *PNV_CONTROLLER_PACKET;
#define MULTI_CONTROLLER_MAGIC 0x0000000D
#define MULTI_CONTROLLER_MAGIC_GEN5 0x0000000C
#define MC_HEADER_B 0x001A
#define MC_MID_B 0x0014
#define MC_TAIL_A 0x0000009C
@ -97,6 +99,7 @@ typedef struct _NV_MULTI_CONTROLLER_PACKET {
} NV_MULTI_CONTROLLER_PACKET, *PNV_MULTI_CONTROLLER_PACKET;
#define SCROLL_MAGIC 0x00000009
#define SCROLL_MAGIC_GEN5 0x0000000A
typedef struct _NV_SCROLL_PACKET {
NV_INPUT_HEADER header;
short scrollAmt1;

View File

@ -224,6 +224,17 @@ static bool sendInputPacket(PPACKET_HOLDER holder) {
static void inputSendThreadProc(void* context) {
SOCK_RET err;
PPACKET_HOLDER holder;
uint32_t multiControllerMagicLE;
uint32_t relMouseMagicLE;
if (AppVersionQuad[0] >= 5) {
multiControllerMagicLE = LE32(MULTI_CONTROLLER_MAGIC_GEN5);
relMouseMagicLE = LE32(MOUSE_MOVE_REL_MAGIC_GEN5);
}
else {
multiControllerMagicLE = LE32(MULTI_CONTROLLER_MAGIC);
relMouseMagicLE = LE32(MOUSE_MOVE_REL_MAGIC);
}
while (!PltIsThreadInterrupted(&inputSendThread)) {
err = LbqWaitForQueueElement(&packetQueue, (void**)&holder);
@ -232,7 +243,7 @@ static void inputSendThreadProc(void* context) {
}
// If it's a multi-controller packet we can do batching
if (holder->packet.header.magic == LE32(MULTI_CONTROLLER_MAGIC)) {
if (holder->packet.header.magic == multiControllerMagicLE) {
PPACKET_HOLDER controllerBatchHolder;
PNV_MULTI_CONTROLLER_PACKET origPkt;
@ -246,7 +257,7 @@ static void inputSendThreadProc(void* context) {
}
// If it's not a controller packet, we're done
if (controllerBatchHolder->packet.header.magic != LE32(MULTI_CONTROLLER_MAGIC)) {
if (controllerBatchHolder->packet.header.magic != multiControllerMagicLE) {
break;
}
@ -281,7 +292,7 @@ static void inputSendThreadProc(void* context) {
}
}
// If it's a relative mouse move packet, we can also do batching
else if (holder->packet.header.magic == LE32(MOUSE_MOVE_REL_MAGIC)) {
else if (holder->packet.header.magic == relMouseMagicLE) {
PPACKET_HOLDER mouseBatchHolder;
int totalDeltaX = (short)BE16(holder->packet.mouseMoveRel.deltaX);
int totalDeltaY = (short)BE16(holder->packet.mouseMoveRel.deltaY);
@ -296,7 +307,7 @@ static void inputSendThreadProc(void* context) {
}
// If it's not a mouse move packet, we're done
if (mouseBatchHolder->packet.header.magic != LE32(MOUSE_MOVE_REL_MAGIC)) {
if (mouseBatchHolder->packet.header.magic != relMouseMagicLE) {
break;
}
@ -499,12 +510,12 @@ int LiSendMouseMoveEvent(short deltaX, short deltaY) {
holder->packetLength = sizeof(NV_REL_MOUSE_MOVE_PACKET);
holder->packet.mouseMoveRel.header.size = BE32(holder->packetLength - sizeof(uint32_t));
holder->packet.mouseMoveRel.header.magic = MOUSE_MOVE_REL_MAGIC;
// On Gen 5 servers, the header code is incremented by one
if (AppVersionQuad[0] >= 5) {
holder->packet.mouseMoveRel.header.magic++;
holder->packet.mouseMoveRel.header.magic = LE32(MOUSE_MOVE_REL_MAGIC_GEN5);
}
else {
holder->packet.mouseMoveRel.header.magic = LE32(MOUSE_MOVE_REL_MAGIC);
}
holder->packet.mouseMoveRel.header.magic = LE32(holder->packet.mouseMoveRel.header.magic);
holder->packet.mouseMoveRel.deltaX = BE16(deltaX);
holder->packet.mouseMoveRel.deltaY = BE16(deltaY);
@ -730,12 +741,13 @@ static int sendControllerEventInternal(short controllerNumber, short activeGamep
// Generation 4+ servers support passing the controller number
holder->packetLength = sizeof(NV_MULTI_CONTROLLER_PACKET);
holder->packet.multiController.header.size = BE32(holder->packetLength - sizeof(uint32_t));
holder->packet.multiController.header.magic = MULTI_CONTROLLER_MAGIC;
// On Gen 5 servers, the header code is decremented by one
if (AppVersionQuad[0] >= 5) {
holder->packet.multiController.header.magic--;
holder->packet.multiController.header.magic = LE32(MULTI_CONTROLLER_MAGIC_GEN5);
}
else {
holder->packet.multiController.header.magic = LE32(MULTI_CONTROLLER_MAGIC);
}
holder->packet.multiController.header.magic = LE32(holder->packet.multiController.header.magic);
holder->packet.multiController.headerB = LE16(MC_HEADER_B);
holder->packet.multiController.controllerNumber = LE16(controllerNumber);
holder->packet.multiController.activeGamepadMask = LE16(activeGamepadMask);
@ -799,12 +811,12 @@ int LiSendHighResScrollEvent(short scrollAmount) {
holder->packetLength = sizeof(NV_SCROLL_PACKET);
holder->packet.scroll.header.size = BE32(holder->packetLength - sizeof(uint32_t));
holder->packet.scroll.header.magic = SCROLL_MAGIC;
// On Gen 5 servers, the header code is incremented by one
if (AppVersionQuad[0] >= 5) {
holder->packet.scroll.header.magic++;
holder->packet.scroll.header.magic = LE32(SCROLL_MAGIC_GEN5);
}
else {
holder->packet.scroll.header.magic = LE32(SCROLL_MAGIC);
}
holder->packet.scroll.header.magic = LE32(holder->packet.scroll.header.magic);
holder->packet.scroll.scrollAmt1 = BE16(scrollAmount);
holder->packet.scroll.scrollAmt2 = holder->packet.scroll.scrollAmt1;
holder->packet.scroll.zero3 = 0;