|
|
1.1 root 1: /*
2: Hatari - shortcut.c
3:
4: This file is distributed under the GNU Public License, version 2 or at
5: your option any later version. Read the file gpl.txt for details.
6:
7: Shortcut keys
8: */
9: const char ShortCut_fileid[] = "Hatari shortcut.c : " __DATE__ " " __TIME__;
10:
11: #include <SDL.h>
12:
13: #include "main.h"
14: #include "dialog.h"
15: #include "file.h"
16: #include "m68000.h"
1.1.1.5 ! root 17: #include "dimension.hpp"
1.1 root 18: #include "reset.h"
19: #include "screen.h"
20: #include "configuration.h"
21: #include "shortcut.h"
22: #include "debugui.h"
23: #include "sdlgui.h"
24: #include "video.h"
1.1.1.3 root 25: #include "snd.h"
26: #include "statusbar.h"
1.1 root 27:
28: static SHORTCUTKEYIDX ShortCutKey = SHORTCUT_NONE; /* current shortcut key */
29:
30:
31: /*-----------------------------------------------------------------------*/
32: /**
33: * Shortcut to toggle full-screen
34: */
35: static void ShortCut_FullScreen(void)
36: {
37: if (!bInFullScreen)
38: {
39: Screen_EnterFullScreen();
40: }
41: else
42: {
43: Screen_ReturnFromFullScreen();
44: }
45: }
46:
47:
48: /*-----------------------------------------------------------------------*/
49: /**
50: * Shortcut to toggle mouse grabbing mode
51: */
52: static void ShortCut_MouseGrab(void)
53: {
1.1.1.5 ! root 54:
1.1 root 55: bGrabMouse = !bGrabMouse; /* Toggle flag */
56:
57: /* If we are in windowed mode, toggle the mouse cursor mode now: */
58: if (!bInFullScreen)
59: {
60: if (bGrabMouse)
61: {
1.1.1.3 root 62: SDL_SetRelativeMouseMode(SDL_TRUE);
63: SDL_SetWindowGrab(sdlWindow, SDL_TRUE);
64: Main_SetTitle(MOUSE_LOCK_MSG);
1.1 root 65: }
66: else
67: {
1.1.1.3 root 68: SDL_SetRelativeMouseMode(SDL_FALSE);
69: SDL_SetWindowGrab(sdlWindow, SDL_FALSE);
70: Main_SetTitle(NULL);
1.1 root 71: }
72: }
73: }
74:
75:
76: /*-----------------------------------------------------------------------*/
77: /**
78: * Shortcut to sound on/off
79: */
80: static void ShortCut_SoundOnOff(void)
81: {
1.1.1.3 root 82: ConfigureParams.Sound.bEnableSound = !ConfigureParams.Sound.bEnableSound;
83:
84: Sound_Reset();
1.1 root 85: }
86:
87: /*-----------------------------------------------------------------------*/
88: /**
1.1.1.4 root 89: * Shorcut to M68K debug interface
1.1 root 90: */
1.1.1.4 root 91: void ShortCut_Debug_M68K(void)
1.1 root 92: {
93: int running;
94:
95: running = Main_PauseEmulation(true);
1.1.1.4 root 96: /* Call the debugger */
1.1 root 97: DebugUI();
98: if (running)
99: Main_UnPauseEmulation();
100: }
101:
1.1.1.4 root 102: /*-----------------------------------------------------------------------*/
103: /**
104: * Shorcut to I860 debug interface
105: */
106: void ShortCut_Debug_I860(void) {
107: int running;
108:
109: if (bInFullScreen)
110: Screen_ReturnFromFullScreen();
111:
112: running = Main_PauseEmulation(true);
113:
114: /* override paused message so that user knows to look into console
115: * on how to continue in case he invoked the debugger by accident.
116: */
117: Statusbar_AddMessage("I860 Console Debugger", 100);
118: Statusbar_Update(sdlscrn);
119:
120: /* disable normal GUI alerts while on console */
121: int alertLevel = Log_SetAlertLevel(LOG_FATAL);
122:
123: /* Call the debugger */
124: nd_start_debugger();
125: Log_SetAlertLevel(alertLevel);
126:
127: if (running)
128: Main_UnPauseEmulation();
129: }
1.1 root 130:
131: /*-----------------------------------------------------------------------*/
132: /**
133: * Shorcut to pausing
134: */
135: static void ShortCut_Pause(void)
136: {
137: if (!Main_UnPauseEmulation())
138: Main_PauseEmulation(true);
139: }
140:
141: /**
1.1.1.4 root 142: * Shorcut to switch monochrome and dimension screen
1.1 root 143: */
1.1.1.3 root 144: static void ShortCut_Dimension(void)
1.1 root 145: {
1.1.1.5 ! root 146: if (ConfigureParams.System.nMachineType==NEXT_STATION ||
! 147: ConfigureParams.Screen.nMonitorType==MONITOR_TYPE_DUAL) {
1.1.1.4 root 148: return;
149: }
1.1.1.5 ! root 150:
! 151: while (ConfigureParams.Screen.nMonitorNum < ND_MAX_BOARDS) {
! 152: if (ConfigureParams.Screen.nMonitorType==MONITOR_TYPE_CPU) {
! 153: ConfigureParams.Screen.nMonitorType = MONITOR_TYPE_DIMENSION;
! 154: ConfigureParams.Screen.nMonitorNum = 0;
1.1.1.3 root 155: } else {
1.1.1.5 ! root 156: ConfigureParams.Screen.nMonitorNum++;
! 157: }
! 158: if (ConfigureParams.Screen.nMonitorNum==ND_MAX_BOARDS) {
! 159: ConfigureParams.Screen.nMonitorType = MONITOR_TYPE_CPU;
! 160: ConfigureParams.Screen.nMonitorNum = 0;
! 161: break;
! 162: }
! 163: if (ConfigureParams.Dimension.board[ConfigureParams.Screen.nMonitorNum].bEnabled) {
! 164: break;
1.1.1.3 root 165: }
166: }
1.1.1.5 ! root 167:
1.1.1.3 root 168: Statusbar_UpdateInfo();
1.1 root 169: }
170:
171:
172: /*-----------------------------------------------------------------------*/
173: /**
174: * Check to see if pressed any shortcut keys, and call handling function
175: */
176: void ShortCut_ActKey(void)
177: {
178: if (ShortCutKey == SHORTCUT_NONE)
179: return;
180:
181: switch (ShortCutKey)
182: {
183: case SHORTCUT_OPTIONS:
184: Dialog_DoProperty(); /* Show options dialog */
185: break;
186: case SHORTCUT_FULLSCREEN:
187: ShortCut_FullScreen(); /* Switch between fullscreen/windowed mode */
188: break;
189: case SHORTCUT_MOUSEGRAB:
190: ShortCut_MouseGrab(); /* Toggle mouse grab */
191: break;
192: case SHORTCUT_COLDRESET:
193: Main_UnPauseEmulation();
194: Reset_Cold(); /* Reset emulator with 'cold' (clear all) */
195: break;
196: case SHORTCUT_SOUND:
197: ShortCut_SoundOnOff(); /* Enable/disable sound */
198: break;
1.1.1.4 root 199: case SHORTCUT_DEBUG_M68K:
200: ShortCut_Debug_M68K(); /* Invoke the Debug UI */
1.1 root 201: break;
1.1.1.4 root 202: case SHORTCUT_DEBUG_I860:
203: ShortCut_Debug_I860(); /* Invoke the M68K UI */
1.1.1.3 root 204: break;
1.1 root 205: case SHORTCUT_PAUSE:
206: ShortCut_Pause(); /* Invoke Pause */
207: break;
208: case SHORTCUT_QUIT:
209: Main_RequestQuit();
210: break;
1.1.1.3 root 211: case SHORTCUT_DIMENSION:
212: ShortCut_Dimension();
1.1 root 213: break;
214: case SHORTCUT_KEYS:
215: case SHORTCUT_NONE:
216: /* ERROR: cannot happen, just make compiler happy */
1.1.1.3 root 217: default:
1.1 root 218: break;
219: }
220: ShortCutKey = SHORTCUT_NONE;
221: }
222:
223:
224: /*-----------------------------------------------------------------------*/
225: /**
226: * Invoke shortcut identified by name. This supports only keys for
227: * functionality that cannot be invoked with command line options
228: * or otherwise for remote GUIs etc.
229: */
230: bool Shortcut_Invoke(const char *shortcut)
231: {
232: struct {
233: SHORTCUTKEYIDX id;
234: const char *name;
235: } shortcuts[] = {
236: { SHORTCUT_MOUSEGRAB, "mousegrab" },
237: { SHORTCUT_COLDRESET, "coldreset" },
238: { SHORTCUT_WARMRESET, "warmreset" },
239: { SHORTCUT_QUIT, "quit" },
240: { SHORTCUT_NONE, NULL }
241: };
242: int i;
243:
244: if (ShortCutKey != SHORTCUT_NONE)
245: {
246: fprintf(stderr, "Shortcut invocation failed, shortcut already active\n");
247: return false;
248: }
249: for (i = 0; shortcuts[i].name; i++)
250: {
251: if (strcmp(shortcut, shortcuts[i].name) == 0)
252: {
253: ShortCutKey = shortcuts[i].id;
254: ShortCut_ActKey();
255: ShortCutKey = SHORTCUT_NONE;
256: return true;
257: }
258: }
259: fprintf(stderr, "WARNING: unknown shortcut '%s'\n\n", shortcut);
260: fprintf(stderr, "Hatari shortcuts are:\n");
261: for (i = 0; shortcuts[i].name; i++)
262: {
263: fprintf(stderr, "- %s\n", shortcuts[i].name);
264: }
265: return false;
266: }
267:
268:
269: /*-----------------------------------------------------------------------*/
270: /**
271: * Check whether given key was any of the ones in given shortcut array.
272: * Return corresponding array index or SHORTCUT_NONE for no match
273: */
274: static SHORTCUTKEYIDX ShortCut_CheckKey(int symkey, int *keys)
275: {
276: SHORTCUTKEYIDX key;
277: for (key = SHORTCUT_OPTIONS; key < SHORTCUT_KEYS; key++)
278: {
279: if (symkey == keys[key])
280: return key;
281: }
282: return SHORTCUT_NONE;
283: }
284:
285: /*-----------------------------------------------------------------------*/
286: /**
287: * Check which Shortcut key is pressed/released.
288: * If press is set, store the key array index.
289: * Return zero if key didn't match to a shortcut
290: */
291: int ShortCut_CheckKeys(int modkey, int symkey, bool press)
292: {
293: SHORTCUTKEYIDX key;
294:
1.1.1.3 root 295: #if defined(__APPLE__)
296: if ((modkey&(KMOD_RCTRL|KMOD_LCTRL)) && (modkey&(KMOD_RALT|KMOD_LALT)))
297: #else
298: if (modkey & (KMOD_RALT|KMOD_LGUI|KMOD_RGUI|KMOD_MODE))
299: #endif
1.1 root 300: key = ShortCut_CheckKey(symkey, ConfigureParams.Shortcut.withModifier);
301: else
302: key = ShortCut_CheckKey(symkey, ConfigureParams.Shortcut.withoutModifier);
303:
304: if (key == SHORTCUT_NONE)
305: return 0;
306: if (press) {
307: ShortCutKey = key;
308: fprintf(stderr,"Short :%x\n",ShortCutKey);
309: }
310: return 1;
311: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.