nkeynes@1015: /** nkeynes@1015: * $Id: $ nkeynes@1015: * nkeynes@1015: * Handles hotkeys for pause/continue, save states, quit, etc nkeynes@1015: * nkeynes@1015: * Copyright (c) 2009 wahrhaft nkeynes@1015: * nkeynes@1015: * This program is free software; you can redistribute it and/or modify nkeynes@1015: * it under the terms of the GNU General Public License as published by nkeynes@1015: * the Free Software Foundation; either version 2 of the License, or nkeynes@1015: * (at your option) any later version. nkeynes@1015: * nkeynes@1015: * This program is distributed in the hope that it will be useful, nkeynes@1015: * but WITHOUT ANY WARRANTY; without even the implied warranty of nkeynes@1015: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the nkeynes@1015: * GNU General Public License for more details. nkeynes@1015: */ nkeynes@1015: #include nkeynes@1015: #include nkeynes@1015: #include nkeynes@1015: #include nkeynes@1015: #include nkeynes@1015: #include "lxdream.h" nkeynes@1015: #include "dreamcast.h" nkeynes@1015: #include "display.h" nkeynes@1015: #include "hotkeys.h" nkeynes@1015: #include "gui.h" nkeynes@1015: #include "config.h" nkeynes@1015: nkeynes@1015: static void hotkey_resume_callback( void *mdev, uint32_t value, uint32_t pressure, gboolean isKeyDown ); nkeynes@1015: static void hotkey_stop_callback( void *mdev, uint32_t value, uint32_t pressure, gboolean isKeyDown ); nkeynes@1015: static void hotkey_reset_callback( void *mdev, uint32_t value, uint32_t pressure, gboolean isKeyDown ); nkeynes@1015: static void hotkey_exit_callback( void *mdev, uint32_t value, uint32_t pressure, gboolean isKeyDown ); nkeynes@1015: static void hotkey_state_select_callback( void *mdev, uint32_t value, uint32_t pressure, gboolean isKeyDown ); nkeynes@1015: static void hotkey_state_save_callback( void *mdev, uint32_t value, uint32_t pressure, gboolean isKeyDown ); nkeynes@1015: static void hotkey_state_load_callback( void *mdev, uint32_t value, uint32_t pressure, gboolean isKeyDown ); nkeynes@1015: nkeynes@1015: static char *set_current_state_filename(int filenum); nkeynes@1015: nkeynes@1015: static char *current_save_state; nkeynes@1015: nkeynes@1015: struct lxdream_config_entry hotkeys_config[] = { nkeynes@1015: {"resume", N_("Resume emulation"), CONFIG_TYPE_KEY}, nkeynes@1015: {"stop", N_("Stop emulation"), CONFIG_TYPE_KEY}, nkeynes@1015: {"reset", N_("Reset emulator"), CONFIG_TYPE_KEY}, nkeynes@1015: {"exit", N_("Exit emulator"), CONFIG_TYPE_KEY}, nkeynes@1015: {"save", N_("Save current quick save"), CONFIG_TYPE_KEY}, nkeynes@1015: {"load", N_("Load current quick save"), CONFIG_TYPE_KEY}, nkeynes@1015: {"state1", N_("Select quick save state 1"), CONFIG_TYPE_KEY}, nkeynes@1015: {"state2", N_("Select quick save state 2"), CONFIG_TYPE_KEY}, nkeynes@1015: {"state3", N_("Select quick save state 3"), CONFIG_TYPE_KEY}, nkeynes@1015: {"state4", N_("Select quick save state 4"), CONFIG_TYPE_KEY}, nkeynes@1015: {"state5", N_("Select quick save state 5"), CONFIG_TYPE_KEY}, nkeynes@1015: {"state6", N_("Select quick save state 6"), CONFIG_TYPE_KEY}, nkeynes@1015: {"state7", N_("Select quick save state 7"), CONFIG_TYPE_KEY}, nkeynes@1015: {"state8", N_("Select quick save state 8"), CONFIG_TYPE_KEY}, nkeynes@1015: {"state9", N_("Select quick save state 9"), CONFIG_TYPE_KEY}, nkeynes@1015: {NULL, CONFIG_TYPE_NONE} nkeynes@1015: }; nkeynes@1015: nkeynes@1015: void hotkeys_init() { nkeynes@1015: nkeynes@1015: char *home = getenv("HOME"); nkeynes@1015: char *save_path = g_strdup_printf("%s/.lxdream", home); nkeynes@1015: mkdir(save_path, S_IRWXU); nkeynes@1015: g_free(save_path); nkeynes@1015: nkeynes@1015: set_current_state_filename(1); nkeynes@1015: nkeynes@1015: hotkeys_register_keys(); nkeynes@1015: } nkeynes@1015: nkeynes@1015: void hotkeys_register_keys() nkeynes@1015: { nkeynes@1015: input_register_key(hotkeys_config[0].value, &hotkey_resume_callback, NULL, 0); nkeynes@1015: input_register_key(hotkeys_config[1].value, &hotkey_stop_callback, NULL, 0); nkeynes@1015: input_register_key(hotkeys_config[2].value, &hotkey_reset_callback, NULL, 0); nkeynes@1015: input_register_key(hotkeys_config[3].value, &hotkey_exit_callback, NULL, 0); nkeynes@1015: input_register_key(hotkeys_config[4].value, &hotkey_state_save_callback, NULL, 0); nkeynes@1015: input_register_key(hotkeys_config[5].value, &hotkey_state_load_callback, NULL, 0); nkeynes@1015: for (int i = 0; i < 9; i++) nkeynes@1015: { nkeynes@1015: input_register_key(hotkeys_config[6 + i].value, &hotkey_state_select_callback, NULL, i); nkeynes@1015: } nkeynes@1015: } nkeynes@1015: nkeynes@1015: void hotkeys_unregister_keys() nkeynes@1015: { nkeynes@1015: input_unregister_key(hotkeys_config[0].value, &hotkey_resume_callback, NULL, 0); nkeynes@1015: input_unregister_key(hotkeys_config[1].value, &hotkey_stop_callback, NULL, 0); nkeynes@1015: input_unregister_key(hotkeys_config[2].value, &hotkey_reset_callback, NULL, 0); nkeynes@1015: input_unregister_key(hotkeys_config[3].value, &hotkey_exit_callback, NULL, 0); nkeynes@1015: input_unregister_key(hotkeys_config[4].value, &hotkey_state_save_callback, NULL, 0); nkeynes@1015: input_unregister_key(hotkeys_config[5].value, &hotkey_state_load_callback, NULL, 0); nkeynes@1015: for (int i = 0; i < 9; i++) nkeynes@1015: { nkeynes@1015: input_unregister_key(hotkeys_config[6 + i].value, &hotkey_state_select_callback, NULL, i); nkeynes@1015: } nkeynes@1015: } nkeynes@1015: nkeynes@1015: lxdream_config_entry_t hotkeys_get_config() nkeynes@1015: { nkeynes@1015: return hotkeys_config; nkeynes@1015: } nkeynes@1015: nkeynes@1015: nkeynes@1015: static void hotkey_resume_callback( void *mdev, uint32_t value, uint32_t pressure, gboolean isKeyDown ) nkeynes@1015: { nkeynes@1015: if (isKeyDown && !dreamcast_is_running() ) { nkeynes@1019: gui_do_later(dreamcast_run); nkeynes@1015: } nkeynes@1015: } nkeynes@1015: nkeynes@1015: static void hotkey_stop_callback( void *mdev, uint32_t value, uint32_t pressure, gboolean isKeyDown ) nkeynes@1015: { nkeynes@1015: if (isKeyDown && dreamcast_is_running() ) { nkeynes@1019: gui_do_later(dreamcast_stop); nkeynes@1015: } nkeynes@1015: } nkeynes@1015: nkeynes@1015: static void hotkey_reset_callback( void *mdev, uint32_t value, uint32_t pressure, gboolean isKeyDown ) nkeynes@1015: { nkeynes@1015: if (isKeyDown) { nkeynes@1015: dreamcast_reset(); nkeynes@1015: } nkeynes@1015: } nkeynes@1015: nkeynes@1015: static void hotkey_exit_callback( void *mdev, uint32_t value, uint32_t pressure, gboolean isKeyDown ) nkeynes@1015: { nkeynes@1015: if (isKeyDown) { nkeynes@1015: dreamcast_shutdown(); nkeynes@1015: } nkeynes@1015: exit(0); nkeynes@1015: } nkeynes@1015: nkeynes@1015: static void hotkey_state_select_callback( void *mdev, uint32_t value, uint32_t pressure, gboolean isKeyDown ) nkeynes@1015: { nkeynes@1015: if (isKeyDown) { nkeynes@1015: INFO("state select callback called (%d)", value); nkeynes@1015: assert(value > 0 && value <= 9); nkeynes@1015: set_current_state_filename(value); nkeynes@1015: } nkeynes@1015: } nkeynes@1015: nkeynes@1015: static void hotkey_state_save_callback( void *mdev, uint32_t value, uint32_t pressure, gboolean isKeyDown ) nkeynes@1015: { nkeynes@1015: if (isKeyDown) { nkeynes@1015: if (current_save_state != NULL) nkeynes@1015: dreamcast_save_state(current_save_state); nkeynes@1015: } nkeynes@1015: } nkeynes@1015: nkeynes@1015: static void hotkey_state_load_callback( void *mdev, uint32_t value, uint32_t pressure, gboolean isKeyDown ) nkeynes@1015: { nkeynes@1015: if (isKeyDown) { nkeynes@1015: if (current_save_state != NULL) nkeynes@1015: dreamcast_load_state(current_save_state); nkeynes@1015: } nkeynes@1015: } nkeynes@1015: nkeynes@1015: static char *set_current_state_filename(int filenum) nkeynes@1015: { nkeynes@1015: char *home = getenv("HOME"); nkeynes@1015: if (current_save_state != NULL) nkeynes@1015: g_free(current_save_state); nkeynes@1015: current_save_state = g_strdup_printf("%s/.lxdream/quicksave%d.dst", home, filenum); nkeynes@1015: } nkeynes@1015: