1 /*  RetroArch - A frontend for libretro.
2  *  Copyright (C) 2010-2014 - Hans-Kristian Arntzen
3  *  Copyright (C) 2011-2017 - Daniel De Matteis
4  *
5  *  RetroArch is free software: you can redistribute it and/or modify it under the terms
6  *  of the GNU General Public License as published by the Free Software Found-
7  *  ation, either version 3 of the License, or (at your option) any later version.
8  *
9  *  RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
10  *  without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
11  *  PURPOSE.  See the GNU General Public License for more details.
12  *
13  *  You should have received a copy of the GNU General Public License along with RetroArch.
14  *  If not, see <http://www.gnu.org/licenses/>.
15  */
16 
17 #ifndef __INPUT_DEFINES__H
18 #define __INPUT_DEFINES__H
19 
20 #include <stdint.h>
21 #include <string.h>
22 
23 #include <retro_common_api.h>
24 
25 RETRO_BEGIN_DECLS
26 
27 #define MAX_USERS                      16
28 
29 #define MAX_INPUT_DEVICES              16
30 
31 #define RARCH_MAX_KEYS 137
32 
33 #define RARCH_FIRST_CUSTOM_BIND        16
34 #define RARCH_FIRST_LIGHTGUN_BIND      RARCH_ANALOG_BIND_LIST_END
35 #define RARCH_FIRST_MISC_CUSTOM_BIND   RARCH_LIGHTGUN_BIND_LIST_END
36 #define RARCH_FIRST_META_KEY           RARCH_CUSTOM_BIND_LIST_END
37 
38 #define RARCH_UNMAPPED                 1024
39 
40 /* RetroArch specific bind IDs. */
41 enum
42 {
43    /* Custom binds that extend the scope of RETRO_DEVICE_JOYPAD for
44     * RetroArch specifically.
45     * Analogs (RETRO_DEVICE_ANALOG) */
46    RARCH_ANALOG_LEFT_X_PLUS = RARCH_FIRST_CUSTOM_BIND,
47    RARCH_ANALOG_LEFT_X_MINUS,
48    RARCH_ANALOG_LEFT_Y_PLUS,
49    RARCH_ANALOG_LEFT_Y_MINUS,
50    RARCH_ANALOG_RIGHT_X_PLUS,
51    RARCH_ANALOG_RIGHT_X_MINUS,
52    RARCH_ANALOG_RIGHT_Y_PLUS,
53    RARCH_ANALOG_RIGHT_Y_MINUS,
54    RARCH_ANALOG_BIND_LIST_END,
55 
56    /* Lightgun */
57    RARCH_LIGHTGUN_TRIGGER = RARCH_FIRST_LIGHTGUN_BIND,
58    RARCH_LIGHTGUN_RELOAD,
59    RARCH_LIGHTGUN_AUX_A,
60    RARCH_LIGHTGUN_AUX_B,
61    RARCH_LIGHTGUN_AUX_C,
62    RARCH_LIGHTGUN_START,
63    RARCH_LIGHTGUN_SELECT,
64    RARCH_LIGHTGUN_DPAD_UP,
65    RARCH_LIGHTGUN_DPAD_DOWN,
66    RARCH_LIGHTGUN_DPAD_LEFT,
67    RARCH_LIGHTGUN_DPAD_RIGHT,
68    RARCH_LIGHTGUN_BIND_LIST_END,
69 
70    /* Turbo */
71    RARCH_TURBO_ENABLE = RARCH_FIRST_MISC_CUSTOM_BIND,
72 
73    RARCH_CUSTOM_BIND_LIST_END,
74 
75    /* Command binds. Not related to game input,
76     * only usable for port 0. */
77    RARCH_FAST_FORWARD_KEY = RARCH_FIRST_META_KEY,
78    RARCH_FAST_FORWARD_HOLD_KEY,
79    RARCH_SLOWMOTION_KEY,
80    RARCH_SLOWMOTION_HOLD_KEY,
81    RARCH_LOAD_STATE_KEY,
82    RARCH_SAVE_STATE_KEY,
83    RARCH_FULLSCREEN_TOGGLE_KEY,
84    RARCH_CLOSE_CONTENT_KEY,
85    RARCH_QUIT_KEY,
86    RARCH_STATE_SLOT_PLUS,
87    RARCH_STATE_SLOT_MINUS,
88    RARCH_REWIND,
89    RARCH_BSV_RECORD_TOGGLE,
90    RARCH_PAUSE_TOGGLE,
91    RARCH_FRAMEADVANCE,
92    RARCH_RESET,
93    RARCH_SHADER_NEXT,
94    RARCH_SHADER_PREV,
95    RARCH_CHEAT_INDEX_PLUS,
96    RARCH_CHEAT_INDEX_MINUS,
97    RARCH_CHEAT_TOGGLE,
98    RARCH_SCREENSHOT,
99    RARCH_MUTE,
100    RARCH_OSK,
101    RARCH_FPS_TOGGLE,
102    RARCH_SEND_DEBUG_INFO,
103    RARCH_NETPLAY_HOST_TOGGLE,
104    RARCH_NETPLAY_GAME_WATCH,
105    RARCH_ENABLE_HOTKEY,
106    RARCH_VOLUME_UP,
107    RARCH_VOLUME_DOWN,
108    RARCH_OVERLAY_NEXT,
109    RARCH_DISK_EJECT_TOGGLE,
110    RARCH_DISK_NEXT,
111    RARCH_DISK_PREV,
112    RARCH_GRAB_MOUSE_TOGGLE,
113    RARCH_GAME_FOCUS_TOGGLE,
114    RARCH_UI_COMPANION_TOGGLE,
115 
116    RARCH_MENU_TOGGLE,
117 
118    RARCH_RECORDING_TOGGLE,
119    RARCH_STREAMING_TOGGLE,
120    RARCH_RUNAHEAD_TOGGLE,
121 
122    RARCH_AI_SERVICE,
123 
124    RARCH_BIND_LIST_END,
125    RARCH_BIND_LIST_END_NULL
126 };
127 
128 enum analog_dpad_mode
129 {
130    ANALOG_DPAD_NONE = 0,
131    ANALOG_DPAD_LSTICK,
132    ANALOG_DPAD_RSTICK,
133    ANALOG_DPAD_LSTICK_FORCED,
134    ANALOG_DPAD_RSTICK_FORCED,
135    ANALOG_DPAD_LAST
136 };
137 
138 enum input_toggle_type
139 {
140    INPUT_TOGGLE_NONE = 0,
141    INPUT_TOGGLE_DOWN_Y_L_R,
142    INPUT_TOGGLE_L3_R3,
143    INPUT_TOGGLE_L1_R1_START_SELECT,
144    INPUT_TOGGLE_START_SELECT,
145    INPUT_TOGGLE_L3_R,
146    INPUT_TOGGLE_L_R,
147    INPUT_TOGGLE_HOLD_START,
148    INPUT_TOGGLE_HOLD_SELECT,
149    INPUT_TOGGLE_DOWN_SELECT,
150    INPUT_TOGGLE_L2_R2,
151    INPUT_TOGGLE_LAST
152 };
153 
154 enum input_turbo_mode
155 {
156    INPUT_TURBO_MODE_CLASSIC = 0,
157    INPUT_TURBO_MODE_SINGLEBUTTON,
158    INPUT_TURBO_MODE_SINGLEBUTTON_HOLD,
159    INPUT_TURBO_MODE_LAST
160 };
161 
162 enum input_turbo_default_button
163 {
164    INPUT_TURBO_DEFAULT_BUTTON_B = 0,
165    INPUT_TURBO_DEFAULT_BUTTON_Y,
166    INPUT_TURBO_DEFAULT_BUTTON_A,
167    INPUT_TURBO_DEFAULT_BUTTON_X,
168    INPUT_TURBO_DEFAULT_BUTTON_L,
169    INPUT_TURBO_DEFAULT_BUTTON_R,
170    INPUT_TURBO_DEFAULT_BUTTON_L2,
171    INPUT_TURBO_DEFAULT_BUTTON_R2,
172    INPUT_TURBO_DEFAULT_BUTTON_L3,
173    INPUT_TURBO_DEFAULT_BUTTON_R3,
174    INPUT_TURBO_DEFAULT_BUTTON_LAST
175 };
176 
177 enum input_action
178 {
179    INPUT_ACTION_NONE = 0,
180    INPUT_ACTION_AXIS_THRESHOLD,
181    INPUT_ACTION_MAX_USERS
182 };
183 
184 /* Specialized _MOUSE that targets the full screen regardless of viewport.
185  */
186 #define RARCH_DEVICE_MOUSE_SCREEN      (RETRO_DEVICE_MOUSE | 0x10000)
187 
188 /* Specialized _POINTER that targets the full screen regardless of viewport.
189  * Should not be used by a libretro implementation as coordinates returned
190  * make no sense.
191  *
192  * It is only used internally for overlays. */
193 #define RARCH_DEVICE_POINTER_SCREEN    (RETRO_DEVICE_POINTER | 0x10000)
194 
195 #define RARCH_DEVICE_ID_POINTER_BACK   (RETRO_DEVICE_ID_POINTER_PRESSED | 0x10000)
196 
197 /* libretro has 16 buttons from 0-15 (libretro.h)
198  * Analog binds use RETRO_DEVICE_ANALOG, but we follow the same scheme
199  * internally in RetroArch for simplicity, so they are mapped into [16, 23].
200  */
201 
202 #define AXIS_NEG(x)        (((uint32_t)(x) << 16) | 0xFFFFU)
203 #define AXIS_POS(x)        ((uint32_t)(x) | 0xFFFF0000UL)
204 #define AXIS_NONE          0xFFFFFFFFUL
205 #define AXIS_DIR_NONE      0xFFFFU
206 
207 #define AXIS_NEG_GET(x)    (((uint32_t)(x) >> 16) & 0xFFFFU)
208 #define AXIS_POS_GET(x)    ((uint32_t)(x) & 0xFFFFU)
209 
210 #define NO_BTN             0xFFFFU
211 
212 #define HAT_UP_SHIFT       15
213 #define HAT_DOWN_SHIFT     14
214 #define HAT_LEFT_SHIFT     13
215 #define HAT_RIGHT_SHIFT    12
216 #define HAT_UP_MASK        (1 << HAT_UP_SHIFT)
217 #define HAT_DOWN_MASK      (1 << HAT_DOWN_SHIFT)
218 #define HAT_LEFT_MASK      (1 << HAT_LEFT_SHIFT)
219 #define HAT_RIGHT_MASK     (1 << HAT_RIGHT_SHIFT)
220 #define HAT_MAP(x, hat)    ((x & ((1 << 12) - 1)) | hat)
221 
222 #define HAT_MASK           (HAT_UP_MASK | HAT_DOWN_MASK | HAT_LEFT_MASK | HAT_RIGHT_MASK)
223 #define GET_HAT_DIR(x)     (x & HAT_MASK)
224 #define GET_HAT(x)         (x & (~HAT_MASK))
225 
226 RETRO_END_DECLS
227 
228 #endif
229