summaryrefslogtreecommitdiff
path: root/src/waypad.h
blob: 1137f9bba69837874a2e6e3e6ee292be601d114e (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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#ifndef _WAYPAD_H_
#define _WAYPAD_H_

#include <stddef.h>
#include <stdint.h>

#include <libevdev/libevdev.h>

enum gamepad_button {
	GAMEPAD_BUTTON_INVALID = -1,
	GAMEPAD_BUTTON_A,
	GAMEPAD_BUTTON_B,
	GAMEPAD_BUTTON_X,
	GAMEPAD_BUTTON_Y,
	GAMEPAD_BUTTON_BACK,
	GAMEPAD_BUTTON_GUIDE,
	GAMEPAD_BUTTON_START,
	GAMEPAD_BUTTON_LEFTSTICK,
	GAMEPAD_BUTTON_RIGHTSTICK,
	GAMEPAD_BUTTON_LEFTSHOULDER,
	GAMEPAD_BUTTON_RIGHTSHOULDER,
	GAMEPAD_BUTTON_DPAD_UP,
	GAMEPAD_BUTTON_DPAD_DOWN,
	GAMEPAD_BUTTON_DPAD_LEFT,
	GAMEPAD_BUTTON_DPAD_RIGHT,
	GAMEPAD_BUTTON_MISC1,
	GAMEPAD_BUTTON_PADDLE1,
	GAMEPAD_BUTTON_PADDLE2,
	GAMEPAD_BUTTON_PADDLE3,
	GAMEPAD_BUTTON_PADDLE4,
	GAMEPAD_BUTTON_TOUCHPAD,
	GAMEPAD_BUTTON_MAX
};

enum gamepad_axis {
	GAMEPAD_AXIS_INVALID = -1,
	GAMEPAD_AXIS_LEFTX,
	GAMEPAD_AXIS_LEFTY,
	GAMEPAD_AXIS_RIGHTX,
	GAMEPAD_AXIS_RIGHTY,
	GAMEPAD_AXIS_TRIGGERLEFT,
	GAMEPAD_AXIS_TRIGGERRIGHT,
	GAMEPAD_AXIS_MAX
};

enum keyboard_modifier {
	KEYMOD_LSHIFT = 1 << 0,
	KEYMOD_RSHIFT = 1 << 1,
	KEYMOD_LCTRL  = 1 << 2,
	KEYMOD_RCTRL  = 1 << 3,
	KEYMOD_LALT   = 1 << 4,
	KEYMOD_RALT   = 1 << 5,
	KEYMOD_LMETA  = 1 << 6,
	KEYMOD_RMETA  = 1 << 7,
};

struct guid { uint16_t guid[8]; };

struct mapping {
	char *name;
	struct guid guid;
	uint8_t buttons[GAMEPAD_BUTTON_MAX];
	uint8_t axis[GAMEPAD_AXIS_MAX];
};

struct action {
	enum {
		ACTION_NONE,
		ACTION_EXEC,
		ACTION_KEY,
		ACTION_MOUSE,
		ACTION_CLICK,
		ACTION_MODE,
	} type;
	int old_value; /* for relative axis binds */
	union {
		char **exec;
		struct {
			enum keyboard_modifier mod;
			int code;
		} key;
		int click;
		enum {
			MOUSE_X,
			MOUSE_Y
		} mouse;
		struct mode *mode;
	};
};

struct gamepad {
	struct mapping *mapping;
	struct libevdev *dev;
	/* maps libevdev event ids to indexes in gamepad.actions */
	struct {
		uint8_t button[KEY_MAX - BTN_MISC];
		uint8_t axis[ABS_MAX];
	} map;
	size_t nbuttons, naxis;
	struct {
		size_t len, cap;
		struct mode {
			char *name;
			struct action *buttons, *axis;
		} *all, *current, base;
	} modes;
};

extern struct gamepads {
	size_t len, cap;
	struct gamepad *loaded;
} gamepads;

bool load_config(const char *path);
bool load_gamepads();
void free_gamepads();
struct gamepad *find_gamepad(const char *name);
struct mode *get_make_mode(struct gamepad *pad, const char *name);
enum gamepad_axis str_to_axis(const char *str);
enum gamepad_button str_to_button(const char *str);

bool wayland_init();

bool uinput_mouse_init();
void uinput_mouse_press(int button);
void uinput_mouse_release(int button);
void uinput_mouse_rel_move(int x, int y);

bool uinput_keyboard_init();
void uinput_keyboard_press(enum keyboard_modifier mod, int key);
void uinput_keyboard_release(enum keyboard_modifier mod, int key);
#endif