8984c1a7c4
The video screen size on the client may differ from the real device screen size (e.g. the video stream may be scaled down). As a consequence, mouse events must be scaled to match the real device coordinates. For this purpose, make the client send the video screen size along with the absolute pointer location, and the server scale the location to match the real device size before injecting mouse events.
120 lines
3.4 KiB
C
120 lines
3.4 KiB
C
#include <assert.h>
|
|
|
|
#include "controlevent.h"
|
|
|
|
static void test_serialize_keycode_event() {
|
|
struct control_event event = {
|
|
.type = CONTROL_EVENT_TYPE_KEYCODE,
|
|
.keycode_event = {
|
|
.action = AKEY_EVENT_ACTION_UP,
|
|
.keycode = AKEYCODE_ENTER,
|
|
.metastate = AMETA_SHIFT_ON | AMETA_SHIFT_LEFT_ON,
|
|
},
|
|
};
|
|
|
|
unsigned char buf[SERIALIZED_EVENT_MAX_SIZE];
|
|
int size = control_event_serialize(&event, buf);
|
|
assert(size == 10);
|
|
|
|
const unsigned char expected[] = {
|
|
0x00, // CONTROL_EVENT_TYPE_KEYCODE
|
|
0x01, // AKEY_EVENT_ACTION_UP
|
|
0x00, 0x00, 0x00, 0x42, // AKEYCODE_ENTER
|
|
0x00, 0x00, 0x00, 0x41, // AMETA_SHIFT_ON | AMETA_SHIFT_LEFT_ON
|
|
};
|
|
assert(!memcmp(buf, expected, sizeof(expected)));
|
|
}
|
|
|
|
static void test_serialize_text_event() {
|
|
struct control_event event = {
|
|
.type = CONTROL_EVENT_TYPE_TEXT,
|
|
.text_event = {
|
|
.text = "hello, world!",
|
|
},
|
|
};
|
|
|
|
unsigned char buf[SERIALIZED_EVENT_MAX_SIZE];
|
|
int size = control_event_serialize(&event, buf);
|
|
assert(size == 15);
|
|
|
|
const unsigned char expected[] = {
|
|
0x01, // CONTROL_EVENT_TYPE_KEYCODE
|
|
0x0d, // text length
|
|
'h', 'e', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd', '!', // text
|
|
};
|
|
assert(!memcmp(buf, expected, sizeof(expected)));
|
|
}
|
|
|
|
static void test_serialize_mouse_event() {
|
|
struct control_event event = {
|
|
.type = CONTROL_EVENT_TYPE_MOUSE,
|
|
.mouse_event = {
|
|
.action = AMOTION_EVENT_ACTION_DOWN,
|
|
.buttons = AMOTION_EVENT_BUTTON_PRIMARY,
|
|
.point = {
|
|
.position = {
|
|
.x = 260,
|
|
.y = 1026,
|
|
},
|
|
.screen_size = {
|
|
.width = 1080,
|
|
.height = 1920,
|
|
},
|
|
},
|
|
},
|
|
};
|
|
|
|
unsigned char buf[SERIALIZED_EVENT_MAX_SIZE];
|
|
int size = control_event_serialize(&event, buf);
|
|
assert(size == 14);
|
|
|
|
const unsigned char expected[] = {
|
|
0x02, // CONTROL_EVENT_TYPE_MOUSE
|
|
0x00, // AKEY_EVENT_ACTION_DOWN
|
|
0x00, 0x00, 0x00, 0x01, // AMOTION_EVENT_BUTTON_PRIMARY
|
|
0x01, 0x04, 0x04, 0x02, // 260 1026
|
|
0x04, 0x38, 0x07, 0x80, // 1080 1920
|
|
};
|
|
assert(!memcmp(buf, expected, sizeof(expected)));
|
|
}
|
|
|
|
static void test_serialize_scroll_event() {
|
|
struct control_event event = {
|
|
.type = CONTROL_EVENT_TYPE_SCROLL,
|
|
.scroll_event = {
|
|
.point = {
|
|
.position = {
|
|
.x = 260,
|
|
.y = 1026,
|
|
},
|
|
.screen_size = {
|
|
.width = 1080,
|
|
.height = 1920,
|
|
},
|
|
},
|
|
.hscroll = 1,
|
|
.vscroll = -1,
|
|
},
|
|
};
|
|
|
|
unsigned char buf[SERIALIZED_EVENT_MAX_SIZE];
|
|
int size = control_event_serialize(&event, buf);
|
|
assert(size == 17);
|
|
|
|
const unsigned char expected[] = {
|
|
0x03, // CONTROL_EVENT_TYPE_SCROLL
|
|
0x01, 0x04, 0x04, 0x02, // 260 1026
|
|
0x04, 0x38, 0x07, 0x80, // 1080 1920
|
|
0x00, 0x00, 0x00, 0x01, // 1
|
|
0xFF, 0xFF, 0xFF, 0xFF, // -1
|
|
};
|
|
assert(!memcmp(buf, expected, sizeof(expected)));
|
|
}
|
|
|
|
int main() {
|
|
test_serialize_keycode_event();
|
|
test_serialize_text_event();
|
|
test_serialize_mouse_event();
|
|
test_serialize_scroll_event();
|
|
return 0;
|
|
}
|