1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
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);
}
|