aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2022-03-05 10:23:30 +0100
committerBad Diode <bd@badd10de.dev>2022-03-05 10:23:30 +0100
commit9005cb1eb923fa154230aabc48a4fb73a2aabf12 (patch)
tree524dd0fdcb0554b90684cc3b917b0c0a0a1d6cc9
parente835289d291bb8d0a9f0b56130412226c4cbec7c (diff)
downloaduxnfb-9005cb1eb923fa154230aabc48a4fb73a2aabf12.tar.gz
uxnfb-9005cb1eb923fa154230aabc48a4fb73a2aabf12.zip
Add rest of main keys and kbd controller status
-rw-r--r--src/main.c54
1 files changed, 48 insertions, 6 deletions
diff --git a/src/main.c b/src/main.c
index 2bce9f7..445fb17 100644
--- a/src/main.c
+++ b/src/main.c
@@ -36,12 +36,15 @@ time_elapsed(Time since){
36typedef struct Keyboard { 36typedef 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
41static Keyboard keyboard; 42static Keyboard keyboard;
42 43
43void 44void
44init_input(void) { 45init_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
57void 58void
@@ -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