2019-05-31 14:55:11 +02:00
|
|
|
#include "control_msg.h"
|
|
|
|
|
|
2019-11-27 21:11:40 +01:00
|
|
|
#include <assert.h>
|
2021-06-08 19:14:20 +03:00
|
|
|
#include <inttypes.h>
|
2021-01-24 15:14:53 +01:00
|
|
|
#include <stdlib.h>
|
2019-05-31 14:55:11 +02:00
|
|
|
#include <string.h>
|
|
|
|
|
|
2022-08-03 15:13:16 +02:00
|
|
|
#include "util/binary.h"
|
2019-11-24 11:53:00 +01:00
|
|
|
#include "util/log.h"
|
2021-11-12 23:12:51 +01:00
|
|
|
#include "util/str.h"
|
2019-05-31 14:55:11 +02:00
|
|
|
|
2021-06-08 19:14:20 +03:00
|
|
|
/**
|
|
|
|
|
* Map an enum value to a string based on an array, without crashing on an
|
|
|
|
|
* out-of-bounds index.
|
|
|
|
|
*/
|
|
|
|
|
#define ENUM_TO_LABEL(labels, value) \
|
|
|
|
|
((size_t) (value) < ARRAY_LEN(labels) ? labels[value] : "???")
|
|
|
|
|
|
|
|
|
|
#define KEYEVENT_ACTION_LABEL(value) \
|
|
|
|
|
ENUM_TO_LABEL(android_keyevent_action_labels, value)
|
|
|
|
|
|
|
|
|
|
#define MOTIONEVENT_ACTION_LABEL(value) \
|
|
|
|
|
ENUM_TO_LABEL(android_motionevent_action_labels, value)
|
|
|
|
|
|
|
|
|
|
static const char *const android_keyevent_action_labels[] = {
|
|
|
|
|
"down",
|
|
|
|
|
"up",
|
|
|
|
|
"multi",
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
static const char *const android_motionevent_action_labels[] = {
|
|
|
|
|
"down",
|
|
|
|
|
"up",
|
|
|
|
|
"move",
|
|
|
|
|
"cancel",
|
|
|
|
|
"outside",
|
2022-09-27 14:12:27 +02:00
|
|
|
"pointer-down",
|
2021-06-08 19:14:20 +03:00
|
|
|
"pointer-up",
|
|
|
|
|
"hover-move",
|
|
|
|
|
"scroll",
|
2021-12-04 09:25:36 +01:00
|
|
|
"hover-enter",
|
2021-06-08 19:14:20 +03:00
|
|
|
"hover-exit",
|
|
|
|
|
"btn-press",
|
|
|
|
|
"btn-release",
|
|
|
|
|
};
|
|
|
|
|
|
2021-11-29 09:30:57 +01:00
|
|
|
static const char *const copy_key_labels[] = {
|
|
|
|
|
"none",
|
|
|
|
|
"copy",
|
|
|
|
|
"cut",
|
|
|
|
|
};
|
|
|
|
|
|
2022-11-08 17:15:08 +01:00
|
|
|
static inline const char *
|
|
|
|
|
get_well_known_pointer_id_name(uint64_t pointer_id) {
|
|
|
|
|
switch (pointer_id) {
|
2024-07-08 16:29:47 +02:00
|
|
|
case SC_POINTER_ID_MOUSE:
|
2022-11-08 17:15:08 +01:00
|
|
|
return "mouse";
|
2024-07-08 16:29:47 +02:00
|
|
|
case SC_POINTER_ID_GENERIC_FINGER:
|
2022-11-08 17:15:08 +01:00
|
|
|
return "finger";
|
2024-07-08 16:29:47 +02:00
|
|
|
case SC_POINTER_ID_VIRTUAL_FINGER:
|
2022-11-08 17:15:08 +01:00
|
|
|
return "vfinger";
|
|
|
|
|
default:
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2019-05-31 14:55:11 +02:00
|
|
|
static void
|
2021-10-30 15:20:39 +02:00
|
|
|
write_position(uint8_t *buf, const struct sc_position *position) {
|
2022-02-12 09:12:46 +01:00
|
|
|
sc_write32be(&buf[0], position->point.x);
|
|
|
|
|
sc_write32be(&buf[4], position->point.y);
|
|
|
|
|
sc_write16be(&buf[8], position->screen_size.width);
|
|
|
|
|
sc_write16be(&buf[10], position->screen_size.height);
|
2019-05-31 14:55:11 +02:00
|
|
|
}
|
|
|
|
|
|
2024-09-08 19:57:14 +02:00
|
|
|
// Write truncated string, and return the size
|
2019-05-31 14:55:11 +02:00
|
|
|
static size_t
|
2024-09-08 19:57:14 +02:00
|
|
|
write_string_payload(uint8_t *payload, const char *utf8, size_t max_len) {
|
|
|
|
|
if (!utf8) {
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
2021-11-12 23:08:19 +01:00
|
|
|
size_t len = sc_str_utf8_truncation_index(utf8, max_len);
|
2024-09-08 19:57:14 +02:00
|
|
|
memcpy(payload, utf8, len);
|
|
|
|
|
return len;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Write length (4 bytes) + string (non null-terminated)
|
|
|
|
|
static size_t
|
|
|
|
|
write_string(uint8_t *buf, const char *utf8, size_t max_len) {
|
|
|
|
|
size_t len = write_string_payload(buf + 4, utf8, max_len);
|
2022-02-12 09:12:46 +01:00
|
|
|
sc_write32be(buf, len);
|
2020-06-04 21:42:09 +02:00
|
|
|
return 4 + len;
|
2019-05-31 14:55:11 +02:00
|
|
|
}
|
|
|
|
|
|
2024-09-08 19:57:14 +02:00
|
|
|
// Write length (1 byte) + string (non null-terminated)
|
|
|
|
|
static size_t
|
|
|
|
|
write_string_tiny(uint8_t *buf, const char *utf8, size_t max_len) {
|
|
|
|
|
assert(max_len <= 0xFF);
|
|
|
|
|
size_t len = write_string_payload(buf + 1, utf8, max_len);
|
|
|
|
|
buf[0] = len;
|
|
|
|
|
return 1 + len;
|
|
|
|
|
}
|
|
|
|
|
|
2019-05-31 14:55:11 +02:00
|
|
|
size_t
|
2024-02-23 19:59:54 +01:00
|
|
|
sc_control_msg_serialize(const struct sc_control_msg *msg, uint8_t *buf) {
|
2019-05-31 14:55:11 +02:00
|
|
|
buf[0] = msg->type;
|
|
|
|
|
switch (msg->type) {
|
2022-01-26 21:31:30 +01:00
|
|
|
case SC_CONTROL_MSG_TYPE_INJECT_KEYCODE:
|
2019-05-31 14:55:11 +02:00
|
|
|
buf[1] = msg->inject_keycode.action;
|
2022-02-12 09:12:46 +01:00
|
|
|
sc_write32be(&buf[2], msg->inject_keycode.keycode);
|
|
|
|
|
sc_write32be(&buf[6], msg->inject_keycode.repeat);
|
|
|
|
|
sc_write32be(&buf[10], msg->inject_keycode.metastate);
|
2020-06-11 04:40:52 -04:00
|
|
|
return 14;
|
2022-01-26 21:31:30 +01:00
|
|
|
case SC_CONTROL_MSG_TYPE_INJECT_TEXT: {
|
2024-09-08 20:01:28 +02:00
|
|
|
size_t len = write_string(&buf[1], msg->inject_text.text,
|
|
|
|
|
SC_CONTROL_MSG_INJECT_TEXT_MAX_LENGTH);
|
2019-05-31 14:55:11 +02:00
|
|
|
return 1 + len;
|
|
|
|
|
}
|
2022-01-26 21:31:30 +01:00
|
|
|
case SC_CONTROL_MSG_TYPE_INJECT_TOUCH_EVENT:
|
2019-09-15 16:16:17 +02:00
|
|
|
buf[1] = msg->inject_touch_event.action;
|
2022-02-12 09:12:46 +01:00
|
|
|
sc_write64be(&buf[2], msg->inject_touch_event.pointer_id);
|
2019-09-15 16:16:17 +02:00
|
|
|
write_position(&buf[10], &msg->inject_touch_event.position);
|
|
|
|
|
uint16_t pressure =
|
2022-08-03 15:17:44 +02:00
|
|
|
sc_float_to_u16fp(msg->inject_touch_event.pressure);
|
2022-02-12 09:12:46 +01:00
|
|
|
sc_write16be(&buf[22], pressure);
|
2023-01-29 22:14:05 +01:00
|
|
|
sc_write32be(&buf[24], msg->inject_touch_event.action_button);
|
|
|
|
|
sc_write32be(&buf[28], msg->inject_touch_event.buttons);
|
|
|
|
|
return 32;
|
2022-01-26 21:31:30 +01:00
|
|
|
case SC_CONTROL_MSG_TYPE_INJECT_SCROLL_EVENT:
|
2019-05-31 14:55:11 +02:00
|
|
|
write_position(&buf[1], &msg->inject_scroll_event.position);
|
2025-06-20 09:06:10 +02:00
|
|
|
// Accept values in the range [-16, 16].
|
|
|
|
|
// Normalize to [-1, 1] in order to use sc_float_to_i16fp().
|
|
|
|
|
float hscroll_norm = msg->inject_scroll_event.hscroll / 16;
|
|
|
|
|
hscroll_norm = CLAMP(hscroll_norm, -1, 1);
|
|
|
|
|
float vscroll_norm = msg->inject_scroll_event.vscroll / 16;
|
|
|
|
|
vscroll_norm = CLAMP(vscroll_norm, -1, 1);
|
|
|
|
|
int16_t hscroll = sc_float_to_i16fp(hscroll_norm);
|
|
|
|
|
int16_t vscroll = sc_float_to_i16fp(vscroll_norm);
|
2022-07-03 07:02:17 +00:00
|
|
|
sc_write16be(&buf[13], (uint16_t) hscroll);
|
|
|
|
|
sc_write16be(&buf[15], (uint16_t) vscroll);
|
|
|
|
|
sc_write32be(&buf[17], msg->inject_scroll_event.buttons);
|
|
|
|
|
return 21;
|
2022-01-26 21:31:30 +01:00
|
|
|
case SC_CONTROL_MSG_TYPE_BACK_OR_SCREEN_ON:
|
2021-04-16 18:37:50 +02:00
|
|
|
buf[1] = msg->inject_keycode.action;
|
|
|
|
|
return 2;
|
2022-01-26 21:31:30 +01:00
|
|
|
case SC_CONTROL_MSG_TYPE_GET_CLIPBOARD:
|
2021-11-29 09:30:57 +01:00
|
|
|
buf[1] = msg->get_clipboard.copy_key;
|
|
|
|
|
return 2;
|
2022-01-26 21:31:30 +01:00
|
|
|
case SC_CONTROL_MSG_TYPE_SET_CLIPBOARD:
|
2022-02-12 09:12:46 +01:00
|
|
|
sc_write64be(&buf[1], msg->set_clipboard.sequence);
|
2021-11-20 11:50:33 +01:00
|
|
|
buf[9] = !!msg->set_clipboard.paste;
|
2024-09-08 20:01:28 +02:00
|
|
|
size_t len = write_string(&buf[10], msg->set_clipboard.text,
|
|
|
|
|
SC_CONTROL_MSG_CLIPBOARD_TEXT_MAX_LENGTH);
|
2021-11-20 11:50:33 +01:00
|
|
|
return 10 + len;
|
2024-10-28 23:56:17 +01:00
|
|
|
case SC_CONTROL_MSG_TYPE_SET_DISPLAY_POWER:
|
|
|
|
|
buf[1] = msg->set_display_power.on;
|
2019-03-15 20:23:30 +01:00
|
|
|
return 2;
|
2023-11-28 17:17:35 +08:00
|
|
|
case SC_CONTROL_MSG_TYPE_UHID_CREATE:
|
|
|
|
|
sc_write16be(&buf[1], msg->uhid_create.id);
|
2024-12-07 12:43:49 +01:00
|
|
|
sc_write16be(&buf[3], msg->uhid_create.vendor_id);
|
|
|
|
|
sc_write16be(&buf[5], msg->uhid_create.product_id);
|
2024-09-08 19:57:14 +02:00
|
|
|
|
2024-12-07 12:43:49 +01:00
|
|
|
size_t index = 7;
|
2024-09-08 19:57:14 +02:00
|
|
|
index += write_string_tiny(&buf[index], msg->uhid_create.name, 127);
|
|
|
|
|
|
|
|
|
|
sc_write16be(&buf[index], msg->uhid_create.report_desc_size);
|
|
|
|
|
index += 2;
|
|
|
|
|
|
|
|
|
|
memcpy(&buf[index], msg->uhid_create.report_desc,
|
|
|
|
|
msg->uhid_create.report_desc_size);
|
|
|
|
|
index += msg->uhid_create.report_desc_size;
|
|
|
|
|
|
|
|
|
|
return index;
|
2023-11-28 17:17:35 +08:00
|
|
|
case SC_CONTROL_MSG_TYPE_UHID_INPUT:
|
|
|
|
|
sc_write16be(&buf[1], msg->uhid_input.id);
|
|
|
|
|
sc_write16be(&buf[3], msg->uhid_input.size);
|
|
|
|
|
memcpy(&buf[5], msg->uhid_input.data, msg->uhid_input.size);
|
|
|
|
|
return 5 + msg->uhid_input.size;
|
2024-09-06 23:08:08 +02:00
|
|
|
case SC_CONTROL_MSG_TYPE_UHID_DESTROY:
|
|
|
|
|
sc_write16be(&buf[1], msg->uhid_destroy.id);
|
|
|
|
|
return 3;
|
2024-10-19 18:19:10 +02:00
|
|
|
case SC_CONTROL_MSG_TYPE_START_APP: {
|
|
|
|
|
size_t len = write_string_tiny(&buf[1], msg->start_app.name, 255);
|
|
|
|
|
return 1 + len;
|
|
|
|
|
}
|
2022-01-26 21:31:30 +01:00
|
|
|
case SC_CONTROL_MSG_TYPE_EXPAND_NOTIFICATION_PANEL:
|
|
|
|
|
case SC_CONTROL_MSG_TYPE_EXPAND_SETTINGS_PANEL:
|
|
|
|
|
case SC_CONTROL_MSG_TYPE_COLLAPSE_PANELS:
|
|
|
|
|
case SC_CONTROL_MSG_TYPE_ROTATE_DEVICE:
|
2024-02-24 22:30:30 +01:00
|
|
|
case SC_CONTROL_MSG_TYPE_OPEN_HARD_KEYBOARD_SETTINGS:
|
2024-10-31 22:47:35 +01:00
|
|
|
case SC_CONTROL_MSG_TYPE_RESET_VIDEO:
|
2019-05-31 14:55:11 +02:00
|
|
|
// no additional data
|
|
|
|
|
return 1;
|
|
|
|
|
default:
|
|
|
|
|
LOGW("Unknown message type: %u", (unsigned) msg->type);
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2021-06-08 19:14:20 +03:00
|
|
|
void
|
2022-01-14 22:17:30 +01:00
|
|
|
sc_control_msg_log(const struct sc_control_msg *msg) {
|
2021-06-08 19:14:20 +03:00
|
|
|
#define LOG_CMSG(fmt, ...) LOGV("input: " fmt, ## __VA_ARGS__)
|
|
|
|
|
switch (msg->type) {
|
2022-01-26 21:31:30 +01:00
|
|
|
case SC_CONTROL_MSG_TYPE_INJECT_KEYCODE:
|
2021-06-08 19:14:20 +03:00
|
|
|
LOG_CMSG("key %-4s code=%d repeat=%" PRIu32 " meta=%06lx",
|
|
|
|
|
KEYEVENT_ACTION_LABEL(msg->inject_keycode.action),
|
|
|
|
|
(int) msg->inject_keycode.keycode,
|
|
|
|
|
msg->inject_keycode.repeat,
|
|
|
|
|
(long) msg->inject_keycode.metastate);
|
|
|
|
|
break;
|
2022-01-26 21:31:30 +01:00
|
|
|
case SC_CONTROL_MSG_TYPE_INJECT_TEXT:
|
2021-06-08 19:14:20 +03:00
|
|
|
LOG_CMSG("text \"%s\"", msg->inject_text.text);
|
|
|
|
|
break;
|
2022-01-26 21:31:30 +01:00
|
|
|
case SC_CONTROL_MSG_TYPE_INJECT_TOUCH_EVENT: {
|
2021-06-08 19:14:20 +03:00
|
|
|
int action = msg->inject_touch_event.action
|
|
|
|
|
& AMOTION_EVENT_ACTION_MASK;
|
|
|
|
|
uint64_t id = msg->inject_touch_event.pointer_id;
|
2022-11-08 17:15:08 +01:00
|
|
|
const char *pointer_name = get_well_known_pointer_id_name(id);
|
|
|
|
|
if (pointer_name) {
|
2021-06-08 19:14:20 +03:00
|
|
|
// string pointer id
|
|
|
|
|
LOG_CMSG("touch [id=%s] %-4s position=%" PRIi32 ",%" PRIi32
|
2023-01-29 22:14:05 +01:00
|
|
|
" pressure=%f action_button=%06lx buttons=%06lx",
|
2022-11-08 17:15:08 +01:00
|
|
|
pointer_name,
|
2021-06-08 19:14:20 +03:00
|
|
|
MOTIONEVENT_ACTION_LABEL(action),
|
|
|
|
|
msg->inject_touch_event.position.point.x,
|
|
|
|
|
msg->inject_touch_event.position.point.y,
|
|
|
|
|
msg->inject_touch_event.pressure,
|
2023-01-29 22:14:05 +01:00
|
|
|
(long) msg->inject_touch_event.action_button,
|
2021-06-08 19:14:20 +03:00
|
|
|
(long) msg->inject_touch_event.buttons);
|
|
|
|
|
} else {
|
|
|
|
|
// numeric pointer id
|
2021-06-20 01:30:06 +02:00
|
|
|
LOG_CMSG("touch [id=%" PRIu64_ "] %-4s position=%" PRIi32 ",%"
|
2023-01-29 22:14:05 +01:00
|
|
|
PRIi32 " pressure=%f action_button=%06lx"
|
|
|
|
|
" buttons=%06lx",
|
2021-06-08 19:14:20 +03:00
|
|
|
id,
|
|
|
|
|
MOTIONEVENT_ACTION_LABEL(action),
|
|
|
|
|
msg->inject_touch_event.position.point.x,
|
|
|
|
|
msg->inject_touch_event.position.point.y,
|
|
|
|
|
msg->inject_touch_event.pressure,
|
2023-01-29 22:14:05 +01:00
|
|
|
(long) msg->inject_touch_event.action_button,
|
2021-06-08 19:14:20 +03:00
|
|
|
(long) msg->inject_touch_event.buttons);
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
2022-01-26 21:31:30 +01:00
|
|
|
case SC_CONTROL_MSG_TYPE_INJECT_SCROLL_EVENT:
|
2022-07-03 07:02:17 +00:00
|
|
|
LOG_CMSG("scroll position=%" PRIi32 ",%" PRIi32 " hscroll=%f"
|
|
|
|
|
" vscroll=%f buttons=%06lx",
|
2021-06-08 19:14:20 +03:00
|
|
|
msg->inject_scroll_event.position.point.x,
|
|
|
|
|
msg->inject_scroll_event.position.point.y,
|
|
|
|
|
msg->inject_scroll_event.hscroll,
|
2021-12-31 10:38:05 +01:00
|
|
|
msg->inject_scroll_event.vscroll,
|
|
|
|
|
(long) msg->inject_scroll_event.buttons);
|
2021-06-08 19:14:20 +03:00
|
|
|
break;
|
2022-01-26 21:31:30 +01:00
|
|
|
case SC_CONTROL_MSG_TYPE_BACK_OR_SCREEN_ON:
|
2021-06-08 19:14:20 +03:00
|
|
|
LOG_CMSG("back-or-screen-on %s",
|
|
|
|
|
KEYEVENT_ACTION_LABEL(msg->inject_keycode.action));
|
|
|
|
|
break;
|
2022-01-26 21:31:30 +01:00
|
|
|
case SC_CONTROL_MSG_TYPE_GET_CLIPBOARD:
|
2021-11-29 09:30:57 +01:00
|
|
|
LOG_CMSG("get clipboard copy_key=%s",
|
|
|
|
|
copy_key_labels[msg->get_clipboard.copy_key]);
|
|
|
|
|
break;
|
2022-01-26 21:31:30 +01:00
|
|
|
case SC_CONTROL_MSG_TYPE_SET_CLIPBOARD:
|
2021-11-20 11:50:33 +01:00
|
|
|
LOG_CMSG("clipboard %" PRIu64_ " %s \"%s\"",
|
|
|
|
|
msg->set_clipboard.sequence,
|
2021-11-29 09:05:53 +01:00
|
|
|
msg->set_clipboard.paste ? "paste" : "nopaste",
|
2021-06-08 19:14:20 +03:00
|
|
|
msg->set_clipboard.text);
|
|
|
|
|
break;
|
2024-10-28 23:56:17 +01:00
|
|
|
case SC_CONTROL_MSG_TYPE_SET_DISPLAY_POWER:
|
|
|
|
|
LOG_CMSG("display power %s",
|
|
|
|
|
msg->set_display_power.on ? "on" : "off");
|
2021-06-08 19:14:20 +03:00
|
|
|
break;
|
2022-01-26 21:31:30 +01:00
|
|
|
case SC_CONTROL_MSG_TYPE_EXPAND_NOTIFICATION_PANEL:
|
2021-06-08 19:14:20 +03:00
|
|
|
LOG_CMSG("expand notification panel");
|
|
|
|
|
break;
|
2022-01-26 21:31:30 +01:00
|
|
|
case SC_CONTROL_MSG_TYPE_EXPAND_SETTINGS_PANEL:
|
2021-06-08 19:14:20 +03:00
|
|
|
LOG_CMSG("expand settings panel");
|
|
|
|
|
break;
|
2022-01-26 21:31:30 +01:00
|
|
|
case SC_CONTROL_MSG_TYPE_COLLAPSE_PANELS:
|
2021-06-08 19:14:20 +03:00
|
|
|
LOG_CMSG("collapse panels");
|
|
|
|
|
break;
|
2022-01-26 21:31:30 +01:00
|
|
|
case SC_CONTROL_MSG_TYPE_ROTATE_DEVICE:
|
2021-06-08 19:14:20 +03:00
|
|
|
LOG_CMSG("rotate device");
|
|
|
|
|
break;
|
2024-09-08 19:57:14 +02:00
|
|
|
case SC_CONTROL_MSG_TYPE_UHID_CREATE: {
|
|
|
|
|
// Quote only if name is not null
|
|
|
|
|
const char *name = msg->uhid_create.name;
|
|
|
|
|
const char *quote = name ? "\"" : "";
|
2024-12-07 12:43:49 +01:00
|
|
|
LOG_CMSG("UHID create [%" PRIu16 "] %04" PRIx16 ":%04" PRIx16
|
|
|
|
|
" name=%s%s%s report_desc_size=%" PRIu16,
|
|
|
|
|
msg->uhid_create.id,
|
|
|
|
|
msg->uhid_create.vendor_id,
|
|
|
|
|
msg->uhid_create.product_id,
|
|
|
|
|
quote, name, quote,
|
|
|
|
|
msg->uhid_create.report_desc_size);
|
2023-11-28 17:17:35 +08:00
|
|
|
break;
|
2024-09-08 19:57:14 +02:00
|
|
|
}
|
2023-11-28 17:17:35 +08:00
|
|
|
case SC_CONTROL_MSG_TYPE_UHID_INPUT: {
|
|
|
|
|
char *hex = sc_str_to_hex_string(msg->uhid_input.data,
|
|
|
|
|
msg->uhid_input.size);
|
|
|
|
|
if (hex) {
|
|
|
|
|
LOG_CMSG("UHID input [%" PRIu16 "] %s",
|
|
|
|
|
msg->uhid_input.id, hex);
|
|
|
|
|
free(hex);
|
|
|
|
|
} else {
|
|
|
|
|
LOG_CMSG("UHID input [%" PRIu16 "] size=%" PRIu16,
|
|
|
|
|
msg->uhid_input.id, msg->uhid_input.size);
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
2024-09-06 23:08:08 +02:00
|
|
|
case SC_CONTROL_MSG_TYPE_UHID_DESTROY:
|
|
|
|
|
LOG_CMSG("UHID destroy [%" PRIu16 "]", msg->uhid_destroy.id);
|
|
|
|
|
break;
|
2024-02-24 22:30:30 +01:00
|
|
|
case SC_CONTROL_MSG_TYPE_OPEN_HARD_KEYBOARD_SETTINGS:
|
|
|
|
|
LOG_CMSG("open hard keyboard settings");
|
|
|
|
|
break;
|
2024-10-19 18:19:10 +02:00
|
|
|
case SC_CONTROL_MSG_TYPE_START_APP:
|
|
|
|
|
LOG_CMSG("start app \"%s\"", msg->start_app.name);
|
|
|
|
|
break;
|
2024-10-31 22:47:35 +01:00
|
|
|
case SC_CONTROL_MSG_TYPE_RESET_VIDEO:
|
|
|
|
|
LOG_CMSG("reset video");
|
|
|
|
|
break;
|
2021-06-08 19:14:20 +03:00
|
|
|
default:
|
|
|
|
|
LOG_CMSG("unknown type: %u", (unsigned) msg->type);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-09-06 23:08:08 +02:00
|
|
|
bool
|
|
|
|
|
sc_control_msg_is_droppable(const struct sc_control_msg *msg) {
|
|
|
|
|
// Cannot drop UHID_CREATE messages, because it would cause all further
|
2024-09-06 23:08:08 +02:00
|
|
|
// UHID_INPUT messages for this device to be invalid.
|
|
|
|
|
// Cannot drop UHID_DESTROY messages either, because a further UHID_CREATE
|
|
|
|
|
// with the same id may fail.
|
|
|
|
|
return msg->type != SC_CONTROL_MSG_TYPE_UHID_CREATE
|
|
|
|
|
&& msg->type != SC_CONTROL_MSG_TYPE_UHID_DESTROY;
|
2024-09-06 23:08:08 +02:00
|
|
|
}
|
|
|
|
|
|
2019-05-31 14:55:11 +02:00
|
|
|
void
|
2022-01-14 22:17:30 +01:00
|
|
|
sc_control_msg_destroy(struct sc_control_msg *msg) {
|
2019-05-31 14:55:11 +02:00
|
|
|
switch (msg->type) {
|
2022-01-26 21:31:30 +01:00
|
|
|
case SC_CONTROL_MSG_TYPE_INJECT_TEXT:
|
2021-01-24 15:14:53 +01:00
|
|
|
free(msg->inject_text.text);
|
2019-05-31 14:55:11 +02:00
|
|
|
break;
|
2022-01-26 21:31:30 +01:00
|
|
|
case SC_CONTROL_MSG_TYPE_SET_CLIPBOARD:
|
2021-01-24 15:14:53 +01:00
|
|
|
free(msg->set_clipboard.text);
|
2019-05-31 14:55:11 +02:00
|
|
|
break;
|
2024-10-19 18:19:10 +02:00
|
|
|
case SC_CONTROL_MSG_TYPE_START_APP:
|
|
|
|
|
free(msg->start_app.name);
|
|
|
|
|
break;
|
2019-05-31 14:55:11 +02:00
|
|
|
default:
|
|
|
|
|
// do nothing
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|