summaryrefslogtreecommitdiff
path: root/src/uinput.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/uinput.c')
-rw-r--r--src/uinput.c80
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);
+}