1 /******************************************************************************
2     Copyright (C) 2014-2015 by Ruwen Hahn <palana@stunned.de>
3 
4     This program is free software: you can redistribute it and/or modify
5     it under the terms of the GNU General Public License as published by
6     the Free Software Foundation, either version 2 of the License, or
7     (at your option) any later version.
8 
9     This program is distributed in the hope that it will be useful,
10     but WITHOUT ANY WARRANTY; without even the implied warranty of
11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12     GNU General Public License for more details.
13 
14     You should have received a copy of the GNU General Public License
15     along with this program.  If not, see <http://www.gnu.org/licenses/>.
16 ******************************************************************************/
17 
18 #pragma once
19 
20 #ifdef __cplusplus
21 extern "C" {
22 #endif
23 
24 typedef size_t obs_hotkey_id;
25 typedef size_t obs_hotkey_pair_id;
26 
27 #ifndef SWIG
28 #define OBS_INVALID_HOTKEY_ID (~(obs_hotkey_id)0)
29 #define OBS_INVALID_HOTKEY_PAIR_ID (~(obs_hotkey_pair_id)0)
30 #else
31 const size_t OBS_INVALID_HOTKEY_ID = (size_t)-1;
32 const size_t OBS_INVALID_HOTKEY_PAIR_ID = (size_t)-1;
33 #endif
34 
35 #define XINPUT_MOUSE_LEN 33
36 
37 enum obs_key {
38 #define OBS_HOTKEY(x) x,
39 #include "obs-hotkeys.h"
40 #undef OBS_HOTKEY
41 	OBS_KEY_LAST_VALUE //not an actual key
42 };
43 typedef enum obs_key obs_key_t;
44 
45 struct obs_key_combination {
46 	uint32_t modifiers;
47 	obs_key_t key;
48 };
49 typedef struct obs_key_combination obs_key_combination_t;
50 
51 typedef struct obs_hotkey obs_hotkey_t;
52 typedef struct obs_hotkey_binding obs_hotkey_binding_t;
53 
54 enum obs_hotkey_registerer_type {
55 	OBS_HOTKEY_REGISTERER_FRONTEND,
56 	OBS_HOTKEY_REGISTERER_SOURCE,
57 	OBS_HOTKEY_REGISTERER_OUTPUT,
58 	OBS_HOTKEY_REGISTERER_ENCODER,
59 	OBS_HOTKEY_REGISTERER_SERVICE,
60 };
61 typedef enum obs_hotkey_registerer_type obs_hotkey_registerer_t;
62 
63 /* getter functions */
64 
65 EXPORT obs_hotkey_id obs_hotkey_get_id(const obs_hotkey_t *key);
66 EXPORT const char *obs_hotkey_get_name(const obs_hotkey_t *key);
67 EXPORT const char *obs_hotkey_get_description(const obs_hotkey_t *key);
68 EXPORT obs_hotkey_registerer_t
69 obs_hotkey_get_registerer_type(const obs_hotkey_t *key);
70 EXPORT void *obs_hotkey_get_registerer(const obs_hotkey_t *key);
71 EXPORT obs_hotkey_id obs_hotkey_get_pair_partner_id(const obs_hotkey_t *key);
72 
73 EXPORT obs_key_combination_t
74 obs_hotkey_binding_get_key_combination(obs_hotkey_binding_t *binding);
75 EXPORT obs_hotkey_id
76 obs_hotkey_binding_get_hotkey_id(obs_hotkey_binding_t *binding);
77 EXPORT obs_hotkey_t *
78 obs_hotkey_binding_get_hotkey(obs_hotkey_binding_t *binding);
79 
80 /* setter functions */
81 
82 EXPORT void obs_hotkey_set_name(obs_hotkey_id id, const char *name);
83 EXPORT void obs_hotkey_set_description(obs_hotkey_id id, const char *desc);
84 EXPORT void obs_hotkey_pair_set_names(obs_hotkey_pair_id id, const char *name0,
85 				      const char *name1);
86 EXPORT void obs_hotkey_pair_set_descriptions(obs_hotkey_pair_id id,
87 					     const char *desc0,
88 					     const char *desc1);
89 
90 #ifndef SWIG
91 struct obs_hotkeys_translations {
92 	const char *insert;
93 	const char *del;
94 	const char *home;
95 	const char *end;
96 	const char *page_up;
97 	const char *page_down;
98 	const char *num_lock;
99 	const char *scroll_lock;
100 	const char *caps_lock;
101 	const char *backspace;
102 	const char *tab;
103 	const char *print;
104 	const char *pause;
105 	const char *left;
106 	const char *right;
107 	const char *up;
108 	const char *down;
109 	const char *shift;
110 	const char *alt;
111 	const char *control;
112 	const char *meta; /* windows/super key */
113 	const char *menu;
114 	const char *space;
115 	const char *numpad_num; /* For example, "Numpad %1" */
116 	const char *numpad_divide;
117 	const char *numpad_multiply;
118 	const char *numpad_minus;
119 	const char *numpad_plus;
120 	const char *numpad_decimal;
121 	const char *apple_keypad_num; /* For example, "%1 (Keypad)" */
122 	const char *apple_keypad_divide;
123 	const char *apple_keypad_multiply;
124 	const char *apple_keypad_minus;
125 	const char *apple_keypad_plus;
126 	const char *apple_keypad_decimal;
127 	const char *apple_keypad_equal;
128 	const char *mouse_num; /* For example, "Mouse %1" */
129 	const char *escape;
130 };
131 
132 /* This function is an optional way to provide translations for specific keys
133  * that may not have translations.  If the operating system can provide
134  * translations for these keys, it will use the operating system's translation
135  * over these translations.  If no translations are specified, it will use
136  * the default English translations for that specific operating system. */
137 EXPORT void
138 obs_hotkeys_set_translations_s(struct obs_hotkeys_translations *translations,
139 			       size_t size);
140 #endif
141 
142 #define obs_hotkeys_set_translations(translations) \
143 	obs_hotkeys_set_translations_s(            \
144 		translations, sizeof(struct obs_hotkeys_translations))
145 
146 EXPORT void
147 obs_hotkeys_set_audio_hotkeys_translations(const char *mute, const char *unmute,
148 					   const char *push_to_mute,
149 					   const char *push_to_talk);
150 
151 EXPORT void obs_hotkeys_set_sceneitem_hotkeys_translations(const char *show,
152 							   const char *hide);
153 
154 /* registering hotkeys (giving hotkeys a name and a function) */
155 
156 typedef void (*obs_hotkey_func)(void *data, obs_hotkey_id id,
157 				obs_hotkey_t *hotkey, bool pressed);
158 
159 EXPORT obs_hotkey_id obs_hotkey_register_frontend(const char *name,
160 						  const char *description,
161 						  obs_hotkey_func func,
162 						  void *data);
163 
164 EXPORT obs_hotkey_id obs_hotkey_register_encoder(obs_encoder_t *encoder,
165 						 const char *name,
166 						 const char *description,
167 						 obs_hotkey_func func,
168 						 void *data);
169 
170 EXPORT obs_hotkey_id obs_hotkey_register_output(obs_output_t *output,
171 						const char *name,
172 						const char *description,
173 						obs_hotkey_func func,
174 						void *data);
175 
176 EXPORT obs_hotkey_id obs_hotkey_register_service(obs_service_t *service,
177 						 const char *name,
178 						 const char *description,
179 						 obs_hotkey_func func,
180 						 void *data);
181 
182 EXPORT obs_hotkey_id obs_hotkey_register_source(obs_source_t *source,
183 						const char *name,
184 						const char *description,
185 						obs_hotkey_func func,
186 						void *data);
187 
188 typedef bool (*obs_hotkey_active_func)(void *data, obs_hotkey_pair_id id,
189 				       obs_hotkey_t *hotkey, bool pressed);
190 
191 EXPORT obs_hotkey_pair_id obs_hotkey_pair_register_frontend(
192 	const char *name0, const char *description0, const char *name1,
193 	const char *description1, obs_hotkey_active_func func0,
194 	obs_hotkey_active_func func1, void *data0, void *data1);
195 
196 EXPORT obs_hotkey_pair_id obs_hotkey_pair_register_encoder(
197 	obs_encoder_t *encoder, const char *name0, const char *description0,
198 	const char *name1, const char *description1,
199 	obs_hotkey_active_func func0, obs_hotkey_active_func func1, void *data0,
200 	void *data1);
201 
202 EXPORT obs_hotkey_pair_id obs_hotkey_pair_register_output(
203 	obs_output_t *output, const char *name0, const char *description0,
204 	const char *name1, const char *description1,
205 	obs_hotkey_active_func func0, obs_hotkey_active_func func1, void *data0,
206 	void *data1);
207 
208 EXPORT obs_hotkey_pair_id obs_hotkey_pair_register_service(
209 	obs_service_t *service, const char *name0, const char *description0,
210 	const char *name1, const char *description1,
211 	obs_hotkey_active_func func0, obs_hotkey_active_func func1, void *data0,
212 	void *data1);
213 
214 EXPORT obs_hotkey_pair_id obs_hotkey_pair_register_source(
215 	obs_source_t *source, const char *name0, const char *description0,
216 	const char *name1, const char *description1,
217 	obs_hotkey_active_func func0, obs_hotkey_active_func func1, void *data0,
218 	void *data1);
219 
220 EXPORT void obs_hotkey_unregister(obs_hotkey_id id);
221 
222 EXPORT void obs_hotkey_pair_unregister(obs_hotkey_pair_id id);
223 
224 /* loading hotkeys (associating a hotkey with a physical key and modifiers) */
225 
226 EXPORT void obs_hotkey_load_bindings(obs_hotkey_id id,
227 				     obs_key_combination_t *combinations,
228 				     size_t num);
229 
230 EXPORT void obs_hotkey_load(obs_hotkey_id id, obs_data_array_t *data);
231 
232 EXPORT void obs_hotkeys_load_encoder(obs_encoder_t *encoder,
233 				     obs_data_t *hotkeys);
234 
235 EXPORT void obs_hotkeys_load_output(obs_output_t *output, obs_data_t *hotkeys);
236 
237 EXPORT void obs_hotkeys_load_service(obs_service_t *service,
238 				     obs_data_t *hotkeys);
239 
240 EXPORT void obs_hotkeys_load_source(obs_source_t *source, obs_data_t *hotkeys);
241 
242 EXPORT void obs_hotkey_pair_load(obs_hotkey_pair_id id, obs_data_array_t *data0,
243 				 obs_data_array_t *data1);
244 
245 EXPORT obs_data_array_t *obs_hotkey_save(obs_hotkey_id id);
246 
247 EXPORT void obs_hotkey_pair_save(obs_hotkey_pair_id id,
248 				 obs_data_array_t **p_data0,
249 				 obs_data_array_t **p_data1);
250 
251 EXPORT obs_data_t *obs_hotkeys_save_encoder(obs_encoder_t *encoder);
252 
253 EXPORT obs_data_t *obs_hotkeys_save_output(obs_output_t *output);
254 
255 EXPORT obs_data_t *obs_hotkeys_save_service(obs_service_t *service);
256 
257 EXPORT obs_data_t *obs_hotkeys_save_source(obs_source_t *source);
258 
259 /* enumerating hotkeys */
260 
261 typedef bool (*obs_hotkey_enum_func)(void *data, obs_hotkey_id id,
262 				     obs_hotkey_t *key);
263 
264 EXPORT void obs_enum_hotkeys(obs_hotkey_enum_func func, void *data);
265 
266 /* enumerating bindings */
267 
268 typedef bool (*obs_hotkey_binding_enum_func)(void *data, size_t idx,
269 					     obs_hotkey_binding_t *binding);
270 
271 EXPORT void obs_enum_hotkey_bindings(obs_hotkey_binding_enum_func func,
272 				     void *data);
273 
274 /* hotkey event control */
275 
276 EXPORT void obs_hotkey_inject_event(obs_key_combination_t hotkey, bool pressed);
277 
278 EXPORT void obs_hotkey_enable_background_press(bool enable);
279 
280 EXPORT void obs_hotkey_enable_strict_modifiers(bool enable);
281 
282 /* hotkey callback routing (trigger callbacks through e.g. a UI thread) */
283 
284 typedef void (*obs_hotkey_callback_router_func)(void *data, obs_hotkey_id id,
285 						bool pressed);
286 
287 EXPORT void
288 obs_hotkey_set_callback_routing_func(obs_hotkey_callback_router_func func,
289 				     void *data);
290 
291 EXPORT void obs_hotkey_trigger_routed_callback(obs_hotkey_id id, bool pressed);
292 
293 /* hotkey callbacks won't be processed if callback rerouting is enabled and no
294  * router func is set */
295 EXPORT void obs_hotkey_enable_callback_rerouting(bool enable);
296 
297 /* misc */
298 
299 typedef void (*obs_hotkey_atomic_update_func)(void *);
300 EXPORT void obs_hotkey_update_atomic(obs_hotkey_atomic_update_func func,
301 				     void *data);
302 
303 struct dstr;
304 EXPORT void obs_key_to_str(obs_key_t key, struct dstr *str);
305 EXPORT void obs_key_combination_to_str(obs_key_combination_t key,
306 				       struct dstr *str);
307 
308 EXPORT obs_key_t obs_key_from_virtual_key(int code);
309 EXPORT int obs_key_to_virtual_key(obs_key_t key);
310 
311 EXPORT const char *obs_key_to_name(obs_key_t key);
312 EXPORT obs_key_t obs_key_from_name(const char *name);
313 
obs_key_combination_is_empty(obs_key_combination_t combo)314 static inline bool obs_key_combination_is_empty(obs_key_combination_t combo)
315 {
316 	return !combo.modifiers && combo.key == OBS_KEY_NONE;
317 }
318 
319 #ifdef __cplusplus
320 }
321 #endif
322