filename | src/hotkeys.c |
changeset | 1019:87f191f92f8f |
prev | 1015:ad448bedc48a |
next | 1024:c67f2d61ab97 |
author | nkeynes |
date | Wed Jun 03 10:29:16 2009 +0000 (12 years ago) |
permissions | -rw-r--r-- |
last change | Allow multiple input hooks to be registered for the same key - useful to allow eg binding the same hotkey for run/stop so that it works as a toggle. |
view | annotate | diff | log | raw |
1 /**
2 * $Id: $
3 *
4 * Handles hotkeys for pause/continue, save states, quit, etc
5 *
6 * Copyright (c) 2009 wahrhaft
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 */
18 #include <assert.h>
19 #include <glib.h>
20 #include <sys/stat.h>
21 #include <stdint.h>
22 #include <stdlib.h>
23 #include "lxdream.h"
24 #include "dreamcast.h"
25 #include "display.h"
26 #include "hotkeys.h"
27 #include "gui.h"
28 #include "drivers/input_lirc.h"
29 #include "config.h"
31 static void hotkey_resume_callback( void *mdev, uint32_t value, uint32_t pressure, gboolean isKeyDown );
32 static void hotkey_stop_callback( void *mdev, uint32_t value, uint32_t pressure, gboolean isKeyDown );
33 static void hotkey_reset_callback( void *mdev, uint32_t value, uint32_t pressure, gboolean isKeyDown );
34 static void hotkey_exit_callback( void *mdev, uint32_t value, uint32_t pressure, gboolean isKeyDown );
35 static void hotkey_state_select_callback( void *mdev, uint32_t value, uint32_t pressure, gboolean isKeyDown );
36 static void hotkey_state_save_callback( void *mdev, uint32_t value, uint32_t pressure, gboolean isKeyDown );
37 static void hotkey_state_load_callback( void *mdev, uint32_t value, uint32_t pressure, gboolean isKeyDown );
39 static char *set_current_state_filename(int filenum);
41 static char *current_save_state;
43 struct lxdream_config_entry hotkeys_config[] = {
44 {"resume", N_("Resume emulation"), CONFIG_TYPE_KEY},
45 {"stop", N_("Stop emulation"), CONFIG_TYPE_KEY},
46 {"reset", N_("Reset emulator"), CONFIG_TYPE_KEY},
47 {"exit", N_("Exit emulator"), CONFIG_TYPE_KEY},
48 {"save", N_("Save current quick save"), CONFIG_TYPE_KEY},
49 {"load", N_("Load current quick save"), CONFIG_TYPE_KEY},
50 {"state1", N_("Select quick save state 1"), CONFIG_TYPE_KEY},
51 {"state2", N_("Select quick save state 2"), CONFIG_TYPE_KEY},
52 {"state3", N_("Select quick save state 3"), CONFIG_TYPE_KEY},
53 {"state4", N_("Select quick save state 4"), CONFIG_TYPE_KEY},
54 {"state5", N_("Select quick save state 5"), CONFIG_TYPE_KEY},
55 {"state6", N_("Select quick save state 6"), CONFIG_TYPE_KEY},
56 {"state7", N_("Select quick save state 7"), CONFIG_TYPE_KEY},
57 {"state8", N_("Select quick save state 8"), CONFIG_TYPE_KEY},
58 {"state9", N_("Select quick save state 9"), CONFIG_TYPE_KEY},
59 {NULL, CONFIG_TYPE_NONE}
60 };
62 void hotkeys_init() {
64 #ifdef HAVE_LIRC
65 input_lirc_create();
66 #endif
68 char *home = getenv("HOME");
69 char *save_path = g_strdup_printf("%s/.lxdream", home);
70 mkdir(save_path, S_IRWXU);
71 g_free(save_path);
73 set_current_state_filename(1);
75 hotkeys_register_keys();
76 }
78 void hotkeys_register_keys()
79 {
80 input_register_key(hotkeys_config[0].value, &hotkey_resume_callback, NULL, 0);
81 input_register_key(hotkeys_config[1].value, &hotkey_stop_callback, NULL, 0);
82 input_register_key(hotkeys_config[2].value, &hotkey_reset_callback, NULL, 0);
83 input_register_key(hotkeys_config[3].value, &hotkey_exit_callback, NULL, 0);
84 input_register_key(hotkeys_config[4].value, &hotkey_state_save_callback, NULL, 0);
85 input_register_key(hotkeys_config[5].value, &hotkey_state_load_callback, NULL, 0);
86 for (int i = 0; i < 9; i++)
87 {
88 input_register_key(hotkeys_config[6 + i].value, &hotkey_state_select_callback, NULL, i);
89 }
90 }
92 void hotkeys_unregister_keys()
93 {
94 input_unregister_key(hotkeys_config[0].value, &hotkey_resume_callback, NULL, 0);
95 input_unregister_key(hotkeys_config[1].value, &hotkey_stop_callback, NULL, 0);
96 input_unregister_key(hotkeys_config[2].value, &hotkey_reset_callback, NULL, 0);
97 input_unregister_key(hotkeys_config[3].value, &hotkey_exit_callback, NULL, 0);
98 input_unregister_key(hotkeys_config[4].value, &hotkey_state_save_callback, NULL, 0);
99 input_unregister_key(hotkeys_config[5].value, &hotkey_state_load_callback, NULL, 0);
100 for (int i = 0; i < 9; i++)
101 {
102 input_unregister_key(hotkeys_config[6 + i].value, &hotkey_state_select_callback, NULL, i);
103 }
104 }
106 lxdream_config_entry_t hotkeys_get_config()
107 {
108 return hotkeys_config;
109 }
112 static void hotkey_resume_callback( void *mdev, uint32_t value, uint32_t pressure, gboolean isKeyDown )
113 {
114 if (isKeyDown && !dreamcast_is_running() ) {
115 gui_do_later(dreamcast_run);
116 }
117 }
119 static void hotkey_stop_callback( void *mdev, uint32_t value, uint32_t pressure, gboolean isKeyDown )
120 {
121 if (isKeyDown && dreamcast_is_running() ) {
122 gui_do_later(dreamcast_stop);
123 }
124 }
126 static void hotkey_reset_callback( void *mdev, uint32_t value, uint32_t pressure, gboolean isKeyDown )
127 {
128 if (isKeyDown) {
129 dreamcast_reset();
130 }
131 }
133 static void hotkey_exit_callback( void *mdev, uint32_t value, uint32_t pressure, gboolean isKeyDown )
134 {
135 if (isKeyDown) {
136 dreamcast_shutdown();
137 }
138 exit(0);
139 }
141 static void hotkey_state_select_callback( void *mdev, uint32_t value, uint32_t pressure, gboolean isKeyDown )
142 {
143 if (isKeyDown) {
144 INFO("state select callback called (%d)", value);
145 assert(value > 0 && value <= 9);
146 set_current_state_filename(value);
147 }
148 }
150 static void hotkey_state_save_callback( void *mdev, uint32_t value, uint32_t pressure, gboolean isKeyDown )
151 {
152 if (isKeyDown) {
153 if (current_save_state != NULL)
154 dreamcast_save_state(current_save_state);
155 }
156 }
158 static void hotkey_state_load_callback( void *mdev, uint32_t value, uint32_t pressure, gboolean isKeyDown )
159 {
160 if (isKeyDown) {
161 if (current_save_state != NULL)
162 dreamcast_load_state(current_save_state);
163 }
164 }
166 static char *set_current_state_filename(int filenum)
167 {
168 char *home = getenv("HOME");
169 if (current_save_state != NULL)
170 g_free(current_save_state);
171 current_save_state = g_strdup_printf("%s/.lxdream/quicksave%d.dst", home, filenum);
172 }
.