2018-08-15 23:01:54 +08:00
|
|
|
#include "control_event.h"
|
2017-12-14 18:38:44 +08:00
|
|
|
|
2018-05-13 21:33:13 +08:00
|
|
|
#include <string.h>
|
2017-12-14 18:38:44 +08:00
|
|
|
|
2018-11-11 07:48:25 +08:00
|
|
|
#include "buffer_util.h"
|
2018-02-13 17:10:18 +08:00
|
|
|
#include "log.h"
|
2017-12-14 18:38:44 +08:00
|
|
|
|
2019-03-03 03:09:56 +08:00
|
|
|
static void
|
2019-03-03 06:52:22 +08:00
|
|
|
write_position(uint8_t *buf, const struct position *position) {
|
2018-11-27 15:54:31 +08:00
|
|
|
buffer_write32be(&buf[0], position->point.x);
|
|
|
|
buffer_write32be(&buf[4], position->point.y);
|
|
|
|
buffer_write16be(&buf[8], position->screen_size.width);
|
|
|
|
buffer_write16be(&buf[10], position->screen_size.height);
|
2018-01-22 23:50:08 +08:00
|
|
|
}
|
|
|
|
|
2019-05-29 23:26:21 +08:00
|
|
|
size_t
|
2019-03-03 03:09:56 +08:00
|
|
|
control_event_serialize(const struct control_event *event, unsigned char *buf) {
|
2017-12-14 18:38:44 +08:00
|
|
|
buf[0] = event->type;
|
|
|
|
switch (event->type) {
|
2018-02-01 18:34:49 +08:00
|
|
|
case CONTROL_EVENT_TYPE_KEYCODE:
|
|
|
|
buf[1] = event->keycode_event.action;
|
2018-11-11 07:48:25 +08:00
|
|
|
buffer_write32be(&buf[2], event->keycode_event.keycode);
|
|
|
|
buffer_write32be(&buf[6], event->keycode_event.metastate);
|
2018-02-01 18:34:49 +08:00
|
|
|
return 10;
|
|
|
|
case CONTROL_EVENT_TYPE_TEXT: {
|
2019-01-22 16:38:51 +08:00
|
|
|
// write length (2 bytes) + string (non nul-terminated)
|
2018-02-01 18:34:49 +08:00
|
|
|
size_t len = strlen(event->text_event.text);
|
2019-05-29 14:35:28 +08:00
|
|
|
if (len > CONTROL_EVENT_TEXT_MAX_LENGTH) {
|
2018-03-07 22:29:33 +08:00
|
|
|
// injecting a text takes time, so limit the text length
|
2019-05-29 14:35:28 +08:00
|
|
|
len = CONTROL_EVENT_TEXT_MAX_LENGTH;
|
2018-02-01 18:34:49 +08:00
|
|
|
}
|
2019-03-03 06:52:22 +08:00
|
|
|
buffer_write16be(&buf[1], (uint16_t) len);
|
2018-03-10 04:47:14 +08:00
|
|
|
memcpy(&buf[3], event->text_event.text, len);
|
|
|
|
return 3 + len;
|
2017-12-14 18:38:44 +08:00
|
|
|
}
|
2018-02-01 18:34:49 +08:00
|
|
|
case CONTROL_EVENT_TYPE_MOUSE:
|
|
|
|
buf[1] = event->mouse_event.action;
|
2018-11-11 07:48:25 +08:00
|
|
|
buffer_write32be(&buf[2], event->mouse_event.buttons);
|
2018-02-01 18:34:49 +08:00
|
|
|
write_position(&buf[6], &event->mouse_event.position);
|
2018-11-27 15:54:31 +08:00
|
|
|
return 18;
|
2018-02-01 18:34:49 +08:00
|
|
|
case CONTROL_EVENT_TYPE_SCROLL:
|
|
|
|
write_position(&buf[1], &event->scroll_event.position);
|
2019-03-03 06:52:22 +08:00
|
|
|
buffer_write32be(&buf[13], (uint32_t) event->scroll_event.hscroll);
|
|
|
|
buffer_write32be(&buf[17], (uint32_t) event->scroll_event.vscroll);
|
2018-11-27 15:54:31 +08:00
|
|
|
return 21;
|
2018-02-02 21:52:23 +08:00
|
|
|
case CONTROL_EVENT_TYPE_COMMAND:
|
|
|
|
buf[1] = event->command_event.action;
|
|
|
|
return 2;
|
2018-02-01 18:34:49 +08:00
|
|
|
default:
|
2018-02-13 17:10:18 +08:00
|
|
|
LOGW("Unknown event type: %u", (unsigned) event->type);
|
2018-02-01 18:34:49 +08:00
|
|
|
return 0;
|
2017-12-14 18:38:44 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-03-03 03:09:56 +08:00
|
|
|
void
|
|
|
|
control_event_destroy(struct control_event *event) {
|
2018-03-07 22:29:33 +08:00
|
|
|
if (event->type == CONTROL_EVENT_TYPE_TEXT) {
|
|
|
|
SDL_free(event->text_event.text);
|
|
|
|
}
|
|
|
|
}
|