diff --git a/clients/gstwestonimagesrc.c b/clients/gstwestonimagesrc.c index fed2cfc..381caca 100644 --- a/clients/gstwestonimagesrc.c +++ b/clients/gstwestonimagesrc.c @@ -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"); - - rcontrol_emit(westonimagesrc, EV_REL, REL_WHEEL, 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 > 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,96 +287,11 @@ 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; + } break; default: break; } - } - } } static gpointer rcontrol_listener_thread(gpointer data) { @@ -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;