Added unicode input event (#63)

* Added unicode input event

* Prevents strcpy overflow

* Updated according to change requests
This commit is contained in:
Mariotaku 2021-07-30 11:36:47 +09:00 committed by GitHub
parent 8abc371fb4
commit 5846a9d6aa
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 45 additions and 0 deletions

View File

@ -25,6 +25,14 @@ typedef struct _NV_KEYBOARD_PACKET {
short zero2; short zero2;
} NV_KEYBOARD_PACKET, *PNV_KEYBOARD_PACKET; } 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 PACKET_TYPE_REL_MOUSE_MOVE 0x08
#define MOUSE_MOVE_REL_MAGIC 0x06 #define MOUSE_MOVE_REL_MAGIC 0x06
typedef struct _NV_REL_MOUSE_MOVE_PACKET { typedef struct _NV_REL_MOUSE_MOVE_PACKET {

View File

@ -26,6 +26,7 @@ typedef struct _PACKET_HOLDER {
NV_MULTI_CONTROLLER_PACKET multiController; NV_MULTI_CONTROLLER_PACKET multiController;
NV_SCROLL_PACKET scroll; NV_SCROLL_PACKET scroll;
NV_HAPTICS_PACKET haptics; NV_HAPTICS_PACKET haptics;
NV_UNICODE_PACKET unicode;
} packet; } packet;
LINKED_BLOCKING_QUEUE_ENTRY entry; LINKED_BLOCKING_QUEUE_ENTRY entry;
} PACKET_HOLDER, *PPACKET_HOLDER; } PACKET_HOLDER, *PPACKET_HOLDER;
@ -607,6 +608,38 @@ int LiSendKeyboardEvent(short keyCode, char keyAction, char modifiers) {
return err; 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, static int sendControllerEventInternal(short controllerNumber, short activeGamepadMask,
short buttonFlags, unsigned char leftTrigger, unsigned char rightTrigger, short buttonFlags, unsigned char leftTrigger, unsigned char rightTrigger,
short leftStickX, short leftStickY, short rightStickX, short rightStickY) short leftStickX, short leftStickY, short rightStickX, short rightStickY)

View File

@ -519,6 +519,10 @@ int LiSendMouseButtonEvent(char action, int button);
#define MODIFIER_META 0x08 #define MODIFIER_META 0x08
int LiSendKeyboardEvent(short keyCode, char keyAction, char modifiers); 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 // Button flags
#define A_FLAG 0x1000 #define A_FLAG 0x1000
#define B_FLAG 0x2000 #define B_FLAG 0x2000