From a290ec032b6a068a56461bbe4b60798b68a319d5 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Thu, 5 Aug 2021 22:14:35 -0500 Subject: [PATCH] Fix relative mouse and controller batching after 74377a06 --- src/Input.h | 3 +++ src/InputStream.c | 42 +++++++++++++++++++++++++++--------------- 2 files changed, 30 insertions(+), 15 deletions(-) diff --git a/src/Input.h b/src/Input.h index 366ff1c..f8fadcb 100644 --- a/src/Input.h +++ b/src/Input.h @@ -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; diff --git a/src/InputStream.c b/src/InputStream.c index c5552a2..ed48ef7 100644 --- a/src/InputStream.c +++ b/src/InputStream.c @@ -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;