Skip to content

Commit 7801482

Browse files
committed
added raw keyboard input
resolves #22
1 parent d8e4e11 commit 7801482

File tree

5 files changed

+414
-27
lines changed

5 files changed

+414
-27
lines changed

include/console_keyboard.h

Lines changed: 158 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -2,38 +2,173 @@
22
#define _CONSOLE_KEYBOARD_H
33

44
#include <stdlib.h>
5+
#include <linux/input-event-codes.h>
56

67
// small subset of the GLFW key ids.
78
// (only the ones needed for text input)
9+
810
typedef enum {
9-
GLFW_KEY_UNKNOWN = -1,
10-
GLFW_KEY_ENTER = 257,
11-
GLFW_KEY_TAB = 258,
12-
GLFW_KEY_BACKSPACE = 259,
13-
GLFW_KEY_DELETE = 261,
14-
GLFW_KEY_RIGHT = 262,
15-
GLFW_KEY_LEFT = 263,
16-
GLFW_KEY_PAGE_UP = 266,
17-
GLFW_KEY_PAGE_DOWN = 267,
18-
GLFW_KEY_HOME = 268,
19-
GLFW_KEY_END = 269,
20-
GLFW_KEY_F1 = 290,
21-
GLFW_KEY_F2 = 291,
22-
GLFW_KEY_F3 = 292,
23-
GLFW_KEY_F4 = 293,
24-
GLFW_KEY_F5 = 294,
25-
GLFW_KEY_F6 = 295,
26-
GLFW_KEY_F7 = 296,
27-
GLFW_KEY_F8 = 297,
28-
GLFW_KEY_F9 = 298,
29-
GLFW_KEY_F10 = 299,
30-
GLFW_KEY_F11 = 300,
31-
GLFW_KEY_F12 = 301
11+
GLFW_KEY_UNKNOWN = -1,
12+
GLFW_KEY_SPACE = 32,
13+
GLFW_KEY_APOSTROPHE = 39,
14+
GLFW_KEY_COMMA = 44,
15+
GLFW_KEY_MINUS = 45,
16+
GLFW_KEY_PERIOD = 46,
17+
GLFW_KEY_SLASH = 47,
18+
GLFW_KEY_0 = 48,
19+
GLFW_KEY_1 = 49,
20+
GLFW_KEY_2 = 50,
21+
GLFW_KEY_3 = 51,
22+
GLFW_KEY_4 = 52,
23+
GLFW_KEY_5 = 53,
24+
GLFW_KEY_6 = 54,
25+
GLFW_KEY_7 = 55,
26+
GLFW_KEY_8 = 56,
27+
GLFW_KEY_9 = 57,
28+
GLFW_KEY_SEMICOLON = 59,
29+
GLFW_KEY_EQUAL = 61,
30+
GLFW_KEY_A = 65,
31+
GLFW_KEY_B = 66,
32+
GLFW_KEY_C = 67,
33+
GLFW_KEY_D = 68,
34+
GLFW_KEY_E = 69,
35+
GLFW_KEY_F = 70,
36+
GLFW_KEY_G = 71,
37+
GLFW_KEY_H = 72,
38+
GLFW_KEY_I = 73,
39+
GLFW_KEY_J = 74,
40+
GLFW_KEY_K = 75,
41+
GLFW_KEY_L = 76,
42+
GLFW_KEY_M = 77,
43+
GLFW_KEY_N = 78,
44+
GLFW_KEY_O = 79,
45+
GLFW_KEY_P = 80,
46+
GLFW_KEY_Q = 81,
47+
GLFW_KEY_R = 82,
48+
GLFW_KEY_S = 83,
49+
GLFW_KEY_T = 84,
50+
GLFW_KEY_U = 85,
51+
GLFW_KEY_V = 86,
52+
GLFW_KEY_W = 87,
53+
GLFW_KEY_X = 88,
54+
GLFW_KEY_Y = 89,
55+
GLFW_KEY_Z = 90,
56+
GLFW_KEY_LEFT_BRACKET = 91,
57+
GLFW_KEY_BACKSLASH = 92,
58+
GLFW_KEY_RIGHT_BRACKET = 93,
59+
GLFW_KEY_GRAVE_ACCENT = 96,
60+
GLFW_KEY_WORLD_1 = 161,
61+
GLFW_KEY_WORLD_2 = 162,
62+
GLFW_KEY_ESCAPE = 256,
63+
GLFW_KEY_ENTER = 257,
64+
GLFW_KEY_TAB = 258,
65+
GLFW_KEY_BACKSPACE = 259,
66+
GLFW_KEY_INSERT = 260,
67+
GLFW_KEY_DELETE = 261,
68+
GLFW_KEY_RIGHT = 262,
69+
GLFW_KEY_LEFT = 263,
70+
GLFW_KEY_DOWN = 264,
71+
GLFW_KEY_UP = 265,
72+
GLFW_KEY_PAGE_UP = 266,
73+
GLFW_KEY_PAGE_DOWN = 267,
74+
GLFW_KEY_HOME = 268,
75+
GLFW_KEY_END = 269,
76+
GLFW_KEY_CAPS_LOCK = 280,
77+
GLFW_KEY_SCROLL_LOCK = 281,
78+
GLFW_KEY_NUM_LOCK = 282,
79+
GLFW_KEY_PRINT_SCREEN = 283,
80+
GLFW_KEY_PAUSE = 284,
81+
GLFW_KEY_F1 = 290,
82+
GLFW_KEY_F2 = 291,
83+
GLFW_KEY_F3 = 292,
84+
GLFW_KEY_F4 = 293,
85+
GLFW_KEY_F5 = 294,
86+
GLFW_KEY_F6 = 295,
87+
GLFW_KEY_F7 = 296,
88+
GLFW_KEY_F8 = 297,
89+
GLFW_KEY_F9 = 298,
90+
GLFW_KEY_F10 = 299,
91+
GLFW_KEY_F11 = 300,
92+
GLFW_KEY_F12 = 301,
93+
GLFW_KEY_F13 = 302,
94+
GLFW_KEY_F14 = 303,
95+
GLFW_KEY_F15 = 304,
96+
GLFW_KEY_F16 = 305,
97+
GLFW_KEY_F17 = 306,
98+
GLFW_KEY_F18 = 307,
99+
GLFW_KEY_F19 = 308,
100+
GLFW_KEY_F20 = 309,
101+
GLFW_KEY_F21 = 310,
102+
GLFW_KEY_F22 = 311,
103+
GLFW_KEY_F23 = 312,
104+
GLFW_KEY_F24 = 313,
105+
GLFW_KEY_F25 = 314,
106+
GLFW_KEY_KP_0 = 320,
107+
GLFW_KEY_KP_1 = 321,
108+
GLFW_KEY_KP_2 = 322,
109+
GLFW_KEY_KP_3 = 323,
110+
GLFW_KEY_KP_4 = 324,
111+
GLFW_KEY_KP_5 = 325,
112+
GLFW_KEY_KP_6 = 326,
113+
GLFW_KEY_KP_7 = 327,
114+
GLFW_KEY_KP_8 = 328,
115+
GLFW_KEY_KP_9 = 329,
116+
GLFW_KEY_KP_DECIMAL = 330,
117+
GLFW_KEY_KP_DIVIDE = 331,
118+
GLFW_KEY_KP_MULTIPLY = 332,
119+
GLFW_KEY_KP_SUBTRACT = 333,
120+
GLFW_KEY_KP_ADD = 334,
121+
GLFW_KEY_KP_ENTER = 335,
122+
GLFW_KEY_KP_EQUAL = 336,
123+
GLFW_KEY_LEFT_SHIFT = 340,
124+
GLFW_KEY_LEFT_CONTROL = 341,
125+
GLFW_KEY_LEFT_ALT = 342,
126+
GLFW_KEY_LEFT_SUPER = 343,
127+
GLFW_KEY_RIGHT_SHIFT = 344,
128+
GLFW_KEY_RIGHT_CONTROL = 345,
129+
GLFW_KEY_RIGHT_ALT = 346,
130+
GLFW_KEY_RIGHT_SUPER = 347,
131+
GLFW_KEY_MENU = 348,
32132
} glfw_key;
33133

34134
#define GLFW_KEY_LAST 348
35135

136+
typedef enum {
137+
GLFW_RELEASE = 0,
138+
GLFW_PRESS = 1,
139+
GLFW_REPEAT = 2
140+
} glfw_key_action;
141+
142+
typedef enum {
143+
GLFW_MOD_SHIFT = 1,
144+
GLFW_MOD_CONTROL = 2,
145+
GLFW_MOD_ALT = 4,
146+
GLFW_MOD_SUPER = 8,
147+
GLFW_MOD_CAPS_LOCK = 16,
148+
GLFW_MOD_NUM_LOCK = 32
149+
} glfw_keymod;
150+
151+
#define GLFW_KEYMOD_FOR_KEY(keycode) \
152+
(((keycode == GLFW_KEY_LEFT_SHIFT) || (keycode == GLFW_KEY_RIGHT_SHIFT)) ? GLFW_MOD_SHIFT : \
153+
((keycode == GLFW_KEY_LEFT_CONTROL) || (keycode == GLFW_KEY_RIGHT_CONTROL)) ? GLFW_MOD_CONTROL : \
154+
((keycode == GLFW_KEY_LEFT_ALT) || (keycode == GLFW_KEY_RIGHT_ALT)) ? GLFW_MOD_ALT : \
155+
((keycode == GLFW_KEY_LEFT_SUPER) || (keycode == GLFW_KEY_RIGHT_SUPER)) ? GLFW_MOD_SUPER : \
156+
(keycode == GLFW_KEY_CAPS_LOCK) ? GLFW_MOD_CAPS_LOCK : \
157+
(keycode == GLFW_KEY_NUM_LOCK) ? GLFW_MOD_NUM_LOCK : 0);
158+
159+
#define GLFW_KEY_IS_RIGHTSIDED(keycode) \
160+
((keycode == GLFW_KEY_RIGHT_SHIFT) ? true : \
161+
(keycode == GLFW_KEY_RIGHT_CONTROL) ? true : \
162+
(keycode == GLFW_KEY_RIGHT_ALT) ? true : \
163+
(keycode == GLFW_KEY_RIGHT_SUPER) ? true : false)
164+
165+
typedef uint8_t glfw_keymod_map;
166+
36167
extern char *glfw_key_control_sequence[GLFW_KEY_LAST+1];
168+
extern glfw_key evdev_code_glfw_key[KEY_CNT];
169+
170+
#define EVDEV_KEY_TO_GLFW_KEY(key) evdev_code_glfw_key[key]
171+
37172

38173
int console_flush_stdin(void);
39174
int console_make_raw(void);

src/console_keyboard.c

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,132 @@ char *glfw_key_control_sequence[GLFW_KEY_LAST+1] = {
3131
"\e[20~", "\e[21~", "\e[23~", "\e[24~"
3232
};
3333

34+
#define EVDEV_TO_GLFW(keyname) [KEY_##keyname] = GLFW_KEY_##keyname
35+
#define EVDEV_TO_GLFW_RENAME(linux_keyname, glfw_keyname) [KEY_##linux_keyname] = GLFW_KEY_##glfw_keyname
36+
37+
glfw_key evdev_code_glfw_key[KEY_CNT] = {
38+
EVDEV_TO_GLFW(SPACE),
39+
EVDEV_TO_GLFW(APOSTROPHE),
40+
EVDEV_TO_GLFW(COMMA),
41+
EVDEV_TO_GLFW(MINUS),
42+
EVDEV_TO_GLFW_RENAME(DOT, PERIOD),
43+
EVDEV_TO_GLFW(SLASH),
44+
EVDEV_TO_GLFW(0),
45+
EVDEV_TO_GLFW(1),
46+
EVDEV_TO_GLFW(2),
47+
EVDEV_TO_GLFW(3),
48+
EVDEV_TO_GLFW(4),
49+
EVDEV_TO_GLFW(5),
50+
EVDEV_TO_GLFW(6),
51+
EVDEV_TO_GLFW(7),
52+
EVDEV_TO_GLFW(8),
53+
EVDEV_TO_GLFW(9),
54+
EVDEV_TO_GLFW(SEMICOLON),
55+
EVDEV_TO_GLFW(EQUAL),
56+
EVDEV_TO_GLFW(A),
57+
EVDEV_TO_GLFW(B),
58+
EVDEV_TO_GLFW(C),
59+
EVDEV_TO_GLFW(D),
60+
EVDEV_TO_GLFW(E),
61+
EVDEV_TO_GLFW(F),
62+
EVDEV_TO_GLFW(G),
63+
EVDEV_TO_GLFW(H),
64+
EVDEV_TO_GLFW(I),
65+
EVDEV_TO_GLFW(J),
66+
EVDEV_TO_GLFW(K),
67+
EVDEV_TO_GLFW(L),
68+
EVDEV_TO_GLFW(M),
69+
EVDEV_TO_GLFW(N),
70+
EVDEV_TO_GLFW(O),
71+
EVDEV_TO_GLFW(P),
72+
EVDEV_TO_GLFW(Q),
73+
EVDEV_TO_GLFW(R),
74+
EVDEV_TO_GLFW(S),
75+
EVDEV_TO_GLFW(T),
76+
EVDEV_TO_GLFW(U),
77+
EVDEV_TO_GLFW(V),
78+
EVDEV_TO_GLFW(W),
79+
EVDEV_TO_GLFW(X),
80+
EVDEV_TO_GLFW(Y),
81+
EVDEV_TO_GLFW(Z),
82+
EVDEV_TO_GLFW_RENAME(LEFTBRACE, LEFT_BRACKET),
83+
EVDEV_TO_GLFW(BACKSLASH),
84+
EVDEV_TO_GLFW_RENAME(RIGHTBRACE, RIGHT_BRACKET),
85+
EVDEV_TO_GLFW_RENAME(GRAVE, GRAVE_ACCENT),
86+
EVDEV_TO_GLFW_RENAME(ESC, ESCAPE),
87+
EVDEV_TO_GLFW(ENTER),
88+
EVDEV_TO_GLFW(TAB),
89+
EVDEV_TO_GLFW(BACKSPACE),
90+
EVDEV_TO_GLFW(INSERT),
91+
EVDEV_TO_GLFW(DELETE),
92+
EVDEV_TO_GLFW(RIGHT),
93+
EVDEV_TO_GLFW(LEFT),
94+
EVDEV_TO_GLFW(DOWN),
95+
EVDEV_TO_GLFW(UP),
96+
EVDEV_TO_GLFW_RENAME(PAGEUP, PAGE_UP),
97+
EVDEV_TO_GLFW_RENAME(PAGEDOWN, PAGE_DOWN),
98+
EVDEV_TO_GLFW(HOME),
99+
EVDEV_TO_GLFW(END),
100+
EVDEV_TO_GLFW_RENAME(CAPSLOCK, CAPS_LOCK),
101+
EVDEV_TO_GLFW_RENAME(SCROLLLOCK, SCROLL_LOCK),
102+
EVDEV_TO_GLFW_RENAME(NUMLOCK, NUM_LOCK),
103+
EVDEV_TO_GLFW_RENAME(SYSRQ, PRINT_SCREEN),
104+
EVDEV_TO_GLFW(PAUSE),
105+
EVDEV_TO_GLFW(F1),
106+
EVDEV_TO_GLFW(F2),
107+
EVDEV_TO_GLFW(F3),
108+
EVDEV_TO_GLFW(F4),
109+
EVDEV_TO_GLFW(F5),
110+
EVDEV_TO_GLFW(F6),
111+
EVDEV_TO_GLFW(F7),
112+
EVDEV_TO_GLFW(F8),
113+
EVDEV_TO_GLFW(F9),
114+
EVDEV_TO_GLFW(F10),
115+
EVDEV_TO_GLFW(F11),
116+
EVDEV_TO_GLFW(F12),
117+
EVDEV_TO_GLFW(F13),
118+
EVDEV_TO_GLFW(F14),
119+
EVDEV_TO_GLFW(F15),
120+
EVDEV_TO_GLFW(F16),
121+
EVDEV_TO_GLFW(F17),
122+
EVDEV_TO_GLFW(F18),
123+
EVDEV_TO_GLFW(F19),
124+
EVDEV_TO_GLFW(F20),
125+
EVDEV_TO_GLFW(F21),
126+
EVDEV_TO_GLFW(F22),
127+
EVDEV_TO_GLFW(F23),
128+
EVDEV_TO_GLFW(F24),
129+
EVDEV_TO_GLFW_RENAME(KP0, KP_0),
130+
EVDEV_TO_GLFW_RENAME(KP1, KP_1),
131+
EVDEV_TO_GLFW_RENAME(KP2, KP_2),
132+
EVDEV_TO_GLFW_RENAME(KP3, KP_3),
133+
EVDEV_TO_GLFW_RENAME(KP4, KP_4),
134+
EVDEV_TO_GLFW_RENAME(KP5, KP_5),
135+
EVDEV_TO_GLFW_RENAME(KP6, KP_6),
136+
EVDEV_TO_GLFW_RENAME(KP7, KP_7),
137+
EVDEV_TO_GLFW_RENAME(KP8, KP_8),
138+
EVDEV_TO_GLFW_RENAME(KP9, KP_9),
139+
EVDEV_TO_GLFW_RENAME(KPDOT, KP_DECIMAL),
140+
EVDEV_TO_GLFW_RENAME(KPSLASH, KP_DIVIDE),
141+
EVDEV_TO_GLFW_RENAME(KPASTERISK, KP_MULTIPLY),
142+
EVDEV_TO_GLFW_RENAME(KPMINUS, KP_SUBTRACT),
143+
EVDEV_TO_GLFW_RENAME(KPPLUS, KP_ADD),
144+
EVDEV_TO_GLFW_RENAME(KPENTER, KP_ENTER),
145+
//CONVERSION(KP_EQUAL), // what is the equivalent of KP_EQUAL? is it
146+
EVDEV_TO_GLFW_RENAME(LEFTSHIFT, LEFT_SHIFT),
147+
EVDEV_TO_GLFW_RENAME(LEFTCTRL, LEFT_CONTROL),
148+
EVDEV_TO_GLFW_RENAME(LEFTALT, LEFT_ALT),
149+
EVDEV_TO_GLFW_RENAME(LEFTMETA, LEFT_SUPER),
150+
EVDEV_TO_GLFW_RENAME(RIGHTSHIFT, RIGHT_SHIFT),
151+
EVDEV_TO_GLFW_RENAME(RIGHTCTRL, RIGHT_CONTROL),
152+
EVDEV_TO_GLFW_RENAME(RIGHTALT, RIGHT_ALT),
153+
EVDEV_TO_GLFW_RENAME(RIGHTMETA, RIGHT_SUPER),
154+
EVDEV_TO_GLFW(MENU), // could also be that the linux equivalent is KEY_COMPOSE
155+
};
156+
157+
#undef EVDEV_TO_GLFW
158+
#undef EVDEV_TO_GLFW_RENAME
159+
34160
int console_flush_stdin(void) {
35161
int ok;
36162

src/flutter-pi.c

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
#include <pluginregistry.h>
3939
#include "plugins/services-plugin.h"
4040
#include "plugins/text_input.h"
41+
#include "plugins/raw_keyboard.h"
4142

4243

4344
char* usage ="\
@@ -1438,7 +1439,19 @@ void on_evdev_input(fd_set fds, size_t n_ready_fds) {
14381439
// update the active_buttons bitmap
14391440
// only apply BTN_TOUCH to the active buttons if a touch really equals a pressed button (device->is_direct is set)
14401441
// is_direct is true for touchscreens, but not for touchpads; so BTN_TOUCH doesn't result in a kMove for touchpads
1441-
if (e->code != BTN_TOUCH || device->is_direct) {
1442+
1443+
glfw_key glfw_key = EVDEV_KEY_TO_GLFW_KEY(e->code);
1444+
if ((glfw_key != GLFW_KEY_UNKNOWN) && (glfw_key != 0)) {
1445+
glfw_key_action action;
1446+
switch (e->value) {
1447+
case 0: action = GLFW_RELEASE; break;
1448+
case 1: action = GLFW_PRESS; break;
1449+
case 2: action = GLFW_REPEAT; break;
1450+
default: action = -1; break;
1451+
}
1452+
1453+
RawKeyboard_onKeyEvent(EVDEV_KEY_TO_GLFW_KEY(e->code), 0, action);
1454+
} else if (e->code != BTN_TOUCH || device->is_direct) {
14421455
if (e->value == 1) device->active_buttons |= FLUTTER_BUTTON_FROM_EVENT_CODE(e->code);
14431456
else device->active_buttons &= ~FLUTTER_BUTTON_FROM_EVENT_CODE(e->code);
14441457
}
@@ -1535,7 +1548,6 @@ void on_console_input(void) {
15351548
while (*cursor) {
15361549
if (key = console_try_get_key(cursor, &cursor), key != GLFW_KEY_UNKNOWN) {
15371550
TextInput_onKey(key);
1538-
printf("got key: %i\n", key);
15391551
} else if (c = console_try_get_utf8char(cursor, &cursor), c != NULL) {
15401552
TextInput_onUtf8Char(c);
15411553
} else {

0 commit comments

Comments
 (0)