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;
} 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 {

View File

@ -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)

View File

@ -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