diff --git a/gtk3/main.c b/gtk3/main.c index eaa6b5a..3c88f53 100644 --- a/gtk3/main.c +++ b/gtk3/main.c @@ -157,6 +157,42 @@ static GuiData gui_data = { }; GB_gameboy_t gb; +typedef enum { + INPUT_UP, + INPUT_DOWN, + INPUT_LEFT, + INPUT_RIGHT, + INPUT_A, + INPUT_B, + INPUT_START, + INPUT_SELECT, + + INPUT_TURBO, + INPUT_REWIND, + INPUT_SLOWDOWN, + + INPUT_FULLSCREEN, +} input_names_t; + +static unsigned key_map[] = { + [INPUT_UP] = GDK_KEY_w, + [INPUT_DOWN] = GDK_KEY_a, + [INPUT_LEFT] = GDK_KEY_s, + [INPUT_RIGHT] = GDK_KEY_d, + + [INPUT_A] = GDK_KEY_l, + [INPUT_B] = GDK_KEY_k, + + [INPUT_START] = GDK_KEY_h, + [INPUT_SELECT] = GDK_KEY_g, + + [INPUT_TURBO] = GDK_KEY_space, + [INPUT_REWIND] = GDK_KEY_Tab, + [INPUT_SLOWDOWN] = GDK_KEY_Shift_L, + + [INPUT_FULLSCREEN] = GDK_KEY_F11, +}; + // Forward declarations of the actions static void activate_open(GSimpleAction *action, GVariant *parameter, gpointer app); static void activate_close(GSimpleAction *action, GVariant *parameter, gpointer app); @@ -1458,52 +1494,45 @@ static void create_action_groups(GApplication *app) { static gboolean on_key_press(GtkWidget *w, GdkEventKey *event, gpointer data) { uint8_t mask; - // TODO: Allow control remapping in the GUI - switch (event->keyval) { - case GDK_KEY_w: mask = BUTTON_MASK_UP; break; - case GDK_KEY_a: mask = BUTTON_MASK_LEFT; break; - case GDK_KEY_s: mask = BUTTON_MASK_DOWN; break; - case GDK_KEY_d: mask = BUTTON_MASK_RIGHT; break; + if (event->keyval == key_map[INPUT_UP]) mask = BUTTON_MASK_UP; + if (event->keyval == key_map[INPUT_DOWN]) mask = BUTTON_MASK_DOWN; + if (event->keyval == key_map[INPUT_LEFT]) mask = BUTTON_MASK_LEFT; + if (event->keyval == key_map[INPUT_RIGHT]) mask = BUTTON_MASK_RIGHT; + if (event->keyval == key_map[INPUT_START]) mask = BUTTON_MASK_START; + if (event->keyval == key_map[INPUT_SELECT]) mask = BUTTON_MASK_SELECT; + if (event->keyval == key_map[INPUT_A]) mask = BUTTON_MASK_A; + if (event->keyval == key_map[INPUT_B]) mask = BUTTON_MASK_B; - case GDK_KEY_g: mask = BUTTON_MASK_SELECT; break; - case GDK_KEY_h: mask = BUTTON_MASK_START; break; + if (event->keyval == key_map[INPUT_REWIND]) { + gui_data.rewind_down = event->type == GDK_KEY_PRESS; + GB_set_turbo_mode(&gb, gui_data.turbo_down, gui_data.turbo_down && gui_data.rewind_down); - case GDK_KEY_k: mask = BUTTON_MASK_B; break; - case GDK_KEY_l: mask = BUTTON_MASK_A; break; - - case GDK_KEY_Tab: { - gui_data.rewind_down = event->type == GDK_KEY_PRESS; - GB_set_turbo_mode(&gb, gui_data.turbo_down, gui_data.turbo_down && gui_data.rewind_down); - - if (event->type == GDK_KEY_RELEASE) { - gui_data.rewind_paused = false; - } - break; } - - case GDK_KEY_space: { - gui_data.turbo_down = event->type == GDK_KEY_PRESS; - GB_audio_clear_queue(); - GB_set_turbo_mode(&gb, gui_data.turbo_down, gui_data.turbo_down && gui_data.rewind_down); - break; } - - case GDK_KEY_dead_acute: // fall through - case GDK_KEY_acute: // fall through - case GDK_KEY_apostrophe: - gui_data.underclock_down = event->type == GDK_KEY_PRESS; - break; - - case GDK_KEY_F11: { - if (event->type == GDK_KEY_RELEASE) { - if (gui_data.is_fullscreen) { - gtk_window_unfullscreen(GTK_WINDOW(gui_data.main_window)); - } - else { - gtk_window_fullscreen(GTK_WINDOW(gui_data.main_window)); - } - } - break; } + if (event->type == GDK_KEY_RELEASE) { + gui_data.rewind_paused = false; + } } + if (event->keyval == key_map[INPUT_TURBO]) { + gui_data.turbo_down = event->type == GDK_KEY_PRESS; + GB_audio_clear_queue(); + GB_set_turbo_mode(&gb, gui_data.turbo_down, gui_data.turbo_down && gui_data.rewind_down); + } + + if (event->keyval == key_map[INPUT_SLOWDOWN]) { + gui_data.underclock_down = event->type == GDK_KEY_PRESS; + } + + if (event->keyval == key_map[INPUT_FULLSCREEN]) { + if (event->type == GDK_KEY_RELEASE) { + if (gui_data.is_fullscreen) { + gtk_window_unfullscreen(GTK_WINDOW(gui_data.main_window)); + } + else { + gtk_window_fullscreen(GTK_WINDOW(gui_data.main_window)); + } + } + } + if (event->type == GDK_KEY_PRESS) { gui_data.pressed_buttons |= mask; }