add keyboard
This commit is contained in:
parent
a7ca90b135
commit
c27e5aabc6
|
|
@ -51,6 +51,8 @@ enum {
|
|||
RCONTROL_EVENT_TYPE_MOUSE_BTN_RELEASE = 3,
|
||||
RCONTROL_EVENT_TYPE_MOUSE_MOVE = 5,
|
||||
RCONTROL_EVENT_TYPE_MOUSE_WHEEL = 31,
|
||||
RCONTROL_EVENT_TYPE_KEY_PRESSED = 6,
|
||||
RCONTROL_EVENT_TYPE_KEY_RELEASED = 7,
|
||||
N_EVENT_TYPES,
|
||||
};
|
||||
|
||||
|
|
@ -103,7 +105,9 @@ static void rcontrol_emit(GstWestonImageSrc *westonimagesrc, int type, int code,
|
|||
static void rcontrol_handle_compound(GstWestonImageSrc *westonimagesrc, msgpack_object obj);
|
||||
static int rcontrol_get_event_type(GstWestonImageSrc *westonimagesrc, msgpack_object obj);
|
||||
static float rcontrol_get_mouse_pos(GstWestonImageSrc *westonimagesrc, msgpack_object obj, const char *key);
|
||||
static int rcontrol_get_mouse_wheel_pos(GstWestonImageSrc *westonimagesrc, msgpack_object obj, const char *key);
|
||||
static float rcontrol_get_mouse_btn(GstWestonImageSrc *westonimagesrc, msgpack_object obj);
|
||||
static int rcontrol_get_key(GstWestonImageSrc *westonimagesrc, msgpack_object obj);
|
||||
|
||||
static void rcontrol_emit(GstWestonImageSrc *westonimagesrc, int type, int code, int value) {
|
||||
struct input_event ev;
|
||||
|
|
@ -149,6 +153,19 @@ static float rcontrol_get_mouse_pos(GstWestonImageSrc *westonimagesrc, msgpack_o
|
|||
return -1.f;
|
||||
}
|
||||
|
||||
static int rcontrol_get_mouse_wheel_pos(GstWestonImageSrc *westonimagesrc, msgpack_object obj, const char *key) {
|
||||
for (uint32_t i = 0; i < obj.via.map.size; i++) {
|
||||
msgpack_object_kv kv = obj.via.map.ptr[i];
|
||||
if (kv.key.type == MSGPACK_OBJECT_STR) {
|
||||
if (!strncmp(kv.key.via.str.ptr, key, kv.key.via.str.size)) {
|
||||
return kv.val.via.i64;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static float rcontrol_get_mouse_btn(GstWestonImageSrc *westonimagesrc, msgpack_object obj) {
|
||||
for (uint32_t i = 0; i < obj.via.map.size; i++) {
|
||||
msgpack_object_kv kv = obj.via.map.ptr[i];
|
||||
|
|
@ -162,6 +179,19 @@ static float rcontrol_get_mouse_btn(GstWestonImageSrc *westonimagesrc, msgpack_o
|
|||
return RCONTROL_MOUSE_BTN_UNDEFINED;
|
||||
}
|
||||
|
||||
static int rcontrol_get_key(GstWestonImageSrc *westonimagesrc, msgpack_object obj) {
|
||||
for (uint32_t i = 0; i < obj.via.map.size; i++) {
|
||||
msgpack_object_kv kv = obj.via.map.ptr[i];
|
||||
if (kv.key.type == MSGPACK_OBJECT_STR) {
|
||||
if (!strncmp(kv.key.via.str.ptr, "k", kv.key.via.str.size)) {
|
||||
return kv.val.via.u64;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void rcontrol_handle_compound(GstWestonImageSrc *westonimagesrc, msgpack_object obj) {
|
||||
switch (obj.type) {
|
||||
case MSGPACK_OBJECT_MAP: {
|
||||
|
|
@ -172,9 +202,10 @@ static void rcontrol_handle_compound(GstWestonImageSrc *westonimagesrc, msgpack_
|
|||
float y = rcontrol_get_mouse_pos(westonimagesrc, obj, "y");
|
||||
|
||||
if (x >= 0.f && y >= 0.f) {
|
||||
rcontrol_emit(westonimagesrc, EV_ABS, ABS_X, buff_size.width * x);
|
||||
rcontrol_emit(westonimagesrc, EV_ABS, ABS_Y, buff_size.height * y);
|
||||
rcontrol_emit(westonimagesrc, EV_ABS, ABS_X, (int)(buff_size.width * x));
|
||||
rcontrol_emit(westonimagesrc, EV_ABS, ABS_Y, (int)(buff_size.height * y));
|
||||
rcontrol_emit(westonimagesrc, EV_SYN, SYN_REPORT, 0);
|
||||
GST_INFO_OBJECT(westonimagesrc, "DEBUG: MOUSE MOVE: %i, %i", (int)(buff_size.width * x), (int)(buff_size.height * y));
|
||||
}
|
||||
} break;
|
||||
|
||||
|
|
@ -182,16 +213,19 @@ static void rcontrol_handle_compound(GstWestonImageSrc *westonimagesrc, msgpack_
|
|||
int btn;
|
||||
switch (btn = rcontrol_get_mouse_btn(westonimagesrc, obj)) {
|
||||
case RCONTROL_MOUSE_BTN_LEFT: {
|
||||
GST_INFO_OBJECT(westonimagesrc, "DEBUG: MOUSE LEFT BTN PRESS");
|
||||
rcontrol_emit(westonimagesrc, EV_KEY, BTN_LEFT, 1);
|
||||
rcontrol_emit(westonimagesrc, EV_SYN, SYN_REPORT, 0);
|
||||
} break;
|
||||
|
||||
case RCONTROL_MOUSE_BTN_RIGHT: {
|
||||
GST_INFO_OBJECT(westonimagesrc, "DEBUG: MOUSE RIGHT BTN PRESS");
|
||||
rcontrol_emit(westonimagesrc, EV_KEY, BTN_RIGHT, 1);
|
||||
rcontrol_emit(westonimagesrc, EV_SYN, SYN_REPORT, 0);
|
||||
} break;
|
||||
|
||||
case RCONTROL_MOUSE_BTN_MID: {
|
||||
GST_INFO_OBJECT(westonimagesrc, "DEBUG: MOUSE MID BTN PRESS");
|
||||
rcontrol_emit(westonimagesrc, EV_KEY, BTN_MIDDLE, 1);
|
||||
rcontrol_emit(westonimagesrc, EV_SYN, SYN_REPORT, 0);
|
||||
} break;
|
||||
|
|
@ -204,16 +238,19 @@ static void rcontrol_handle_compound(GstWestonImageSrc *westonimagesrc, msgpack_
|
|||
int btn;
|
||||
switch (btn = rcontrol_get_mouse_btn(westonimagesrc, obj)) {
|
||||
case RCONTROL_MOUSE_BTN_LEFT: {
|
||||
GST_INFO_OBJECT(westonimagesrc, "DEBUG: MOUSE LEFT BTN RELEASE");
|
||||
rcontrol_emit(westonimagesrc, EV_KEY, BTN_LEFT, 0);
|
||||
rcontrol_emit(westonimagesrc, EV_SYN, SYN_REPORT, 0);
|
||||
} break;
|
||||
|
||||
case RCONTROL_MOUSE_BTN_RIGHT: {
|
||||
GST_INFO_OBJECT(westonimagesrc, "DEBUG: MOUSE RIGHT BTN RELEASE");
|
||||
rcontrol_emit(westonimagesrc, EV_KEY, BTN_RIGHT, 0);
|
||||
rcontrol_emit(westonimagesrc, EV_SYN, SYN_REPORT, 0);
|
||||
} break;
|
||||
|
||||
case RCONTROL_MOUSE_BTN_MID: {
|
||||
GST_INFO_OBJECT(westonimagesrc, "DEBUG: MOUSE MID BTN RELEASE");
|
||||
rcontrol_emit(westonimagesrc, EV_KEY, BTN_MIDDLE, 0);
|
||||
rcontrol_emit(westonimagesrc, EV_SYN, SYN_REPORT, 0);
|
||||
} break;
|
||||
|
|
@ -223,9 +260,26 @@ static void rcontrol_handle_compound(GstWestonImageSrc *westonimagesrc, msgpack_
|
|||
} break;
|
||||
|
||||
case RCONTROL_EVENT_TYPE_MOUSE_WHEEL: {
|
||||
float y = rcontrol_get_mouse_pos(westonimagesrc, obj, "y");
|
||||
int y = rcontrol_get_mouse_wheel_pos(westonimagesrc, obj, "y");
|
||||
GST_INFO_OBJECT(westonimagesrc, "DEBUG: MOUSE WHEEL: %i", y);
|
||||
|
||||
rcontrol_emit(westonimagesrc, EV_REL, REL_WHEEL, y);
|
||||
rcontrol_emit(westonimagesrc, EV_REL, REL_WHEEL, y > 0 ? 1 : y < 0 ? -1 : 0);
|
||||
rcontrol_emit(westonimagesrc, EV_SYN, SYN_REPORT, 0);
|
||||
} break;
|
||||
|
||||
case RCONTROL_EVENT_TYPE_KEY_PRESSED: {
|
||||
int key = rcontrol_get_key(westonimagesrc, obj);
|
||||
GST_INFO_OBJECT(westonimagesrc, "DEBUG: KEY PRESS: %i", key);
|
||||
|
||||
rcontrol_emit(westonimagesrc, EV_KEY, key, 1);
|
||||
rcontrol_emit(westonimagesrc, EV_SYN, SYN_REPORT, 0);
|
||||
} break;
|
||||
|
||||
case RCONTROL_EVENT_TYPE_KEY_RELEASED: {
|
||||
int key = rcontrol_get_key(westonimagesrc, obj);
|
||||
GST_INFO_OBJECT(westonimagesrc, "DEBUG: KEY RELEASE: %i", key);
|
||||
|
||||
rcontrol_emit(westonimagesrc, EV_KEY, key, 0);
|
||||
rcontrol_emit(westonimagesrc, EV_SYN, SYN_REPORT, 0);
|
||||
} break;
|
||||
|
||||
|
|
@ -233,95 +287,10 @@ static void rcontrol_handle_compound(GstWestonImageSrc *westonimagesrc, msgpack_
|
|||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
for (uint32_t i = 0; i < obj.via.map.size; i++) {
|
||||
msgpack_object_kv kv = obj.via.map.ptr[i];
|
||||
if (kv.key.type == MSGPACK_OBJECT_STR) {
|
||||
switch (kv.val.type) {
|
||||
case MSGPACK_OBJECT_STR: {
|
||||
GST_INFO_OBJECT(westonimagesrc, "%.*s: %.*s", kv.key.via.str.size, kv.key.via.str.ptr, kv.val.via.str.size, kv.val.via.str.ptr);
|
||||
} break;
|
||||
|
||||
case MSGPACK_OBJECT_POSITIVE_INTEGER: {
|
||||
GST_INFO_OBJECT(westonimagesrc, "%.*s: %llu", kv.key.via.str.size, kv.key.via.str.ptr, (unsigned long long)kv.val.via.u64);
|
||||
} break;
|
||||
|
||||
case MSGPACK_OBJECT_NEGATIVE_INTEGER: {
|
||||
GST_INFO_OBJECT(westonimagesrc, "%.*s: %lld", kv.key.via.str.size, kv.key.via.str.ptr, (long long)kv.val.via.i64);
|
||||
} break;
|
||||
|
||||
case MSGPACK_OBJECT_FLOAT:
|
||||
case MSGPACK_OBJECT_FLOAT32: {
|
||||
GST_INFO_OBJECT(westonimagesrc, "%.*s: %lf", kv.key.via.str.size, kv.key.via.str.ptr, (double)kv.val.via.f64);
|
||||
} break;
|
||||
|
||||
case MSGPACK_OBJECT_BOOLEAN: {
|
||||
GST_INFO_OBJECT(westonimagesrc, "%.*s: %i", kv.key.via.str.size, kv.key.via.str.ptr, (gboolean)kv.val.via.boolean);
|
||||
} break;
|
||||
|
||||
case MSGPACK_OBJECT_ARRAY: {
|
||||
GST_INFO_OBJECT(westonimagesrc, "%.*s: (array)", kv.key.via.str.size, kv.key.via.str.ptr);
|
||||
rcontrol_handle_compound(westonimagesrc, kv.val);
|
||||
} break;
|
||||
|
||||
case MSGPACK_OBJECT_MAP: {
|
||||
GST_INFO_OBJECT(westonimagesrc, "%.*s: (object)", kv.key.via.str.size, kv.key.via.str.ptr);
|
||||
rcontrol_handle_compound(westonimagesrc, kv.val);
|
||||
} break;
|
||||
|
||||
default:
|
||||
GST_INFO_OBJECT(westonimagesrc, "%.*s: (unknown)", kv.key.via.str.size, kv.key.via.str.ptr);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case MSGPACK_OBJECT_ARRAY: {
|
||||
for (uint32_t i = 0; i < obj.via.map.size; i++) {
|
||||
msgpack_object o = obj.via.array.ptr[i];
|
||||
switch (o.type) {
|
||||
case MSGPACK_OBJECT_STR: {
|
||||
GST_INFO_OBJECT(westonimagesrc, "%i: %.*s", i, o.via.str.size, o.via.str.ptr);
|
||||
} break;
|
||||
|
||||
case MSGPACK_OBJECT_POSITIVE_INTEGER: {
|
||||
GST_INFO_OBJECT(westonimagesrc, "%i: %llu", i, (unsigned long long)o.via.u64);
|
||||
} break;
|
||||
|
||||
case MSGPACK_OBJECT_NEGATIVE_INTEGER: {
|
||||
GST_INFO_OBJECT(westonimagesrc, "%i: %lld", i, (long long)o.via.i64);
|
||||
} break;
|
||||
|
||||
case MSGPACK_OBJECT_FLOAT:
|
||||
case MSGPACK_OBJECT_FLOAT32: {
|
||||
GST_INFO_OBJECT(westonimagesrc, "%i: %lf", i, (double)o.via.f64);
|
||||
} break;
|
||||
|
||||
case MSGPACK_OBJECT_BOOLEAN: {
|
||||
GST_INFO_OBJECT(westonimagesrc, "%i: %i", i, (gboolean)o.via.boolean);
|
||||
} break;
|
||||
|
||||
case MSGPACK_OBJECT_ARRAY: {
|
||||
GST_INFO_OBJECT(westonimagesrc, "%i: (array)", i);
|
||||
rcontrol_handle_compound(westonimagesrc, o);
|
||||
} break;
|
||||
|
||||
case MSGPACK_OBJECT_MAP: {
|
||||
GST_INFO_OBJECT(westonimagesrc, "%i: (object)", i);
|
||||
rcontrol_handle_compound(westonimagesrc, o);
|
||||
} break;
|
||||
|
||||
default:
|
||||
GST_INFO_OBJECT(westonimagesrc, "%i: (unknown)", i);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -445,12 +414,16 @@ static void rcontrol_init_uinput(GstWestonImageSrc *westonimagesrc) {
|
|||
ioctl(westonimagesrc->uinput_fd, UI_SET_ABSBIT, ABS_X);
|
||||
ioctl(westonimagesrc->uinput_fd, UI_SET_ABSBIT, ABS_Y);
|
||||
|
||||
// Rel bits
|
||||
ioctl(westonimagesrc->uinput_fd, UI_SET_EVBIT, EV_REL);
|
||||
ioctl(westonimagesrc->uinput_fd, UI_SET_RELBIT, REL_X);
|
||||
ioctl(westonimagesrc->uinput_fd, UI_SET_RELBIT, REL_Y);
|
||||
ioctl(westonimagesrc->uinput_fd, UI_SET_RELBIT, REL_WHEEL);
|
||||
ioctl(westonimagesrc->uinput_fd, UI_SET_RELBIT, REL_HWHEEL);
|
||||
|
||||
ioctl(westonimagesrc->uinput_fd, UI_SET_RELBIT, REL_WHEEL_HI_RES);
|
||||
ioctl(westonimagesrc->uinput_fd, UI_SET_RELBIT, REL_HWHEEL_HI_RES);
|
||||
|
||||
struct uinput_abs_setup abs_x = {
|
||||
.code = ABS_X,
|
||||
.absinfo =
|
||||
|
|
@ -481,7 +454,7 @@ static void rcontrol_init_uinput(GstWestonImageSrc *westonimagesrc) {
|
|||
|
||||
snprintf(usetup.name, UINPUT_MAX_NAME_SIZE, "Virtual Keyboard + Mouse");
|
||||
usetup.id.bustype = BUS_USB;
|
||||
usetup.id.vendor = 0x7777;
|
||||
usetup.id.vendor = 0x8888;
|
||||
usetup.id.product = 0x8888;
|
||||
usetup.id.version = 1;
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue