|
|
1.1 root 1: /*
2: * UAE - The Un*x Amiga Emulator
3: *
4: * Support for mapping SDL raw keycodes
5: *
6: * Copyright 2004 Richard Drummond
7: */
8:
9: #include "sysconfig.h"
10: #include "sysdeps.h"
11:
12: #include "options.h"
13: #include "inputdevice.h"
14: #include "keyboard.h"
15:
16: #include "hotkeys.h"
17: #include "keymap/keymap.h"
18: #include "keymap/keymap_all.h"
19: #include "sdlgfx.h"
20:
21: #include <SDL.h>
22:
23: /*
24: * This stuff is hacked together for now to get
25: * raw keyboard support working and tested.
26: *
27: * A cleaner implementation will be coming . . .
28: */
29: struct sdl_raw_keymap
30: {
31: int sdl_gfx_driver;
32: const char *name;
33: const struct uaekey_hostmap *keymap;
34: struct uae_hotkeyseq *hotkeys;
35: const int *modtable;
36: };
37:
38: static struct uae_input_device_kbr_default *keyboard = 0;
39: static const int *modkeytable;
40:
41: /*
42: * Table used to pick keymapping based on SDL gfx driver
43: */
44: static const struct sdl_raw_keymap keymaps[] = {
45: #if (defined __i386__ || defined __x86_64__ || defined __powerpc__ || defined __ppc__) && defined __linux__
46: { SDLGFX_DRIVER_X11, "x11pc", x11pc_keymap, x11pc_hotkeys, 0},
47: { SDLGFX_DRIVER_DGA, "x11pc", x11pc_keymap, x11pc_hotkeys, 0},
48: #endif
49: #if (defined __powerpc__ || defined __ppc__) && defined __APPLE__
50: { SDLGFX_DRIVER_QUARTZ, "quartz", quartz_keymap, quartz_hotkeys, quartz_modkeytable},
51: #endif
52: #ifdef __BEOS__
53: { SDLGFX_DRIVER_BWINDOW, "beos", beos_keymap, beos_hotkeys, 0},
54: #endif
55: #ifdef TARGET_AMIGAOS
56: # ifdef __amigaos4__
57: { SDLGFX_DRIVER_AMIGAOS4, "amiga", amiga_keymap, amiga_hotkeys, 0},
58: # else
59: { SDLGFX_DRIVER_CYBERGFX, "amiga", amiga_keymap, amiga_hotkeys, 0},
60: # endif
61: #endif
62: { 0, 0, 0, 0, 0 }
63: };
64:
65: struct uae_input_device_kbr_default *get_default_raw_keymap (int type)
66: {
67: const struct sdl_raw_keymap *k = &keymaps[0];
68:
69: if (!keyboard) {
70: free (keyboard);
71: keyboard = 0;
72: }
73:
74: while (k->sdl_gfx_driver != type && k->sdl_gfx_driver != 0)
75: k++;
76:
77: if (k->keymap) {
78: write_log ("Found %s raw keyboard mapping\n", k->name);
79: modkeytable = k->modtable;
80: keyboard = uaekey_make_default_kbr (k->keymap);
81: }
82:
83: return keyboard;
84: }
85:
86: struct uae_hotkeyseq *get_default_raw_hotkeys (void)
87: {
88: const struct sdl_raw_keymap *k = &keymaps[0];
89:
90: while (k->sdl_gfx_driver != get_sdlgfx_type())
91: k++;
92:
93: return k->hotkeys;
94: }
95:
96:
97: /*
98: * Map SDL modifier key to raw key code
99: *
100: * This is required on platforms where the modifiers keys aren't
101: * reported with a raw key code - but SDL_GetModState() works, e.g.,
102: * on OS X.
103: */
104: int modifier_hack (int *scancode, int *pressed)
105: {
106: int result = 1;
107:
108: static int old_modifiers = 0;
109: int modifiers = SDL_GetModState ();
110:
111: if (modkeytable && modifiers != old_modifiers) {
112: if ((modifiers & KMOD_LSHIFT) != (old_modifiers & KMOD_LSHIFT)) {
113: *scancode = modkeytable[UAEMODKEY_LSHIFT];
114: *pressed = modifiers & KMOD_LSHIFT;
115: } else if ((modifiers & KMOD_RSHIFT) != (old_modifiers & KMOD_RSHIFT)) {
116: *scancode = modkeytable[UAEMODKEY_RSHIFT];
117: *pressed = modifiers & KMOD_RSHIFT;
118: } else if ((modifiers & KMOD_LCTRL) != (old_modifiers & KMOD_LCTRL)) {
119: *scancode = modkeytable[UAEMODKEY_LCTRL];
120: *pressed = modifiers & KMOD_LCTRL;
121: } else if ((modifiers & KMOD_RCTRL) != (old_modifiers & KMOD_RCTRL)) {
122: *scancode = modkeytable[UAEMODKEY_RCTRL];
123: *pressed = modifiers & KMOD_RCTRL;
124: } else if ((modifiers & KMOD_LALT) != (old_modifiers & KMOD_LALT)) {
125: *scancode = modkeytable[UAEMODKEY_LALT];
126: *pressed = modifiers & KMOD_LALT;
127: } else if ((modifiers & KMOD_RALT) != (old_modifiers & KMOD_RALT)) {
128: *scancode = modkeytable[UAEMODKEY_RALT];
129: *pressed = modifiers & KMOD_RALT;
130: } else if ((modifiers & KMOD_LMETA) != (old_modifiers & KMOD_LMETA)) {
131: *scancode = modkeytable[UAEMODKEY_LSUPER];
132: *pressed = modifiers & KMOD_LMETA;
133: } else if ((modifiers & KMOD_RMETA) != (old_modifiers & KMOD_RMETA)) {
134: *scancode = modkeytable[UAEMODKEY_RSUPER];
135: *pressed = modifiers & KMOD_RMETA;
136: } else if ((modifiers & KMOD_CAPS) != (old_modifiers & KMOD_CAPS)) {
137: *scancode = modkeytable[UAEMODKEY_CAPSLOCK];
138: *pressed = modifiers & KMOD_CAPS;
139: } else
140: result = 0;
141: old_modifiers = modifiers;
142: } else
143: result = 0;
144:
145: return result;
146: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.