diff options
author | Bad Diode <bd@badd10de.dev> | 2022-03-05 10:23:30 +0100 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2022-03-05 10:23:30 +0100 |
commit | 9005cb1eb923fa154230aabc48a4fb73a2aabf12 (patch) | |
tree | 524dd0fdcb0554b90684cc3b917b0c0a0a1d6cc9 | |
parent | e835289d291bb8d0a9f0b56130412226c4cbec7c (diff) | |
download | uxnfb-9005cb1eb923fa154230aabc48a4fb73a2aabf12.tar.gz uxnfb-9005cb1eb923fa154230aabc48a4fb73a2aabf12.zip |
Add rest of main keys and kbd controller status
-rw-r--r-- | src/main.c | 54 |
1 files changed, 48 insertions, 6 deletions
@@ -36,12 +36,15 @@ time_elapsed(Time since){ | |||
36 | typedef struct Keyboard { | 36 | typedef struct Keyboard { |
37 | int fd; | 37 | int fd; |
38 | char map[KEY_MAX / 8 + 1]; | 38 | char map[KEY_MAX / 8 + 1]; |
39 | u8 controller; | ||
39 | } Keyboard; | 40 | } Keyboard; |
40 | 41 | ||
41 | static Keyboard keyboard; | 42 | static Keyboard keyboard; |
42 | 43 | ||
43 | void | 44 | void |
44 | init_input(void) { | 45 | init_input(void) { |
46 | memset(&keyboard, 0, sizeof(Keyboard)); | ||
47 | |||
45 | const char *dev = "/dev/input/by-id/usb-Apple_Inc._Magic_Keyboard_with_Numeric_Keypad_F0T0167000DHTHKAD-if01-event-kbd"; | 48 | const char *dev = "/dev/input/by-id/usb-Apple_Inc._Magic_Keyboard_with_Numeric_Keypad_F0T0167000DHTHKAD-if01-event-kbd"; |
46 | keyboard.fd = open(dev, O_RDONLY); | 49 | keyboard.fd = open(dev, O_RDONLY); |
47 | if (keyboard.fd == -1) { | 50 | if (keyboard.fd == -1) { |
@@ -50,8 +53,6 @@ init_input(void) { | |||
50 | fprintf(stderr, "error: no couldn't open keyboard %s: %s.\n", dev, strerror(errno)); | 53 | fprintf(stderr, "error: no couldn't open keyboard %s: %s.\n", dev, strerror(errno)); |
51 | exit(EXIT_FAILURE); | 54 | exit(EXIT_FAILURE); |
52 | } | 55 | } |
53 | |||
54 | memset(keyboard.map, 0, sizeof(keyboard.map)); | ||
55 | } | 56 | } |
56 | 57 | ||
57 | void | 58 | void |
@@ -92,28 +93,38 @@ handle_keyboard(void) { | |||
92 | } | 93 | } |
93 | 94 | ||
94 | // Handle normal keys. | 95 | // Handle normal keys. |
96 | u8 controller_now = 0; | ||
95 | for (size_t i = 0; i < sizeof(keyboard.map); i++) { | 97 | for (size_t i = 0; i < sizeof(keyboard.map); i++) { |
96 | for (size_t j = 0; j < 8; j++) { | 98 | for (size_t j = 0; j < 8; j++) { |
97 | char key = keyboard.map[i] & (1 << j); | 99 | char key = keyboard.map[i] & (1 << j); |
98 | if (key) { | 100 | if (key) { |
99 | char key_code = i * 8 + j; | 101 | char key_code = i * 8 + j; |
100 | // Special keys. | ||
101 | // TODO: ... | ||
102 | |||
103 | // Normal keys. | 102 | // Normal keys. |
104 | char rune = '\0'; | 103 | u8 rune = '\0'; |
105 | switch (key_code) { | 104 | switch (key_code) { |
105 | case KEY_KP1: | ||
106 | case KEY_1: { rune = shift_mod ? '!' : '1'; } break; | 106 | case KEY_1: { rune = shift_mod ? '!' : '1'; } break; |
107 | case KEY_KP2: | ||
107 | case KEY_2: { rune = shift_mod ? '@' : '2'; } break; | 108 | case KEY_2: { rune = shift_mod ? '@' : '2'; } break; |
109 | case KEY_KP3: | ||
108 | case KEY_3: { rune = shift_mod ? '#' : '3'; } break; | 110 | case KEY_3: { rune = shift_mod ? '#' : '3'; } break; |
111 | case KEY_KP4: | ||
109 | case KEY_4: { rune = shift_mod ? '$' : '4'; } break; | 112 | case KEY_4: { rune = shift_mod ? '$' : '4'; } break; |
113 | case KEY_KP5: | ||
110 | case KEY_5: { rune = shift_mod ? '%' : '5'; } break; | 114 | case KEY_5: { rune = shift_mod ? '%' : '5'; } break; |
115 | case KEY_KP6: | ||
111 | case KEY_6: { rune = shift_mod ? '^' : '6'; } break; | 116 | case KEY_6: { rune = shift_mod ? '^' : '6'; } break; |
117 | case KEY_KP7: | ||
112 | case KEY_7: { rune = shift_mod ? '&' : '7'; } break; | 118 | case KEY_7: { rune = shift_mod ? '&' : '7'; } break; |
119 | case KEY_KP8: | ||
113 | case KEY_8: { rune = shift_mod ? '*' : '8'; } break; | 120 | case KEY_8: { rune = shift_mod ? '*' : '8'; } break; |
121 | case KEY_KP9: | ||
114 | case KEY_9: { rune = shift_mod ? '(' : '9'; } break; | 122 | case KEY_9: { rune = shift_mod ? '(' : '9'; } break; |
123 | case KEY_KP0: | ||
115 | case KEY_0: { rune = shift_mod ? ')' : '0'; } break; | 124 | case KEY_0: { rune = shift_mod ? ')' : '0'; } break; |
125 | case KEY_KPMINUS: | ||
116 | case KEY_MINUS: { rune = shift_mod ? '_' : '-'; } break; | 126 | case KEY_MINUS: { rune = shift_mod ? '_' : '-'; } break; |
127 | case KEY_KPEQUAL: | ||
117 | case KEY_EQUAL: { rune = shift_mod ? '+' : '+'; } break; | 128 | case KEY_EQUAL: { rune = shift_mod ? '+' : '+'; } break; |
118 | case KEY_Q: { rune = shift_mod ? 'Q' : 'q'; } break; | 129 | case KEY_Q: { rune = shift_mod ? 'Q' : 'q'; } break; |
119 | case KEY_W: { rune = shift_mod ? 'W' : 'w'; } break; | 130 | case KEY_W: { rune = shift_mod ? 'W' : 'w'; } break; |
@@ -149,9 +160,14 @@ handle_keyboard(void) { | |||
149 | case KEY_M: { rune = shift_mod ? 'M' : 'm'; } break; | 160 | case KEY_M: { rune = shift_mod ? 'M' : 'm'; } break; |
150 | case KEY_COMMA: { rune = shift_mod ? '<' : ','; } break; | 161 | case KEY_COMMA: { rune = shift_mod ? '<' : ','; } break; |
151 | case KEY_DOT: { rune = shift_mod ? '>' : '.'; } break; | 162 | case KEY_DOT: { rune = shift_mod ? '>' : '.'; } break; |
163 | case KEY_KPSLASH: | ||
152 | case KEY_SLASH: { rune = shift_mod ? '?' : '/'; } break; | 164 | case KEY_SLASH: { rune = shift_mod ? '?' : '/'; } break; |
165 | case KEY_KPASTERISK: { rune = '*'; } break; | ||
166 | case KEY_KPPLUS: { rune = '+'; } break; | ||
167 | case KEY_KPCOMMA: { rune = '.'; } break; | ||
153 | case KEY_SPACE: { rune = ' '; } break; | 168 | case KEY_SPACE: { rune = ' '; } break; |
154 | case KEY_TAB: { rune = '\t'; } break; | 169 | case KEY_TAB: { rune = '\t'; } break; |
170 | case KEY_ESC: { rune = 0x1b; } break; | ||
155 | case KEY_BACKSPACE: { rune = 0x08; } break; | 171 | case KEY_BACKSPACE: { rune = 0x08; } break; |
156 | case KEY_ENTER: | 172 | case KEY_ENTER: |
157 | case KEY_KPENTER: { rune = 0x0d; } break; | 173 | case KEY_KPENTER: { rune = 0x0d; } break; |
@@ -163,9 +179,35 @@ handle_keyboard(void) { | |||
163 | devctrl->dat[3] = 0; | 179 | devctrl->dat[3] = 0; |
164 | continue; | 180 | continue; |
165 | } | 181 | } |
182 | |||
183 | // Special keys. | ||
184 | switch (key_code) { | ||
185 | case KEY_LEFTCTRL: { rune = 0x01; } break; | ||
186 | case KEY_LEFTALT: { rune = 0x02; } break; | ||
187 | case KEY_LEFTSHIFT: { rune = 0x04; } break; | ||
188 | case KEY_HOME: { rune = 0x08; } break; | ||
189 | case KEY_UP: { rune = 0x10; } break; | ||
190 | case KEY_DOWN: { rune = 0x20; } break; | ||
191 | case KEY_LEFT: { rune = 0x40; } break; | ||
192 | case KEY_RIGHT: { rune = 0x80; } break; | ||
193 | default: break; | ||
194 | } | ||
195 | if (rune) { | ||
196 | controller_now |= rune; | ||
197 | continue; | ||
198 | } | ||
166 | } | 199 | } |
167 | } | 200 | } |
168 | } | 201 | } |
202 | |||
203 | if (controller_now != keyboard.controller) { | ||
204 | devctrl->dat[2] = controller_now; | ||
205 | uxn_eval(&u, mempeek16(devctrl->dat, 0)); | ||
206 | keyboard.controller = controller_now; | ||
207 | } | ||
208 | |||
209 | // Reset keyboard state. | ||
210 | devctrl->dat[3] = 0; | ||
169 | memset(keyboard.map, 0, sizeof(keyboard.map)); | 211 | memset(keyboard.map, 0, sizeof(keyboard.map)); |
170 | } | 212 | } |
171 | 213 | ||