diff --git a/src/Input.h b/src/Input.h index 7c56fc8..bc1162b 100644 --- a/src/Input.h +++ b/src/Input.h @@ -25,6 +25,14 @@ typedef struct _NV_KEYBOARD_PACKET { short zero2; } NV_KEYBOARD_PACKET, *PNV_KEYBOARD_PACKET; +#define UTF8_TEXT_EVENT_MAGIC 0x17 +#define UTF8_TEXT_EVENT_MAX_COUNT 32 +typedef struct _NV_UNICODE_PACKET { + unsigned int size; + int magic; + char text[UTF8_TEXT_EVENT_MAX_COUNT]; +} NV_UNICODE_PACKET, *PNV_UNICODE_PACKET; + #define PACKET_TYPE_REL_MOUSE_MOVE 0x08 #define MOUSE_MOVE_REL_MAGIC 0x06 typedef struct _NV_REL_MOUSE_MOVE_PACKET { diff --git a/src/InputStream.c b/src/InputStream.c index c9605f9..495e34f 100644 --- a/src/InputStream.c +++ b/src/InputStream.c @@ -26,6 +26,7 @@ typedef struct _PACKET_HOLDER { NV_MULTI_CONTROLLER_PACKET multiController; NV_SCROLL_PACKET scroll; NV_HAPTICS_PACKET haptics; + NV_UNICODE_PACKET unicode; } packet; LINKED_BLOCKING_QUEUE_ENTRY entry; } PACKET_HOLDER, *PPACKET_HOLDER; @@ -607,6 +608,38 @@ int LiSendKeyboardEvent(short keyCode, char keyAction, char modifiers) { return err; } +int LiSendUtf8TextEvent(const char *text, unsigned int length) { + PPACKET_HOLDER holder; + int err; + + if (!initialized) { + return -2; + } + + if (length > UTF8_TEXT_EVENT_MAX_COUNT) { + return -1; + } + holder = allocatePacketHolder(); + if (holder == NULL) { + return -1; + } + // Size + magic + string length + holder->packetLength = 4 + 4 + length; + // Magic + string length + holder->packet.unicode.size = BE32(4 + length); + holder->packet.unicode.magic = LE32(UTF8_TEXT_EVENT_MAGIC); + memcpy(holder->packet.unicode.text, text, length); + + err = LbqOfferQueueItem(&packetQueue, holder, &holder->entry); + if (err != LBQ_SUCCESS) { + LC_ASSERT(err == LBQ_BOUND_EXCEEDED); + Limelog("Input queue reached maximum size limit\n"); + freePacketHolder(holder); + } + + return err; +} + static int sendControllerEventInternal(short controllerNumber, short activeGamepadMask, short buttonFlags, unsigned char leftTrigger, unsigned char rightTrigger, short leftStickX, short leftStickY, short rightStickX, short rightStickY) diff --git a/src/Limelight.h b/src/Limelight.h index e9e9110..ac72900 100644 --- a/src/Limelight.h +++ b/src/Limelight.h @@ -519,6 +519,10 @@ int LiSendMouseButtonEvent(char action, int button); #define MODIFIER_META 0x08 int LiSendKeyboardEvent(short keyCode, char keyAction, char modifiers); +// This function queues an UTF-8 encoded text to be sent to the remote server. +// Currently maximum length is 32 bytes. +int LiSendUtf8TextEvent(const char *text, unsigned int length); + // Button flags #define A_FLAG 0x1000 #define B_FLAG 0x2000