#include #include "waypad.h" #include "util.h" struct uinput_dev { struct libevdev *dev; struct libevdev_uinput *uinput; } mouse, keyboard; bool uinput_mouse_init() { mouse.dev = libevdev_new(); libevdev_set_name(mouse.dev, "waypad mouse"); libevdev_enable_event_type(mouse.dev, EV_REL); libevdev_enable_event_code(mouse.dev, EV_REL, REL_X, NULL); libevdev_enable_event_code(mouse.dev, EV_REL, REL_Y, NULL); libevdev_enable_event_type(mouse.dev, EV_KEY); libevdev_enable_event_code(mouse.dev, EV_KEY, BTN_LEFT, NULL); libevdev_enable_event_code(mouse.dev, EV_KEY, BTN_MIDDLE, NULL); libevdev_enable_event_code(mouse.dev, EV_KEY, BTN_RIGHT, NULL); return libevdev_uinput_create_from_device(mouse.dev, LIBEVDEV_UINPUT_OPEN_MANAGED, &mouse.uinput) == 0; } void uinput_mouse_rel_move(int x, int y) { if (x) libevdev_uinput_write_event(mouse.uinput, EV_REL, REL_X, x); if (y) libevdev_uinput_write_event(mouse.uinput, EV_REL, REL_Y, y); libevdev_uinput_write_event(mouse.uinput, EV_SYN, SYN_REPORT, 0); } void uinput_mouse_press(int button) { libevdev_uinput_write_event(mouse.uinput, EV_KEY, button, 1); libevdev_uinput_write_event(mouse.uinput, EV_SYN, SYN_REPORT, 0); } void uinput_mouse_release(int button) { libevdev_uinput_write_event(mouse.uinput, EV_KEY, button, 0); libevdev_uinput_write_event(mouse.uinput, EV_SYN, SYN_REPORT, 0); } bool uinput_keyboard_init() { keyboard.dev = libevdev_new(); libevdev_set_name(keyboard.dev, "waypad keyboard"); libevdev_enable_event_type(keyboard.dev, EV_KEY); for (size_t i = 0; i < KEY_MAX; i++) libevdev_enable_event_code(keyboard.dev, EV_KEY, i, NULL); return libevdev_uinput_create_from_device(keyboard.dev, LIBEVDEV_UINPUT_OPEN_MANAGED, &keyboard.uinput) == 0; } static const struct { enum keyboard_modifier mod; int code; } mod_map[] = { { KEYMOD_LSHIFT, KEY_LEFTSHIFT }, { KEYMOD_RSHIFT, KEY_RIGHTSHIFT }, { KEYMOD_LCTRL, KEY_LEFTCTRL }, { KEYMOD_RCTRL, KEY_RIGHTCTRL }, { KEYMOD_LALT, KEY_LEFTALT }, { KEYMOD_RALT, KEY_RIGHTALT }, { KEYMOD_LMETA, KEY_LEFTMETA }, { KEYMOD_RMETA, KEY_RIGHTMETA }, }; void uinput_keyboard_press(enum keyboard_modifier mod, int key) { for (size_t i = 0; i < lenghtof(mod_map); i++) if (mod & mod_map[i].mod) libevdev_uinput_write_event(keyboard.uinput, EV_KEY, mod_map[i].code, 1); libevdev_uinput_write_event(keyboard.uinput, EV_KEY, key, 1); libevdev_uinput_write_event(keyboard.uinput, EV_SYN, SYN_REPORT, 0); } void uinput_keyboard_release(enum keyboard_modifier mod, int key) { libevdev_uinput_write_event(keyboard.uinput, EV_KEY, key, 0); for (size_t i = 0; i < lenghtof(mod_map); i++) if (mod & mod_map[i].mod) libevdev_uinput_write_event(keyboard.uinput, EV_KEY, mod_map[i].code, 0); libevdev_uinput_write_event(keyboard.uinput, EV_SYN, SYN_REPORT, 0); }