-
-
Notifications
You must be signed in to change notification settings - Fork 11k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
After the recent refactorings, a "control event" is not necessarily an "event" (it may be a "command"). Similarly, the unique "device event" used to send the device clipboard content is more a "reponse" to the request from the client than an "event". Rename both to "message", and rename the message types to better describe their intent.
- Loading branch information
Showing
28 changed files
with
777 additions
and
778 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file was deleted.
Oops, something went wrong.
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,83 @@ | ||
#include "control_msg.h" | ||
|
||
#include <string.h> | ||
|
||
#include "buffer_util.h" | ||
#include "log.h" | ||
#include "str_util.h" | ||
|
||
static void | ||
write_position(uint8_t *buf, const struct position *position) { | ||
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); | ||
} | ||
|
||
// write length (2 bytes) + string (non nul-terminated) | ||
static size_t | ||
write_string(const char *utf8, size_t max_len, unsigned char *buf) { | ||
size_t len = utf8_truncation_index(utf8, max_len); | ||
buffer_write16be(buf, (uint16_t) len); | ||
memcpy(&buf[2], utf8, len); | ||
return 2 + len; | ||
} | ||
|
||
size_t | ||
control_msg_serialize(const struct control_msg *msg, unsigned char *buf) { | ||
buf[0] = msg->type; | ||
switch (msg->type) { | ||
case CONTROL_MSG_TYPE_INJECT_KEYCODE: | ||
buf[1] = msg->inject_keycode.action; | ||
buffer_write32be(&buf[2], msg->inject_keycode.keycode); | ||
buffer_write32be(&buf[6], msg->inject_keycode.metastate); | ||
return 10; | ||
case CONTROL_MSG_TYPE_INJECT_TEXT: { | ||
size_t len = write_string(msg->inject_text.text, | ||
CONTROL_MSG_TEXT_MAX_LENGTH, &buf[1]); | ||
return 1 + len; | ||
} | ||
case CONTROL_MSG_TYPE_INJECT_MOUSE_EVENT: | ||
buf[1] = msg->inject_mouse_event.action; | ||
buffer_write32be(&buf[2], msg->inject_mouse_event.buttons); | ||
write_position(&buf[6], &msg->inject_mouse_event.position); | ||
return 18; | ||
case CONTROL_MSG_TYPE_INJECT_SCROLL_EVENT: | ||
write_position(&buf[1], &msg->inject_scroll_event.position); | ||
buffer_write32be(&buf[13], | ||
(uint32_t) msg->inject_scroll_event.hscroll); | ||
buffer_write32be(&buf[17], | ||
(uint32_t) msg->inject_scroll_event.vscroll); | ||
return 21; | ||
case CONTROL_MSG_TYPE_SET_CLIPBOARD: { | ||
size_t len = write_string(msg->inject_text.text, | ||
CONTROL_MSG_CLIPBOARD_TEXT_MAX_LENGTH, | ||
&buf[1]); | ||
return 1 + len; | ||
} | ||
case CONTROL_MSG_TYPE_BACK_OR_SCREEN_ON: | ||
case CONTROL_MSG_TYPE_EXPAND_NOTIFICATION_PANEL: | ||
case CONTROL_MSG_TYPE_COLLAPSE_NOTIFICATION_PANEL: | ||
case CONTROL_MSG_TYPE_GET_CLIPBOARD: | ||
// no additional data | ||
return 1; | ||
default: | ||
LOGW("Unknown message type: %u", (unsigned) msg->type); | ||
return 0; | ||
} | ||
} | ||
|
||
void | ||
control_msg_destroy(struct control_msg *msg) { | ||
switch (msg->type) { | ||
case CONTROL_MSG_TYPE_INJECT_TEXT: | ||
SDL_free(msg->inject_text.text); | ||
break; | ||
case CONTROL_MSG_TYPE_SET_CLIPBOARD: | ||
SDL_free(msg->set_clipboard.text); | ||
break; | ||
default: | ||
// do nothing | ||
break; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,64 @@ | ||
#ifndef CONTROLMSG_H | ||
#define CONTROLMSG_H | ||
|
||
#include <stdbool.h> | ||
#include <stddef.h> | ||
#include <stdint.h> | ||
|
||
#include "android/input.h" | ||
#include "android/keycodes.h" | ||
#include "common.h" | ||
|
||
#define CONTROL_MSG_TEXT_MAX_LENGTH 300 | ||
#define CONTROL_MSG_CLIPBOARD_TEXT_MAX_LENGTH 4093 | ||
#define CONTROL_MSG_SERIALIZED_MAX_SIZE \ | ||
(3 + CONTROL_MSG_CLIPBOARD_TEXT_MAX_LENGTH) | ||
|
||
enum control_msg_type { | ||
CONTROL_MSG_TYPE_INJECT_KEYCODE, | ||
CONTROL_MSG_TYPE_INJECT_TEXT, | ||
CONTROL_MSG_TYPE_INJECT_MOUSE_EVENT, | ||
CONTROL_MSG_TYPE_INJECT_SCROLL_EVENT, | ||
CONTROL_MSG_TYPE_BACK_OR_SCREEN_ON, | ||
CONTROL_MSG_TYPE_EXPAND_NOTIFICATION_PANEL, | ||
CONTROL_MSG_TYPE_COLLAPSE_NOTIFICATION_PANEL, | ||
CONTROL_MSG_TYPE_GET_CLIPBOARD, | ||
CONTROL_MSG_TYPE_SET_CLIPBOARD, | ||
}; | ||
|
||
struct control_msg { | ||
enum control_msg_type type; | ||
union { | ||
struct { | ||
enum android_keyevent_action action; | ||
enum android_keycode keycode; | ||
enum android_metastate metastate; | ||
} inject_keycode; | ||
struct { | ||
char *text; // owned, to be freed by SDL_free() | ||
} inject_text; | ||
struct { | ||
enum android_motionevent_action action; | ||
enum android_motionevent_buttons buttons; | ||
struct position position; | ||
} inject_mouse_event; | ||
struct { | ||
struct position position; | ||
int32_t hscroll; | ||
int32_t vscroll; | ||
} inject_scroll_event; | ||
struct { | ||
char *text; // owned, to be freed by SDL_free() | ||
} set_clipboard; | ||
}; | ||
}; | ||
|
||
// buf size must be at least CONTROL_MSG_SERIALIZED_MAX_SIZE | ||
// return the number of bytes written | ||
size_t | ||
control_msg_serialize(const struct control_msg *msg, unsigned char *buf); | ||
|
||
void | ||
control_msg_destroy(struct control_msg *msg); | ||
|
||
#endif |
Oops, something went wrong.