diff options
author | Bad Diode <bd@badd10de.dev> | 2022-03-05 10:35:36 +0100 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2022-03-05 10:35:36 +0100 |
commit | d08a7dfac6ea835603a580668761aa27e70f669b (patch) | |
tree | a2839b8b9d077a1736b79275b23f65463db7e331 | |
parent | 9005cb1eb923fa154230aabc48a4fb73a2aabf12 (diff) | |
download | uxnfb-d08a7dfac6ea835603a580668761aa27e70f669b.tar.gz uxnfb-d08a7dfac6ea835603a580668761aa27e70f669b.zip |
Make keyboard path a compile time constant
-rw-r--r-- | Makefile | 3 | ||||
-rw-r--r-- | src/main.c | 48 |
2 files changed, 28 insertions, 23 deletions
@@ -8,6 +8,7 @@ UXN_HEAD := $(BASE_UXN)/src/uxn.h | |||
8 | TAL_SRC ?= $(BASE_UXN)/projects/examples/devices/screen.tal | 8 | TAL_SRC ?= $(BASE_UXN)/projects/examples/devices/screen.tal |
9 | UXN_ROM ?= $(BUILD_DIR)/rom.rom | 9 | UXN_ROM ?= $(BUILD_DIR)/rom.rom |
10 | UXN_ASM ?= $(BUILD_DIR)/uxnasm | 10 | UXN_ASM ?= $(BUILD_DIR)/uxnasm |
11 | KBD_PATH ?= /dev/input/event1 | ||
11 | 12 | ||
12 | CC ?= cc | 13 | CC ?= cc |
13 | CFLAGS := -Wall -Wextra -pedantic | 14 | CFLAGS := -Wall -Wextra -pedantic |
@@ -29,7 +30,7 @@ endif | |||
29 | main: $(BIN) | 30 | main: $(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) |
@@ -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 | ||
36 | typedef struct Keyboard { | 36 | typedef 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 | ||
42 | static Keyboard keyboard; | 42 | static Input input; |
43 | 43 | ||
44 | void | 44 | void |
45 | init_input(void) { | 45 | init_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 | ||
58 | void | 58 | void |
59 | poll_keyboard(void) { | 59 | poll_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 | ||
214 | void | 218 | void |