46d37bbb9853e9dcbf2597fa88c0b0488a42c2f9
[picodrive.git] / platform / opendingux / inputmap.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <SDL_keysym.h>
5
6 #include "../libpicofe/input.h"
7 #include "../libpicofe/in_sdl.h"
8 #include "../libpicofe/plat.h"
9 #include "../common/input_pico.h"
10 #include "../common/plat_sdl.h"
11 #include "../common/emu.h"
12
13 struct in_default_bind _in_sdl_defbinds[] = {
14         { SDLK_UP,      IN_BINDTYPE_PLAYER12, GBTN_UP },
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 };
30 const struct in_default_bind *in_sdl_defbinds = _in_sdl_defbinds;
31
32 struct menu_keymap _in_sdl_key_map[] = {
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 };
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;
46
47 const struct menu_keymap _in_sdl_joy_map[] = {
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 };
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;
60
61 const char * _in_sdl_key_names[SDLK_LAST] = {
62         /* common */
63         [SDLK_UP] = "UP",
64         [SDLK_DOWN] = "DOWN",
65         [SDLK_LEFT] = "LEFT",
66         [SDLK_RIGHT] = "RIGHT",
67         [SDLK_LCTRL] = "A",
68         [SDLK_LALT] = "B",
69         [SDLK_LSHIFT] = "Y",
70         [SDLK_SPACE] = "X",
71         [SDLK_RETURN] = "START",
72         [SDLK_ESCAPE] = "SELECT",
73         [SDLK_TAB] = "L1",
74         [SDLK_BACKSPACE] = "R1",
75
76         /* opendingux rg, gkd etc */
77         [SDLK_PAGEUP] = "L2",
78         [SDLK_PAGEDOWN] = "R2",
79         [SDLK_KP_DIVIDE] = "L3",
80         [SDLK_KP_PERIOD] = "R3",
81         [SDLK_HOME] = "POWER",
82         /* gkd (mini) */
83         /*[SDLK_HOME] = "MENU",*/
84         [SDLK_END] = "EXIT",
85         /* gcw0 */
86         [SDLK_POWER] = "POWER",
87         [SDLK_PAUSE] = "LOCK",
88         /* miyoo */
89         [SDLK_RALT] = "L2",
90         [SDLK_RSHIFT] = "R2",
91         [SDLK_RCTRL] = "RESET",
92         /* retrofw */
93         [SDLK_LEFTBRACKET] = "SETUP",   /* actually brightness setting */
94         /*[SDLK_END] = "POWER",*/
95 };
96 const char * const *in_sdl_key_names = _in_sdl_key_names;
97
98 const struct in_default_bind in_sdl_kbd_map[] = {
99         // Opendingux devices usually don't have a keyboard.
100         { 0, 0, 0 }
101 };
102
103
104 static void nameset(int x1, const char *name)
105 {
106         _in_sdl_key_names[x1] = name;
107 }
108
109 static void nameswap(int x1, int x2)
110 {
111         const char **p = &_in_sdl_key_names[x1];
112         const char **q = &_in_sdl_key_names[x2];
113         const char *t = *p; *p = *q; *q = t;
114 }
115
116 static void keyswap(int k1, int k2)
117 {
118         int x1, x2, t;
119
120         for (x1 = in_sdl_key_map_sz-1; x1 >= 0; x1--)
121                 if (_in_sdl_key_map[x1].key == k1) break;
122         for (x2 = in_sdl_key_map_sz-1; x2 >= 0; x2--)
123                 if (_in_sdl_key_map[x2].key == k2) break;
124         if (x1 >= 0 && x2 >= 0) {
125                 struct menu_keymap *p = &_in_sdl_key_map[x1];
126                 struct menu_keymap *q = &_in_sdl_key_map[x2];
127                 t = p->pbtn; p->pbtn = q->pbtn; q->pbtn = t;
128         }
129 }
130
131 static void bindswap(int k1, int k2)
132 {
133         int i;
134
135         for (i = 0; _in_sdl_defbinds[i].code; i++)
136                 if (_in_sdl_defbinds[i].code == k1)
137                         _in_sdl_defbinds[i].code = k2;
138 }
139
140 void plat_target_setup_input(void)
141 {
142         if (strcmp(plat_device, "miyoo") == 0) {
143                 /* swapped A/B and X/Y keys */
144                 keyswap(SDLK_LALT, SDLK_LCTRL);
145                 nameswap(SDLK_LALT, SDLK_LCTRL);
146                 nameswap(SDLK_SPACE, SDLK_LSHIFT);
147                 bindswap(SDLK_ESCAPE, SDLK_RCTRL);
148         } else if (strcmp(plat_device, "gcw0") == 0) {
149                 /* swapped X/Y keys, single L/R keys */
150                 nameswap(SDLK_SPACE, SDLK_LSHIFT);
151                 nameset(SDLK_TAB, "L"); nameset(SDLK_BACKSPACE, "R");
152         } else if (strcmp(plat_device, "retrofw") == 0 || strcmp(plat_device, "dingux") == 0) {
153                 /* single L/R keys */
154                 nameset(SDLK_TAB, "L"); nameset(SDLK_BACKSPACE, "R");
155                 nameset(SDLK_END, "POWER");
156         }
157 }