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