Move all input handling into input module

This commit is contained in:
2025-10-18 17:43:22 +01:00
parent f992dd3d39
commit 79dc3c1256
5 changed files with 88 additions and 103 deletions

85
input.c
View File

@@ -10,19 +10,67 @@ enum {
RELEASE = 0,
PRESS = 1,
REPEAT = 2,
NCALLBACKS,
};
input_state_t input;
static int input_fd;
static input_callback_t callbacks[NCALLBACKS];
static input_callback_t shoot;
static void key_press(int key)
{
switch (key) {
case KEY_Q:
input.quit = true;
break;
case KEY_UP:
++input.thrust;
break;
case KEY_LEFT:
++input.spin;
break;
case KEY_RIGHT:
--input.spin;
break;
case KEY_SPACE:
if (shoot != nullptr)
shoot();
break;
}
}
static void key_release(int key)
{
switch (key) {
case KEY_UP:
--input.thrust;
break;
case KEY_LEFT:
--input.spin;
break;
case KEY_RIGHT:
++input.spin;
break;
}
}
static void key_repeat(int key)
{
if (key == KEY_SPACE && shoot != nullptr)
shoot();
}
int input_init()
{
memset(callbacks, 0, sizeof(callbacks));
memset(&input, 0, sizeof(input));
shoot = nullptr;
input_fd = open("/dev/input/event0", O_RDONLY);
assert(input_fd != -1);
const int res = ioctl(input_fd, EVIOCGRAB, (void *)1);
assert(res != -1);
@@ -35,19 +83,9 @@ void input_cleanup()
close(input_fd);
}
void input_on_press(input_callback_t cb)
void input_on_shoot(input_callback_t cb)
{
callbacks[PRESS] = cb;
}
void input_on_release(input_callback_t cb)
{
callbacks[RELEASE] = cb;
}
void input_on_repeat(input_callback_t cb)
{
callbacks[REPEAT] = cb;
shoot = cb;
}
void input_handle()
@@ -55,8 +93,17 @@ void input_handle()
struct input_event ev;
const int len = read(input_fd, &ev, sizeof(ev));
assert(len == sizeof(ev));
if (ev.type == EV_KEY && 0 <= ev.value && ev.value < NCALLBACKS) {
if (callbacks[ev.value] != nullptr)
callbacks[ev.value](ev.code);
if (ev.type == EV_KEY) {
switch (ev.value) {
case PRESS:
key_press(ev.code);
break;
case RELEASE:
key_release(ev.code);
break;
case REPEAT:
key_repeat(ev.code);
break;
}
}
}