summaryrefslogtreecommitdiff
path: root/src/uinput.c
blob: 51dbc5662fc3dfa8cc329b7cdd1e692831245918 (plain)
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);
}