aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2022-03-05 10:35:36 +0100
committerBad Diode <bd@badd10de.dev>2022-03-05 10:35:36 +0100
commitd08a7dfac6ea835603a580668761aa27e70f669b (patch)
treea2839b8b9d077a1736b79275b23f65463db7e331
parent9005cb1eb923fa154230aabc48a4fb73a2aabf12 (diff)
downloaduxnfb-d08a7dfac6ea835603a580668761aa27e70f669b.tar.gz
uxnfb-d08a7dfac6ea835603a580668761aa27e70f669b.zip
Make keyboard path a compile time constant
-rw-r--r--Makefile3
-rw-r--r--src/main.c48
2 files changed, 28 insertions, 23 deletions
diff --git a/Makefile b/Makefile
index 3d41a4a..8548dbc 100644
--- a/Makefile
+++ b/Makefile
@@ -8,6 +8,7 @@ UXN_HEAD := $(BASE_UXN)/src/uxn.h
8TAL_SRC ?= $(BASE_UXN)/projects/examples/devices/screen.tal 8TAL_SRC ?= $(BASE_UXN)/projects/examples/devices/screen.tal
9UXN_ROM ?= $(BUILD_DIR)/rom.rom 9UXN_ROM ?= $(BUILD_DIR)/rom.rom
10UXN_ASM ?= $(BUILD_DIR)/uxnasm 10UXN_ASM ?= $(BUILD_DIR)/uxnasm
11KBD_PATH ?= /dev/input/event1
11 12
12CC ?= cc 13CC ?= cc
13CFLAGS := -Wall -Wextra -pedantic 14CFLAGS := -Wall -Wextra -pedantic
@@ -29,7 +30,7 @@ endif
29main: $(BIN) 30main: $(BIN)
30 31
31$(BIN): $(SRC_MAIN) $(BUILD_DIR) $(UXN_HEAD) 32$(BIN): $(SRC_MAIN) $(BUILD_DIR) $(UXN_HEAD)
32 $(CC) $(CFLAGS) -o $(BIN) $(SRC_MAIN) 33 $(CC) $(CFLAGS) -o $(BIN) $(SRC_MAIN) -DKBD_PATH=\"$(KBD_PATH)\"
33 34
34$(BUILD_DIR): 35$(BUILD_DIR):
35 mkdir -p $(BUILD_DIR) 36 mkdir -p $(BUILD_DIR)
diff --git a/src/main.c b/src/main.c
index 445fb17..aac3211 100644
--- a/src/main.c
+++ b/src/main.c
@@ -33,35 +33,39 @@ time_elapsed(Time since){
33 return (now.tv_sec - since.tv_sec) * 1e9 + (now.tv_nsec - since.tv_nsec); 33 return (now.tv_sec - since.tv_sec) * 1e9 + (now.tv_nsec - since.tv_nsec);
34} 34}
35 35
36typedef struct Keyboard { 36typedef struct Input {
37 int fd; 37 int kb_fd;
38 char map[KEY_MAX / 8 + 1]; 38 char map[KEY_MAX / 8 + 1];
39 u8 controller; 39 u8 controller;
40} Keyboard; 40} Input;
41 41
42static Keyboard keyboard; 42static Input input;
43 43
44void 44void
45init_input(void) { 45init_input(void) {
46 memset(&keyboard, 0, sizeof(Keyboard)); 46 memset(&input, 0, sizeof(input));
47 47 input.kb_fd = -1;
48 const char *dev = "/dev/input/by-id/usb-Apple_Inc._Magic_Keyboard_with_Numeric_Keypad_F0T0167000DHTHKAD-if01-event-kbd"; 48
49 keyboard.fd = open(dev, O_RDONLY); 49 const char *dev = KBD_PATH;
50 if (keyboard.fd == -1) { 50 input.kb_fd = open(dev, O_RDONLY);
51 // TODO: should this be a warning and still work for applications that 51 if (input.kb_fd == -1) {
52 // don't require a keyboard? 52 // NOTE: Some applications may not require a keyboard so this is
53 // optional, but we are still displaying an error.
53 fprintf(stderr, "error: no couldn't open keyboard %s: %s.\n", dev, strerror(errno)); 54 fprintf(stderr, "error: no couldn't open keyboard %s: %s.\n", dev, strerror(errno));
54 exit(EXIT_FAILURE);
55 } 55 }
56} 56}
57 57
58void 58void
59poll_keyboard(void) { 59poll_keyboard(void) {
60 if (input.kb_fd == -1) {
61 return;
62 }
63
60 char map[KEY_MAX / 8 + 1]; 64 char map[KEY_MAX / 8 + 1];
61 memset(map, 0, sizeof(map)); 65 memset(map, 0, sizeof(map));
62 ioctl(keyboard.fd, EVIOCGKEY(sizeof(map)), map); 66 ioctl(input.kb_fd, EVIOCGKEY(sizeof(map)), map);
63 for (size_t i = 0; i < sizeof(map); i++) { 67 for (size_t i = 0; i < sizeof(map); i++) {
64 keyboard.map[i] |= map[i]; 68 input.map[i] |= map[i];
65 } 69 }
66} 70}
67 71
@@ -72,9 +76,9 @@ handle_keyboard(void) {
72 // bool ctrl_mod = false; 76 // bool ctrl_mod = false;
73 // bool alt_mod = false; 77 // bool alt_mod = false;
74 // bool meta_mod = false; 78 // bool meta_mod = false;
75 for (size_t i = 0; i < sizeof(keyboard.map); i++) { 79 for (size_t i = 0; i < sizeof(input.map); i++) {
76 for (size_t j = 0; j < 8; j++) { 80 for (size_t j = 0; j < 8; j++) {
77 char key = keyboard.map[i] & (1 << j); 81 char key = input.map[i] & (1 << j);
78 if (key) { 82 if (key) {
79 char key_code = i * 8 + j; 83 char key_code = i * 8 + j;
80 switch (key_code) { 84 switch (key_code) {
@@ -94,9 +98,9 @@ handle_keyboard(void) {
94 98
95 // Handle normal keys. 99 // Handle normal keys.
96 u8 controller_now = 0; 100 u8 controller_now = 0;
97 for (size_t i = 0; i < sizeof(keyboard.map); i++) { 101 for (size_t i = 0; i < sizeof(input.map); i++) {
98 for (size_t j = 0; j < 8; j++) { 102 for (size_t j = 0; j < 8; j++) {
99 char key = keyboard.map[i] & (1 << j); 103 char key = input.map[i] & (1 << j);
100 if (key) { 104 if (key) {
101 char key_code = i * 8 + j; 105 char key_code = i * 8 + j;
102 // Normal keys. 106 // Normal keys.
@@ -200,15 +204,15 @@ handle_keyboard(void) {
200 } 204 }
201 } 205 }
202 206
203 if (controller_now != keyboard.controller) { 207 if (controller_now != input.controller) {
204 devctrl->dat[2] = controller_now; 208 devctrl->dat[2] = controller_now;
205 uxn_eval(&u, mempeek16(devctrl->dat, 0)); 209 uxn_eval(&u, mempeek16(devctrl->dat, 0));
206 keyboard.controller = controller_now; 210 input.controller = controller_now;
207 } 211 }
208 212
209 // Reset keyboard state. 213 // Reset input state.
210 devctrl->dat[3] = 0; 214 devctrl->dat[3] = 0;
211 memset(keyboard.map, 0, sizeof(keyboard.map)); 215 memset(input.map, 0, sizeof(input.map));
212} 216}
213 217
214void 218void