diff options
Diffstat (limited to 'src/uinput.c')
| -rw-r--r-- | src/uinput.c | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/src/uinput.c b/src/uinput.c new file mode 100644 index 0000000..51dbc56 --- /dev/null +++ b/src/uinput.c @@ -0,0 +1,80 @@ +#include <libevdev/libevdev-uinput.h> +#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); +} |
