Commit | Line | Data |
---|---|---|
58fc34b1 | 1 | #include <stdio.h> |
d4bea61c | 2 | #include <stdlib.h> |
58fc34b1 | 3 | #include <string.h> |
d4bea61c PC |
4 | #include <SDL_keysym.h> |
5 | ||
6 | #include "../libpicofe/input.h" | |
7 | #include "../libpicofe/in_sdl.h" | |
58fc34b1 | 8 | #include "../libpicofe/plat.h" |
d4bea61c | 9 | #include "../common/input_pico.h" |
b437951a | 10 | #include "../common/plat_sdl.h" |
58fc34b1 | 11 | #include "../common/emu.h" |
d4bea61c | 12 | |
c12b126f | 13 | struct in_default_bind _in_sdl_defbinds[] = { |
8c54e0dd | 14 | { SDLK_UP, IN_BINDTYPE_PLAYER12, GBTN_UP }, |
d4bea61c PC |
15 | { SDLK_DOWN, IN_BINDTYPE_PLAYER12, GBTN_DOWN }, |
16 | { SDLK_LEFT, IN_BINDTYPE_PLAYER12, GBTN_LEFT }, | |
17 | { SDLK_RIGHT, IN_BINDTYPE_PLAYER12, GBTN_RIGHT }, | |
18 | { SDLK_LSHIFT, IN_BINDTYPE_PLAYER12, GBTN_A }, | |
19 | { SDLK_LALT, IN_BINDTYPE_PLAYER12, GBTN_B }, | |
20 | { SDLK_LCTRL, IN_BINDTYPE_PLAYER12, GBTN_C }, | |
21 | { SDLK_RETURN, IN_BINDTYPE_PLAYER12, GBTN_START }, | |
22 | { SDLK_ESCAPE, IN_BINDTYPE_EMU, PEVB_MENU }, | |
23 | { SDLK_TAB, IN_BINDTYPE_EMU, PEVB_PICO_PPREV }, | |
24 | { SDLK_BACKSPACE, IN_BINDTYPE_EMU, PEVB_PICO_PNEXT }, | |
25 | { SDLK_BACKSPACE, IN_BINDTYPE_EMU, PEVB_STATE_SAVE }, | |
26 | { SDLK_TAB, IN_BINDTYPE_EMU, PEVB_STATE_LOAD }, | |
27 | { SDLK_SPACE, IN_BINDTYPE_EMU, PEVB_FF }, | |
28 | { 0, 0, 0 } | |
29 | }; | |
c12b126f | 30 | const struct in_default_bind *in_sdl_defbinds = _in_sdl_defbinds; |
d4bea61c | 31 | |
58fc34b1 | 32 | struct menu_keymap _in_sdl_key_map[] = { |
d4bea61c PC |
33 | { SDLK_UP, PBTN_UP }, |
34 | { SDLK_DOWN, PBTN_DOWN }, | |
35 | { SDLK_LEFT, PBTN_LEFT }, | |
36 | { SDLK_RIGHT, PBTN_RIGHT }, | |
37 | { SDLK_LCTRL, PBTN_MOK }, | |
38 | { SDLK_LALT, PBTN_MBACK }, | |
39 | { SDLK_SPACE, PBTN_MA2 }, | |
40 | { SDLK_LSHIFT, PBTN_MA3 }, | |
41 | { SDLK_TAB, PBTN_L }, | |
42 | { SDLK_BACKSPACE, PBTN_R }, | |
43 | }; | |
58fc34b1 | 44 | const int in_sdl_key_map_sz = sizeof(_in_sdl_key_map) / sizeof(_in_sdl_key_map[0]); |
45 | const struct menu_keymap *in_sdl_key_map = _in_sdl_key_map; | |
d4bea61c | 46 | |
58fc34b1 | 47 | const struct menu_keymap _in_sdl_joy_map[] = { |
b437951a | 48 | { SDLK_UP, PBTN_UP }, |
49 | { SDLK_DOWN, PBTN_DOWN }, | |
50 | { SDLK_LEFT, PBTN_LEFT }, | |
51 | { SDLK_RIGHT, PBTN_RIGHT }, | |
52 | /* joystick */ | |
53 | { SDLK_WORLD_0, PBTN_MOK }, | |
54 | { SDLK_WORLD_1, PBTN_MBACK }, | |
55 | { SDLK_WORLD_2, PBTN_MA2 }, | |
56 | { SDLK_WORLD_3, PBTN_MA3 }, | |
57 | }; | |
58fc34b1 | 58 | const int in_sdl_joy_map_sz = sizeof(_in_sdl_joy_map) / sizeof(_in_sdl_joy_map[0]); |
59 | const struct menu_keymap *in_sdl_joy_map = _in_sdl_joy_map; | |
b437951a | 60 | |
58fc34b1 | 61 | const char * _in_sdl_key_names[SDLK_LAST] = { |
62 | /* common */ | |
d4bea61c PC |
63 | [SDLK_UP] = "UP", |
64 | [SDLK_DOWN] = "DOWN", | |
65 | [SDLK_LEFT] = "LEFT", | |
66 | [SDLK_RIGHT] = "RIGHT", | |
67 | [SDLK_LCTRL] = "A", | |
68 | [SDLK_LALT] = "B", | |
8c54e0dd | 69 | [SDLK_LSHIFT] = "Y", |
70 | [SDLK_SPACE] = "X", | |
d4bea61c PC |
71 | [SDLK_RETURN] = "START", |
72 | [SDLK_ESCAPE] = "SELECT", | |
250c8ffb | 73 | [SDLK_TAB] = "L1", |
74 | [SDLK_BACKSPACE] = "R1", | |
58fc34b1 | 75 | |
76 | /* opendingux rg, gkd etc */ | |
250c8ffb | 77 | [SDLK_PAGEUP] = "L2", |
78 | [SDLK_PAGEDOWN] = "R2", | |
79 | [SDLK_KP_DIVIDE] = "L3", | |
80 | [SDLK_KP_PERIOD] = "R3", | |
81 | [SDLK_HOME] = "POWER", | |
fb79e7ba | 82 | /* gkd (mini) */ |
83 | /*[SDLK_HOME] = "MENU",*/ | |
84 | [SDLK_END] = "EXIT", | |
58fc34b1 | 85 | /* gcw0 */ |
86 | [SDLK_POWER] = "POWER", | |
87 | [SDLK_PAUSE] = "LOCK", | |
88 | /* miyoo */ | |
89 | [SDLK_RALT] = "L2", | |
90 | [SDLK_RSHIFT] = "R2", | |
91 | [SDLK_RCTRL] = "RESET", | |
fb79e7ba | 92 | /* retrofw */ |
93 | [SDLK_LEFTBRACKET] = "SETUP", /* actually brightness setting */ | |
94 | /*[SDLK_END] = "POWER",*/ | |
8c54e0dd | 95 | }; |
58fc34b1 | 96 | const char * const *in_sdl_key_names = _in_sdl_key_names; |
97 | ||
98 | ||
99 | static void nameset(int x1, const char *name) | |
100 | { | |
101 | _in_sdl_key_names[x1] = name; | |
102 | } | |
103 | ||
104 | static void nameswap(int x1, int x2) | |
105 | { | |
106 | const char **p = &_in_sdl_key_names[x1]; | |
107 | const char **q = &_in_sdl_key_names[x2]; | |
108 | const char *t = *p; *p = *q; *q = t; | |
109 | } | |
110 | ||
111 | static void keyswap(int k1, int k2) | |
112 | { | |
113 | int x1, x2, t; | |
114 | ||
115 | for (x1 = in_sdl_key_map_sz-1; x1 >= 0; x1--) | |
116 | if (_in_sdl_key_map[x1].key == k1) break; | |
117 | for (x2 = in_sdl_key_map_sz-1; x2 >= 0; x2--) | |
118 | if (_in_sdl_key_map[x2].key == k2) break; | |
119 | if (x1 >= 0 && x2 >= 0) { | |
120 | struct menu_keymap *p = &_in_sdl_key_map[x1]; | |
121 | struct menu_keymap *q = &_in_sdl_key_map[x2]; | |
122 | t = p->pbtn; p->pbtn = q->pbtn; q->pbtn = t; | |
123 | } | |
124 | } | |
125 | ||
c12b126f | 126 | static void bindswap(int k1, int k2) |
127 | { | |
128 | int i; | |
129 | ||
130 | for (i = 0; _in_sdl_defbinds[i].code; i++) | |
131 | if (_in_sdl_defbinds[i].code == k1) | |
132 | _in_sdl_defbinds[i].code = k2; | |
133 | } | |
134 | ||
58fc34b1 | 135 | void plat_target_setup_input(void) |
136 | { | |
137 | if (strcmp(plat_device, "miyoo") == 0) { | |
138 | /* swapped A/B and X/Y keys */ | |
139 | keyswap(SDLK_LALT, SDLK_LCTRL); | |
140 | nameswap(SDLK_LALT, SDLK_LCTRL); | |
141 | nameswap(SDLK_SPACE, SDLK_LSHIFT); | |
c12b126f | 142 | bindswap(SDLK_ESCAPE, SDLK_RCTRL); |
58fc34b1 | 143 | } else if (strcmp(plat_device, "gcw0") == 0) { |
144 | /* swapped X/Y keys, single L/R keys */ | |
145 | nameswap(SDLK_SPACE, SDLK_LSHIFT); | |
146 | nameset(SDLK_TAB, "L"); nameset(SDLK_BACKSPACE, "R"); | |
147 | } else if (strcmp(plat_device, "retrofw") == 0 || strcmp(plat_device, "dingux") == 0) { | |
148 | /* single L/R keys */ | |
149 | nameset(SDLK_TAB, "L"); nameset(SDLK_BACKSPACE, "R"); | |
fb79e7ba | 150 | nameset(SDLK_END, "POWER"); |
58fc34b1 | 151 | } |
152 | } |