1 // Copyright 2015 Dolphin Emulator Project
2 // Licensed under GPLv2+
3 // Refer to the license.txt file included.
4 
5 #pragma once
6 
7 #include <array>
8 #include <string>
9 
10 #include "Common/CommonTypes.h"
11 #include "InputCommon/ControllerEmu/ControllerEmu.h"
12 #include "InputCommon/InputConfig.h"
13 
14 namespace ControllerEmu
15 {
16 class ControllerEmu;
17 class Buttons;
18 }  // namespace ControllerEmu
19 
20 enum Hotkey
21 {
22   HK_OPEN,
23   HK_CHANGE_DISC,
24   HK_EJECT_DISC,
25   HK_REFRESH_LIST,
26   HK_PLAY_PAUSE,
27   HK_STOP,
28   HK_RESET,
29   HK_FULLSCREEN,
30   HK_SCREENSHOT,
31   HK_EXIT,
32   HK_ACTIVATE_CHAT,
33   HK_REQUEST_GOLF_CONTROL,
34 
35   HK_VOLUME_DOWN,
36   HK_VOLUME_UP,
37   HK_VOLUME_TOGGLE_MUTE,
38 
39   HK_DECREASE_EMULATION_SPEED,
40   HK_INCREASE_EMULATION_SPEED,
41   HK_TOGGLE_THROTTLE,
42 
43   HK_FRAME_ADVANCE,
44   HK_FRAME_ADVANCE_DECREASE_SPEED,
45   HK_FRAME_ADVANCE_INCREASE_SPEED,
46   HK_FRAME_ADVANCE_RESET_SPEED,
47 
48   HK_START_RECORDING,
49   HK_PLAY_RECORDING,
50   HK_EXPORT_RECORDING,
51   HK_READ_ONLY_MODE,
52 
53   HK_STEP,
54   HK_STEP_OVER,
55   HK_STEP_OUT,
56   HK_SKIP,
57 
58   HK_SHOW_PC,
59   HK_SET_PC,
60 
61   HK_BP_TOGGLE,
62   HK_BP_ADD,
63   HK_MBP_ADD,
64 
65   HK_TRIGGER_SYNC_BUTTON,
66   HK_WIIMOTE1_CONNECT,
67   HK_WIIMOTE2_CONNECT,
68   HK_WIIMOTE3_CONNECT,
69   HK_WIIMOTE4_CONNECT,
70   HK_BALANCEBOARD_CONNECT,
71   HK_TOGGLE_SD_CARD,
72   HK_TOGGLE_USB_KEYBOARD,
73 
74   HK_NEXT_WIIMOTE_PROFILE_1,
75   HK_PREV_WIIMOTE_PROFILE_1,
76   HK_NEXT_GAME_WIIMOTE_PROFILE_1,
77   HK_PREV_GAME_WIIMOTE_PROFILE_1,
78   HK_NEXT_WIIMOTE_PROFILE_2,
79   HK_PREV_WIIMOTE_PROFILE_2,
80   HK_NEXT_GAME_WIIMOTE_PROFILE_2,
81   HK_PREV_GAME_WIIMOTE_PROFILE_2,
82   HK_NEXT_WIIMOTE_PROFILE_3,
83   HK_PREV_WIIMOTE_PROFILE_3,
84   HK_NEXT_GAME_WIIMOTE_PROFILE_3,
85   HK_PREV_GAME_WIIMOTE_PROFILE_3,
86   HK_NEXT_WIIMOTE_PROFILE_4,
87   HK_PREV_WIIMOTE_PROFILE_4,
88   HK_NEXT_GAME_WIIMOTE_PROFILE_4,
89   HK_PREV_GAME_WIIMOTE_PROFILE_4,
90 
91   HK_TOGGLE_CROP,
92   HK_TOGGLE_AR,
93   HK_TOGGLE_EFBCOPIES,
94   HK_TOGGLE_XFBCOPIES,
95   HK_TOGGLE_IMMEDIATE_XFB,
96   HK_TOGGLE_FOG,
97   HK_TOGGLE_DUMPTEXTURES,
98   HK_TOGGLE_TEXTURES,
99 
100   HK_INCREASE_IR,
101   HK_DECREASE_IR,
102 
103   HK_FREELOOK_DECREASE_SPEED,
104   HK_FREELOOK_INCREASE_SPEED,
105   HK_FREELOOK_RESET_SPEED,
106   HK_FREELOOK_UP,
107   HK_FREELOOK_DOWN,
108   HK_FREELOOK_LEFT,
109   HK_FREELOOK_RIGHT,
110   HK_FREELOOK_ZOOM_IN,
111   HK_FREELOOK_ZOOM_OUT,
112   HK_FREELOOK_RESET,
113   HK_FREELOOK_TOGGLE,
114   HK_FREELOOK_INCREASE_FOV_X,
115   HK_FREELOOK_DECREASE_FOV_X,
116   HK_FREELOOK_INCREASE_FOV_Y,
117   HK_FREELOOK_DECREASE_FOV_Y,
118 
119   HK_TOGGLE_STEREO_SBS,
120   HK_TOGGLE_STEREO_TAB,
121   HK_TOGGLE_STEREO_ANAGLYPH,
122 
123   HK_DECREASE_DEPTH,
124   HK_INCREASE_DEPTH,
125   HK_DECREASE_CONVERGENCE,
126   HK_INCREASE_CONVERGENCE,
127 
128   HK_LOAD_STATE_SLOT_1,
129   HK_LOAD_STATE_SLOT_2,
130   HK_LOAD_STATE_SLOT_3,
131   HK_LOAD_STATE_SLOT_4,
132   HK_LOAD_STATE_SLOT_5,
133   HK_LOAD_STATE_SLOT_6,
134   HK_LOAD_STATE_SLOT_7,
135   HK_LOAD_STATE_SLOT_8,
136   HK_LOAD_STATE_SLOT_9,
137   HK_LOAD_STATE_SLOT_10,
138   HK_LOAD_STATE_SLOT_SELECTED,
139 
140   HK_SAVE_STATE_SLOT_1,
141   HK_SAVE_STATE_SLOT_2,
142   HK_SAVE_STATE_SLOT_3,
143   HK_SAVE_STATE_SLOT_4,
144   HK_SAVE_STATE_SLOT_5,
145   HK_SAVE_STATE_SLOT_6,
146   HK_SAVE_STATE_SLOT_7,
147   HK_SAVE_STATE_SLOT_8,
148   HK_SAVE_STATE_SLOT_9,
149   HK_SAVE_STATE_SLOT_10,
150   HK_SAVE_STATE_SLOT_SELECTED,
151 
152   HK_SELECT_STATE_SLOT_1,
153   HK_SELECT_STATE_SLOT_2,
154   HK_SELECT_STATE_SLOT_3,
155   HK_SELECT_STATE_SLOT_4,
156   HK_SELECT_STATE_SLOT_5,
157   HK_SELECT_STATE_SLOT_6,
158   HK_SELECT_STATE_SLOT_7,
159   HK_SELECT_STATE_SLOT_8,
160   HK_SELECT_STATE_SLOT_9,
161   HK_SELECT_STATE_SLOT_10,
162 
163   HK_LOAD_LAST_STATE_1,
164   HK_LOAD_LAST_STATE_2,
165   HK_LOAD_LAST_STATE_3,
166   HK_LOAD_LAST_STATE_4,
167   HK_LOAD_LAST_STATE_5,
168   HK_LOAD_LAST_STATE_6,
169   HK_LOAD_LAST_STATE_7,
170   HK_LOAD_LAST_STATE_8,
171   HK_LOAD_LAST_STATE_9,
172   HK_LOAD_LAST_STATE_10,
173 
174   HK_SAVE_FIRST_STATE,
175   HK_UNDO_LOAD_STATE,
176   HK_UNDO_SAVE_STATE,
177   HK_SAVE_STATE_FILE,
178   HK_LOAD_STATE_FILE,
179 
180   NUM_HOTKEYS,
181 };
182 
183 enum HotkeyGroup : int
184 {
185   HKGP_GENERAL,
186   HKGP_VOLUME,
187   HKGP_SPEED,
188   HKGP_FRAME_ADVANCE,
189   HKGP_MOVIE,
190   HKGP_STEPPING,
191   HKGP_PC,
192   HKGP_BREAKPOINT,
193   HKGP_WII,
194   HKGP_CONTROLLER_PROFILE_1,
195   HKGP_CONTROLLER_PROFILE_2,
196   HKGP_CONTROLLER_PROFILE_3,
197   HKGP_CONTROLLER_PROFILE_4,
198   HKGP_GRAPHICS_TOGGLES,
199   HKGP_IR,
200   HKGP_FREELOOK,
201   HKGP_3D_TOGGLE,
202   HKGP_3D_DEPTH,
203   HKGP_LOAD_STATE,
204   HKGP_SAVE_STATE,
205   HKGP_SELECT_STATE,
206   HKGP_LOAD_LAST_STATE,
207   HKGP_STATE_MISC,
208 
209   NUM_HOTKEY_GROUPS,
210 };
211 
212 struct HotkeyStatus
213 {
214   std::array<u32, NUM_HOTKEY_GROUPS> button;
215   s8 err;
216 };
217 
218 class HotkeyManager : public ControllerEmu::EmulatedController
219 {
220 public:
221   HotkeyManager();
222   ~HotkeyManager();
223 
224   void GetInput(HotkeyStatus* const hk);
225   std::string GetName() const override;
226   ControllerEmu::ControlGroup* GetHotkeyGroup(HotkeyGroup group) const;
227   int FindGroupByID(int id) const;
228   int GetIndexForGroup(int group, int id) const;
229   void LoadDefaults(const ControllerInterface& ciface) override;
230 
231 private:
232   std::array<ControllerEmu::Buttons*, NUM_HOTKEY_GROUPS> m_keys;
233   std::array<ControllerEmu::ControlGroup*, NUM_HOTKEY_GROUPS> m_hotkey_groups;
234 };
235 
236 namespace HotkeyManagerEmu
237 {
238 void Initialize();
239 void Shutdown();
240 void LoadConfig();
241 
242 InputConfig* GetConfig();
243 ControllerEmu::ControlGroup* GetHotkeyGroup(HotkeyGroup group);
244 void GetStatus();
245 bool IsEnabled();
246 void Enable(bool enable_toggle);
247 bool IsPressed(int Id, bool held);
248 }  // namespace HotkeyManagerEmu
249