Move all input handling into input module
This commit is contained in:
85
input.c
85
input.c
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user