1 /* RetroArch - A frontend for libretro.
2 * Copyright (C) 2010-2014 - Hans-Kristian Arntzen
3 * Copyright (C) 2011-2017 - Daniel De Matteis
4 * Copyright (C) 2014-2017 - Jean-André Santoni
5 * Copyright (C) 2016-2019 - Brad Parker
6 *
7 * RetroArch is free software: you can redistribute it and/or modify it under the terms
8 * of the GNU General Public License as published by the Free Software Found-
9 * ation, either version 3 of the License, or (at your option) any later version.
10 *
11 * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
12 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
13 * PURPOSE. See the GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License along with RetroArch.
16 * If not, see <http://www.gnu.org/licenses/>.
17 */
18
19 #ifdef _WIN32
20 #include <direct.h>
21 #else
22 #include <unistd.h>
23 #endif
24
25 #include <libretro.h>
26 #include <lists/file_list.h>
27 #include <file/file_path.h>
28 #include <string/stdstring.h>
29 #include <lists/string_list.h>
30 #include <streams/file_stream.h>
31 #include <audio/audio_resampler.h>
32
33 #include <compat/strl.h>
34
35 #ifdef HAVE_CONFIG_H
36 #include "../config.h"
37 #endif
38
39 #ifdef HAVE_CDROM
40 #include <vfs/vfs_implementation_cdrom.h>
41 #endif
42
43 #include "../config.def.h"
44 #include "../config.def.keybinds.h"
45
46 #if !defined(__PSL1GHT__) && defined(__PS3__)
47 #include <sysutil/sysutil_bgmplayback.h>
48 #endif
49
50 #ifdef HAVE_CHEEVOS
51 #include "../cheevos/cheevos.h"
52 #endif
53
54 #ifdef HAVE_TRANSLATE
55 #include "../translation_defines.h"
56 #endif
57
58 #include "../frontend/frontend_driver.h"
59
60 #include "menu_input_bind_dialog.h"
61
62 #include "menu_setting.h"
63 #include "menu_cbs.h"
64 #include "menu_driver.h"
65 #include "../gfx/gfx_animation.h"
66 #ifdef HAVE_GFX_WIDGETS
67 #include "../gfx/gfx_widgets.h"
68 #endif
69 #include "menu_input.h"
70 #if defined(HAVE_CG) || defined(HAVE_GLSL) || defined(HAVE_SLANG) || defined(HAVE_HLSL)
71 #include "menu_shader.h"
72 #endif
73
74 #include "../core.h"
75 #include "../configuration.h"
76 #include "../msg_hash.h"
77 #include "../defaults.h"
78 #include "../driver.h"
79 #include "../paths.h"
80 #include "../dynamic.h"
81 #include "../list_special.h"
82 #include "../bluetooth/bluetooth_driver.h"
83 #include "../wifi/wifi_driver.h"
84 #include "../midi/midi_driver.h"
85 #include "../tasks/tasks_internal.h"
86 #include "../config.def.h"
87 #include "../ui/ui_companion_driver.h"
88 #include "../performance_counters.h"
89 #include "../setting_list.h"
90 #include "../lakka.h"
91 #include "../retroarch.h"
92 #include "../gfx/video_display_server.h"
93 #ifdef HAVE_CHEATS
94 #include "../cheat_manager.h"
95 #endif
96 #include "../verbosity.h"
97 #include "../playlist.h"
98 #include "../manual_content_scan.h"
99 #include "../input/input_remapping.h"
100
101 #include "../tasks/tasks_internal.h"
102
103 #ifdef HAVE_NETWORKING
104 #include "../network/netplay/netplay.h"
105 #endif
106
107 #ifdef HAVE_VIDEO_LAYOUT
108 #include "../gfx/video_layout.h"
109 #endif
110
111 #if defined(HAVE_OVERLAY)
112 #include "../input/input_overlay.h"
113 #endif
114
115 /* Required for 3DS display mode setting */
116 #if defined(_3DS)
117 #include "gfx/common/ctr_common.h"
118 #include <3ds/services/cfgu.h>
119 #endif
120
121 #if defined(DINGUX)
122 #include "../dingux/dingux_utils.h"
123 #endif
124
125 #if defined(ANDROID)
126 #include "../play_feature_delivery/play_feature_delivery.h"
127 #endif
128
129 #define _3_SECONDS 3000000
130 #define _6_SECONDS 6000000
131 #define _9_SECONDS 9000000
132 #define _12_SECONDS 12000000
133 #define _15_SECONDS 15000000
134 #define _18_SECONDS 18000000
135 #define _21_SECONDS 21000000
136
137 #define CONFIG_SIZE(a, b, c, d, e, f, g, h, i, j, k, l) \
138 if (SETTINGS_LIST_APPEND(a, b)) \
139 config_size(a, b, c, d, e, f, g, h, i, j, k, l)
140
141 #define CONFIG_BOOL_ALT(a, b, c, d, e, f, g, h, i, j, k, l, m, n) \
142 if (SETTINGS_LIST_APPEND(a, b)) \
143 config_bool_alt(a, b, c, d, e, f, g, h, i, j, k, l, m, n)
144
145 #define CONFIG_BOOL(a, b, c, d, e, f, g, h, i, j, k, l, m, n) \
146 if (SETTINGS_LIST_APPEND(a, b)) \
147 config_bool(a, b, c, d, e, f, g, h, i, j, k, l, m, n)
148
149 #define CONFIG_INT(a, b, c, d, e, f, g, h, i, j, k) \
150 if (SETTINGS_LIST_APPEND(a, b)) \
151 config_int(a, b, c, d, e, f, g, h, i, j, k)
152
153 #define CONFIG_UINT_ALT(a, b, c, d, e, f, g, h, i, j, k) \
154 if (SETTINGS_LIST_APPEND(a, b)) \
155 config_uint_alt(a, b, c, d, e, f, g, h, i, j, k)
156
157 #define CONFIG_UINT(a, b, c, d, e, f, g, h, i, j, k) \
158 if (SETTINGS_LIST_APPEND(a, b)) \
159 config_uint(a, b, c, d, e, f, g, h, i, j, k)
160
161 #define CONFIG_STRING(a, b, c, d, e, f, g, h, i, j, k, l) \
162 if (SETTINGS_LIST_APPEND(a, b)) \
163 config_string(a, b, c, d, e, f, g, h, i, j, k, l)
164
165 #define CONFIG_FLOAT(a, b, c, d, e, f, g, h, i, j, k, l) \
166 if (SETTINGS_LIST_APPEND(a, b)) \
167 config_float(a, b, c, d, e, f, g, h, i, j, k, l)
168
169 #define CONFIG_DIR(a, b, c, d, e, f, g, h, i, j, k, l, m) \
170 if (SETTINGS_LIST_APPEND(a, b)) \
171 config_dir(a, b, c, d, e, f, g, h, i, j, k, l, m)
172
173 #define CONFIG_PATH(a, b, c, d, e, f, g, h, i, j, k, l) \
174 if (SETTINGS_LIST_APPEND(a, b)) \
175 config_path(a, b, c, d, e, f, g, h, i, j, k, l)
176
177 #define CONFIG_ACTION_ALT(a, b, c, d, e, f, g) \
178 if (SETTINGS_LIST_APPEND(a, b)) \
179 config_action_alt(a, b, c, d, e, f, g)
180
181 #define CONFIG_ACTION(a, b, c, d, e, f, g) \
182 if (SETTINGS_LIST_APPEND(a, b)) \
183 config_action(a, b, c, d, e, f, g)
184
185 #define END_GROUP(a, b, c) \
186 if (SETTINGS_LIST_APPEND(a, b)) \
187 end_group(a, b, c)
188
189 #define START_SUB_GROUP(a, b, c, d, e, f) \
190 if (SETTINGS_LIST_APPEND(a, b)) \
191 start_sub_group(a, b, c, d, e, f)
192
193 #define END_SUB_GROUP(a, b, c) \
194 if (SETTINGS_LIST_APPEND(a, b)) \
195 end_sub_group(a, b, c)
196
197 #define CONFIG_STRING_OPTIONS(a, b, c, d, e, f, g, h, i, j, k, l, m) \
198 if (SETTINGS_LIST_APPEND(a, b)) \
199 config_string_options(a, b, c, d, e, f, g, h, i, j, k, l, m)
200
201 #define CONFIG_HEX(a, b, c, d, e, f, g, h, i, j, k, l) \
202 if (SETTINGS_LIST_APPEND(a, b)) \
203 config_hex(a, b, c, d, e, f, g, h, i, j, k, l)
204
205 #define CONFIG_BIND_ALT(a, b, c, d, e, f, g, h, i, j, k) \
206 if (SETTINGS_LIST_APPEND(a, b)) \
207 config_bind_alt(a, b, c, d, e, f, g, h, i, j, k)
208
209 #define CONFIG_BIND(a, b, c, d, e, f, g, h, i, j, k, l) \
210 if (SETTINGS_LIST_APPEND(a, b)) \
211 config_bind(a, b, c, d, e, f, g, h, i, j, k, l)
212
213 #define SETTINGS_DATA_LIST_CURRENT_ADD_FREE_FLAGS(a, b, c) \
214 (*a)[b->index - 1].free_flags |= c
215
216 #define MENU_SETTINGS_LIST_CURRENT_ADD_ENUM_IDX_PTR(a, b, c) \
217 (*a)[b->index - 1].enum_idx = c
218
219 #define MENU_SETTINGS_LIST_CURRENT_ADD_ENUM_VALUE_IDX(a, b, c) \
220 (*a)[b->index - 1].enum_value_idx = c
221
222 #define SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(a, b, c) \
223 { \
224 (*a)[b->index - 1].flags |= c; \
225 setting_add_special_callbacks(a, b, c); \
226 }
227
228 #define SETTINGS_LIST_APPEND(a, b) ((a && *a && b) ? ((((b)->index == (b)->size)) ? SETTINGS_LIST_APPEND_internal(a, b) : true) : false)
229
230 #define MENU_SETTINGS_LIST_CURRENT_IDX(list_info) (list_info->index - 1)
231
232 #define MENU_SETTINGS_LIST_CURRENT_ADD_VALUES(list, list_info, str) ((*(list))[MENU_SETTINGS_LIST_CURRENT_IDX((list_info))].values = (str))
233
234 #define MENU_SETTINGS_LIST_CURRENT_ADD_CMD(list, list_info, str) (*(list))[MENU_SETTINGS_LIST_CURRENT_IDX(list_info)].cmd_trigger_idx = (str)
235
236 #define CONFIG_UINT_CBS(var, label, left, right, msg_enum_base, string_rep, min, max, step) \
237 CONFIG_UINT( \
238 list, list_info, \
239 &(var), \
240 MENU_ENUM_LABEL_##label, \
241 MENU_ENUM_LABEL_VALUE_##label, \
242 var, \
243 &group_info, \
244 &subgroup_info, \
245 parent_group, \
246 general_write_handler, \
247 general_read_handler); \
248 (*list)[list_info->index - 1].action_left = left; \
249 (*list)[list_info->index - 1].action_right = right; \
250 (*list)[list_info->index - 1].get_string_representation = string_rep; \
251 (*list)[list_info->index - 1].index_offset = msg_enum_base; \
252 menu_settings_list_current_add_range(list, list_info, min, max, step, true, true);
253
254 enum settings_list_type
255 {
256 SETTINGS_LIST_NONE = 0,
257 SETTINGS_LIST_MAIN_MENU,
258 SETTINGS_LIST_DRIVERS,
259 SETTINGS_LIST_CORE,
260 SETTINGS_LIST_CONFIGURATION,
261 SETTINGS_LIST_LOGGING,
262 SETTINGS_LIST_SAVING,
263 SETTINGS_LIST_REWIND,
264 SETTINGS_LIST_CHEAT_DETAILS,
265 SETTINGS_LIST_CHEAT_SEARCH,
266 SETTINGS_LIST_CHEATS,
267 SETTINGS_LIST_VIDEO,
268 SETTINGS_LIST_CRT_SWITCHRES,
269 SETTINGS_LIST_AUDIO,
270 SETTINGS_LIST_INPUT,
271 SETTINGS_LIST_INPUT_TURBO_FIRE,
272 SETTINGS_LIST_INPUT_HOTKEY,
273 SETTINGS_LIST_RECORDING,
274 SETTINGS_LIST_FRAME_THROTTLING,
275 SETTINGS_LIST_FRAME_TIME_COUNTER,
276 SETTINGS_LIST_ONSCREEN_NOTIFICATIONS,
277 SETTINGS_LIST_OVERLAY,
278 #ifdef HAVE_VIDEO_LAYOUT
279 SETTINGS_LIST_VIDEO_LAYOUT,
280 #endif
281 SETTINGS_LIST_MENU,
282 SETTINGS_LIST_MENU_FILE_BROWSER,
283 SETTINGS_LIST_MULTIMEDIA,
284 SETTINGS_LIST_AI_SERVICE,
285 SETTINGS_LIST_ACCESSIBILITY,
286 SETTINGS_LIST_USER_INTERFACE,
287 SETTINGS_LIST_POWER_MANAGEMENT,
288 SETTINGS_LIST_WIFI_MANAGEMENT,
289 SETTINGS_LIST_MENU_SOUNDS,
290 SETTINGS_LIST_PLAYLIST,
291 SETTINGS_LIST_CHEEVOS,
292 SETTINGS_LIST_CORE_UPDATER,
293 SETTINGS_LIST_NETPLAY,
294 SETTINGS_LIST_LAKKA_SERVICES,
295 SETTINGS_LIST_USER,
296 SETTINGS_LIST_USER_ACCOUNTS,
297 SETTINGS_LIST_USER_ACCOUNTS_CHEEVOS,
298 SETTINGS_LIST_USER_ACCOUNTS_YOUTUBE,
299 SETTINGS_LIST_USER_ACCOUNTS_TWITCH,
300 SETTINGS_LIST_USER_ACCOUNTS_FACEBOOK,
301 SETTINGS_LIST_DIRECTORY,
302 SETTINGS_LIST_PRIVACY,
303 SETTINGS_LIST_MIDI,
304 SETTINGS_LIST_MANUAL_CONTENT_SCAN
305 };
306
307 struct bool_entry
308 {
309 bool *target;
310 uint32_t flags;
311 enum msg_hash_enums name_enum_idx;
312 enum msg_hash_enums SHORT_enum_idx;
313 enum msg_hash_enums off_enum_idx;
314 enum msg_hash_enums on_enum_idx;
315 bool default_value;
316 };
317
318 struct string_options_entry
319 {
320 const char *default_value;
321 const char *values;
322 char *target;
323 size_t len;
324 enum msg_hash_enums name_enum_idx;
325 enum msg_hash_enums SHORT_enum_idx;
326 };
327
328 typedef struct rarch_setting_info
329 {
330 int index;
331 int size;
332 } rarch_setting_info_t;
333
334 /* SETTINGS LIST */
335
menu_input_st_uint_cb(void * userdata,const char * str)336 static void menu_input_st_uint_cb(void *userdata, const char *str)
337 {
338 if (str && *str)
339 {
340 const char *label = menu_input_dialog_get_label_setting_buffer();
341 rarch_setting_t *setting = menu_setting_find(label);
342
343 setting_set_with_string_representation(setting, str);
344 }
345
346 menu_input_dialog_end();
347 }
348
349 /* TODO/FIXME - get rid of this eventually */
setting_get_ptr(rarch_setting_t * setting)350 static void *setting_get_ptr(rarch_setting_t *setting)
351 {
352 if (!setting)
353 return NULL;
354
355 switch (setting->type)
356 {
357 case ST_BOOL:
358 return setting->value.target.boolean;
359 case ST_INT:
360 return setting->value.target.integer;
361 case ST_UINT:
362 return setting->value.target.unsigned_integer;
363 case ST_SIZE:
364 return setting->value.target.sizet;
365 case ST_FLOAT:
366 return setting->value.target.fraction;
367 case ST_BIND:
368 return setting->value.target.keybind;
369 case ST_STRING:
370 case ST_STRING_OPTIONS:
371 case ST_PATH:
372 case ST_DIR:
373 return setting->value.target.string;
374 default:
375 break;
376 }
377
378 return NULL;
379 }
380
381
menu_input_st_hex_cb(void * userdata,const char * str)382 static void menu_input_st_hex_cb(void *userdata, const char *str)
383 {
384 if (str && *str)
385 {
386 const char *label = menu_input_dialog_get_label_setting_buffer();
387 rarch_setting_t *setting = menu_setting_find(label);
388
389 if (setting)
390 {
391 unsigned *ptr = (unsigned*)setting_get_ptr(setting);
392 if (str[0] == '#')
393 str++;
394 if (ptr)
395 *ptr = (unsigned)strtoul(str, NULL, 16);
396 }
397 }
398
399 menu_input_dialog_end();
400 }
401
menu_input_st_string_cb(void * userdata,const char * str)402 static void menu_input_st_string_cb(void *userdata, const char *str)
403 {
404 if (str && *str)
405 {
406 rarch_setting_t *setting = NULL;
407 const char *label = menu_input_dialog_get_label_setting_buffer();
408
409 if (!string_is_empty(label))
410 setting = menu_setting_find(label);
411
412 if (setting)
413 {
414 setting_set_with_string_representation(setting, str);
415 menu_setting_generic(setting, 0, false);
416 }
417 }
418
419 menu_input_dialog_end();
420 }
421
422
setting_generic_action_ok_linefeed(rarch_setting_t * setting,size_t idx,bool wraparound)423 static int setting_generic_action_ok_linefeed(
424 rarch_setting_t *setting, size_t idx, bool wraparound)
425 {
426 menu_input_ctx_line_t line;
427 input_keyboard_line_complete_t cb = NULL;
428
429 if (!setting)
430 return -1;
431
432 (void)wraparound;
433
434 switch (setting->type)
435 {
436 case ST_SIZE:
437 case ST_UINT:
438 cb = menu_input_st_uint_cb;
439 break;
440 case ST_HEX:
441 cb = menu_input_st_hex_cb;
442 break;
443 case ST_STRING:
444 case ST_STRING_OPTIONS:
445 cb = menu_input_st_string_cb;
446 break;
447 default:
448 break;
449 }
450
451 line.label = setting->short_description;
452 line.label_setting = setting->name;
453 line.type = 0;
454 line.idx = 0;
455 line.cb = cb;
456
457 if (!menu_input_dialog_start(&line))
458 return -1;
459 return 0;
460 }
461
setting_add_special_callbacks(rarch_setting_t ** list,rarch_setting_info_t * list_info,unsigned values)462 static void setting_add_special_callbacks(
463 rarch_setting_t **list,
464 rarch_setting_info_t *list_info,
465 unsigned values)
466 {
467 unsigned idx = list_info->index - 1;
468
469 if (values & SD_FLAG_ALLOW_INPUT)
470 {
471 (*list)[idx].action_ok = setting_generic_action_ok_linefeed;
472 (*list)[idx].action_select = setting_generic_action_ok_linefeed;
473
474 switch ((*list)[idx].type)
475 {
476 case ST_SIZE:
477 case ST_UINT:
478 (*list)[idx].action_cancel = NULL;
479 break;
480 case ST_HEX:
481 (*list)[idx].action_cancel = NULL;
482 break;
483 case ST_STRING:
484 (*list)[idx].action_start = setting_string_action_start_generic;
485 (*list)[idx].action_cancel = NULL;
486 break;
487 default:
488 break;
489 }
490 }
491 }
492
SETTINGS_LIST_APPEND_internal(rarch_setting_t ** list,rarch_setting_info_t * list_info)493 static bool SETTINGS_LIST_APPEND_internal(
494 rarch_setting_t **list,
495 rarch_setting_info_t *list_info)
496 {
497 unsigned new_size = list_info->size * 2;
498 rarch_setting_t *list_settings = (rarch_setting_t*)
499 realloc(*list, sizeof(rarch_setting_t) * new_size);
500
501 if (!list_settings)
502 return false;
503 list_info->size = new_size;
504 *list = list_settings;
505
506 return true;
507 }
508
setting_get_bind_type(rarch_setting_t * setting)509 unsigned setting_get_bind_type(rarch_setting_t *setting)
510 {
511 if (!setting)
512 return 0;
513 return setting->bind_type;
514 }
515
setting_bind_action_ok(rarch_setting_t * setting,size_t idx,bool wraparound)516 static int setting_bind_action_ok(
517 rarch_setting_t *setting, size_t idx, bool wraparound)
518 {
519 (void)wraparound; /* TODO/FIXME - handle this */
520
521 if (!menu_input_key_bind_set_mode(MENU_INPUT_BINDS_CTL_BIND_SINGLE, setting))
522 return -1;
523 return 0;
524 }
525
setting_int_action_right_default(rarch_setting_t * setting,size_t idx,bool wraparound)526 static int setting_int_action_right_default(
527 rarch_setting_t *setting, size_t idx, bool wraparound)
528 {
529 double max = 0.0f;
530
531 if (!setting)
532 return -1;
533
534 max = setting->max;
535
536 (void)wraparound; /* TODO/FIXME - handle this */
537
538 *setting->value.target.integer =
539 *setting->value.target.integer + setting->step;
540
541 if (setting->enforce_maxrange)
542 {
543 if (*setting->value.target.integer > max)
544 {
545 settings_t *settings = config_get_ptr();
546 double min = setting->min;
547
548 if (settings && settings->bools.menu_navigation_wraparound_enable)
549 *setting->value.target.integer = min;
550 else
551 *setting->value.target.integer = max;
552 }
553 }
554
555 return 0;
556 }
557
setting_bind_action_start(rarch_setting_t * setting)558 static int setting_bind_action_start(rarch_setting_t *setting)
559 {
560 unsigned bind_type;
561 struct retro_keybind *keybind = NULL;
562 struct retro_keybind *def_binds = (struct retro_keybind *)retro_keybinds_1;
563
564 if (!setting)
565 return -1;
566
567 keybind = (struct retro_keybind*)setting->value.target.keybind;
568 if (!keybind)
569 return -1;
570
571 keybind->joykey = NO_BTN;
572 keybind->joyaxis = AXIS_NONE;
573
574 /* Clear old mapping bit */
575 input_keyboard_mapping_bits(0, keybind->key);
576
577 if (setting->index_offset)
578 def_binds = (struct retro_keybind*)retro_keybinds_rest;
579
580 bind_type = setting_get_bind_type(setting);
581 keybind->key = def_binds[bind_type - MENU_SETTINGS_BIND_BEGIN].key;
582
583 keybind->mbutton = NO_BTN;
584
585 /* Store new mapping bit */
586 input_keyboard_mapping_bits(1, keybind->key);
587
588 return 0;
589 }
590
591 #if 0
592 static void setting_get_string_representation_hex(rarch_setting_t *setting,
593 char *s, size_t len)
594 {
595 if (setting)
596 snprintf(s, len, "%08x",
597 *setting->value.target.unsigned_integer);
598 }
599 #endif
600
setting_get_string_representation_hex_and_uint(rarch_setting_t * setting,char * s,size_t len)601 void setting_get_string_representation_hex_and_uint(rarch_setting_t *setting,
602 char *s, size_t len)
603 {
604 if (setting)
605 snprintf(s, len, "%u (%08X)",
606 *setting->value.target.unsigned_integer, *setting->value.target.unsigned_integer);
607 }
608
setting_get_string_representation_uint(rarch_setting_t * setting,char * s,size_t len)609 void setting_get_string_representation_uint(rarch_setting_t *setting,
610 char *s, size_t len)
611 {
612 if (setting)
613 snprintf(s, len, "%u",
614 *setting->value.target.unsigned_integer);
615 }
616
setting_get_string_representation_size(rarch_setting_t * setting,char * s,size_t len)617 void setting_get_string_representation_size(rarch_setting_t *setting,
618 char *s, size_t len)
619 {
620 if (setting)
621 snprintf(s, len, "%" PRI_SIZET,
622 *setting->value.target.sizet);
623 }
624
setting_get_string_representation_size_in_mb(rarch_setting_t * setting,char * s,size_t len)625 void setting_get_string_representation_size_in_mb(rarch_setting_t *setting,
626 char *s, size_t len)
627 {
628 if (setting)
629 snprintf(s, len, "%" PRI_SIZET,
630 (*setting->value.target.sizet)/(1024*1024));
631 }
632
633 #ifdef HAVE_CHEATS
setting_get_string_representation_uint_as_enum(rarch_setting_t * setting,char * s,size_t len)634 static void setting_get_string_representation_uint_as_enum(
635 rarch_setting_t *setting,
636 char *s, size_t len)
637 {
638 if (setting)
639 snprintf(s, len, "%s",
640 msg_hash_to_str((enum msg_hash_enums)(
641 setting->index_offset+(
642 *setting->value.target.unsigned_integer))));
643 }
644 #endif
645
recalc_step_based_on_length_of_action(rarch_setting_t * setting)646 static float recalc_step_based_on_length_of_action(rarch_setting_t *setting)
647 {
648 float step = setting->step;
649 global_t *global = global_get_ptr();
650
651 if (global)
652 {
653 retro_time_t action_press_time = global->menu.action_press_time;
654 if (action_press_time > _21_SECONDS)
655 step = setting->step * 1000000.0f;
656 else if (action_press_time > _18_SECONDS)
657 step = setting->step * 100000.0f;
658 else if (action_press_time > _15_SECONDS)
659 step = setting->step * 10000.0f;
660 else if (action_press_time > _12_SECONDS)
661 step = setting->step * 1000.0f;
662 else if (action_press_time > _9_SECONDS)
663 step = setting->step * 100.0f;
664 else if (action_press_time > _6_SECONDS)
665 step = setting->step * 10.0f;
666 else if (action_press_time > _3_SECONDS)
667 step = setting->step * 5.0f;
668 else
669 step = setting->step;
670 }
671 return step < setting->step ? setting->step : step;
672 }
673
setting_uint_action_left_default(rarch_setting_t * setting,size_t idx,bool wraparound)674 int setting_uint_action_left_default(
675 rarch_setting_t *setting, size_t idx, bool wraparound)
676 {
677 double min = 0.0f;
678 bool overflowed = false;
679 float step = 0.0f;
680
681 if (!setting)
682 return -1;
683
684 min = setting->min;
685
686 (void)wraparound; /* TODO/FIXME - handle this */
687
688 step = recalc_step_based_on_length_of_action(setting);
689 overflowed = step > *setting->value.target.unsigned_integer;
690
691 if (!overflowed)
692 *setting->value.target.unsigned_integer =
693 *setting->value.target.unsigned_integer - step;
694
695 if (setting->enforce_minrange)
696 {
697 if (overflowed || *setting->value.target.unsigned_integer < min)
698 {
699 settings_t *settings = config_get_ptr();
700 double max = setting->max;
701
702 if (settings && settings->bools.menu_navigation_wraparound_enable)
703 *setting->value.target.unsigned_integer = max;
704 else
705 *setting->value.target.unsigned_integer = min;
706 }
707 }
708
709 return 0;
710 }
711
setting_uint_action_right_default(rarch_setting_t * setting,size_t idx,bool wraparound)712 int setting_uint_action_right_default(
713 rarch_setting_t *setting, size_t idx, bool wraparound)
714 {
715 double max = 0.0f;
716 float step = 0.0f;
717
718 if (!setting)
719 return -1;
720
721 max = setting->max;
722 step =
723 recalc_step_based_on_length_of_action(setting);
724
725 *setting->value.target.unsigned_integer =
726 *setting->value.target.unsigned_integer + step;
727
728 if (setting->enforce_maxrange)
729 {
730 if (*setting->value.target.unsigned_integer > max)
731 {
732 settings_t *settings = config_get_ptr();
733 double min = setting->min;
734
735 if (settings && settings->bools.menu_navigation_wraparound_enable)
736 *setting->value.target.unsigned_integer = min;
737 else
738 *setting->value.target.unsigned_integer = max;
739 }
740 }
741
742 return 0;
743 }
744
setting_bool_action_right_with_refresh(rarch_setting_t * setting,size_t idx,bool wraparound)745 int setting_bool_action_right_with_refresh(
746 rarch_setting_t *setting, size_t idx, bool wraparound)
747 {
748 bool refresh = false;
749
750 setting_set_with_string_representation(setting,
751 *setting->value.target.boolean ? "false" : "true");
752
753 menu_entries_ctl(MENU_ENTRIES_CTL_SET_REFRESH, &refresh);
754 menu_driver_ctl(RARCH_MENU_CTL_SET_PREVENT_POPULATE, NULL);
755
756 return 0;
757 }
758
setting_uint_action_right_with_refresh(rarch_setting_t * setting,size_t idx,bool wraparound)759 int setting_uint_action_right_with_refresh(
760 rarch_setting_t *setting, size_t idx, bool wraparound)
761 {
762 int retval = setting_uint_action_right_default(setting, idx, wraparound);
763 bool refresh = false;
764
765 menu_entries_ctl(MENU_ENTRIES_CTL_SET_REFRESH, &refresh);
766 menu_driver_ctl(RARCH_MENU_CTL_SET_PREVENT_POPULATE, NULL);
767
768 return retval;
769 }
770
setting_bool_action_left_with_refresh(rarch_setting_t * setting,size_t idx,bool wraparound)771 int setting_bool_action_left_with_refresh(
772 rarch_setting_t *setting, size_t idx, bool wraparound)
773 {
774 bool refresh = false;
775
776 setting_set_with_string_representation(setting,
777 *setting->value.target.boolean ? "false" : "true");
778
779 menu_entries_ctl(MENU_ENTRIES_CTL_SET_REFRESH, &refresh);
780 menu_driver_ctl(RARCH_MENU_CTL_SET_PREVENT_POPULATE, NULL);
781
782 return 0;
783 }
784
setting_uint_action_left_with_refresh(rarch_setting_t * setting,size_t idx,bool wraparound)785 int setting_uint_action_left_with_refresh(
786 rarch_setting_t *setting, size_t idx, bool wraparound)
787 {
788 int retval = setting_uint_action_left_default(setting, idx, wraparound);
789 bool refresh = false;
790
791 menu_entries_ctl(MENU_ENTRIES_CTL_SET_REFRESH, &refresh);
792 menu_driver_ctl(RARCH_MENU_CTL_SET_PREVENT_POPULATE, NULL);
793
794 return retval;
795
796 }
797
setting_size_action_left_default(rarch_setting_t * setting,size_t idx,bool wraparound)798 static int setting_size_action_left_default(
799 rarch_setting_t *setting, size_t idx, bool wraparound)
800 {
801 double min = 0.0f;
802 bool overflowed = false;
803 float step = 0.0f;
804
805 if (!setting)
806 return -1;
807
808 min = setting->min;
809
810 (void)wraparound; /* TODO/FIXME - handle this */
811
812 step = recalc_step_based_on_length_of_action(setting);
813 overflowed = step > *setting->value.target.sizet;
814
815 if (!overflowed)
816 *setting->value.target.sizet = *setting->value.target.sizet - step;
817
818 if (setting->enforce_minrange)
819 {
820 if (overflowed || *setting->value.target.sizet < min)
821 {
822 settings_t *settings = config_get_ptr();
823 double max = setting->max;
824
825 if (settings && settings->bools.menu_navigation_wraparound_enable)
826 *setting->value.target.sizet = max;
827 else
828 *setting->value.target.sizet = min;
829 }
830 }
831
832 return 0;
833 }
834
setting_size_action_right_default(rarch_setting_t * setting,size_t idx,bool wraparound)835 static int setting_size_action_right_default(
836 rarch_setting_t *setting, size_t idx, bool wraparound)
837 {
838 double max = 0.0f;
839 float step = 0.0f;
840
841 if (!setting)
842 return -1;
843
844 max = setting->max;
845
846 (void)wraparound; /* TODO/FIXME - handle this */
847
848 step = recalc_step_based_on_length_of_action(setting);
849
850 *setting->value.target.sizet =
851 *setting->value.target.sizet + step;
852
853 if (setting->enforce_maxrange)
854 {
855 if (*setting->value.target.sizet > max)
856 {
857 settings_t *settings = config_get_ptr();
858 double min = setting->min;
859
860 if (settings && settings->bools.menu_navigation_wraparound_enable)
861 *setting->value.target.sizet = min;
862 else
863 *setting->value.target.sizet = max;
864 }
865 }
866
867 return 0;
868 }
869
setting_generic_action_ok_default(rarch_setting_t * setting,size_t idx,bool wraparound)870 int setting_generic_action_ok_default(
871 rarch_setting_t *setting, size_t idx, bool wraparound)
872 {
873 if (!setting)
874 return -1;
875
876 (void)wraparound; /* TODO/FIXME - handle this */
877
878 if (setting->cmd_trigger_idx != CMD_EVENT_NONE)
879 setting->cmd_trigger_event_triggered = true;
880
881 return 0;
882 }
883
setting_generic_handle_change(rarch_setting_t * setting)884 void setting_generic_handle_change(rarch_setting_t *setting)
885 {
886 settings_t *settings = config_get_ptr();
887 settings->modified = true;
888
889 if (setting->change_handler)
890 setting->change_handler(setting);
891
892 if (setting->cmd_trigger_idx && !setting->cmd_trigger_event_triggered)
893 command_event(setting->cmd_trigger_idx, NULL);
894 }
895
896
setting_get_string_representation_int_gpu_index(rarch_setting_t * setting,char * s,size_t len)897 static void setting_get_string_representation_int_gpu_index(rarch_setting_t *setting,
898 char *s, size_t len)
899 {
900 if (setting)
901 {
902 struct string_list *list = video_driver_get_gpu_api_devices(video_context_driver_get_api());
903
904 if (list && (*setting->value.target.integer < (int)list->size) && !string_is_empty(list->elems[*setting->value.target.integer].data))
905 snprintf(s, len, "%d - %s", *setting->value.target.integer, list->elems[*setting->value.target.integer].data);
906 else
907 snprintf(s, len, "%d", *setting->value.target.integer);
908 }
909 }
910
setting_get_string_representation_int(rarch_setting_t * setting,char * s,size_t len)911 static void setting_get_string_representation_int(rarch_setting_t *setting,
912 char *s, size_t len)
913 {
914 if (setting)
915 snprintf(s, len, "%d", *setting->value.target.integer);
916 }
917
918 /**
919 * setting_set_with_string_representation:
920 * @setting : pointer to setting
921 * @value : value for the setting (string)
922 *
923 * Set a settings' value with a string. It is assumed
924 * that the string has been properly formatted.
925 **/
setting_set_with_string_representation(rarch_setting_t * setting,const char * value)926 int setting_set_with_string_representation(rarch_setting_t* setting,
927 const char* value)
928 {
929 double min, max;
930 uint64_t flags;
931 if (!setting || !value)
932 return -1;
933
934 min = setting->min;
935 max = setting->max;
936 flags = setting->flags;
937
938 switch (setting->type)
939 {
940 case ST_INT:
941 sscanf(value, "%d", setting->value.target.integer);
942 if (flags & SD_FLAG_HAS_RANGE)
943 {
944 if (setting->enforce_minrange && *setting->value.target.integer < min)
945 *setting->value.target.integer = min;
946 if (setting->enforce_maxrange && *setting->value.target.integer > max)
947 {
948 settings_t *settings = config_get_ptr();
949 if (settings && settings->bools.menu_navigation_wraparound_enable)
950 *setting->value.target.integer = min;
951 else
952 *setting->value.target.integer = max;
953 }
954 }
955 break;
956 case ST_UINT:
957 sscanf(value, "%u", setting->value.target.unsigned_integer);
958 if (flags & SD_FLAG_HAS_RANGE)
959 {
960 if (setting->enforce_minrange && *setting->value.target.unsigned_integer < min)
961 *setting->value.target.unsigned_integer = min;
962 if (setting->enforce_maxrange && *setting->value.target.unsigned_integer > max)
963 {
964 settings_t *settings = config_get_ptr();
965 if (settings && settings->bools.menu_navigation_wraparound_enable)
966 *setting->value.target.unsigned_integer = min;
967 else
968 *setting->value.target.unsigned_integer = max;
969 }
970 }
971 break;
972 case ST_SIZE:
973 sscanf(value, "%" PRI_SIZET, setting->value.target.sizet);
974 if (flags & SD_FLAG_HAS_RANGE)
975 {
976 if (setting->enforce_minrange && *setting->value.target.sizet < min)
977 *setting->value.target.sizet = min;
978 if (setting->enforce_maxrange && *setting->value.target.sizet > max)
979 {
980 settings_t *settings = config_get_ptr();
981 if (settings && settings->bools.menu_navigation_wraparound_enable)
982 *setting->value.target.sizet = min;
983 else
984 *setting->value.target.sizet = max;
985 }
986 }
987 break;
988 case ST_FLOAT:
989 sscanf(value, "%f", setting->value.target.fraction);
990 if (flags & SD_FLAG_HAS_RANGE)
991 {
992 if (setting->enforce_minrange && *setting->value.target.fraction < min)
993 *setting->value.target.fraction = min;
994 if (setting->enforce_maxrange && *setting->value.target.fraction > max)
995 {
996 settings_t *settings = config_get_ptr();
997 if (settings && settings->bools.menu_navigation_wraparound_enable)
998 *setting->value.target.fraction = min;
999 else
1000 *setting->value.target.fraction = max;
1001 }
1002 }
1003 break;
1004 case ST_PATH:
1005 case ST_DIR:
1006 case ST_STRING:
1007 case ST_STRING_OPTIONS:
1008 case ST_ACTION:
1009 if (setting->value.target.string)
1010 strlcpy(setting->value.target.string, value, setting->size);
1011 break;
1012 case ST_BOOL:
1013 if (string_is_equal(value, "true"))
1014 *setting->value.target.boolean = true;
1015 else if (string_is_equal(value, "false"))
1016 *setting->value.target.boolean = false;
1017 break;
1018 default:
1019 break;
1020 }
1021
1022 if (setting->change_handler)
1023 setting->change_handler(setting);
1024
1025 return 0;
1026 }
1027
setting_fraction_action_left_default(rarch_setting_t * setting,size_t idx,bool wraparound)1028 static int setting_fraction_action_left_default(
1029 rarch_setting_t *setting, size_t idx, bool wraparound)
1030 {
1031 double min = 0.0f;
1032
1033 if (!setting)
1034 return -1;
1035
1036 min = setting->min;
1037
1038 (void)wraparound; /* TODO/FIXME - handle this */
1039
1040 *setting->value.target.fraction = *setting->value.target.fraction - setting->step;
1041
1042 if (setting->enforce_minrange)
1043 {
1044 if (*setting->value.target.fraction < min)
1045 {
1046 settings_t *settings = config_get_ptr();
1047 double max = setting->max;
1048
1049 if (settings && settings->bools.menu_navigation_wraparound_enable)
1050 *setting->value.target.fraction = max;
1051 else
1052 *setting->value.target.fraction = min;
1053 }
1054 }
1055
1056 return 0;
1057 }
1058
setting_fraction_action_right_default(rarch_setting_t * setting,size_t idx,bool wraparound)1059 static int setting_fraction_action_right_default(
1060 rarch_setting_t *setting, size_t idx, bool wraparound)
1061 {
1062 double max = 0.0f;
1063
1064 if (!setting)
1065 return -1;
1066
1067 max = setting->max;
1068
1069 (void)wraparound; /* TODO/FIXME - handle this */
1070
1071 *setting->value.target.fraction =
1072 *setting->value.target.fraction + setting->step;
1073
1074 if (setting->enforce_maxrange)
1075 {
1076 if (*setting->value.target.fraction > max)
1077 {
1078 settings_t *settings = config_get_ptr();
1079 double min = setting->min;
1080
1081 if (settings && settings->bools.menu_navigation_wraparound_enable)
1082 *setting->value.target.fraction = min;
1083 else
1084 *setting->value.target.fraction = max;
1085 }
1086 }
1087
1088 return 0;
1089 }
1090
1091 /**
1092 * setting_reset_setting:
1093 * @setting : pointer to setting
1094 *
1095 * Reset a setting's value to its defaults.
1096 **/
setting_reset_setting(rarch_setting_t * setting)1097 static void setting_reset_setting(rarch_setting_t* setting)
1098 {
1099 if (!setting)
1100 return;
1101
1102 switch (setting->type)
1103 {
1104 case ST_BOOL:
1105 *setting->value.target.boolean = setting->default_value.boolean;
1106 break;
1107 case ST_INT:
1108 *setting->value.target.integer = setting->default_value.integer;
1109 break;
1110 case ST_UINT:
1111 *setting->value.target.unsigned_integer = setting->default_value.unsigned_integer;
1112 break;
1113 case ST_SIZE:
1114 *setting->value.target.sizet = setting->default_value.sizet;
1115 break;
1116 case ST_FLOAT:
1117 *setting->value.target.fraction = setting->default_value.fraction;
1118 break;
1119 case ST_BIND:
1120 *setting->value.target.keybind = *setting->default_value.keybind;
1121 break;
1122 case ST_STRING:
1123 case ST_STRING_OPTIONS:
1124 case ST_PATH:
1125 case ST_DIR:
1126 if (setting->default_value.string)
1127 {
1128 if (setting->type == ST_STRING)
1129 setting_set_with_string_representation(setting, setting->default_value.string);
1130 else
1131 fill_pathname_expand_special(setting->value.target.string,
1132 setting->default_value.string, setting->size);
1133 }
1134 break;
1135 default:
1136 break;
1137 }
1138
1139 if (setting->change_handler)
1140 setting->change_handler(setting);
1141 }
1142
setting_generic_action_start_default(rarch_setting_t * setting)1143 int setting_generic_action_start_default(rarch_setting_t *setting)
1144 {
1145 bool refresh = false;
1146 if (!setting)
1147 return -1;
1148
1149 setting_reset_setting(setting);
1150
1151 menu_entries_ctl(MENU_ENTRIES_CTL_SET_REFRESH, &refresh);
1152 menu_driver_ctl(RARCH_MENU_CTL_SET_PREVENT_POPULATE, NULL);
1153 return 0;
1154 }
1155
setting_get_string_representation_default(rarch_setting_t * setting,char * s,size_t len)1156 static void setting_get_string_representation_default(rarch_setting_t *setting,
1157 char *s, size_t len)
1158 {
1159 strcpy_literal(s, "...");
1160 }
1161
1162 /**
1163 * setting_get_string_representation_st_bool:
1164 * @setting : pointer to setting
1165 * @s : string for the type to be represented on-screen as
1166 * a label.
1167 * @len : size of @s
1168 *
1169 * Set a settings' label value. The setting is of type ST_BOOL.
1170 **/
setting_get_string_representation_st_bool(rarch_setting_t * setting,char * s,size_t len)1171 static void setting_get_string_representation_st_bool(rarch_setting_t *setting,
1172 char *s, size_t len)
1173 {
1174 if (setting)
1175 strlcpy(s, *setting->value.target.boolean ? setting->boolean.on_label :
1176 setting->boolean.off_label, len);
1177 }
1178
1179 /**
1180 * setting_get_string_representation_st_float:
1181 * @setting : pointer to setting
1182 * @s : string for the type to be represented on-screen as
1183 * a label.
1184 * @len : size of @s
1185 *
1186 * Set a settings' label value. The setting is of type ST_FLOAT.
1187 **/
setting_get_string_representation_st_float(rarch_setting_t * setting,char * s,size_t len)1188 static void setting_get_string_representation_st_float(rarch_setting_t *setting,
1189 char *s, size_t len)
1190 {
1191 if (setting)
1192 snprintf(s, len, setting->rounding_fraction,
1193 *setting->value.target.fraction);
1194 }
1195
setting_get_string_representation_st_dir(rarch_setting_t * setting,char * s,size_t len)1196 static void setting_get_string_representation_st_dir(rarch_setting_t *setting,
1197 char *s, size_t len)
1198 {
1199 if (setting)
1200 strlcpy(s,
1201 *setting->value.target.string ?
1202 setting->value.target.string : setting->dir.empty_path,
1203 len);
1204 }
1205
setting_get_string_representation_st_path(rarch_setting_t * setting,char * s,size_t len)1206 static void setting_get_string_representation_st_path(rarch_setting_t *setting,
1207 char *s, size_t len)
1208 {
1209 if (setting)
1210 fill_short_pathname_representation(s, setting->value.target.string, len);
1211 }
1212
setting_get_string_representation_st_string(rarch_setting_t * setting,char * s,size_t len)1213 static void setting_get_string_representation_st_string(rarch_setting_t *setting,
1214 char *s, size_t len)
1215 {
1216 if (setting)
1217 strlcpy(s, setting->value.target.string, len);
1218 }
1219
setting_get_string_representation_st_bind(rarch_setting_t * setting,char * s,size_t len)1220 static void setting_get_string_representation_st_bind(rarch_setting_t *setting,
1221 char *s, size_t len)
1222 {
1223 unsigned index_offset = 0;
1224 const struct retro_keybind* keybind = NULL;
1225 const struct retro_keybind* auto_bind = NULL;
1226
1227 if (!setting)
1228 return;
1229
1230 index_offset = setting->index_offset;
1231 keybind = (const struct retro_keybind*)setting->value.target.keybind;
1232 auto_bind = (const struct retro_keybind*)
1233 input_config_get_bind_auto(index_offset, keybind->id);
1234
1235 input_config_get_bind_string(s, keybind, auto_bind, len);
1236 }
1237
setting_action_action_ok(rarch_setting_t * setting,size_t idx,bool wraparound)1238 static int setting_action_action_ok(
1239 rarch_setting_t *setting, size_t idx, bool wraparound)
1240 {
1241 if (!setting)
1242 return -1;
1243
1244 (void)wraparound; /* TODO/FIXME - handle this */
1245
1246 if (setting->cmd_trigger_idx != CMD_EVENT_NONE)
1247 command_event(setting->cmd_trigger_idx, NULL);
1248
1249 return 0;
1250 }
1251
1252 /**
1253 * setting_action_setting:
1254 * @name : Name of setting.
1255 * @short_description : Short description of setting.
1256 * @group : Group that the setting belongs to.
1257 * @subgroup : Subgroup that the setting belongs to.
1258 *
1259 * Initializes a setting of type ST_ACTION.
1260 *
1261 * Returns: setting of type ST_ACTION.
1262 **/
setting_action_setting(const char * name,const char * short_description,const char * group,const char * subgroup,const char * parent_group,bool dont_use_enum_idx)1263 static rarch_setting_t setting_action_setting(const char* name,
1264 const char* short_description,
1265 const char *group, const char *subgroup,
1266 const char *parent_group,
1267 bool dont_use_enum_idx)
1268 {
1269 rarch_setting_t result;
1270
1271 result.enum_idx = MSG_UNKNOWN;
1272 result.type = ST_ACTION;
1273
1274 result.size = 0;
1275
1276 result.name = name;
1277 result.short_description = short_description;
1278 result.group = group;
1279 result.subgroup = subgroup;
1280 result.parent_group = parent_group;
1281 result.values = NULL;
1282
1283 result.index = 0;
1284 result.index_offset = 0;
1285 result.offset_by = 0;
1286
1287 result.min = 0.0;
1288 result.max = 0.0;
1289
1290 result.flags = 0;
1291 result.free_flags = 0;
1292
1293 result.change_handler = NULL;
1294 result.read_handler = NULL;
1295 result.action_start = NULL;
1296 result.action_left = NULL;
1297 result.action_right = NULL;
1298 result.action_up = NULL;
1299 result.action_down = NULL;
1300 result.action_cancel = NULL;
1301 result.action_ok = setting_action_action_ok;
1302 result.action_select = setting_action_action_ok;
1303 result.get_string_representation = &setting_get_string_representation_default;
1304
1305 result.bind_type = 0;
1306 result.browser_selection_type = ST_NONE;
1307 result.step = 0.0f;
1308 result.rounding_fraction = NULL;
1309 result.enforce_minrange = false;
1310 result.enforce_maxrange = false;
1311
1312 result.cmd_trigger_idx = CMD_EVENT_NONE;
1313 result.cmd_trigger_event_triggered = false;
1314
1315 result.dont_use_enum_idx_representation = dont_use_enum_idx;
1316
1317 return result;
1318 }
1319
1320 /**
1321 * setting_group_setting:
1322 * @type : type of settting.
1323 * @name : name of setting.
1324 *
1325 * Initializes a setting of type ST_GROUP.
1326 *
1327 * Returns: setting of type ST_GROUP.
1328 **/
setting_group_setting(enum setting_type type,const char * name,const char * parent_group)1329 static rarch_setting_t setting_group_setting(
1330 enum setting_type type, const char* name,
1331 const char *parent_group)
1332 {
1333 rarch_setting_t result;
1334
1335 result.enum_idx = MSG_UNKNOWN;
1336 result.type = type;
1337
1338 result.size = 0;
1339
1340 result.name = name;
1341 result.short_description = name;
1342 result.group = NULL;
1343 result.subgroup = NULL;
1344 result.parent_group = parent_group;
1345 result.values = NULL;
1346
1347 result.index = 0;
1348 result.index_offset = 0;
1349 result.offset_by = 0;
1350
1351 result.min = 0.0;
1352 result.max = 0.0;
1353
1354 result.flags = 0;
1355 result.free_flags = 0;
1356
1357 result.change_handler = NULL;
1358 result.read_handler = NULL;
1359 result.action_start = NULL;
1360 result.action_left = NULL;
1361 result.action_right = NULL;
1362 result.action_up = NULL;
1363 result.action_down = NULL;
1364 result.action_cancel = NULL;
1365 result.action_ok = NULL;
1366 result.action_select = NULL;
1367 result.get_string_representation = &setting_get_string_representation_default;
1368
1369 result.bind_type = 0;
1370 result.browser_selection_type = ST_NONE;
1371 result.step = 0.0f;
1372 result.rounding_fraction = NULL;
1373 result.enforce_minrange = false;
1374 result.enforce_maxrange = false;
1375
1376 result.cmd_trigger_idx = CMD_EVENT_NONE;
1377 result.cmd_trigger_event_triggered = false;
1378
1379 result.dont_use_enum_idx_representation = false;
1380
1381 return result;
1382 }
1383
1384 /**
1385 * setting_float_setting:
1386 * @name : name of setting.
1387 * @short_description : Short description of setting.
1388 * @target : Target of float setting.
1389 * @default_value : Default value (in float).
1390 * @rounding : Rounding (for float-to-string representation).
1391 * @group : Group that the setting belongs to.
1392 * @subgroup : Subgroup that the setting belongs to.
1393 * @change_handler : Function callback for change handler function pointer.
1394 * @read_handler : Function callback for read handler function pointer.
1395 *
1396 * Initializes a setting of type ST_FLOAT.
1397 *
1398 * Returns: setting of type ST_FLOAT.
1399 **/
setting_float_setting(const char * name,const char * short_description,float * target,float default_value,const char * rounding,const char * group,const char * subgroup,const char * parent_group,change_handler_t change_handler,change_handler_t read_handler,bool dont_use_enum_idx)1400 static rarch_setting_t setting_float_setting(const char* name,
1401 const char* short_description, float* target, float default_value,
1402 const char *rounding, const char *group, const char *subgroup,
1403 const char *parent_group,
1404 change_handler_t change_handler, change_handler_t read_handler,
1405 bool dont_use_enum_idx)
1406 {
1407 rarch_setting_t result;
1408
1409 result.enum_idx = MSG_UNKNOWN;
1410 result.type = ST_FLOAT;
1411
1412 result.size = sizeof(float);
1413
1414 result.name = name;
1415 result.short_description = short_description;
1416 result.group = group;
1417 result.subgroup = subgroup;
1418 result.parent_group = parent_group;
1419 result.values = NULL;
1420
1421 result.index = 0;
1422 result.index_offset = 0;
1423 result.offset_by = 0;
1424
1425 result.min = 0.0;
1426 result.max = 0.0;
1427
1428 result.flags = 0;
1429 result.free_flags = 0;
1430
1431 result.change_handler = change_handler;
1432 result.read_handler = read_handler;
1433 result.action_start = setting_generic_action_start_default;
1434 result.action_left = setting_fraction_action_left_default;
1435 result.action_right = setting_fraction_action_right_default;
1436 result.action_up = NULL;
1437 result.action_down = NULL;
1438 result.action_cancel = NULL;
1439 result.action_ok = setting_generic_action_ok_default;
1440 result.action_select = setting_generic_action_ok_default;
1441 result.get_string_representation = &setting_get_string_representation_st_float;
1442
1443 result.bind_type = 0;
1444 result.browser_selection_type = ST_NONE;
1445 result.step = 0.0f;
1446 result.rounding_fraction = rounding;
1447 result.enforce_minrange = false;
1448 result.enforce_maxrange = false;
1449
1450 result.value.target.fraction = target;
1451 result.original_value.fraction = *target;
1452 result.default_value.fraction = default_value;
1453
1454 result.cmd_trigger_idx = CMD_EVENT_NONE;
1455 result.cmd_trigger_event_triggered = false;
1456
1457 result.dont_use_enum_idx_representation = dont_use_enum_idx;
1458
1459 return result;
1460 }
1461
1462 /**
1463 * setting_uint_setting:
1464 * @name : name of setting.
1465 * @short_description : Short description of setting.
1466 * @target : Target of unsigned integer setting.
1467 * @default_value : Default value (in unsigned integer format).
1468 * @group : Group that the setting belongs to.
1469 * @subgroup : Subgroup that the setting belongs to.
1470 * @change_handler : Function callback for change handler function pointer.
1471 * @read_handler : Function callback for read handler function pointer.
1472 *
1473 * Initializes a setting of type ST_UINT.
1474 *
1475 * Returns: setting of type ST_UINT.
1476 **/
setting_uint_setting(const char * name,const char * short_description,unsigned int * target,unsigned int default_value,const char * group,const char * subgroup,const char * parent_group,change_handler_t change_handler,change_handler_t read_handler,bool dont_use_enum_idx)1477 static rarch_setting_t setting_uint_setting(const char* name,
1478 const char* short_description, unsigned int* target,
1479 unsigned int default_value,
1480 const char *group, const char *subgroup, const char *parent_group,
1481 change_handler_t change_handler, change_handler_t read_handler,
1482 bool dont_use_enum_idx)
1483 {
1484 rarch_setting_t result;
1485
1486 result.enum_idx = MSG_UNKNOWN;
1487 result.type = ST_UINT;
1488
1489 result.size = sizeof(unsigned int);
1490
1491 result.name = name;
1492 result.short_description = short_description;
1493 result.group = group;
1494 result.subgroup = subgroup;
1495 result.parent_group = parent_group;
1496 result.values = NULL;
1497
1498 result.index = 0;
1499 result.index_offset = 0;
1500 result.offset_by = 0;
1501
1502 result.min = 0.0;
1503 result.max = 0.0;
1504
1505 result.flags = 0;
1506 result.free_flags = 0;
1507
1508 result.change_handler = change_handler;
1509 result.read_handler = read_handler;
1510 result.action_start = setting_generic_action_start_default;
1511 result.action_left = setting_uint_action_left_default;
1512 result.action_right = setting_uint_action_right_default;
1513 result.action_up = NULL;
1514 result.action_down = NULL;
1515 result.action_cancel = NULL;
1516 result.action_ok = setting_generic_action_ok_default;
1517 result.action_select = setting_generic_action_ok_default;
1518 result.get_string_representation = &setting_get_string_representation_uint;
1519
1520 result.bind_type = 0;
1521 result.browser_selection_type = ST_NONE;
1522 result.step = 0.0f;
1523 result.rounding_fraction = NULL;
1524 result.enforce_minrange = false;
1525 result.enforce_maxrange = false;
1526
1527 result.value.target.unsigned_integer = target;
1528 result.original_value.unsigned_integer = *target;
1529 result.default_value.unsigned_integer = default_value;
1530
1531 result.cmd_trigger_idx = CMD_EVENT_NONE;
1532 result.cmd_trigger_event_triggered = false;
1533
1534 result.dont_use_enum_idx_representation = dont_use_enum_idx;
1535
1536 return result;
1537 }
1538
1539 /**
1540 * setting_size_setting:
1541 * @name : name of setting.
1542 * @short_description : Short description of setting.
1543 * @target : Target of size_t setting.
1544 * @default_value : Default value (in size_t format).
1545 * @group : Group that the setting belongs to.
1546 * @subgroup : Subgroup that the setting belongs to.
1547 * @change_handler : Function callback for change handler function pointer.
1548 * @read_handler : Function callback for read handler function pointer.
1549 * @dont_use_enum_idx : Boolean indicating whether or not to use the enum idx
1550 * @string_representation_handler : Function callback for converting the setting to a string
1551 *
1552 * Initializes a setting of type ST_SIZE.
1553 *
1554 * Returns: setting of type ST_SIZE.
1555 **/
setting_size_setting(const char * name,const char * short_description,size_t * target,size_t default_value,const char * group,const char * subgroup,const char * parent_group,change_handler_t change_handler,change_handler_t read_handler,bool dont_use_enum_idx,get_string_representation_t string_representation_handler)1556 static rarch_setting_t setting_size_setting(const char* name,
1557 const char* short_description, size_t* target,
1558 size_t default_value,
1559 const char *group, const char *subgroup, const char *parent_group,
1560 change_handler_t change_handler, change_handler_t read_handler,
1561 bool dont_use_enum_idx, get_string_representation_t string_representation_handler)
1562 {
1563 rarch_setting_t result;
1564
1565 result.enum_idx = MSG_UNKNOWN;
1566 result.type = ST_SIZE;
1567
1568 result.size = sizeof(size_t);
1569
1570 result.name = name;
1571 result.short_description = short_description;
1572 result.group = group;
1573 result.subgroup = subgroup;
1574 result.parent_group = parent_group;
1575 result.values = NULL;
1576
1577 result.index = 0;
1578 result.index_offset = 0;
1579 result.offset_by = 0;
1580
1581 result.min = 0.0;
1582 result.max = 0.0;
1583
1584 result.flags = 0;
1585 result.free_flags = 0;
1586
1587 result.change_handler = change_handler;
1588 result.read_handler = read_handler;
1589 result.action_start = setting_generic_action_start_default;
1590 result.action_left = setting_size_action_left_default;
1591 result.action_right = setting_size_action_right_default;
1592 result.action_up = NULL;
1593 result.action_down = NULL;
1594 result.action_cancel = NULL;
1595 result.action_ok = setting_generic_action_ok_default;
1596 result.action_select = setting_generic_action_ok_default;
1597 result.get_string_representation = string_representation_handler;
1598
1599 result.bind_type = 0;
1600 result.browser_selection_type = ST_NONE;
1601 result.step = 0.0f;
1602 result.rounding_fraction = NULL;
1603 result.enforce_minrange = false;
1604 result.enforce_maxrange = false;
1605
1606 result.value.target.sizet = target;
1607 result.original_value.sizet = *target;
1608 result.default_value.sizet = default_value;
1609
1610 result.cmd_trigger_idx = CMD_EVENT_NONE;
1611 result.cmd_trigger_event_triggered = false;
1612
1613 result.dont_use_enum_idx_representation = dont_use_enum_idx;
1614
1615 return result;
1616 }
1617
1618 /**
1619 * setting_hex_setting:
1620 * @name : name of setting.
1621 * @short_description : Short description of setting.
1622 * @target : Target of unsigned integer setting.
1623 * @default_value : Default value (in unsigned integer format).
1624 * @group : Group that the setting belongs to.
1625 * @subgroup : Subgroup that the setting belongs to.
1626 * @change_handler : Function callback for change handler function pointer.
1627 * @read_handler : Function callback for read handler function pointer.
1628 *
1629 * Initializes a setting of type ST_HEX.
1630 *
1631 * Returns: setting of type ST_HEX.
1632 **/
1633 #if 0
1634 static rarch_setting_t setting_hex_setting(const char* name,
1635 const char* short_description, unsigned int* target,
1636 unsigned int default_value,
1637 const char *group, const char *subgroup, const char *parent_group,
1638 change_handler_t change_handler, change_handler_t read_handler,
1639 bool dont_use_enum_idx)
1640 {
1641 rarch_setting_t result;
1642
1643 result.enum_idx = MSG_UNKNOWN;
1644 result.type = ST_HEX;
1645
1646 result.size = sizeof(unsigned int);
1647
1648 result.name = name;
1649 result.short_description = short_description;
1650 result.group = group;
1651 result.subgroup = subgroup;
1652 result.parent_group = parent_group;
1653 result.values = NULL;
1654
1655 result.index = 0;
1656 result.index_offset = 0;
1657 result.offset_by = 0;
1658
1659 result.min = 0.0;
1660 result.max = 0.0;
1661
1662 result.flags = 0;
1663 result.free_flags = 0;
1664
1665 result.change_handler = change_handler;
1666 result.read_handler = read_handler;
1667 result.action_start = setting_generic_action_start_default;
1668 result.action_left = NULL;
1669 result.action_right = NULL;
1670 result.action_up = NULL;
1671 result.action_down = NULL;
1672 result.action_cancel = NULL;
1673 result.action_ok = setting_generic_action_ok_default;
1674 result.action_select = setting_generic_action_ok_default;
1675 result.get_string_representation = &setting_get_string_representation_hex;
1676
1677 result.bind_type = 0;
1678 result.browser_selection_type = ST_NONE;
1679 result.step = 0.0f;
1680 result.rounding_fraction = NULL;
1681 result.enforce_minrange = false;
1682 result.enforce_maxrange = false;
1683
1684 result.value.target.unsigned_integer = target;
1685 result.original_value.unsigned_integer = *target;
1686 result.default_value.unsigned_integer = default_value;
1687
1688 result.cmd_trigger_idx = CMD_EVENT_NONE;
1689 result.cmd_trigger_event_triggered = false;
1690
1691 result.dont_use_enum_idx_representation = dont_use_enum_idx;
1692
1693 return result;
1694 }
1695 #endif
1696
1697 /**
1698 * setting_bind_setting:
1699 * @name : name of setting.
1700 * @short_description : Short description of setting.
1701 * @target : Target of bind setting.
1702 * @idx : Index of bind setting.
1703 * @idx_offset : Index offset of bind setting.
1704 * @default_value : Default value (in bind format).
1705 * @group : Group that the setting belongs to.
1706 * @subgroup : Subgroup that the setting belongs to.
1707 *
1708 * Initializes a setting of type ST_BIND.
1709 *
1710 * Returns: setting of type ST_BIND.
1711 **/
setting_bind_setting(const char * name,const char * short_description,struct retro_keybind * target,uint32_t idx,uint32_t idx_offset,const struct retro_keybind * default_value,const char * group,const char * subgroup,const char * parent_group,bool dont_use_enum_idx)1712 static rarch_setting_t setting_bind_setting(const char* name,
1713 const char* short_description, struct retro_keybind* target,
1714 uint32_t idx, uint32_t idx_offset,
1715 const struct retro_keybind* default_value,
1716 const char *group, const char *subgroup,
1717 const char *parent_group,
1718 bool dont_use_enum_idx)
1719 {
1720 rarch_setting_t result;
1721
1722 result.enum_idx = MSG_UNKNOWN;
1723 result.type = ST_BIND;
1724
1725 result.size = 0;
1726
1727 result.name = name;
1728 result.short_description = short_description;
1729 result.group = group;
1730 result.subgroup = subgroup;
1731 result.parent_group = parent_group;
1732 result.values = NULL;
1733
1734 result.index = idx;
1735 result.index_offset = idx_offset;
1736 result.offset_by = 0;
1737
1738 result.min = 0.0;
1739 result.max = 0.0;
1740
1741 result.flags = 0;
1742 result.free_flags = 0;
1743
1744 result.change_handler = NULL;
1745 result.read_handler = NULL;
1746 result.action_start = setting_bind_action_start;
1747 result.action_left = NULL;
1748 result.action_right = NULL;
1749 result.action_up = NULL;
1750 result.action_down = NULL;
1751 result.action_cancel = NULL;
1752 result.action_ok = setting_bind_action_ok;
1753 result.action_select = setting_bind_action_ok;
1754 result.get_string_representation = &setting_get_string_representation_st_bind;
1755
1756 result.bind_type = 0;
1757 result.browser_selection_type = ST_NONE;
1758 result.step = 0.0f;
1759 result.rounding_fraction = NULL;
1760 result.enforce_minrange = false;
1761 result.enforce_maxrange = false;
1762
1763 result.value.target.keybind = target;
1764 result.default_value.keybind = default_value;
1765
1766 result.cmd_trigger_idx = CMD_EVENT_NONE;
1767 result.cmd_trigger_event_triggered = false;
1768
1769 result.dont_use_enum_idx_representation = dont_use_enum_idx;
1770
1771 return result;
1772 }
1773
setting_int_action_left_default(rarch_setting_t * setting,size_t idx,bool wraparound)1774 static int setting_int_action_left_default(
1775 rarch_setting_t *setting, size_t idx, bool wraparound)
1776 {
1777 double min = 0.0f;
1778
1779 if (!setting)
1780 return -1;
1781
1782 min = setting->min;
1783
1784 (void)wraparound; /* TODO/FIXME - handle this */
1785
1786 *setting->value.target.integer = *setting->value.target.integer - setting->step;
1787
1788 if (setting->enforce_minrange)
1789 {
1790 if (*setting->value.target.integer < min)
1791 {
1792 settings_t *settings = config_get_ptr();
1793 double max = setting->max;
1794
1795 if (settings && settings->bools.menu_navigation_wraparound_enable)
1796 *setting->value.target.integer = max;
1797 else
1798 *setting->value.target.integer = min;
1799 }
1800 }
1801
1802 return 0;
1803 }
1804
setting_bool_action_ok_default(rarch_setting_t * setting,size_t idx,bool wraparound)1805 static int setting_bool_action_ok_default(
1806 rarch_setting_t *setting, size_t idx, bool wraparound)
1807 {
1808 if (!setting)
1809 return -1;
1810
1811 (void)wraparound; /* TODO/FIXME - handle this */
1812
1813 setting_set_with_string_representation(setting,
1814 *setting->value.target.boolean ? "false" : "true");
1815
1816 return 0;
1817 }
1818
setting_bool_action_toggle_default(rarch_setting_t * setting,size_t idx,bool wraparound)1819 static int setting_bool_action_toggle_default(
1820 rarch_setting_t *setting, size_t idx, bool wraparound)
1821 {
1822 if (!setting)
1823 return -1;
1824
1825 (void)wraparound; /* TODO/FIXME - handle this */
1826
1827 setting_set_with_string_representation(setting,
1828 *setting->value.target.boolean ? "false" : "true");
1829
1830 return 0;
1831 }
1832
setting_string_action_start_generic(rarch_setting_t * setting)1833 int setting_string_action_start_generic(rarch_setting_t *setting)
1834 {
1835 if (!setting)
1836 return -1;
1837
1838 setting->value.target.string[0] = '\0';
1839
1840 return 0;
1841 }
1842
1843 /**
1844 * setting_string_setting:
1845 * @type : type of setting.
1846 * @name : name of setting.
1847 * @short_description : Short description of setting.
1848 * @target : Target of string setting.
1849 * @size : Size of string setting.
1850 * @default_value : Default value (in string format).
1851 * @empty : TODO/FIXME: ???
1852 * @group : Group that the setting belongs to.
1853 * @subgroup : Subgroup that the setting belongs to.
1854 * @change_handler : Function callback for change handler function pointer.
1855 * @read_handler : Function callback for read handler function pointer.
1856 *
1857 * Initializes a string setting (of type @type).
1858 *
1859 * Returns: String setting of type @type.
1860 **/
setting_string_setting(enum setting_type type,const char * name,const char * short_description,char * target,unsigned size,const char * default_value,const char * empty,const char * group,const char * subgroup,const char * parent_group,change_handler_t change_handler,change_handler_t read_handler,bool dont_use_enum_idx)1861 static rarch_setting_t setting_string_setting(enum setting_type type,
1862 const char* name, const char* short_description, char* target,
1863 unsigned size, const char* default_value, const char *empty,
1864 const char *group, const char *subgroup, const char *parent_group,
1865 change_handler_t change_handler,
1866 change_handler_t read_handler,
1867 bool dont_use_enum_idx)
1868 {
1869 rarch_setting_t result;
1870
1871 result.enum_idx = MSG_UNKNOWN;
1872 result.type = type;
1873
1874 result.size = size;
1875
1876 result.name = name;
1877 result.short_description = short_description;
1878 result.group = group;
1879 result.subgroup = subgroup;
1880 result.parent_group = parent_group;
1881 result.values = NULL;
1882
1883 result.index = 0;
1884 result.index_offset = 0;
1885 result.offset_by = 0;
1886
1887 result.min = 0.0;
1888 result.max = 0.0;
1889
1890 result.flags = 0;
1891 result.free_flags = 0;
1892
1893 result.change_handler = change_handler;
1894 result.read_handler = read_handler;
1895 result.action_start = NULL;
1896 result.action_left = NULL;
1897 result.action_right = NULL;
1898 result.action_up = NULL;
1899 result.action_down = NULL;
1900 result.action_cancel = NULL;
1901 result.action_ok = NULL;
1902 result.action_select = NULL;
1903 result.get_string_representation = &setting_get_string_representation_st_string;
1904
1905 result.bind_type = 0;
1906 result.browser_selection_type = ST_NONE;
1907 result.step = 0.0f;
1908 result.rounding_fraction = NULL;
1909 result.enforce_minrange = false;
1910 result.enforce_maxrange = false;
1911
1912 result.dir.empty_path = empty;
1913 result.value.target.string = target;
1914 result.default_value.string = default_value;
1915
1916 result.cmd_trigger_idx = CMD_EVENT_NONE;
1917 result.cmd_trigger_event_triggered = false;
1918
1919 switch (type)
1920 {
1921 case ST_DIR:
1922 result.action_start = setting_string_action_start_generic;
1923 result.browser_selection_type = ST_DIR;
1924 result.get_string_representation = &setting_get_string_representation_st_dir;
1925 break;
1926 case ST_PATH:
1927 result.action_start = setting_string_action_start_generic;
1928 result.browser_selection_type = ST_PATH;
1929 result.get_string_representation = &setting_get_string_representation_st_path;
1930 break;
1931 default:
1932 break;
1933 }
1934
1935 result.dont_use_enum_idx_representation = dont_use_enum_idx;
1936
1937 return result;
1938 }
1939
1940 /**
1941 * setting_string_setting_options:
1942 * @type : type of settting.
1943 * @name : name of setting.
1944 * @short_description : Short description of setting.
1945 * @target : Target of bind setting.
1946 * @size : Size of string setting.
1947 * @default_value : Default value.
1948 * @empty : N/A.
1949 * @values : Values, separated by a delimiter.
1950 * @group : Group that the setting belongs to.
1951 * @subgroup : Subgroup that the setting belongs to.
1952 * @change_handler : Function callback for change handler function pointer.
1953 * @read_handler : Function callback for read handler function pointer.
1954 *
1955 * Initializes a string options list setting.
1956 *
1957 * Returns: string option list setting.
1958 **/
setting_string_setting_options(enum setting_type type,const char * name,const char * short_description,char * target,unsigned size,const char * default_value,const char * empty,const char * values,const char * group,const char * subgroup,const char * parent_group,change_handler_t change_handler,change_handler_t read_handler,bool dont_use_enum_idx)1959 static rarch_setting_t setting_string_setting_options(enum setting_type type,
1960 const char* name, const char* short_description, char* target,
1961 unsigned size, const char* default_value,
1962 const char *empty, const char *values,
1963 const char *group, const char *subgroup, const char *parent_group,
1964 change_handler_t change_handler, change_handler_t read_handler,
1965 bool dont_use_enum_idx)
1966 {
1967 rarch_setting_t result = setting_string_setting(type, name,
1968 short_description, target, size, default_value, empty, group,
1969 subgroup, parent_group, change_handler, read_handler,
1970 dont_use_enum_idx);
1971
1972 result.action_start = setting_generic_action_start_default;
1973
1974 result.parent_group = parent_group;
1975 result.values = values;
1976 return result;
1977 }
1978
1979 /**
1980 * setting_subgroup_setting:
1981 * @type : type of settting.
1982 * @name : name of setting.
1983 * @parent_name : group that the subgroup setting belongs to.
1984 *
1985 * Initializes a setting of type ST_SUBGROUP.
1986 *
1987 * Returns: setting of type ST_SUBGROUP.
1988 **/
setting_subgroup_setting(enum setting_type type,const char * name,const char * parent_name,const char * parent_group,bool dont_use_enum_idx)1989 static rarch_setting_t setting_subgroup_setting(enum setting_type type,
1990 const char* name, const char *parent_name, const char *parent_group,
1991 bool dont_use_enum_idx)
1992 {
1993 rarch_setting_t result;
1994
1995 result.enum_idx = MSG_UNKNOWN;
1996 result.type = type;
1997
1998 result.size = 0;
1999
2000 result.name = name;
2001 result.short_description = name;
2002 result.group = parent_name;
2003 result.parent_group = parent_group;
2004 result.values = NULL;
2005 result.subgroup = NULL;
2006
2007 result.index = 0;
2008 result.index_offset = 0;
2009 result.offset_by = 0;
2010
2011 result.min = 0.0;
2012 result.max = 0.0;
2013
2014 result.flags = 0;
2015 result.free_flags = 0;
2016
2017 result.change_handler = NULL;
2018 result.read_handler = NULL;
2019 result.action_start = NULL;
2020 result.action_left = NULL;
2021 result.action_right = NULL;
2022 result.action_up = NULL;
2023 result.action_down = NULL;
2024 result.action_cancel = NULL;
2025 result.action_ok = NULL;
2026 result.action_select = NULL;
2027 result.get_string_representation = &setting_get_string_representation_default;
2028
2029 result.bind_type = 0;
2030 result.browser_selection_type = ST_NONE;
2031 result.step = 0.0f;
2032 result.rounding_fraction = NULL;
2033 result.enforce_minrange = false;
2034 result.enforce_maxrange = false;
2035
2036 result.cmd_trigger_idx = CMD_EVENT_NONE;
2037 result.cmd_trigger_event_triggered = false;
2038
2039 result.dont_use_enum_idx_representation = dont_use_enum_idx;
2040
2041 return result;
2042 }
2043
2044 /**
2045 * setting_bool_setting:
2046 * @name : name of setting.
2047 * @short_description : Short description of setting.
2048 * @target : Target of bool setting.
2049 * @default_value : Default value (in bool format).
2050 * @off : String value for "Off" label.
2051 * @on : String value for "On" label.
2052 * @group : Group that the setting belongs to.
2053 * @subgroup : Subgroup that the setting belongs to.
2054 * @change_handler : Function callback for change handler function pointer.
2055 * @read_handler : Function callback for read handler function pointer.
2056 *
2057 * Initializes a setting of type ST_BOOL.
2058 *
2059 * Returns: setting of type ST_BOOL.
2060 **/
setting_bool_setting(const char * name,const char * short_description,bool * target,bool default_value,const char * off,const char * on,const char * group,const char * subgroup,const char * parent_group,change_handler_t change_handler,change_handler_t read_handler,bool dont_use_enum_idx)2061 static rarch_setting_t setting_bool_setting(const char* name,
2062 const char* short_description, bool* target, bool default_value,
2063 const char *off, const char *on,
2064 const char *group, const char *subgroup, const char *parent_group,
2065 change_handler_t change_handler, change_handler_t read_handler,
2066 bool dont_use_enum_idx)
2067 {
2068 rarch_setting_t result;
2069
2070 result.enum_idx = MSG_UNKNOWN;
2071 result.type = ST_BOOL;
2072
2073 result.size = sizeof(bool);
2074
2075 result.name = name;
2076 result.short_description = short_description;
2077 result.group = group;
2078 result.subgroup = subgroup;
2079 result.parent_group = parent_group;
2080 result.values = NULL;
2081
2082 result.index = 0;
2083 result.index_offset = 0;
2084 result.offset_by = 0;
2085
2086 result.min = 0.0;
2087 result.max = 0.0;
2088
2089 result.flags = 0;
2090 result.free_flags = 0;
2091
2092 result.change_handler = change_handler;
2093 result.read_handler = read_handler;
2094 result.action_start = setting_generic_action_start_default;
2095 result.action_left = setting_bool_action_toggle_default;
2096 result.action_right = setting_bool_action_toggle_default;
2097 result.action_up = NULL;
2098 result.action_down = NULL;
2099 result.action_cancel = NULL;
2100 result.action_ok = setting_bool_action_ok_default;
2101 result.action_select = setting_generic_action_ok_default;
2102 result.get_string_representation = &setting_get_string_representation_st_bool;
2103
2104 result.bind_type = 0;
2105 result.browser_selection_type = ST_NONE;
2106 result.step = 0.0f;
2107 result.rounding_fraction = NULL;
2108 result.enforce_minrange = false;
2109 result.enforce_maxrange = false;
2110
2111 result.value.target.boolean = target;
2112 result.original_value.boolean = *target;
2113 result.default_value.boolean = default_value;
2114 result.boolean.off_label = off;
2115 result.boolean.on_label = on;
2116
2117 result.cmd_trigger_idx = CMD_EVENT_NONE;
2118 result.cmd_trigger_event_triggered = false;
2119
2120 result.dont_use_enum_idx_representation = dont_use_enum_idx;
2121
2122 return result;
2123 }
2124
2125 /**
2126 * setting_int_setting:
2127 * @name : name of setting.
2128 * @short_description : Short description of setting.
2129 * @target : Target of signed integer setting.
2130 * @default_value : Default value (in signed integer format).
2131 * @group : Group that the setting belongs to.
2132 * @subgroup : Subgroup that the setting belongs to.
2133 * @change_handler : Function callback for change handler function pointer.
2134 * @read_handler : Function callback for read handler function pointer.
2135 *
2136 * Initializes a setting of type ST_INT.
2137 *
2138 * Returns: setting of type ST_INT.
2139 **/
setting_int_setting(const char * name,const char * short_description,int * target,int default_value,const char * group,const char * subgroup,const char * parent_group,change_handler_t change_handler,change_handler_t read_handler,bool dont_use_enum_idx)2140 static rarch_setting_t setting_int_setting(const char* name,
2141 const char* short_description, int* target,
2142 int default_value,
2143 const char *group, const char *subgroup, const char *parent_group,
2144 change_handler_t change_handler, change_handler_t read_handler,
2145 bool dont_use_enum_idx)
2146 {
2147 rarch_setting_t result;
2148
2149 result.enum_idx = MSG_UNKNOWN;
2150 result.type = ST_INT;
2151
2152 result.size = sizeof(int);
2153
2154 result.name = name;
2155 result.short_description = short_description;
2156 result.group = group;
2157 result.subgroup = subgroup;
2158 result.parent_group = parent_group;
2159 result.values = NULL;
2160
2161 result.index = 0;
2162 result.index_offset = 0;
2163 result.offset_by = 0;
2164
2165 result.min = 0.0;
2166 result.max = 0.0;
2167
2168 result.flags = 0;
2169 result.free_flags = 0;
2170
2171 result.change_handler = change_handler;
2172 result.read_handler = read_handler;
2173 result.action_start = setting_generic_action_start_default;
2174 result.action_left = setting_int_action_left_default;
2175 result.action_right = setting_int_action_right_default;
2176 result.action_up = NULL;
2177 result.action_down = NULL;
2178 result.action_cancel = NULL;
2179 result.action_ok = setting_generic_action_ok_default;
2180 result.action_select = setting_generic_action_ok_default;
2181 result.get_string_representation = &setting_get_string_representation_int;
2182
2183 result.bind_type = 0;
2184 result.browser_selection_type = ST_NONE;
2185 result.step = 0.0f;
2186 result.rounding_fraction = NULL;
2187 result.enforce_minrange = false;
2188 result.enforce_maxrange = false;
2189
2190 result.value.target.integer = target;
2191 result.original_value.integer = *target;
2192 result.default_value.integer = default_value;
2193
2194 result.cmd_trigger_idx = CMD_EVENT_NONE;
2195 result.cmd_trigger_event_triggered = false;
2196
2197 result.dont_use_enum_idx_representation = dont_use_enum_idx;
2198
2199 return result;
2200 }
2201
2202 #ifdef HAVE_NETWORKING
config_bool_alt(rarch_setting_t ** list,rarch_setting_info_t * list_info,bool * target,const char * name,const char * SHORT,bool default_value,enum msg_hash_enums off_enum_idx,enum msg_hash_enums on_enum_idx,rarch_setting_group_info_t * group_info,rarch_setting_group_info_t * subgroup_info,const char * parent_group,change_handler_t change_handler,change_handler_t read_handler,uint32_t flags)2203 static void config_bool_alt(
2204 rarch_setting_t **list,
2205 rarch_setting_info_t *list_info,
2206 bool *target,
2207 const char *name, const char *SHORT,
2208 bool default_value,
2209 enum msg_hash_enums off_enum_idx,
2210 enum msg_hash_enums on_enum_idx,
2211 rarch_setting_group_info_t *group_info,
2212 rarch_setting_group_info_t *subgroup_info,
2213 const char *parent_group,
2214 change_handler_t change_handler,
2215 change_handler_t read_handler,
2216 uint32_t flags)
2217 {
2218 (*list)[list_info->index++] = setting_bool_setting(name, SHORT, target,
2219 default_value,
2220 msg_hash_to_str(off_enum_idx), msg_hash_to_str(on_enum_idx),
2221 group_info->name, subgroup_info->name, parent_group,
2222 change_handler, read_handler, true);
2223 if (flags != SD_FLAG_NONE)
2224 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, flags);
2225 }
2226 #endif
2227
config_bool(rarch_setting_t ** list,rarch_setting_info_t * list_info,bool * target,enum msg_hash_enums name_enum_idx,enum msg_hash_enums SHORT_enum_idx,bool default_value,enum msg_hash_enums off_enum_idx,enum msg_hash_enums on_enum_idx,rarch_setting_group_info_t * group_info,rarch_setting_group_info_t * subgroup_info,const char * parent_group,change_handler_t change_handler,change_handler_t read_handler,uint32_t flags)2228 static void config_bool(
2229 rarch_setting_t **list,
2230 rarch_setting_info_t *list_info,
2231 bool *target,
2232 enum msg_hash_enums name_enum_idx,
2233 enum msg_hash_enums SHORT_enum_idx,
2234 bool default_value,
2235 enum msg_hash_enums off_enum_idx,
2236 enum msg_hash_enums on_enum_idx,
2237 rarch_setting_group_info_t *group_info,
2238 rarch_setting_group_info_t *subgroup_info,
2239 const char *parent_group,
2240 change_handler_t change_handler,
2241 change_handler_t read_handler,
2242 uint32_t flags)
2243 {
2244 (*list)[list_info->index++] = setting_bool_setting(
2245 msg_hash_to_str(name_enum_idx),
2246 msg_hash_to_str(SHORT_enum_idx),
2247 target,
2248 default_value,
2249 msg_hash_to_str(off_enum_idx),
2250 msg_hash_to_str(on_enum_idx),
2251 group_info->name, subgroup_info->name, parent_group,
2252 change_handler, read_handler, false);
2253 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_CHECKBOX;
2254 if (flags != SD_FLAG_NONE)
2255 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, flags);
2256
2257 MENU_SETTINGS_LIST_CURRENT_ADD_ENUM_IDX_PTR(list, list_info, name_enum_idx);
2258 MENU_SETTINGS_LIST_CURRENT_ADD_ENUM_VALUE_IDX(list, list_info, SHORT_enum_idx);
2259 }
2260
config_int(rarch_setting_t ** list,rarch_setting_info_t * list_info,int * target,enum msg_hash_enums name_enum_idx,enum msg_hash_enums SHORT_enum_idx,int default_value,rarch_setting_group_info_t * group_info,rarch_setting_group_info_t * subgroup_info,const char * parent_group,change_handler_t change_handler,change_handler_t read_handler)2261 static void config_int(
2262 rarch_setting_t **list,
2263 rarch_setting_info_t *list_info,
2264 int *target,
2265 enum msg_hash_enums name_enum_idx,
2266 enum msg_hash_enums SHORT_enum_idx,
2267 int default_value,
2268 rarch_setting_group_info_t *group_info,
2269 rarch_setting_group_info_t *subgroup_info,
2270 const char *parent_group,
2271 change_handler_t change_handler, change_handler_t read_handler)
2272 {
2273 (*list)[list_info->index++] = setting_int_setting(
2274 msg_hash_to_str(name_enum_idx),
2275 msg_hash_to_str(SHORT_enum_idx),
2276 target, default_value,
2277 group_info->name, subgroup_info->name, parent_group,
2278 change_handler, read_handler,
2279 false);
2280
2281 MENU_SETTINGS_LIST_CURRENT_ADD_ENUM_IDX_PTR(list, list_info, name_enum_idx);
2282 MENU_SETTINGS_LIST_CURRENT_ADD_ENUM_VALUE_IDX(list, list_info, SHORT_enum_idx);
2283 }
2284
config_uint_alt(rarch_setting_t ** list,rarch_setting_info_t * list_info,unsigned int * target,const char * name,const char * SHORT,unsigned int default_value,rarch_setting_group_info_t * group_info,rarch_setting_group_info_t * subgroup_info,const char * parent_group,change_handler_t change_handler,change_handler_t read_handler)2285 static void config_uint_alt(
2286 rarch_setting_t **list,
2287 rarch_setting_info_t *list_info,
2288 unsigned int *target,
2289 const char *name, const char *SHORT,
2290 unsigned int default_value,
2291 rarch_setting_group_info_t *group_info,
2292 rarch_setting_group_info_t *subgroup_info,
2293 const char *parent_group,
2294 change_handler_t change_handler, change_handler_t read_handler)
2295 {
2296 (*list)[list_info->index++] = setting_uint_setting(
2297 name, SHORT, target, default_value,
2298 group_info->name,
2299 subgroup_info->name, parent_group, change_handler, read_handler,
2300 true);
2301 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_SPINBOX;
2302 }
2303
config_uint(rarch_setting_t ** list,rarch_setting_info_t * list_info,unsigned int * target,enum msg_hash_enums name_enum_idx,enum msg_hash_enums SHORT_enum_idx,unsigned int default_value,rarch_setting_group_info_t * group_info,rarch_setting_group_info_t * subgroup_info,const char * parent_group,change_handler_t change_handler,change_handler_t read_handler)2304 static void config_uint(
2305 rarch_setting_t **list,
2306 rarch_setting_info_t *list_info,
2307 unsigned int *target,
2308 enum msg_hash_enums name_enum_idx,
2309 enum msg_hash_enums SHORT_enum_idx,
2310 unsigned int default_value,
2311 rarch_setting_group_info_t *group_info,
2312 rarch_setting_group_info_t *subgroup_info,
2313 const char *parent_group,
2314 change_handler_t change_handler, change_handler_t read_handler)
2315 {
2316 (*list)[list_info->index++] = setting_uint_setting (
2317 msg_hash_to_str(name_enum_idx),
2318 msg_hash_to_str(SHORT_enum_idx),
2319 target, default_value,
2320 group_info->name,
2321 subgroup_info->name, parent_group,
2322 change_handler, read_handler,
2323 false);
2324 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_SPINBOX;
2325
2326 MENU_SETTINGS_LIST_CURRENT_ADD_ENUM_IDX_PTR(list, list_info, name_enum_idx);
2327 MENU_SETTINGS_LIST_CURRENT_ADD_ENUM_VALUE_IDX(list, list_info, SHORT_enum_idx);
2328 }
2329
config_size(rarch_setting_t ** list,rarch_setting_info_t * list_info,size_t * target,enum msg_hash_enums name_enum_idx,enum msg_hash_enums SHORT_enum_idx,size_t default_value,rarch_setting_group_info_t * group_info,rarch_setting_group_info_t * subgroup_info,const char * parent_group,change_handler_t change_handler,change_handler_t read_handler,get_string_representation_t string_representation_handler)2330 static void config_size(
2331 rarch_setting_t **list,
2332 rarch_setting_info_t *list_info,
2333 size_t *target,
2334 enum msg_hash_enums name_enum_idx,
2335 enum msg_hash_enums SHORT_enum_idx,
2336 size_t default_value,
2337 rarch_setting_group_info_t *group_info,
2338 rarch_setting_group_info_t *subgroup_info,
2339 const char *parent_group,
2340 change_handler_t change_handler, change_handler_t read_handler,
2341 get_string_representation_t string_representation_handler)
2342 {
2343 (*list)[list_info->index++] = setting_size_setting (
2344 msg_hash_to_str(name_enum_idx),
2345 msg_hash_to_str(SHORT_enum_idx),
2346 target, default_value,
2347 group_info->name,
2348 subgroup_info->name, parent_group,
2349 change_handler, read_handler,
2350 false, string_representation_handler);
2351 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_SIZE_SPINBOX;
2352
2353 MENU_SETTINGS_LIST_CURRENT_ADD_ENUM_IDX_PTR(list, list_info, name_enum_idx);
2354 MENU_SETTINGS_LIST_CURRENT_ADD_ENUM_VALUE_IDX(list, list_info, SHORT_enum_idx);
2355 }
2356
config_float(rarch_setting_t ** list,rarch_setting_info_t * list_info,float * target,enum msg_hash_enums name_enum_idx,enum msg_hash_enums SHORT_enum_idx,float default_value,const char * rounding,rarch_setting_group_info_t * group_info,rarch_setting_group_info_t * subgroup_info,const char * parent_group,change_handler_t change_handler,change_handler_t read_handler)2357 static void config_float(
2358 rarch_setting_t **list,
2359 rarch_setting_info_t *list_info,
2360 float *target,
2361 enum msg_hash_enums name_enum_idx,
2362 enum msg_hash_enums SHORT_enum_idx,
2363 float default_value, const char *rounding,
2364 rarch_setting_group_info_t *group_info,
2365 rarch_setting_group_info_t *subgroup_info,
2366 const char *parent_group,
2367 change_handler_t change_handler, change_handler_t read_handler)
2368 {
2369 (*list)[list_info->index++] = setting_float_setting(
2370 msg_hash_to_str(name_enum_idx),
2371 msg_hash_to_str(SHORT_enum_idx), target, default_value, rounding,
2372 group_info->name, subgroup_info->name, parent_group,
2373 change_handler, read_handler, false);
2374 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_FLOAT_SPINBOX;
2375
2376 MENU_SETTINGS_LIST_CURRENT_ADD_ENUM_IDX_PTR(list, list_info, name_enum_idx);
2377 MENU_SETTINGS_LIST_CURRENT_ADD_ENUM_VALUE_IDX(list, list_info, SHORT_enum_idx);
2378 }
2379
config_path(rarch_setting_t ** list,rarch_setting_info_t * list_info,char * target,size_t len,enum msg_hash_enums name_enum_idx,enum msg_hash_enums SHORT_enum_idx,const char * default_value,rarch_setting_group_info_t * group_info,rarch_setting_group_info_t * subgroup_info,const char * parent_group,change_handler_t change_handler,change_handler_t read_handler)2380 static void config_path(
2381 rarch_setting_t **list,
2382 rarch_setting_info_t *list_info,
2383 char *target, size_t len,
2384 enum msg_hash_enums name_enum_idx,
2385 enum msg_hash_enums SHORT_enum_idx,
2386 const char *default_value,
2387 rarch_setting_group_info_t *group_info,
2388 rarch_setting_group_info_t *subgroup_info,
2389 const char *parent_group,
2390 change_handler_t change_handler, change_handler_t read_handler)
2391 {
2392 (*list)[list_info->index++] = setting_string_setting(ST_PATH,
2393 msg_hash_to_str(name_enum_idx),
2394 msg_hash_to_str(SHORT_enum_idx),
2395 target, (unsigned)len, default_value, "",
2396 group_info->name, subgroup_info->name, parent_group,
2397 change_handler, read_handler,
2398 false);
2399 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_FILE_SELECTOR;
2400 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ALLOW_EMPTY);
2401 MENU_SETTINGS_LIST_CURRENT_ADD_ENUM_IDX_PTR(list, list_info, name_enum_idx);
2402 MENU_SETTINGS_LIST_CURRENT_ADD_ENUM_VALUE_IDX(list, list_info, SHORT_enum_idx);
2403 }
2404
config_dir(rarch_setting_t ** list,rarch_setting_info_t * list_info,char * target,size_t len,enum msg_hash_enums name_enum_idx,enum msg_hash_enums SHORT_enum_idx,const char * default_value,enum msg_hash_enums empty_enum_idx,rarch_setting_group_info_t * group_info,rarch_setting_group_info_t * subgroup_info,const char * parent_group,change_handler_t change_handler,change_handler_t read_handler)2405 static void config_dir(
2406 rarch_setting_t **list,
2407 rarch_setting_info_t *list_info,
2408 char *target, size_t len,
2409 enum msg_hash_enums name_enum_idx,
2410 enum msg_hash_enums SHORT_enum_idx,
2411 const char *default_value,
2412 enum msg_hash_enums empty_enum_idx,
2413 rarch_setting_group_info_t *group_info,
2414 rarch_setting_group_info_t *subgroup_info,
2415 const char *parent_group,
2416 change_handler_t change_handler, change_handler_t read_handler)
2417 {
2418 (*list)[list_info->index++] = setting_string_setting(ST_DIR,
2419 msg_hash_to_str(name_enum_idx),
2420 msg_hash_to_str(SHORT_enum_idx),
2421 target, (unsigned)len, default_value,
2422 msg_hash_to_str(empty_enum_idx),
2423 group_info->name, subgroup_info->name, parent_group,
2424 change_handler, read_handler,
2425 false);
2426 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_DIRECTORY_SELECTOR;
2427 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(
2428 list,
2429 list_info,
2430 SD_FLAG_ALLOW_EMPTY | SD_FLAG_PATH_DIR | SD_FLAG_BROWSER_ACTION);
2431
2432 MENU_SETTINGS_LIST_CURRENT_ADD_ENUM_IDX_PTR(list, list_info, name_enum_idx);
2433 MENU_SETTINGS_LIST_CURRENT_ADD_ENUM_VALUE_IDX(list, list_info, SHORT_enum_idx);
2434 }
2435
config_string(rarch_setting_t ** list,rarch_setting_info_t * list_info,char * target,size_t len,enum msg_hash_enums name_enum_idx,enum msg_hash_enums SHORT_enum_idx,const char * default_value,rarch_setting_group_info_t * group_info,rarch_setting_group_info_t * subgroup_info,const char * parent_group,change_handler_t change_handler,change_handler_t read_handler)2436 static void config_string(
2437 rarch_setting_t **list,
2438 rarch_setting_info_t *list_info,
2439 char *target, size_t len,
2440 enum msg_hash_enums name_enum_idx,
2441 enum msg_hash_enums SHORT_enum_idx,
2442 const char *default_value,
2443 rarch_setting_group_info_t *group_info,
2444 rarch_setting_group_info_t *subgroup_info,
2445 const char *parent_group,
2446 change_handler_t change_handler, change_handler_t read_handler)
2447 {
2448 (*list)[list_info->index++] = setting_string_setting(ST_STRING,
2449 msg_hash_to_str(name_enum_idx),
2450 msg_hash_to_str(SHORT_enum_idx),
2451 target, (unsigned)len, default_value, "",
2452 group_info->name, subgroup_info->name, parent_group,
2453 change_handler, read_handler, false);
2454 MENU_SETTINGS_LIST_CURRENT_ADD_ENUM_IDX_PTR(list, list_info, name_enum_idx);
2455 MENU_SETTINGS_LIST_CURRENT_ADD_ENUM_VALUE_IDX(list, list_info, SHORT_enum_idx);
2456 }
2457
config_string_options(rarch_setting_t ** list,rarch_setting_info_t * list_info,char * target,size_t len,enum msg_hash_enums name_enum_idx,enum msg_hash_enums SHORT_enum_idx,const char * default_value,const char * values,rarch_setting_group_info_t * group_info,rarch_setting_group_info_t * subgroup_info,const char * parent_group,change_handler_t change_handler,change_handler_t read_handler)2458 static void config_string_options(
2459 rarch_setting_t **list,
2460 rarch_setting_info_t *list_info,
2461 char *target, size_t len,
2462 enum msg_hash_enums name_enum_idx,
2463 enum msg_hash_enums SHORT_enum_idx,
2464 const char *default_value, const char *values,
2465 rarch_setting_group_info_t *group_info,
2466 rarch_setting_group_info_t *subgroup_info,
2467 const char *parent_group,
2468 change_handler_t change_handler, change_handler_t read_handler)
2469 {
2470 (*list)[list_info->index++] = setting_string_setting_options(
2471 ST_STRING_OPTIONS,
2472 msg_hash_to_str(name_enum_idx),
2473 msg_hash_to_str(SHORT_enum_idx),
2474 target, (unsigned)len, default_value, "", values,
2475 group_info->name, subgroup_info->name, parent_group,
2476 change_handler, read_handler, false);
2477 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_STRING_COMBOBOX;
2478
2479 MENU_SETTINGS_LIST_CURRENT_ADD_ENUM_IDX_PTR(list, list_info, name_enum_idx);
2480 MENU_SETTINGS_LIST_CURRENT_ADD_ENUM_VALUE_IDX(list, list_info, SHORT_enum_idx);
2481 /* Request values to be freed later */
2482 SETTINGS_DATA_LIST_CURRENT_ADD_FREE_FLAGS(list, list_info, SD_FREE_FLAG_VALUES);
2483 }
2484
2485 #if 0
2486 static void config_hex(
2487 rarch_setting_t **list,
2488 rarch_setting_info_t *list_info,
2489 unsigned int *target,
2490 enum msg_hash_enums name_enum_idx,
2491 enum msg_hash_enums SHORT_enum_idx,
2492 unsigned int default_value,
2493 rarch_setting_group_info_t *group_info,
2494 rarch_setting_group_info_t *subgroup_info,
2495 const char *parent_group,
2496 change_handler_t change_handler, change_handler_t read_handler)
2497 {
2498 (*list)[list_info->index++] = setting_hex_setting(
2499 msg_hash_to_str(name_enum_idx),
2500 msg_hash_to_str(SHORT_enum_idx),
2501 target, default_value,
2502 group_info->name, subgroup_info->name, parent_group,
2503 change_handler, read_handler, false);
2504
2505 MENU_SETTINGS_LIST_CURRENT_ADD_ENUM_IDX_PTR(list, list_info, name_enum_idx);
2506 MENU_SETTINGS_LIST_CURRENT_ADD_ENUM_VALUE_IDX(list, list_info, SHORT_enum_idx);
2507 }
2508
2509 /* Please strdup() NAME and SHORT */
2510 static void config_bind(
2511 rarch_setting_t **list,
2512 rarch_setting_info_t *list_info,
2513 struct retro_keybind *target,
2514 uint32_t player, uint32_t player_offset,
2515 const char *name, const char *SHORT,
2516 const struct retro_keybind *default_value,
2517 rarch_setting_group_info_t *group_info,
2518 rarch_setting_group_info_t *subgroup_info,
2519 const char *parent_group)
2520 {
2521 (*list)[list_info->index++] = setting_bind_setting(name, SHORT, target,
2522 player, player_offset, default_value,
2523 group_info->name, subgroup_info->name, parent_group,
2524 false);
2525 /* Request name and short description to be freed later */
2526 SETTINGS_DATA_LIST_CURRENT_ADD_FREE_FLAGS(list, list_info, SD_FREE_FLAG_NAME | SD_FREE_FLAG_SHORT);
2527 }
2528 #endif
2529
2530 /* Please strdup() NAME and SHORT */
config_bind_alt(rarch_setting_t ** list,rarch_setting_info_t * list_info,struct retro_keybind * target,uint32_t player,uint32_t player_offset,const char * name,const char * SHORT,const struct retro_keybind * default_value,rarch_setting_group_info_t * group_info,rarch_setting_group_info_t * subgroup_info,const char * parent_group)2531 static void config_bind_alt(
2532 rarch_setting_t **list,
2533 rarch_setting_info_t *list_info,
2534 struct retro_keybind *target,
2535 uint32_t player, uint32_t player_offset,
2536 const char *name, const char *SHORT,
2537 const struct retro_keybind *default_value,
2538 rarch_setting_group_info_t *group_info,
2539 rarch_setting_group_info_t *subgroup_info,
2540 const char *parent_group)
2541 {
2542 (*list)[list_info->index++] = setting_bind_setting(name, SHORT, target,
2543 player, player_offset, default_value,
2544 group_info->name, subgroup_info->name, parent_group,
2545 true);
2546 /* Request name and short description to be freed later */
2547 SETTINGS_DATA_LIST_CURRENT_ADD_FREE_FLAGS(list, list_info, SD_FREE_FLAG_NAME | SD_FREE_FLAG_SHORT);
2548 }
2549
config_action_alt(rarch_setting_t ** list,rarch_setting_info_t * list_info,const char * name,const char * SHORT,rarch_setting_group_info_t * group_info,rarch_setting_group_info_t * subgroup_info,const char * parent_group)2550 static void config_action_alt(
2551 rarch_setting_t **list,
2552 rarch_setting_info_t *list_info,
2553 const char *name, const char *SHORT,
2554 rarch_setting_group_info_t *group_info,
2555 rarch_setting_group_info_t *subgroup_info,
2556 const char *parent_group)
2557 {
2558 (*list)[list_info->index++] = setting_action_setting(name, SHORT,
2559 group_info->name, subgroup_info->name, parent_group,
2560 true);
2561 }
2562
config_action(rarch_setting_t ** list,rarch_setting_info_t * list_info,enum msg_hash_enums name_enum_idx,enum msg_hash_enums SHORT_enum_idx,rarch_setting_group_info_t * group_info,rarch_setting_group_info_t * subgroup_info,const char * parent_group)2563 static void config_action(
2564 rarch_setting_t **list,
2565 rarch_setting_info_t *list_info,
2566 enum msg_hash_enums name_enum_idx,
2567 enum msg_hash_enums SHORT_enum_idx,
2568 rarch_setting_group_info_t *group_info,
2569 rarch_setting_group_info_t *subgroup_info,
2570 const char *parent_group)
2571 {
2572 (*list)[list_info->index++] = setting_action_setting(
2573 msg_hash_to_str(name_enum_idx),
2574 msg_hash_to_str(SHORT_enum_idx),
2575 group_info->name,
2576 subgroup_info->name, parent_group,
2577 false);
2578
2579 MENU_SETTINGS_LIST_CURRENT_ADD_ENUM_IDX_PTR(list, list_info, name_enum_idx);
2580 MENU_SETTINGS_LIST_CURRENT_ADD_ENUM_VALUE_IDX(list, list_info, SHORT_enum_idx);
2581 }
2582
START_GROUP(rarch_setting_t ** list,rarch_setting_info_t * list_info,rarch_setting_group_info_t * group_info,const char * name,const char * parent_group)2583 static void START_GROUP(rarch_setting_t **list, rarch_setting_info_t *list_info,
2584 rarch_setting_group_info_t *group_info,
2585 const char *name, const char *parent_group)
2586 {
2587 group_info->name = name;
2588 if (!SETTINGS_LIST_APPEND(list, list_info))
2589 return;
2590 (*list)[list_info->index++] = setting_group_setting (ST_GROUP, name, parent_group);
2591 }
2592
end_group(rarch_setting_t ** list,rarch_setting_info_t * list_info,const char * parent_group)2593 static void end_group(rarch_setting_t **list,
2594 rarch_setting_info_t *list_info,
2595 const char *parent_group)
2596 {
2597 (*list)[list_info->index++] = setting_group_setting (ST_END_GROUP, 0, parent_group);
2598 }
2599
start_sub_group(rarch_setting_t ** list,rarch_setting_info_t * list_info,const char * name,rarch_setting_group_info_t * group_info,rarch_setting_group_info_t * subgroup_info,const char * parent_group)2600 static bool start_sub_group(rarch_setting_t **list,
2601 rarch_setting_info_t *list_info, const char *name,
2602 rarch_setting_group_info_t *group_info,
2603 rarch_setting_group_info_t *subgroup_info,
2604 const char *parent_group)
2605 {
2606 subgroup_info->name = name;
2607
2608 if (!SETTINGS_LIST_APPEND(list, list_info))
2609 return false;
2610 (*list)[list_info->index++] = setting_subgroup_setting (ST_SUB_GROUP,
2611 name, group_info->name, parent_group, false);
2612 return true;
2613 }
2614
end_sub_group(rarch_setting_t ** list,rarch_setting_info_t * list_info,const char * parent_group)2615 static void end_sub_group(
2616 rarch_setting_t **list,
2617 rarch_setting_info_t *list_info,
2618 const char *parent_group)
2619 {
2620 (*list)[list_info->index++] = setting_group_setting (ST_END_SUB_GROUP, 0, parent_group);
2621 }
2622
2623 /* MENU SETTINGS */
2624
setting_action_ok_bind_all(rarch_setting_t * setting,size_t idx,bool wraparound)2625 static int setting_action_ok_bind_all(
2626 rarch_setting_t *setting, size_t idx, bool wraparound)
2627 {
2628 (void)wraparound;
2629 if (!menu_input_key_bind_set_mode(MENU_INPUT_BINDS_CTL_BIND_ALL, setting))
2630 return -1;
2631 return 0;
2632 }
2633
2634 #ifdef HAVE_CONFIGFILE
setting_action_ok_bind_all_save_autoconfig(rarch_setting_t * setting,size_t idx,bool wraparound)2635 static int setting_action_ok_bind_all_save_autoconfig(
2636 rarch_setting_t *setting, size_t idx, bool wraparound)
2637 {
2638 unsigned index_offset = 0;
2639 const char *name = NULL;
2640
2641 (void)wraparound;
2642
2643 if (!setting)
2644 return -1;
2645
2646 index_offset = setting->index_offset;
2647 name = input_config_get_device_name(index_offset);
2648
2649 if (!string_is_empty(name) &&
2650 config_save_autoconf_profile(name, index_offset))
2651 runloop_msg_queue_push(
2652 msg_hash_to_str(MSG_AUTOCONFIG_FILE_SAVED_SUCCESSFULLY), 1, 100, true,
2653 NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO);
2654 else
2655 runloop_msg_queue_push(
2656 msg_hash_to_str(MSG_AUTOCONFIG_FILE_ERROR_SAVING), 1, 100, true,
2657 NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO);
2658
2659 return 0;
2660 }
2661 #endif
2662
setting_action_ok_bind_defaults(rarch_setting_t * setting,size_t idx,bool wraparound)2663 static int setting_action_ok_bind_defaults(
2664 rarch_setting_t *setting, size_t idx, bool wraparound)
2665 {
2666 unsigned i;
2667 menu_input_ctx_bind_limits_t lim;
2668 struct retro_keybind *target = NULL;
2669 const struct retro_keybind *def_binds = NULL;
2670
2671 (void)wraparound;
2672
2673 if (!setting)
2674 return -1;
2675
2676 target = &input_config_binds[setting->index_offset][0];
2677 def_binds = (setting->index_offset) ?
2678 retro_keybinds_rest : retro_keybinds_1;
2679
2680 lim.min = MENU_SETTINGS_BIND_BEGIN;
2681 lim.max = MENU_SETTINGS_BIND_LAST;
2682
2683 menu_input_key_bind_set_min_max(&lim);
2684
2685 for (i = MENU_SETTINGS_BIND_BEGIN;
2686 i <= MENU_SETTINGS_BIND_LAST; i++, target++)
2687 {
2688 target->key = def_binds[i - MENU_SETTINGS_BIND_BEGIN].key;
2689 target->joykey = NO_BTN;
2690 target->joyaxis = AXIS_NONE;
2691 target->mbutton = NO_BTN;
2692 }
2693
2694 return 0;
2695 }
2696
setting_action_ok_video_refresh_rate_auto(rarch_setting_t * setting,size_t idx,bool wraparound)2697 static int setting_action_ok_video_refresh_rate_auto(
2698 rarch_setting_t *setting, size_t idx, bool wraparound)
2699 {
2700 double video_refresh_rate = 0.0;
2701 double deviation = 0.0;
2702 unsigned sample_points = 0;
2703
2704 if (!setting)
2705 return -1;
2706
2707 if (video_monitor_fps_statistics(&video_refresh_rate,
2708 &deviation, &sample_points))
2709 {
2710 float video_refresh_rate_float = (float)video_refresh_rate;
2711 driver_ctl(RARCH_DRIVER_CTL_SET_REFRESH_RATE, &video_refresh_rate_float);
2712 /* Incase refresh rate update forced non-block video. */
2713 command_event(CMD_EVENT_VIDEO_SET_BLOCKING_STATE, NULL);
2714 }
2715
2716 if (setting_generic_action_ok_default(setting, idx, wraparound) != 0)
2717 return -1;
2718
2719 return 0;
2720 }
2721
setting_action_ok_video_refresh_rate_polled(rarch_setting_t * setting,size_t idx,bool wraparound)2722 static int setting_action_ok_video_refresh_rate_polled(
2723 rarch_setting_t *setting, size_t idx, bool wraparound)
2724 {
2725 float refresh_rate = 0.0;
2726
2727 if (!setting)
2728 return -1;
2729
2730 if ((refresh_rate = video_driver_get_refresh_rate()) == 0.0)
2731 return -1;
2732
2733 driver_ctl(RARCH_DRIVER_CTL_SET_REFRESH_RATE, &refresh_rate);
2734 /* Incase refresh rate update forced non-block video. */
2735 command_event(CMD_EVENT_VIDEO_SET_BLOCKING_STATE, NULL);
2736
2737 if (setting_generic_action_ok_default(setting, idx, wraparound) != 0)
2738 return -1;
2739
2740 return 0;
2741 }
2742
setting_action_ok_uint_special(rarch_setting_t * setting,size_t idx,bool wraparound)2743 static int setting_action_ok_uint_special(
2744 rarch_setting_t *setting, size_t idx, bool wraparound)
2745 {
2746 char enum_idx[16];
2747 if (!setting)
2748 return -1;
2749
2750 snprintf(enum_idx, sizeof(enum_idx), "%d", setting->enum_idx);
2751
2752 generic_action_ok_displaylist_push(
2753 enum_idx, /* we will pass the enumeration index of the string as a path */
2754 NULL, NULL, 0, idx, 0,
2755 ACTION_OK_DL_DROPDOWN_BOX_LIST_SPECIAL);
2756 return 0;
2757 }
2758
setting_action_ok_uint(rarch_setting_t * setting,size_t idx,bool wraparound)2759 static int setting_action_ok_uint(
2760 rarch_setting_t *setting, size_t idx, bool wraparound)
2761 {
2762 char enum_idx[16];
2763 if (!setting)
2764 return -1;
2765
2766 snprintf(enum_idx, sizeof(enum_idx), "%d", setting->enum_idx);
2767
2768 generic_action_ok_displaylist_push(
2769 enum_idx, /* we will pass the enumeration index of the string as a path */
2770 NULL, NULL, 0, idx, 0,
2771 ACTION_OK_DL_DROPDOWN_BOX_LIST);
2772 return 0;
2773 }
2774
setting_action_ok_libretro_device_type(rarch_setting_t * setting,size_t idx,bool wraparound)2775 static int setting_action_ok_libretro_device_type(
2776 rarch_setting_t *setting, size_t idx, bool wraparound)
2777 {
2778 char enum_idx[16];
2779 if (!setting)
2780 return -1;
2781
2782 snprintf(enum_idx, sizeof(enum_idx), "%d", setting->enum_idx);
2783
2784 generic_action_ok_displaylist_push(
2785 enum_idx, /* we will pass the enumeration index of the string as a path */
2786 NULL, NULL, 0, idx, 0,
2787 ACTION_OK_DL_DROPDOWN_BOX_LIST_INPUT_DEVICE_TYPE);
2788 return 0;
2789 }
2790
setting_action_ok_bind_device(rarch_setting_t * setting,size_t idx,bool wraparound)2791 static int setting_action_ok_bind_device(
2792 rarch_setting_t *setting, size_t idx, bool wraparound)
2793 {
2794 char enum_idx[16];
2795 if (!setting)
2796 return -1;
2797
2798 snprintf(enum_idx, sizeof(enum_idx), "%d", setting->enum_idx);
2799
2800 generic_action_ok_displaylist_push(
2801 enum_idx, /* we will pass the enumeration index of the string as a path */
2802 NULL, NULL, 0, idx, 0,
2803 ACTION_OK_DL_DROPDOWN_BOX_LIST_INPUT_DEVICE_INDEX);
2804 return 0;
2805 }
2806
setting_string_action_left_string_options(rarch_setting_t * setting,size_t idx,bool wraparound)2807 static int setting_string_action_left_string_options(
2808 rarch_setting_t* setting, size_t idx, bool wraparound)
2809 {
2810 struct string_list tmp_str_list = { 0 };
2811 size_t i;
2812
2813 if (!setting)
2814 return -1;
2815
2816 string_list_initialize(&tmp_str_list);
2817 string_split_noalloc(&tmp_str_list,
2818 setting->values, "|");
2819
2820 for (i = 0; i < tmp_str_list.size; ++i)
2821 {
2822 if (string_is_equal(tmp_str_list.elems[i].data, setting->value.target.string))
2823 {
2824 i = (i + tmp_str_list.size - 1) % tmp_str_list.size;
2825 strlcpy(setting->value.target.string,
2826 tmp_str_list.elems[i].data, setting->size);
2827
2828 if (setting->change_handler)
2829 setting->change_handler(setting);
2830
2831 string_list_deinitialize(&tmp_str_list);
2832 return 0;
2833 }
2834 }
2835
2836 string_list_deinitialize(&tmp_str_list);
2837 return -1;
2838 }
2839
setting_string_action_right_string_options(rarch_setting_t * setting,size_t idx,bool wraparound)2840 static int setting_string_action_right_string_options(
2841 rarch_setting_t* setting, size_t idx, bool wraparound)
2842 {
2843 struct string_list tmp_str_list = { 0 };
2844 size_t i;
2845
2846 if (!setting)
2847 return -1;
2848
2849 string_list_initialize(&tmp_str_list);
2850 string_split_noalloc(&tmp_str_list,
2851 setting->values, "|");
2852
2853 for (i = 0; i < tmp_str_list.size; ++i)
2854 {
2855 if (string_is_equal(tmp_str_list.elems[i].data, setting->value.target.string))
2856 {
2857 i = (i + 1) % tmp_str_list.size;
2858 strlcpy(setting->value.target.string,
2859 tmp_str_list.elems[i].data, setting->size);
2860
2861 if (setting->change_handler)
2862 setting->change_handler(setting);
2863
2864 string_list_deinitialize(&tmp_str_list);
2865 return 0;
2866 }
2867 }
2868
2869 string_list_deinitialize(&tmp_str_list);
2870 return -1;
2871 }
2872
2873 #if defined(HAVE_GFX_WIDGETS)
setting_action_ok_mapped_string(rarch_setting_t * setting,size_t idx,bool wraparound)2874 static int setting_action_ok_mapped_string(
2875 rarch_setting_t* setting, size_t idx, bool wraparound)
2876 {
2877 /* this is functionally the same as setting_action_ok_uint.
2878 * the mapping happens in menu_displaylist_ctl */
2879 return setting_action_ok_uint(setting, idx, wraparound);
2880 }
2881 #endif
2882
setting_get_string_representation_streaming_mode(rarch_setting_t * setting,char * s,size_t len)2883 static void setting_get_string_representation_streaming_mode(
2884 rarch_setting_t *setting,
2885 char *s, size_t len)
2886 {
2887 if (!setting)
2888 return;
2889
2890 /* TODO/FIXME - localize this */
2891 switch (*setting->value.target.unsigned_integer)
2892 {
2893 case STREAMING_MODE_TWITCH:
2894 strcpy_literal(s, "Twitch");
2895 break;
2896 case STREAMING_MODE_YOUTUBE:
2897 strcpy_literal(s, "YouTube");
2898 break;
2899 case STREAMING_MODE_FACEBOOK:
2900 strcpy_literal(s, "Facebook Gaming");
2901 break;
2902 case STREAMING_MODE_LOCAL:
2903 strlcpy(s, "Local", len);
2904 break;
2905 case STREAMING_MODE_CUSTOM:
2906 strlcpy(s, "Custom", len);
2907 break;
2908 }
2909 }
2910
setting_get_string_representation_video_stream_quality(rarch_setting_t * setting,char * s,size_t len)2911 static void setting_get_string_representation_video_stream_quality(
2912 rarch_setting_t *setting,
2913 char *s, size_t len)
2914 {
2915 if (!setting)
2916 return;
2917
2918 /* TODO/FIXME - localize this */
2919 switch (*setting->value.target.unsigned_integer)
2920 {
2921 case RECORD_CONFIG_TYPE_STREAMING_CUSTOM:
2922 strlcpy(s, "Custom", len);
2923 break;
2924 case RECORD_CONFIG_TYPE_STREAMING_LOW_QUALITY:
2925 strlcpy(s, "Low", len);
2926 break;
2927 case RECORD_CONFIG_TYPE_STREAMING_MED_QUALITY:
2928 strlcpy(s, "Medium", len);
2929 break;
2930 case RECORD_CONFIG_TYPE_STREAMING_HIGH_QUALITY:
2931 strlcpy(s, "High", len);
2932 break;
2933 }
2934 }
2935
setting_get_string_representation_video_record_quality(rarch_setting_t * setting,char * s,size_t len)2936 static void setting_get_string_representation_video_record_quality(rarch_setting_t *setting,
2937 char *s, size_t len)
2938 {
2939 if (!setting)
2940 return;
2941
2942 /* TODO/FIXME - localize this */
2943 switch (*setting->value.target.unsigned_integer)
2944 {
2945 case RECORD_CONFIG_TYPE_RECORDING_CUSTOM:
2946 strlcpy(s, "Custom", len);
2947 break;
2948 case RECORD_CONFIG_TYPE_RECORDING_LOW_QUALITY:
2949 strlcpy(s, "Low", len);
2950 break;
2951 case RECORD_CONFIG_TYPE_RECORDING_MED_QUALITY:
2952 strlcpy(s, "Medium", len);
2953 break;
2954 case RECORD_CONFIG_TYPE_RECORDING_HIGH_QUALITY:
2955 strlcpy(s, "High", len);
2956 break;
2957 case RECORD_CONFIG_TYPE_RECORDING_LOSSLESS_QUALITY:
2958 strlcpy(s, "Lossless", len);
2959 break;
2960 case RECORD_CONFIG_TYPE_RECORDING_WEBM_FAST:
2961 strlcpy(s, "WebM Fast", len);
2962 break;
2963 case RECORD_CONFIG_TYPE_RECORDING_WEBM_HIGH_QUALITY:
2964 strlcpy(s, "WebM High Quality", len);
2965 break;
2966 case RECORD_CONFIG_TYPE_RECORDING_GIF:
2967 strlcpy(s, "GIF", len);
2968 break;
2969 case RECORD_CONFIG_TYPE_RECORDING_APNG:
2970 strlcpy(s, "APNG", len);
2971 break;
2972 }
2973 }
2974
setting_get_string_representation_video_filter(rarch_setting_t * setting,char * s,size_t len)2975 static void setting_get_string_representation_video_filter(rarch_setting_t *setting,
2976 char *s, size_t len)
2977 {
2978 if (!setting)
2979 return;
2980
2981 fill_short_pathname_representation(s, setting->value.target.string, len);
2982 }
2983
setting_get_string_representation_state_slot(rarch_setting_t * setting,char * s,size_t len)2984 static void setting_get_string_representation_state_slot(rarch_setting_t *setting,
2985 char *s, size_t len)
2986 {
2987 if (!setting)
2988 return;
2989
2990 snprintf(s, len, "%d", *setting->value.target.integer);
2991 if (*setting->value.target.integer == -1)
2992 strlcat(s, " (Auto)", len);
2993 }
2994
setting_get_string_representation_percentage(rarch_setting_t * setting,char * s,size_t len)2995 static void setting_get_string_representation_percentage(rarch_setting_t *setting,
2996 char *s, size_t len)
2997 {
2998 if (!setting)
2999 return;
3000
3001 snprintf(s, len, "%d%%", *setting->value.target.integer);
3002 }
3003
setting_get_string_representation_float_video_msg_color(rarch_setting_t * setting,char * s,size_t len)3004 static void setting_get_string_representation_float_video_msg_color(rarch_setting_t *setting,
3005 char *s, size_t len)
3006 {
3007 if (!setting)
3008 return;
3009
3010 snprintf(s, len, "%d", (int)(*setting->value.target.fraction * 255.0f));
3011 }
3012
setting_get_string_representation_max_users(rarch_setting_t * setting,char * s,size_t len)3013 static void setting_get_string_representation_max_users(rarch_setting_t *setting,
3014 char *s, size_t len)
3015 {
3016 if (!setting)
3017 return;
3018
3019 snprintf(s, len, "%d", *setting->value.target.unsigned_integer);
3020 }
3021
3022 #ifdef HAVE_CHEEVOS
setting_get_string_representation_cheevos_password(rarch_setting_t * setting,char * s,size_t len)3023 static void setting_get_string_representation_cheevos_password(
3024 rarch_setting_t *setting,
3025 char *s, size_t len)
3026 {
3027 if (!setting)
3028 return;
3029
3030 if (!string_is_empty(setting->value.target.string))
3031 strcpy_literal(s, "********");
3032 else
3033 {
3034 settings_t *settings = config_get_ptr();
3035 if (settings->arrays.cheevos_token[0])
3036 strcpy_literal(s, "********");
3037 else
3038 *setting->value.target.string = '\0';
3039 }
3040 }
3041 #endif
3042
3043 #if TARGET_OS_IPHONE
setting_get_string_representation_uint_keyboard_gamepad_mapping_type(rarch_setting_t * setting,char * s,size_t len)3044 static void setting_get_string_representation_uint_keyboard_gamepad_mapping_type(
3045 rarch_setting_t *setting,
3046 char *s, size_t len)
3047 {
3048 if (!setting)
3049 return;
3050
3051 switch (*setting->value.target.unsigned_integer)
3052 {
3053 case 0:
3054 strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NONE), len);
3055 break;
3056 case 1:
3057 strcpy_literal(s, "iPega PG-9017");
3058 break;
3059 case 2:
3060 strcpy_literal(s, "8-bitty");
3061 break;
3062 case 3:
3063 strcpy_literal(s, "SNES30 8bitdo");
3064 break;
3065 }
3066 }
3067 #endif
3068
3069 #ifdef HAVE_TRANSLATE
setting_get_string_representation_uint_ai_service_mode(rarch_setting_t * setting,char * s,size_t len)3070 static void setting_get_string_representation_uint_ai_service_mode(
3071 rarch_setting_t *setting,
3072 char *s, size_t len)
3073 {
3074 enum msg_hash_enums enum_idx = MSG_UNKNOWN;
3075 if (!setting)
3076 return;
3077
3078 switch (*setting->value.target.unsigned_integer)
3079 {
3080 case 0:
3081 enum_idx = MENU_ENUM_LABEL_VALUE_AI_SERVICE_IMAGE_MODE;
3082 break;
3083 case 1:
3084 enum_idx = MENU_ENUM_LABEL_VALUE_AI_SERVICE_SPEECH_MODE;
3085 break;
3086 case 2:
3087 enum_idx = MENU_ENUM_LABEL_VALUE_AI_SERVICE_NARRATOR_MODE;
3088 break;
3089 default:
3090 break;
3091 }
3092
3093 if (enum_idx != 0)
3094 strlcpy(s, msg_hash_to_str(enum_idx), len);
3095 }
3096
setting_get_string_representation_uint_ai_service_lang(rarch_setting_t * setting,char * s,size_t len)3097 static void setting_get_string_representation_uint_ai_service_lang(
3098 rarch_setting_t *setting,
3099 char *s, size_t len)
3100 {
3101 enum msg_hash_enums enum_idx = MSG_UNKNOWN;
3102 if (!setting)
3103 return;
3104
3105 switch (*setting->value.target.unsigned_integer)
3106 {
3107 case TRANSLATION_LANG_EN:
3108 enum_idx = MENU_ENUM_LABEL_VALUE_LANG_ENGLISH;
3109 break;
3110 case TRANSLATION_LANG_ES:
3111 enum_idx = MENU_ENUM_LABEL_VALUE_LANG_SPANISH;
3112 break;
3113 case TRANSLATION_LANG_FR:
3114 enum_idx = MENU_ENUM_LABEL_VALUE_LANG_FRENCH;
3115 break;
3116 case TRANSLATION_LANG_IT:
3117 enum_idx = MENU_ENUM_LABEL_VALUE_LANG_ITALIAN;
3118 break;
3119 case TRANSLATION_LANG_DE:
3120 enum_idx = MENU_ENUM_LABEL_VALUE_LANG_GERMAN;
3121 break;
3122 case TRANSLATION_LANG_JP:
3123 enum_idx = MENU_ENUM_LABEL_VALUE_LANG_JAPANESE;
3124 break;
3125 case TRANSLATION_LANG_NL:
3126 enum_idx = MENU_ENUM_LABEL_VALUE_LANG_DUTCH;
3127 break;
3128 case TRANSLATION_LANG_CS:
3129 enum_idx = MENU_ENUM_LABEL_VALUE_LANG_CZECH;
3130 break;
3131 case TRANSLATION_LANG_DA:
3132 enum_idx = MENU_ENUM_LABEL_VALUE_LANG_DANISH;
3133 break;
3134 /* TODO/FIXME */
3135 case TRANSLATION_LANG_SV:
3136 enum_idx = MENU_ENUM_LABEL_VALUE_LANG_SWEDISH;
3137 break;
3138 case TRANSLATION_LANG_HR:
3139 enum_idx = MENU_ENUM_LABEL_VALUE_LANG_CROATIAN;
3140 break;
3141 case TRANSLATION_LANG_CA:
3142 enum_idx = MENU_ENUM_LABEL_VALUE_LANG_CATALAN;
3143 break;
3144 case TRANSLATION_LANG_AST:
3145 enum_idx = MENU_ENUM_LABEL_VALUE_LANG_ASTURIAN;
3146 break;
3147 case TRANSLATION_LANG_BG:
3148 enum_idx = MENU_ENUM_LABEL_VALUE_LANG_BULGARIAN;
3149 break;
3150 case TRANSLATION_LANG_BN:
3151 enum_idx = MENU_ENUM_LABEL_VALUE_LANG_BENGALI;
3152 break;
3153 case TRANSLATION_LANG_EU:
3154 enum_idx = MENU_ENUM_LABEL_VALUE_LANG_BASQUE;
3155 break;
3156 case TRANSLATION_LANG_AZ:
3157 enum_idx = MENU_ENUM_LABEL_VALUE_LANG_AZERBAIJANI;
3158 break;
3159 case TRANSLATION_LANG_SQ:
3160 enum_idx = MENU_ENUM_LABEL_VALUE_LANG_ALBANIAN;
3161 break;
3162 case TRANSLATION_LANG_AF:
3163 enum_idx = MENU_ENUM_LABEL_VALUE_LANG_AFRIKAANS;
3164 break;
3165 case TRANSLATION_LANG_ET:
3166 enum_idx = MENU_ENUM_LABEL_VALUE_LANG_ESTONIAN;
3167 break;
3168 case TRANSLATION_LANG_TL:
3169 enum_idx = MENU_ENUM_LABEL_VALUE_LANG_FILIPINO;
3170 break;
3171 case TRANSLATION_LANG_FI:
3172 enum_idx = MENU_ENUM_LABEL_VALUE_LANG_FINNISH;
3173 break;
3174 case TRANSLATION_LANG_GL:
3175 enum_idx = MENU_ENUM_LABEL_VALUE_LANG_GALICIAN;
3176 break;
3177 case TRANSLATION_LANG_KA:
3178 enum_idx = MENU_ENUM_LABEL_VALUE_LANG_GEORGIAN;
3179 break;
3180 case TRANSLATION_LANG_GU:
3181 enum_idx = MENU_ENUM_LABEL_VALUE_LANG_GUJARATI;
3182 break;
3183 case TRANSLATION_LANG_HT:
3184 enum_idx = MENU_ENUM_LABEL_VALUE_LANG_HAITIAN_CREOLE;
3185 break;
3186 case TRANSLATION_LANG_HE:
3187 enum_idx = MENU_ENUM_LABEL_VALUE_LANG_HEBREW;
3188 break;
3189 case TRANSLATION_LANG_HI:
3190 enum_idx = MENU_ENUM_LABEL_VALUE_LANG_HINDI;
3191 break;
3192 case TRANSLATION_LANG_HU:
3193 enum_idx = MENU_ENUM_LABEL_VALUE_LANG_HUNGARIAN;
3194 break;
3195 case TRANSLATION_LANG_IS:
3196 enum_idx = MENU_ENUM_LABEL_VALUE_LANG_ICELANDIC;
3197 break;
3198 case TRANSLATION_LANG_ID:
3199 enum_idx = MENU_ENUM_LABEL_VALUE_LANG_INDONESIAN;
3200 break;
3201 case TRANSLATION_LANG_GA:
3202 enum_idx = MENU_ENUM_LABEL_VALUE_LANG_IRISH;
3203 break;
3204 case TRANSLATION_LANG_KN:
3205 enum_idx = MENU_ENUM_LABEL_VALUE_LANG_KANNADA;
3206 break;
3207 case TRANSLATION_LANG_LA:
3208 enum_idx = MENU_ENUM_LABEL_VALUE_LANG_LATIN;
3209 break;
3210 case TRANSLATION_LANG_LV:
3211 enum_idx = MENU_ENUM_LABEL_VALUE_LANG_LATVIAN;
3212 break;
3213 case TRANSLATION_LANG_LT:
3214 enum_idx = MENU_ENUM_LABEL_VALUE_LANG_LITHUANIAN;
3215 break;
3216 case TRANSLATION_LANG_MK:
3217 enum_idx = MENU_ENUM_LABEL_VALUE_LANG_MACEDONIAN;
3218 break;
3219 case TRANSLATION_LANG_MS:
3220 enum_idx = MENU_ENUM_LABEL_VALUE_LANG_MALAY;
3221 break;
3222 case TRANSLATION_LANG_MT:
3223 enum_idx = MENU_ENUM_LABEL_VALUE_LANG_MALTESE;
3224 break;
3225 case TRANSLATION_LANG_NO:
3226 enum_idx = MENU_ENUM_LABEL_VALUE_LANG_NORWEGIAN;
3227 break;
3228 case TRANSLATION_LANG_FA:
3229 enum_idx = MENU_ENUM_LABEL_VALUE_LANG_PERSIAN;
3230 break;
3231 case TRANSLATION_LANG_RO:
3232 enum_idx = MENU_ENUM_LABEL_VALUE_LANG_ROMANIAN;
3233 break;
3234 case TRANSLATION_LANG_SR:
3235 enum_idx = MENU_ENUM_LABEL_VALUE_LANG_SERBIAN;
3236 break;
3237 case TRANSLATION_LANG_SK:
3238 enum_idx = MENU_ENUM_LABEL_VALUE_LANG_SLOVAK;
3239 break;
3240 case TRANSLATION_LANG_SL:
3241 enum_idx = MENU_ENUM_LABEL_VALUE_LANG_SLOVENIAN;
3242 break;
3243 case TRANSLATION_LANG_SW:
3244 enum_idx = MENU_ENUM_LABEL_VALUE_LANG_SWAHILI;
3245 break;
3246 case TRANSLATION_LANG_TA:
3247 enum_idx = MENU_ENUM_LABEL_VALUE_LANG_TAMIL;
3248 break;
3249 case TRANSLATION_LANG_TE:
3250 enum_idx = MENU_ENUM_LABEL_VALUE_LANG_TELUGU;
3251 break;
3252 case TRANSLATION_LANG_TH:
3253 enum_idx = MENU_ENUM_LABEL_VALUE_LANG_THAI;
3254 break;
3255 case TRANSLATION_LANG_UK:
3256 enum_idx = MENU_ENUM_LABEL_VALUE_LANG_UKRAINIAN;
3257 break;
3258 case TRANSLATION_LANG_UR:
3259 enum_idx = MENU_ENUM_LABEL_VALUE_LANG_URDU;
3260 break;
3261 case TRANSLATION_LANG_CY:
3262 enum_idx = MENU_ENUM_LABEL_VALUE_LANG_WELSH;
3263 break;
3264 case TRANSLATION_LANG_YI:
3265 enum_idx = MENU_ENUM_LABEL_VALUE_LANG_YIDDISH;
3266 break;
3267 case TRANSLATION_LANG_RU:
3268 enum_idx = MENU_ENUM_LABEL_VALUE_LANG_RUSSIAN;
3269 break;
3270 case TRANSLATION_LANG_PT:
3271 enum_idx = MENU_ENUM_LABEL_VALUE_LANG_PORTUGUESE_PORTUGAL;
3272 break;
3273 case TRANSLATION_LANG_TR:
3274 enum_idx = MENU_ENUM_LABEL_VALUE_LANG_TURKISH;
3275 break;
3276 case TRANSLATION_LANG_PL:
3277 enum_idx = MENU_ENUM_LABEL_VALUE_LANG_POLISH;
3278 break;
3279 case TRANSLATION_LANG_VI:
3280 enum_idx = MENU_ENUM_LABEL_VALUE_LANG_VIETNAMESE;
3281 break;
3282 case TRANSLATION_LANG_EL:
3283 enum_idx = MENU_ENUM_LABEL_VALUE_LANG_GREEK;
3284 break;
3285 case TRANSLATION_LANG_KO:
3286 enum_idx = MENU_ENUM_LABEL_VALUE_LANG_KOREAN;
3287 break;
3288 case TRANSLATION_LANG_EO:
3289 enum_idx = MENU_ENUM_LABEL_VALUE_LANG_ESPERANTO;
3290 break;
3291 case TRANSLATION_LANG_AR:
3292 enum_idx = MENU_ENUM_LABEL_VALUE_LANG_ARABIC;
3293 break;
3294 case TRANSLATION_LANG_ZH_CN:
3295 enum_idx = MENU_ENUM_LABEL_VALUE_LANG_CHINESE_SIMPLIFIED;
3296 break;
3297 case TRANSLATION_LANG_ZH_TW:
3298 enum_idx = MENU_ENUM_LABEL_VALUE_LANG_CHINESE_TRADITIONAL;
3299 break;
3300 case TRANSLATION_LANG_DONT_CARE:
3301 enum_idx = MENU_ENUM_LABEL_VALUE_DONT_CARE;
3302 break;
3303 default:
3304 break;
3305 }
3306
3307 if (enum_idx != 0)
3308 strlcpy(s, msg_hash_to_str(enum_idx), len);
3309 else
3310 snprintf(s, len, "%d", *setting->value.target.unsigned_integer);
3311 }
3312 #endif
3313
setting_get_string_representation_uint_menu_thumbnails(rarch_setting_t * setting,char * s,size_t len)3314 static void setting_get_string_representation_uint_menu_thumbnails(
3315 rarch_setting_t *setting,
3316 char *s, size_t len)
3317 {
3318 if (!setting)
3319 return;
3320
3321 switch (*setting->value.target.unsigned_integer)
3322 {
3323 case 0:
3324 strlcpy(s, msg_hash_to_str(
3325 MENU_ENUM_LABEL_VALUE_OFF), len);
3326 break;
3327 case 1:
3328 strlcpy(s,
3329 msg_hash_to_str(
3330 MENU_ENUM_LABEL_VALUE_THUMBNAIL_MODE_SCREENSHOTS), len);
3331 break;
3332 case 2:
3333 strlcpy(s,
3334 msg_hash_to_str(
3335 MENU_ENUM_LABEL_VALUE_THUMBNAIL_MODE_TITLE_SCREENS), len);
3336 break;
3337 case 3:
3338 strlcpy(s,
3339 msg_hash_to_str(
3340 MENU_ENUM_LABEL_VALUE_THUMBNAIL_MODE_BOXARTS), len);
3341 break;
3342 }
3343 }
3344
setting_get_string_representation_uint_menu_left_thumbnails(rarch_setting_t * setting,char * s,size_t len)3345 static void setting_get_string_representation_uint_menu_left_thumbnails(
3346 rarch_setting_t *setting,
3347 char *s, size_t len)
3348 {
3349 if (!setting)
3350 return;
3351
3352 switch (*setting->value.target.unsigned_integer)
3353 {
3354 case 0:
3355 strlcpy(s, msg_hash_to_str(
3356 MENU_ENUM_LABEL_VALUE_OFF), len);
3357 break;
3358 case 1:
3359 strlcpy(s,
3360 msg_hash_to_str(
3361 MENU_ENUM_LABEL_VALUE_THUMBNAIL_MODE_SCREENSHOTS), len);
3362 break;
3363 case 2:
3364 strlcpy(s,
3365 msg_hash_to_str(
3366 MENU_ENUM_LABEL_VALUE_THUMBNAIL_MODE_TITLE_SCREENS), len);
3367 break;
3368 case 3:
3369 strlcpy(s,
3370 msg_hash_to_str(
3371 MENU_ENUM_LABEL_VALUE_THUMBNAIL_MODE_BOXARTS), len);
3372 break;
3373 }
3374 }
3375
setting_set_string_representation_timedate_date_seperator(char * s)3376 static void setting_set_string_representation_timedate_date_seperator(char *s)
3377 {
3378 settings_t *settings = config_get_ptr();
3379 unsigned menu_timedate_date_separator = settings ?
3380 settings->uints.menu_timedate_date_separator :
3381 MENU_TIMEDATE_DATE_SEPARATOR_HYPHEN;
3382
3383 switch (menu_timedate_date_separator)
3384 {
3385 case MENU_TIMEDATE_DATE_SEPARATOR_SLASH:
3386 string_replace_all_chars(s, '-', '/');
3387 break;
3388 case MENU_TIMEDATE_DATE_SEPARATOR_PERIOD:
3389 string_replace_all_chars(s, '-', '.');
3390 break;
3391 case MENU_TIMEDATE_DATE_SEPARATOR_HYPHEN:
3392 default:
3393 break;
3394 }
3395 }
3396
setting_get_string_representation_uint_menu_timedate_style(rarch_setting_t * setting,char * s,size_t len)3397 static void setting_get_string_representation_uint_menu_timedate_style(
3398 rarch_setting_t *setting,
3399 char *s, size_t len)
3400 {
3401 if (!setting)
3402 return;
3403
3404 switch (*setting->value.target.unsigned_integer)
3405 {
3406 case MENU_TIMEDATE_STYLE_YMD_HMS:
3407 strlcpy(s, msg_hash_to_str(
3408 MENU_ENUM_LABEL_VALUE_TIMEDATE_YMD_HMS), len);
3409 break;
3410 case MENU_TIMEDATE_STYLE_YMD_HM:
3411 strlcpy(s, msg_hash_to_str(
3412 MENU_ENUM_LABEL_VALUE_TIMEDATE_YMD_HM), len);
3413 break;
3414 case MENU_TIMEDATE_STYLE_YMD:
3415 strlcpy(s, msg_hash_to_str(
3416 MENU_ENUM_LABEL_VALUE_TIMEDATE_YMD), len);
3417 break;
3418 case MENU_TIMEDATE_STYLE_YM:
3419 strlcpy(s, msg_hash_to_str(
3420 MENU_ENUM_LABEL_VALUE_TIMEDATE_YM), len);
3421 break;
3422 case MENU_TIMEDATE_STYLE_MDYYYY_HMS:
3423 strlcpy(s,
3424 msg_hash_to_str(
3425 MENU_ENUM_LABEL_VALUE_TIMEDATE_MDYYYY_HMS), len);
3426 break;
3427 case MENU_TIMEDATE_STYLE_MDYYYY_HM:
3428 strlcpy(s,
3429 msg_hash_to_str(
3430 MENU_ENUM_LABEL_VALUE_TIMEDATE_MDYYYY_HM), len);
3431 break;
3432 case MENU_TIMEDATE_STYLE_MD_HM:
3433 strlcpy(s,
3434 msg_hash_to_str(
3435 MENU_ENUM_LABEL_VALUE_TIMEDATE_MD_HM), len);
3436 break;
3437 case MENU_TIMEDATE_STYLE_MDYYYY:
3438 strlcpy(s,
3439 msg_hash_to_str(
3440 MENU_ENUM_LABEL_VALUE_TIMEDATE_MDYYYY), len);
3441 break;
3442 case MENU_TIMEDATE_STYLE_MD:
3443 strlcpy(s,
3444 msg_hash_to_str(
3445 MENU_ENUM_LABEL_VALUE_TIMEDATE_MD), len);
3446 break;
3447 case MENU_TIMEDATE_STYLE_DDMMYYYY_HMS:
3448 strlcpy(s,
3449 msg_hash_to_str(
3450 MENU_ENUM_LABEL_VALUE_TIMEDATE_DDMMYYYY_HMS), len);
3451 break;
3452 case MENU_TIMEDATE_STYLE_DDMMYYYY_HM:
3453 strlcpy(s,
3454 msg_hash_to_str(
3455 MENU_ENUM_LABEL_VALUE_TIMEDATE_DDMMYYYY_HM), len);
3456 break;
3457 case MENU_TIMEDATE_STYLE_DDMM_HM:
3458 strlcpy(s,
3459 msg_hash_to_str(
3460 MENU_ENUM_LABEL_VALUE_TIMEDATE_DDMM_HM), len);
3461 break;
3462 case MENU_TIMEDATE_STYLE_DDMMYYYY:
3463 strlcpy(s,
3464 msg_hash_to_str(
3465 MENU_ENUM_LABEL_VALUE_TIMEDATE_DDMMYYYY), len);
3466 break;
3467 case MENU_TIMEDATE_STYLE_DDMM:
3468 strlcpy(s,
3469 msg_hash_to_str(
3470 MENU_ENUM_LABEL_VALUE_TIMEDATE_DDMM), len);
3471 break;
3472 case MENU_TIMEDATE_STYLE_HMS:
3473 strlcpy(s,
3474 msg_hash_to_str(
3475 MENU_ENUM_LABEL_VALUE_TIMEDATE_HMS), len);
3476 break;
3477 case MENU_TIMEDATE_STYLE_HM:
3478 strlcpy(s,
3479 msg_hash_to_str(
3480 MENU_ENUM_LABEL_VALUE_TIMEDATE_HM), len);
3481 break;
3482 case MENU_TIMEDATE_STYLE_YMD_HMS_AMPM:
3483 strlcpy(s,
3484 msg_hash_to_str(
3485 MENU_ENUM_LABEL_VALUE_TIMEDATE_YMD_HMS_AMPM), len);
3486 break;
3487 case MENU_TIMEDATE_STYLE_YMD_HM_AMPM:
3488 strlcpy(s,
3489 msg_hash_to_str(
3490 MENU_ENUM_LABEL_VALUE_TIMEDATE_YMD_HM_AMPM), len);
3491 break;
3492 case MENU_TIMEDATE_STYLE_MDYYYY_HMS_AMPM:
3493 strlcpy(s,
3494 msg_hash_to_str(
3495 MENU_ENUM_LABEL_VALUE_TIMEDATE_MDYYYY_HMS_AMPM), len);
3496 break;
3497 case MENU_TIMEDATE_STYLE_MDYYYY_HM_AMPM:
3498 strlcpy(s,
3499 msg_hash_to_str(
3500 MENU_ENUM_LABEL_VALUE_TIMEDATE_MDYYYY_HM_AMPM), len);
3501 break;
3502 case MENU_TIMEDATE_STYLE_MD_HM_AMPM:
3503 strlcpy(s,
3504 msg_hash_to_str(
3505 MENU_ENUM_LABEL_VALUE_TIMEDATE_MD_HM_AMPM), len);
3506 break;
3507 case MENU_TIMEDATE_STYLE_DDMMYYYY_HMS_AMPM:
3508 strlcpy(s,
3509 msg_hash_to_str(
3510 MENU_ENUM_LABEL_VALUE_TIMEDATE_DDMMYYYY_HMS_AMPM), len);
3511 break;
3512 case MENU_TIMEDATE_STYLE_DDMMYYYY_HM_AMPM:
3513 strlcpy(s,
3514 msg_hash_to_str(
3515 MENU_ENUM_LABEL_VALUE_TIMEDATE_DDMMYYYY_HM_AMPM), len);
3516 break;
3517 case MENU_TIMEDATE_STYLE_DDMM_HM_AMPM:
3518 strlcpy(s,
3519 msg_hash_to_str(
3520 MENU_ENUM_LABEL_VALUE_TIMEDATE_DDMM_HM_AMPM), len);
3521 break;
3522 case MENU_TIMEDATE_STYLE_HMS_AMPM:
3523 strlcpy(s,
3524 msg_hash_to_str(
3525 MENU_ENUM_LABEL_VALUE_TIMEDATE_HMS_AMPM), len);
3526 break;
3527 case MENU_TIMEDATE_STYLE_HM_AMPM:
3528 strlcpy(s,
3529 msg_hash_to_str(
3530 MENU_ENUM_LABEL_VALUE_TIMEDATE_HM_AMPM), len);
3531 break;
3532 }
3533
3534 /* Change date separator, if required */
3535 setting_set_string_representation_timedate_date_seperator(s);
3536 }
3537
setting_get_string_representation_uint_menu_timedate_date_separator(rarch_setting_t * setting,char * s,size_t len)3538 static void setting_get_string_representation_uint_menu_timedate_date_separator(
3539 rarch_setting_t *setting,
3540 char *s, size_t len)
3541 {
3542 if (!setting)
3543 return;
3544
3545 switch (*setting->value.target.unsigned_integer)
3546 {
3547 case MENU_TIMEDATE_DATE_SEPARATOR_HYPHEN:
3548 strcpy_literal(s, "'-'");
3549 break;
3550 case MENU_TIMEDATE_DATE_SEPARATOR_SLASH:
3551 strcpy_literal(s, "'/'");
3552 break;
3553 case MENU_TIMEDATE_DATE_SEPARATOR_PERIOD:
3554 strcpy_literal(s, "'.'");
3555 break;
3556 }
3557 }
3558
setting_get_string_representation_uint_menu_add_content_entry_display_type(rarch_setting_t * setting,char * s,size_t len)3559 static void setting_get_string_representation_uint_menu_add_content_entry_display_type(
3560 rarch_setting_t *setting,
3561 char *s, size_t len)
3562 {
3563 if (!setting)
3564 return;
3565
3566 switch (*setting->value.target.unsigned_integer)
3567 {
3568 case MENU_ADD_CONTENT_ENTRY_DISPLAY_HIDDEN:
3569 strlcpy(s,
3570 msg_hash_to_str(
3571 MENU_ENUM_LABEL_VALUE_OFF),
3572 len);
3573 break;
3574 case MENU_ADD_CONTENT_ENTRY_DISPLAY_MAIN_TAB:
3575 strlcpy(s,
3576 msg_hash_to_str(
3577 MENU_ENUM_LABEL_VALUE_MENU_ADD_CONTENT_ENTRY_DISPLAY_MAIN_TAB),
3578 len);
3579 break;
3580 case MENU_ADD_CONTENT_ENTRY_DISPLAY_PLAYLISTS_TAB:
3581 strlcpy(s,
3582 msg_hash_to_str(
3583 MENU_ENUM_LABEL_VALUE_MENU_ADD_CONTENT_ENTRY_DISPLAY_PLAYLISTS_TAB),
3584 len);
3585 break;
3586 }
3587 }
3588
setting_get_string_representation_uint_rgui_menu_color_theme(rarch_setting_t * setting,char * s,size_t len)3589 static void setting_get_string_representation_uint_rgui_menu_color_theme(
3590 rarch_setting_t *setting,
3591 char *s, size_t len)
3592 {
3593 if (!setting)
3594 return;
3595
3596 switch (*setting->value.target.unsigned_integer)
3597 {
3598 case RGUI_THEME_CUSTOM:
3599 strlcpy(s,
3600 msg_hash_to_str(
3601 MENU_ENUM_LABEL_VALUE_RGUI_MENU_COLOR_THEME_CUSTOM),
3602 len);
3603 break;
3604 case RGUI_THEME_CLASSIC_RED:
3605 strlcpy(s,
3606 msg_hash_to_str(
3607 MENU_ENUM_LABEL_VALUE_RGUI_MENU_COLOR_THEME_CLASSIC_RED),
3608 len);
3609 break;
3610 case RGUI_THEME_CLASSIC_ORANGE:
3611 strlcpy(s,
3612 msg_hash_to_str(
3613 MENU_ENUM_LABEL_VALUE_RGUI_MENU_COLOR_THEME_CLASSIC_ORANGE),
3614 len);
3615 break;
3616 case RGUI_THEME_CLASSIC_YELLOW:
3617 strlcpy(s,
3618 msg_hash_to_str(
3619 MENU_ENUM_LABEL_VALUE_RGUI_MENU_COLOR_THEME_CLASSIC_YELLOW),
3620 len);
3621 break;
3622 case RGUI_THEME_CLASSIC_GREEN:
3623 strlcpy(s,
3624 msg_hash_to_str(
3625 MENU_ENUM_LABEL_VALUE_RGUI_MENU_COLOR_THEME_CLASSIC_GREEN),
3626 len);
3627 break;
3628 case RGUI_THEME_CLASSIC_BLUE:
3629 strlcpy(s,
3630 msg_hash_to_str(
3631 MENU_ENUM_LABEL_VALUE_RGUI_MENU_COLOR_THEME_CLASSIC_BLUE),
3632 len);
3633 break;
3634 case RGUI_THEME_CLASSIC_VIOLET:
3635 strlcpy(s,
3636 msg_hash_to_str(
3637 MENU_ENUM_LABEL_VALUE_RGUI_MENU_COLOR_THEME_CLASSIC_VIOLET),
3638 len);
3639 break;
3640 case RGUI_THEME_CLASSIC_GREY:
3641 strlcpy(s,
3642 msg_hash_to_str(
3643 MENU_ENUM_LABEL_VALUE_RGUI_MENU_COLOR_THEME_CLASSIC_GREY),
3644 len);
3645 break;
3646 case RGUI_THEME_LEGACY_RED:
3647 strlcpy(s,
3648 msg_hash_to_str(
3649 MENU_ENUM_LABEL_VALUE_RGUI_MENU_COLOR_THEME_LEGACY_RED),
3650 len);
3651 break;
3652 case RGUI_THEME_DARK_PURPLE:
3653 strlcpy(s,
3654 msg_hash_to_str(
3655 MENU_ENUM_LABEL_VALUE_RGUI_MENU_COLOR_THEME_DARK_PURPLE),
3656 len);
3657 break;
3658 case RGUI_THEME_MIDNIGHT_BLUE:
3659 strlcpy(s,
3660 msg_hash_to_str(
3661 MENU_ENUM_LABEL_VALUE_RGUI_MENU_COLOR_THEME_MIDNIGHT_BLUE),
3662 len);
3663 break;
3664 case RGUI_THEME_GOLDEN:
3665 strlcpy(s,
3666 msg_hash_to_str(
3667 MENU_ENUM_LABEL_VALUE_RGUI_MENU_COLOR_THEME_GOLDEN),
3668 len);
3669 break;
3670 case RGUI_THEME_ELECTRIC_BLUE:
3671 strlcpy(s,
3672 msg_hash_to_str(
3673 MENU_ENUM_LABEL_VALUE_RGUI_MENU_COLOR_THEME_ELECTRIC_BLUE),
3674 len);
3675 break;
3676 case RGUI_THEME_APPLE_GREEN:
3677 strlcpy(s,
3678 msg_hash_to_str(
3679 MENU_ENUM_LABEL_VALUE_RGUI_MENU_COLOR_THEME_APPLE_GREEN),
3680 len);
3681 break;
3682 case RGUI_THEME_VOLCANIC_RED:
3683 strlcpy(s,
3684 msg_hash_to_str(
3685 MENU_ENUM_LABEL_VALUE_RGUI_MENU_COLOR_THEME_VOLCANIC_RED),
3686 len);
3687 break;
3688 case RGUI_THEME_LAGOON:
3689 strlcpy(s,
3690 msg_hash_to_str(
3691 MENU_ENUM_LABEL_VALUE_RGUI_MENU_COLOR_THEME_LAGOON),
3692 len);
3693 break;
3694 case RGUI_THEME_BROGRAMMER:
3695 strlcpy(s,
3696 msg_hash_to_str(
3697 MENU_ENUM_LABEL_VALUE_RGUI_MENU_COLOR_THEME_BROGRAMMER),
3698 len);
3699 break;
3700 case RGUI_THEME_DRACULA:
3701 strlcpy(s,
3702 msg_hash_to_str(
3703 MENU_ENUM_LABEL_VALUE_RGUI_MENU_COLOR_THEME_DRACULA),
3704 len);
3705 break;
3706 case RGUI_THEME_FAIRYFLOSS:
3707 strlcpy(s,
3708 msg_hash_to_str(
3709 MENU_ENUM_LABEL_VALUE_RGUI_MENU_COLOR_THEME_FAIRYFLOSS),
3710 len);
3711 break;
3712 case RGUI_THEME_FLATUI:
3713 strlcpy(s,
3714 msg_hash_to_str(
3715 MENU_ENUM_LABEL_VALUE_RGUI_MENU_COLOR_THEME_FLATUI),
3716 len);
3717 break;
3718 case RGUI_THEME_GRUVBOX_DARK:
3719 strlcpy(s,
3720 msg_hash_to_str(
3721 MENU_ENUM_LABEL_VALUE_RGUI_MENU_COLOR_THEME_GRUVBOX_DARK),
3722 len);
3723 break;
3724 case RGUI_THEME_GRUVBOX_LIGHT:
3725 strlcpy(s,
3726 msg_hash_to_str(
3727 MENU_ENUM_LABEL_VALUE_RGUI_MENU_COLOR_THEME_GRUVBOX_LIGHT),
3728 len);
3729 break;
3730 case RGUI_THEME_HACKING_THE_KERNEL:
3731 strlcpy(s,
3732 msg_hash_to_str(
3733 MENU_ENUM_LABEL_VALUE_RGUI_MENU_COLOR_THEME_HACKING_THE_KERNEL),
3734 len);
3735 break;
3736 case RGUI_THEME_NORD:
3737 strlcpy(s,
3738 msg_hash_to_str(
3739 MENU_ENUM_LABEL_VALUE_RGUI_MENU_COLOR_THEME_NORD),
3740 len);
3741 break;
3742 case RGUI_THEME_NOVA:
3743 strlcpy(s,
3744 msg_hash_to_str(
3745 MENU_ENUM_LABEL_VALUE_RGUI_MENU_COLOR_THEME_NOVA),
3746 len);
3747 break;
3748 case RGUI_THEME_ONE_DARK:
3749 strlcpy(s,
3750 msg_hash_to_str(
3751 MENU_ENUM_LABEL_VALUE_RGUI_MENU_COLOR_THEME_ONE_DARK),
3752 len);
3753 break;
3754 case RGUI_THEME_PALENIGHT:
3755 strlcpy(s,
3756 msg_hash_to_str(
3757 MENU_ENUM_LABEL_VALUE_RGUI_MENU_COLOR_THEME_PALENIGHT),
3758 len);
3759 break;
3760 case RGUI_THEME_SOLARIZED_DARK:
3761 strlcpy(s,
3762 msg_hash_to_str(
3763 MENU_ENUM_LABEL_VALUE_RGUI_MENU_COLOR_THEME_SOLARIZED_DARK),
3764 len);
3765 break;
3766 case RGUI_THEME_SOLARIZED_LIGHT:
3767 strlcpy(s,
3768 msg_hash_to_str(
3769 MENU_ENUM_LABEL_VALUE_RGUI_MENU_COLOR_THEME_SOLARIZED_LIGHT),
3770 len);
3771 break;
3772 case RGUI_THEME_TANGO_DARK:
3773 strlcpy(s,
3774 msg_hash_to_str(
3775 MENU_ENUM_LABEL_VALUE_RGUI_MENU_COLOR_THEME_TANGO_DARK),
3776 len);
3777 break;
3778 case RGUI_THEME_TANGO_LIGHT:
3779 strlcpy(s,
3780 msg_hash_to_str(
3781 MENU_ENUM_LABEL_VALUE_RGUI_MENU_COLOR_THEME_TANGO_LIGHT),
3782 len);
3783 break;
3784 case RGUI_THEME_ZENBURN:
3785 strlcpy(s,
3786 msg_hash_to_str(
3787 MENU_ENUM_LABEL_VALUE_RGUI_MENU_COLOR_THEME_ZENBURN),
3788 len);
3789 break;
3790 case RGUI_THEME_ANTI_ZENBURN:
3791 strlcpy(s,
3792 msg_hash_to_str(
3793 MENU_ENUM_LABEL_VALUE_RGUI_MENU_COLOR_THEME_ANTI_ZENBURN),
3794 len);
3795 break;
3796 case RGUI_THEME_FLUX:
3797 strlcpy(s,
3798 msg_hash_to_str(
3799 MENU_ENUM_LABEL_VALUE_RGUI_MENU_COLOR_THEME_FLUX),
3800 len);
3801 break;
3802 }
3803 }
3804
setting_get_string_representation_uint_rgui_thumbnail_scaler(rarch_setting_t * setting,char * s,size_t len)3805 static void setting_get_string_representation_uint_rgui_thumbnail_scaler(
3806 rarch_setting_t *setting,
3807 char *s, size_t len)
3808 {
3809 if (!setting)
3810 return;
3811
3812 switch (*setting->value.target.unsigned_integer)
3813 {
3814 case RGUI_THUMB_SCALE_POINT:
3815 strlcpy(s,
3816 msg_hash_to_str(
3817 MENU_ENUM_LABEL_VALUE_RGUI_THUMB_SCALE_POINT),
3818 len);
3819 break;
3820 case RGUI_THUMB_SCALE_BILINEAR:
3821 strlcpy(s,
3822 msg_hash_to_str(
3823 MENU_ENUM_LABEL_VALUE_RGUI_THUMB_SCALE_BILINEAR),
3824 len);
3825 break;
3826 case RGUI_THUMB_SCALE_SINC:
3827 strlcpy(s,
3828 msg_hash_to_str(
3829 MENU_ENUM_LABEL_VALUE_RGUI_THUMB_SCALE_SINC),
3830 len);
3831 break;
3832 }
3833 }
3834
setting_get_string_representation_uint_rgui_internal_upscale_level(rarch_setting_t * setting,char * s,size_t len)3835 static void setting_get_string_representation_uint_rgui_internal_upscale_level(
3836 rarch_setting_t *setting,
3837 char *s, size_t len)
3838 {
3839 if (!setting)
3840 return;
3841
3842 switch (*setting->value.target.unsigned_integer)
3843 {
3844 case RGUI_UPSCALE_NONE:
3845 strlcpy(s,
3846 msg_hash_to_str(
3847 MENU_ENUM_LABEL_VALUE_RGUI_UPSCALE_NONE),
3848 len);
3849 break;
3850 case RGUI_UPSCALE_AUTO:
3851 strlcpy(s,
3852 msg_hash_to_str(
3853 MENU_ENUM_LABEL_VALUE_RGUI_UPSCALE_AUTO),
3854 len);
3855 break;
3856 case RGUI_UPSCALE_X2:
3857 strlcpy(s,
3858 msg_hash_to_str(
3859 MENU_ENUM_LABEL_VALUE_RGUI_UPSCALE_X2),
3860 len);
3861 break;
3862 case RGUI_UPSCALE_X3:
3863 strlcpy(s,
3864 msg_hash_to_str(
3865 MENU_ENUM_LABEL_VALUE_RGUI_UPSCALE_X3),
3866 len);
3867 break;
3868 case RGUI_UPSCALE_X4:
3869 strlcpy(s,
3870 msg_hash_to_str(
3871 MENU_ENUM_LABEL_VALUE_RGUI_UPSCALE_X4),
3872 len);
3873 break;
3874 case RGUI_UPSCALE_X5:
3875 strlcpy(s,
3876 msg_hash_to_str(
3877 MENU_ENUM_LABEL_VALUE_RGUI_UPSCALE_X5),
3878 len);
3879 break;
3880 case RGUI_UPSCALE_X6:
3881 strlcpy(s,
3882 msg_hash_to_str(
3883 MENU_ENUM_LABEL_VALUE_RGUI_UPSCALE_X6),
3884 len);
3885 break;
3886 case RGUI_UPSCALE_X7:
3887 strlcpy(s,
3888 msg_hash_to_str(
3889 MENU_ENUM_LABEL_VALUE_RGUI_UPSCALE_X7),
3890 len);
3891 break;
3892 case RGUI_UPSCALE_X8:
3893 strlcpy(s,
3894 msg_hash_to_str(
3895 MENU_ENUM_LABEL_VALUE_RGUI_UPSCALE_X8),
3896 len);
3897 break;
3898 case RGUI_UPSCALE_X9:
3899 strlcpy(s,
3900 msg_hash_to_str(
3901 MENU_ENUM_LABEL_VALUE_RGUI_UPSCALE_X9),
3902 len);
3903 break;
3904 }
3905 }
3906
3907 #if !defined(DINGUX)
setting_get_string_representation_uint_rgui_aspect_ratio(rarch_setting_t * setting,char * s,size_t len)3908 static void setting_get_string_representation_uint_rgui_aspect_ratio(
3909 rarch_setting_t *setting,
3910 char *s, size_t len)
3911 {
3912 if (!setting)
3913 return;
3914
3915 switch (*setting->value.target.unsigned_integer)
3916 {
3917 case RGUI_ASPECT_RATIO_4_3:
3918 strlcpy(s,
3919 msg_hash_to_str(
3920 MENU_ENUM_LABEL_VALUE_RGUI_ASPECT_RATIO_4_3),
3921 len);
3922 break;
3923 case RGUI_ASPECT_RATIO_16_9:
3924 strlcpy(s,
3925 msg_hash_to_str(
3926 MENU_ENUM_LABEL_VALUE_RGUI_ASPECT_RATIO_16_9),
3927 len);
3928 break;
3929 case RGUI_ASPECT_RATIO_16_9_CENTRE:
3930 strlcpy(s,
3931 msg_hash_to_str(
3932 MENU_ENUM_LABEL_VALUE_RGUI_ASPECT_RATIO_16_9_CENTRE),
3933 len);
3934 break;
3935 case RGUI_ASPECT_RATIO_16_10:
3936 strlcpy(s,
3937 msg_hash_to_str(
3938 MENU_ENUM_LABEL_VALUE_RGUI_ASPECT_RATIO_16_10),
3939 len);
3940 break;
3941 case RGUI_ASPECT_RATIO_16_10_CENTRE:
3942 strlcpy(s,
3943 msg_hash_to_str(
3944 MENU_ENUM_LABEL_VALUE_RGUI_ASPECT_RATIO_16_10_CENTRE),
3945 len);
3946 break;
3947 case RGUI_ASPECT_RATIO_3_2:
3948 strlcpy(s,
3949 msg_hash_to_str(
3950 MENU_ENUM_LABEL_VALUE_RGUI_ASPECT_RATIO_3_2),
3951 len);
3952 break;
3953 case RGUI_ASPECT_RATIO_3_2_CENTRE:
3954 strlcpy(s,
3955 msg_hash_to_str(
3956 MENU_ENUM_LABEL_VALUE_RGUI_ASPECT_RATIO_3_2_CENTRE),
3957 len);
3958 break;
3959 case RGUI_ASPECT_RATIO_5_3:
3960 strlcpy(s,
3961 msg_hash_to_str(
3962 MENU_ENUM_LABEL_VALUE_RGUI_ASPECT_RATIO_5_3),
3963 len);
3964 break;
3965 case RGUI_ASPECT_RATIO_5_3_CENTRE:
3966 strlcpy(s,
3967 msg_hash_to_str(
3968 MENU_ENUM_LABEL_VALUE_RGUI_ASPECT_RATIO_5_3_CENTRE),
3969 len);
3970 break;
3971
3972 }
3973 }
3974
setting_get_string_representation_uint_rgui_aspect_ratio_lock(rarch_setting_t * setting,char * s,size_t len)3975 static void setting_get_string_representation_uint_rgui_aspect_ratio_lock(
3976 rarch_setting_t *setting,
3977 char *s, size_t len)
3978 {
3979 if (!setting)
3980 return;
3981
3982 switch (*setting->value.target.unsigned_integer)
3983 {
3984 case RGUI_ASPECT_RATIO_LOCK_NONE:
3985 strlcpy(s,
3986 msg_hash_to_str(
3987 MENU_ENUM_LABEL_VALUE_RGUI_ASPECT_RATIO_LOCK_NONE),
3988 len);
3989 break;
3990 case RGUI_ASPECT_RATIO_LOCK_FIT_SCREEN:
3991 strlcpy(s,
3992 msg_hash_to_str(
3993 MENU_ENUM_LABEL_VALUE_RGUI_ASPECT_RATIO_LOCK_FIT_SCREEN),
3994 len);
3995 break;
3996 case RGUI_ASPECT_RATIO_LOCK_INTEGER:
3997 strlcpy(s,
3998 msg_hash_to_str(
3999 MENU_ENUM_LABEL_VALUE_RGUI_ASPECT_RATIO_LOCK_INTEGER),
4000 len);
4001 break;
4002 case RGUI_ASPECT_RATIO_LOCK_FILL_SCREEN:
4003 strlcpy(s,
4004 msg_hash_to_str(
4005 MENU_ENUM_LABEL_VALUE_RGUI_ASPECT_RATIO_LOCK_FILL_SCREEN),
4006 len);
4007 break;
4008 }
4009 }
4010 #endif
4011
setting_get_string_representation_uint_rgui_particle_effect(rarch_setting_t * setting,char * s,size_t len)4012 static void setting_get_string_representation_uint_rgui_particle_effect(
4013 rarch_setting_t *setting,
4014 char *s, size_t len)
4015 {
4016 if (!setting)
4017 return;
4018
4019 switch (*setting->value.target.unsigned_integer)
4020 {
4021 case RGUI_PARTICLE_EFFECT_NONE:
4022 strlcpy(s,
4023 msg_hash_to_str(
4024 MENU_ENUM_LABEL_VALUE_RGUI_PARTICLE_EFFECT_NONE),
4025 len);
4026 break;
4027 case RGUI_PARTICLE_EFFECT_SNOW:
4028 strlcpy(s,
4029 msg_hash_to_str(
4030 MENU_ENUM_LABEL_VALUE_RGUI_PARTICLE_EFFECT_SNOW),
4031 len);
4032 break;
4033 case RGUI_PARTICLE_EFFECT_SNOW_ALT:
4034 strlcpy(s,
4035 msg_hash_to_str(
4036 MENU_ENUM_LABEL_VALUE_RGUI_PARTICLE_EFFECT_SNOW_ALT),
4037 len);
4038 break;
4039 case RGUI_PARTICLE_EFFECT_RAIN:
4040 strlcpy(s,
4041 msg_hash_to_str(
4042 MENU_ENUM_LABEL_VALUE_RGUI_PARTICLE_EFFECT_RAIN),
4043 len);
4044 break;
4045 case RGUI_PARTICLE_EFFECT_VORTEX:
4046 strlcpy(s,
4047 msg_hash_to_str(
4048 MENU_ENUM_LABEL_VALUE_RGUI_PARTICLE_EFFECT_VORTEX),
4049 len);
4050 break;
4051 case RGUI_PARTICLE_EFFECT_STARFIELD:
4052 strlcpy(s,
4053 msg_hash_to_str(
4054 MENU_ENUM_LABEL_VALUE_RGUI_PARTICLE_EFFECT_STARFIELD),
4055 len);
4056 break;
4057 }
4058 }
4059
4060 #ifdef HAVE_XMB
setting_get_string_representation_uint_menu_xmb_animation_move_up_down(rarch_setting_t * setting,char * s,size_t len)4061 static void setting_get_string_representation_uint_menu_xmb_animation_move_up_down(
4062 rarch_setting_t *setting,
4063 char *s, size_t len)
4064 {
4065 if (!setting)
4066 return;
4067
4068 switch (*setting->value.target.unsigned_integer)
4069 {
4070 case 0:
4071 strlcpy(s, "Easing Out Quad", len);
4072 break;
4073 case 1:
4074 strlcpy(s, "Easing Out Expo", len);
4075 break;
4076 }
4077 }
4078
setting_get_string_representation_uint_menu_xmb_animation_opening_main_menu(rarch_setting_t * setting,char * s,size_t len)4079 static void setting_get_string_representation_uint_menu_xmb_animation_opening_main_menu(
4080 rarch_setting_t *setting,
4081 char *s, size_t len)
4082 {
4083 if (!setting)
4084 return;
4085
4086 switch (*setting->value.target.unsigned_integer)
4087 {
4088 case 0:
4089 strlcpy(s, "Easing Out Quad", len);
4090 break;
4091 case 1:
4092 strlcpy(s, "Easing Out Circ", len);
4093 break;
4094 case 2:
4095 strlcpy(s, "Easing Out Expo", len);
4096 break;
4097 case 3:
4098 strlcpy(s, "Easing Out Bounce", len);
4099 break;
4100 }
4101 }
4102
setting_get_string_representation_uint_menu_xmb_animation_horizontal_highlight(rarch_setting_t * setting,char * s,size_t len)4103 static void setting_get_string_representation_uint_menu_xmb_animation_horizontal_highlight(
4104 rarch_setting_t *setting,
4105 char *s, size_t len)
4106 {
4107 if (!setting)
4108 return;
4109
4110 switch (*setting->value.target.unsigned_integer)
4111 {
4112 case 0:
4113 strcpy_literal(s, "Easing Out Quad");
4114 break;
4115 case 1:
4116 strcpy_literal(s, "Easing In Sine");
4117 break;
4118 case 2:
4119 strcpy_literal(s, "Easing Out Bounce");
4120 break;
4121 }
4122 }
4123 #endif
4124
setting_get_string_representation_uint_menu_ticker_type(rarch_setting_t * setting,char * s,size_t len)4125 static void setting_get_string_representation_uint_menu_ticker_type(
4126 rarch_setting_t *setting,
4127 char *s, size_t len)
4128 {
4129 if (!setting)
4130 return;
4131
4132 switch (*setting->value.target.unsigned_integer)
4133 {
4134 case TICKER_TYPE_BOUNCE:
4135 strlcpy(s,
4136 msg_hash_to_str(
4137 MENU_ENUM_LABEL_VALUE_MENU_TICKER_TYPE_BOUNCE),
4138 len);
4139 break;
4140 case TICKER_TYPE_LOOP:
4141 strlcpy(s,
4142 msg_hash_to_str(
4143 MENU_ENUM_LABEL_VALUE_MENU_TICKER_TYPE_LOOP),
4144 len);
4145 break;
4146 }
4147 }
4148
4149 #ifdef HAVE_XMB
setting_get_string_representation_uint_xmb_icon_theme(rarch_setting_t * setting,char * s,size_t len)4150 static void setting_get_string_representation_uint_xmb_icon_theme(
4151 rarch_setting_t *setting,
4152 char *s, size_t len)
4153 {
4154 if (!setting)
4155 return;
4156
4157 switch (*setting->value.target.unsigned_integer)
4158 {
4159 case XMB_ICON_THEME_MONOCHROME:
4160 strlcpy(s,
4161 msg_hash_to_str(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_MONOCHROME), len);
4162 break;
4163 case XMB_ICON_THEME_FLATUI:
4164 strlcpy(s,
4165 msg_hash_to_str(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_FLATUI), len);
4166 break;
4167 case XMB_ICON_THEME_RETROACTIVE:
4168 strlcpy(s,
4169 msg_hash_to_str(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROACTIVE), len);
4170 break;
4171 case XMB_ICON_THEME_RETROSYSTEM:
4172 strlcpy(s,
4173 msg_hash_to_str(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROSYSTEM), len);
4174 break;
4175 case XMB_ICON_THEME_PIXEL:
4176 strlcpy(s,
4177 msg_hash_to_str(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_PIXEL), len);
4178 break;
4179 case XMB_ICON_THEME_NEOACTIVE:
4180 strlcpy(s,
4181 msg_hash_to_str(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_NEOACTIVE), len);
4182 break;
4183 case XMB_ICON_THEME_SYSTEMATIC:
4184 strlcpy(s,
4185 msg_hash_to_str(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_SYSTEMATIC), len);
4186 break;
4187 case XMB_ICON_THEME_DOTART:
4188 strlcpy(s,
4189 msg_hash_to_str(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_DOTART), len);
4190 break;
4191 case XMB_ICON_THEME_MONOCHROME_INVERTED:
4192 strlcpy(s,
4193 msg_hash_to_str(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_MONOCHROME_INVERTED), len);
4194 break;
4195 case XMB_ICON_THEME_CUSTOM:
4196 strlcpy(s,
4197 msg_hash_to_str(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_CUSTOM), len);
4198 break;
4199 case XMB_ICON_THEME_AUTOMATIC:
4200 strlcpy(s,
4201 msg_hash_to_str(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_AUTOMATIC), len);
4202 break;
4203 case XMB_ICON_THEME_AUTOMATIC_INVERTED:
4204 strlcpy(s,
4205 msg_hash_to_str(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_AUTOMATIC_INVERTED), len);
4206 break;
4207 }
4208 }
4209 #endif
4210
4211 #ifdef HAVE_XMB
setting_get_string_representation_uint_xmb_layout(rarch_setting_t * setting,char * s,size_t len)4212 static void setting_get_string_representation_uint_xmb_layout(
4213 rarch_setting_t *setting,
4214 char *s, size_t len)
4215 {
4216 if (!setting)
4217 return;
4218
4219 switch (*setting->value.target.unsigned_integer)
4220 {
4221 case 0:
4222 strcpy_literal(s, "Auto");
4223 break;
4224 case 1:
4225 strcpy_literal(s, "Console");
4226 break;
4227 case 2:
4228 strcpy_literal(s, "Handheld");
4229 break;
4230 }
4231 }
4232 #endif
4233
4234 #ifdef HAVE_MATERIALUI
setting_get_string_representation_uint_materialui_menu_color_theme(rarch_setting_t * setting,char * s,size_t len)4235 static void setting_get_string_representation_uint_materialui_menu_color_theme(
4236 rarch_setting_t *setting,
4237 char *s, size_t len)
4238 {
4239 if (!setting)
4240 return;
4241
4242 switch (*setting->value.target.unsigned_integer)
4243 {
4244 case MATERIALUI_THEME_BLUE:
4245 strlcpy(s,
4246 msg_hash_to_str(
4247 MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_COLOR_THEME_BLUE), len);
4248 break;
4249 case MATERIALUI_THEME_BLUE_GREY:
4250 strlcpy(s,
4251 msg_hash_to_str(
4252 MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_COLOR_THEME_BLUE_GREY), len);
4253 break;
4254 case MATERIALUI_THEME_GREEN:
4255 strlcpy(s,
4256 msg_hash_to_str(
4257 MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_COLOR_THEME_GREEN), len);
4258 break;
4259 case MATERIALUI_THEME_RED:
4260 strlcpy(s,
4261 msg_hash_to_str(
4262 MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_COLOR_THEME_RED), len);
4263 break;
4264 case MATERIALUI_THEME_YELLOW:
4265 strlcpy(s,
4266 msg_hash_to_str(
4267 MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_COLOR_THEME_YELLOW), len);
4268 break;
4269 case MATERIALUI_THEME_DARK_BLUE:
4270 strlcpy(s,
4271 msg_hash_to_str(
4272 MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_COLOR_THEME_DARK_BLUE), len);
4273 break;
4274 case MATERIALUI_THEME_NVIDIA_SHIELD:
4275 strlcpy(s,
4276 msg_hash_to_str(
4277 MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_COLOR_THEME_NVIDIA_SHIELD), len);
4278 break;
4279 case MATERIALUI_THEME_MATERIALUI:
4280 strlcpy(s,
4281 msg_hash_to_str(
4282 MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_COLOR_THEME_MATERIALUI), len);
4283 break;
4284 case MATERIALUI_THEME_MATERIALUI_DARK:
4285 strlcpy(s,
4286 msg_hash_to_str(
4287 MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_COLOR_THEME_MATERIALUI_DARK), len);
4288 break;
4289 case MATERIALUI_THEME_OZONE_DARK:
4290 strlcpy(s,
4291 msg_hash_to_str(
4292 MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_COLOR_THEME_OZONE_DARK), len);
4293 break;
4294 case MATERIALUI_THEME_NORD:
4295 strlcpy(s,
4296 msg_hash_to_str(
4297 MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_COLOR_THEME_NORD), len);
4298 break;
4299 case MATERIALUI_THEME_GRUVBOX_DARK:
4300 strlcpy(s,
4301 msg_hash_to_str(
4302 MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_COLOR_THEME_GRUVBOX_DARK), len);
4303 break;
4304 case MATERIALUI_THEME_SOLARIZED_DARK:
4305 strlcpy(s,
4306 msg_hash_to_str(
4307 MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_COLOR_THEME_SOLARIZED_DARK), len);
4308 break;
4309 case MATERIALUI_THEME_CUTIE_BLUE:
4310 strlcpy(s,
4311 msg_hash_to_str(
4312 MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_COLOR_THEME_CUTIE_BLUE), len);
4313 break;
4314 case MATERIALUI_THEME_CUTIE_CYAN:
4315 strlcpy(s,
4316 msg_hash_to_str(
4317 MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_COLOR_THEME_CUTIE_CYAN), len);
4318 break;
4319 case MATERIALUI_THEME_CUTIE_GREEN:
4320 strlcpy(s,
4321 msg_hash_to_str(
4322 MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_COLOR_THEME_CUTIE_GREEN), len);
4323 break;
4324 case MATERIALUI_THEME_CUTIE_ORANGE:
4325 strlcpy(s,
4326 msg_hash_to_str(
4327 MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_COLOR_THEME_CUTIE_ORANGE), len);
4328 break;
4329 case MATERIALUI_THEME_CUTIE_PINK:
4330 strlcpy(s,
4331 msg_hash_to_str(
4332 MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_COLOR_THEME_CUTIE_PINK), len);
4333 break;
4334 case MATERIALUI_THEME_CUTIE_PURPLE:
4335 strlcpy(s,
4336 msg_hash_to_str(
4337 MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_COLOR_THEME_CUTIE_PURPLE), len);
4338 break;
4339 case MATERIALUI_THEME_CUTIE_RED:
4340 strlcpy(s,
4341 msg_hash_to_str(
4342 MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_COLOR_THEME_CUTIE_RED), len);
4343 break;
4344 case MATERIALUI_THEME_VIRTUAL_BOY:
4345 strlcpy(s,
4346 msg_hash_to_str(
4347 MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_COLOR_THEME_VIRTUAL_BOY), len);
4348 break;
4349 case MATERIALUI_THEME_HACKING_THE_KERNEL:
4350 strlcpy(s,
4351 msg_hash_to_str(
4352 MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_COLOR_THEME_HACKING_THE_KERNEL), len);
4353 break;
4354 default:
4355 break;
4356 }
4357 }
4358
setting_get_string_representation_uint_materialui_menu_transition_animation(rarch_setting_t * setting,char * s,size_t len)4359 static void setting_get_string_representation_uint_materialui_menu_transition_animation(
4360 rarch_setting_t *setting,
4361 char *s, size_t len)
4362 {
4363 if (!setting)
4364 return;
4365
4366 switch (*setting->value.target.unsigned_integer)
4367 {
4368 case MATERIALUI_TRANSITION_ANIM_AUTO:
4369 strlcpy(s,
4370 msg_hash_to_str(
4371 MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_TRANSITION_ANIM_AUTO), len);
4372 break;
4373 case MATERIALUI_TRANSITION_ANIM_FADE:
4374 strlcpy(s,
4375 msg_hash_to_str(
4376 MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_TRANSITION_ANIM_FADE), len);
4377 break;
4378 case MATERIALUI_TRANSITION_ANIM_SLIDE:
4379 strlcpy(s,
4380 msg_hash_to_str(
4381 MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_TRANSITION_ANIM_SLIDE), len);
4382 break;
4383 case MATERIALUI_TRANSITION_ANIM_NONE:
4384 strlcpy(s,
4385 msg_hash_to_str(
4386 MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_TRANSITION_ANIM_NONE), len);
4387 break;
4388 default:
4389 break;
4390 }
4391 }
4392
setting_get_string_representation_uint_materialui_menu_thumbnail_view_portrait(rarch_setting_t * setting,char * s,size_t len)4393 static void setting_get_string_representation_uint_materialui_menu_thumbnail_view_portrait(
4394 rarch_setting_t *setting,
4395 char *s, size_t len)
4396 {
4397 if (!setting)
4398 return;
4399
4400 switch (*setting->value.target.unsigned_integer)
4401 {
4402 case MATERIALUI_THUMBNAIL_VIEW_PORTRAIT_DISABLED:
4403 strlcpy(s,
4404 msg_hash_to_str(
4405 MENU_ENUM_LABEL_VALUE_MATERIALUI_THUMBNAIL_VIEW_PORTRAIT_DISABLED), len);
4406 break;
4407 case MATERIALUI_THUMBNAIL_VIEW_PORTRAIT_LIST_SMALL:
4408 strlcpy(s,
4409 msg_hash_to_str(
4410 MENU_ENUM_LABEL_VALUE_MATERIALUI_THUMBNAIL_VIEW_PORTRAIT_LIST_SMALL), len);
4411 break;
4412 case MATERIALUI_THUMBNAIL_VIEW_PORTRAIT_LIST_MEDIUM:
4413 strlcpy(s,
4414 msg_hash_to_str(
4415 MENU_ENUM_LABEL_VALUE_MATERIALUI_THUMBNAIL_VIEW_PORTRAIT_LIST_MEDIUM), len);
4416 break;
4417 case MATERIALUI_THUMBNAIL_VIEW_PORTRAIT_DUAL_ICON:
4418 strlcpy(s,
4419 msg_hash_to_str(
4420 MENU_ENUM_LABEL_VALUE_MATERIALUI_THUMBNAIL_VIEW_PORTRAIT_DUAL_ICON), len);
4421 break;
4422 default:
4423 break;
4424 }
4425 }
4426
setting_get_string_representation_uint_materialui_menu_thumbnail_view_landscape(rarch_setting_t * setting,char * s,size_t len)4427 static void setting_get_string_representation_uint_materialui_menu_thumbnail_view_landscape(
4428 rarch_setting_t *setting,
4429 char *s, size_t len)
4430 {
4431 if (!setting)
4432 return;
4433
4434 switch (*setting->value.target.unsigned_integer)
4435 {
4436 case MATERIALUI_THUMBNAIL_VIEW_LANDSCAPE_DISABLED:
4437 strlcpy(s,
4438 msg_hash_to_str(
4439 MENU_ENUM_LABEL_VALUE_MATERIALUI_THUMBNAIL_VIEW_LANDSCAPE_DISABLED), len);
4440 break;
4441 case MATERIALUI_THUMBNAIL_VIEW_LANDSCAPE_LIST_SMALL:
4442 strlcpy(s,
4443 msg_hash_to_str(
4444 MENU_ENUM_LABEL_VALUE_MATERIALUI_THUMBNAIL_VIEW_LANDSCAPE_LIST_SMALL), len);
4445 break;
4446 case MATERIALUI_THUMBNAIL_VIEW_LANDSCAPE_LIST_MEDIUM:
4447 strlcpy(s,
4448 msg_hash_to_str(
4449 MENU_ENUM_LABEL_VALUE_MATERIALUI_THUMBNAIL_VIEW_LANDSCAPE_LIST_MEDIUM), len);
4450 break;
4451 case MATERIALUI_THUMBNAIL_VIEW_LANDSCAPE_LIST_LARGE:
4452 strlcpy(s,
4453 msg_hash_to_str(
4454 MENU_ENUM_LABEL_VALUE_MATERIALUI_THUMBNAIL_VIEW_LANDSCAPE_LIST_LARGE), len);
4455 break;
4456 case MATERIALUI_THUMBNAIL_VIEW_LANDSCAPE_DESKTOP:
4457 strlcpy(s,
4458 msg_hash_to_str(
4459 MENU_ENUM_LABEL_VALUE_MATERIALUI_THUMBNAIL_VIEW_LANDSCAPE_DESKTOP), len);
4460 break;
4461 default:
4462 break;
4463 }
4464 }
4465
setting_get_string_representation_uint_materialui_landscape_layout_optimization(rarch_setting_t * setting,char * s,size_t len)4466 static void setting_get_string_representation_uint_materialui_landscape_layout_optimization(
4467 rarch_setting_t *setting,
4468 char *s, size_t len)
4469 {
4470 if (!setting)
4471 return;
4472
4473 switch (*setting->value.target.unsigned_integer)
4474 {
4475 case MATERIALUI_LANDSCAPE_LAYOUT_OPTIMIZATION_DISABLED:
4476 strlcpy(s,
4477 msg_hash_to_str(
4478 MENU_ENUM_LABEL_VALUE_MATERIALUI_LANDSCAPE_LAYOUT_OPTIMIZATION_DISABLED), len);
4479 break;
4480 case MATERIALUI_LANDSCAPE_LAYOUT_OPTIMIZATION_ALWAYS:
4481 strlcpy(s,
4482 msg_hash_to_str(
4483 MENU_ENUM_LABEL_VALUE_MATERIALUI_LANDSCAPE_LAYOUT_OPTIMIZATION_ALWAYS), len);
4484 break;
4485 case MATERIALUI_LANDSCAPE_LAYOUT_OPTIMIZATION_EXCLUDE_THUMBNAIL_VIEWS:
4486 strlcpy(s,
4487 msg_hash_to_str(
4488 MENU_ENUM_LABEL_VALUE_MATERIALUI_LANDSCAPE_LAYOUT_OPTIMIZATION_EXCLUDE_THUMBNAIL_VIEWS), len);
4489 break;
4490 default:
4491 break;
4492 }
4493 }
4494 #endif
4495
4496 #ifdef HAVE_XMB
setting_get_string_representation_uint_xmb_menu_color_theme(rarch_setting_t * setting,char * s,size_t len)4497 static void setting_get_string_representation_uint_xmb_menu_color_theme(
4498 rarch_setting_t *setting,
4499 char *s, size_t len)
4500 {
4501 if (!setting)
4502 return;
4503
4504 switch (*setting->value.target.unsigned_integer)
4505 {
4506 case XMB_THEME_WALLPAPER:
4507 strlcpy(s,
4508 msg_hash_to_str(
4509 MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_PLAIN),
4510 len);
4511 break;
4512 case XMB_THEME_LEGACY_RED:
4513 strlcpy(s,
4514 msg_hash_to_str(
4515 MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_LEGACY_RED),
4516 len);
4517 break;
4518 case XMB_THEME_DARK_PURPLE:
4519 strlcpy(s,
4520 msg_hash_to_str(
4521 MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_DARK_PURPLE),
4522 len);
4523 break;
4524 case XMB_THEME_MIDNIGHT_BLUE:
4525 strlcpy(s,
4526 msg_hash_to_str(
4527 MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_MIDNIGHT_BLUE),
4528 len);
4529 break;
4530 case XMB_THEME_GOLDEN:
4531 strlcpy(s,
4532 msg_hash_to_str(
4533 MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_GOLDEN),
4534 len);
4535 break;
4536 case XMB_THEME_ELECTRIC_BLUE:
4537 strlcpy(s,
4538 msg_hash_to_str(
4539 MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_ELECTRIC_BLUE),
4540 len);
4541 break;
4542 case XMB_THEME_APPLE_GREEN:
4543 strlcpy(s,
4544 msg_hash_to_str(
4545 MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_APPLE_GREEN),
4546 len);
4547 break;
4548 case XMB_THEME_UNDERSEA:
4549 strlcpy(s,
4550 msg_hash_to_str(
4551 MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_UNDERSEA),
4552 len);
4553 break;
4554 case XMB_THEME_VOLCANIC_RED:
4555 strlcpy(s,
4556 msg_hash_to_str(
4557 MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_VOLCANIC_RED),
4558 len);
4559 break;
4560 case XMB_THEME_DARK:
4561 strlcpy(s,
4562 msg_hash_to_str(
4563 MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_DARK),
4564 len);
4565 break;
4566 case XMB_THEME_LIGHT:
4567 strlcpy(s,
4568 msg_hash_to_str(
4569 MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_LIGHT),
4570 len);
4571 break;
4572 case XMB_THEME_MORNING_BLUE:
4573 strlcpy(s,
4574 msg_hash_to_str(
4575 MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_MORNING_BLUE),
4576 len);
4577 break;
4578 case XMB_THEME_SUNBEAM:
4579 strlcpy(s,
4580 msg_hash_to_str(
4581 MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_SUNBEAM),
4582 len);
4583 break;
4584 case XMB_THEME_LIME:
4585 strlcpy(s,
4586 msg_hash_to_str(
4587 MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_LIME),
4588 len);
4589 break;
4590 case XMB_THEME_MIDGAR:
4591 strlcpy(s,
4592 msg_hash_to_str(
4593 MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_MIDGAR),
4594 len);
4595 break;
4596 case XMB_THEME_PIKACHU_YELLOW:
4597 strlcpy(s,
4598 msg_hash_to_str(
4599 MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_PIKACHU_YELLOW),
4600 len);
4601 break;
4602 case XMB_THEME_GAMECUBE_PURPLE:
4603 strlcpy(s,
4604 msg_hash_to_str(
4605 MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_GAMECUBE_PURPLE),
4606 len);
4607 break;
4608 case XMB_THEME_FAMICOM_RED:
4609 strlcpy(s,
4610 msg_hash_to_str(
4611 MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_FAMICOM_RED),
4612 len);
4613 break;
4614 case XMB_THEME_FLAMING_HOT:
4615 strlcpy(s,
4616 msg_hash_to_str(
4617 MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_FLAMING_HOT),
4618 len);
4619 break;
4620 case XMB_THEME_ICE_COLD:
4621 strlcpy(s,
4622 msg_hash_to_str(
4623 MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_ICE_COLD),
4624 len);
4625 break;
4626 }
4627 }
4628 #endif
4629
4630 #ifdef HAVE_OZONE
setting_get_string_representation_uint_ozone_menu_color_theme(rarch_setting_t * setting,char * s,size_t len)4631 static void setting_get_string_representation_uint_ozone_menu_color_theme(
4632 rarch_setting_t *setting,
4633 char *s, size_t len)
4634 {
4635 if (!setting)
4636 return;
4637
4638 switch (*setting->value.target.unsigned_integer)
4639 {
4640 case OZONE_COLOR_THEME_BASIC_BLACK:
4641 strlcpy(s,
4642 msg_hash_to_str(
4643 MENU_ENUM_LABEL_VALUE_OZONE_COLOR_THEME_BASIC_BLACK), len);
4644 break;
4645 case OZONE_COLOR_THEME_NORD:
4646 strlcpy(s,
4647 msg_hash_to_str(
4648 MENU_ENUM_LABEL_VALUE_OZONE_COLOR_THEME_NORD), len);
4649 break;
4650 case OZONE_COLOR_THEME_GRUVBOX_DARK:
4651 strlcpy(s,
4652 msg_hash_to_str(
4653 MENU_ENUM_LABEL_VALUE_OZONE_COLOR_THEME_GRUVBOX_DARK), len);
4654 break;
4655 case OZONE_COLOR_THEME_BOYSENBERRY:
4656 strlcpy(s,
4657 msg_hash_to_str(
4658 MENU_ENUM_LABEL_VALUE_OZONE_COLOR_THEME_BOYSENBERRY), len);
4659 break;
4660 case OZONE_COLOR_THEME_HACKING_THE_KERNEL:
4661 strlcpy(s,
4662 msg_hash_to_str(
4663 MENU_ENUM_LABEL_VALUE_OZONE_COLOR_THEME_HACKING_THE_KERNEL), len);
4664 break;
4665 case OZONE_COLOR_THEME_TWILIGHT_ZONE:
4666 strlcpy(s,
4667 msg_hash_to_str(
4668 MENU_ENUM_LABEL_VALUE_OZONE_COLOR_THEME_TWILIGHT_ZONE), len);
4669 break;
4670 case OZONE_COLOR_THEME_DRACULA:
4671 strlcpy(s,
4672 msg_hash_to_str(
4673 MENU_ENUM_LABEL_VALUE_OZONE_COLOR_THEME_DRACULA), len);
4674 break;
4675 case OZONE_COLOR_THEME_BASIC_WHITE:
4676 default:
4677 strlcpy(s,
4678 msg_hash_to_str(
4679 MENU_ENUM_LABEL_VALUE_OZONE_COLOR_THEME_BASIC_WHITE), len);
4680 break;
4681 }
4682 }
4683 #endif
4684
4685 #if defined(HAVE_CG) || defined(HAVE_GLSL) || defined(HAVE_SLANG) || defined(HAVE_HLSL)
4686 #if defined(HAVE_XMB) && defined(HAVE_SHADERPIPELINE)
setting_get_string_representation_uint_xmb_shader_pipeline(rarch_setting_t * setting,char * s,size_t len)4687 static void setting_get_string_representation_uint_xmb_shader_pipeline(
4688 rarch_setting_t *setting,
4689 char *s, size_t len)
4690 {
4691 if (!setting)
4692 return;
4693
4694 switch (*setting->value.target.unsigned_integer)
4695 {
4696 case XMB_SHADER_PIPELINE_WALLPAPER:
4697 strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF), len);
4698 break;
4699 case XMB_SHADER_PIPELINE_SIMPLE_RIBBON:
4700 strlcpy(s,
4701 msg_hash_to_str(
4702 MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_RIBBON_SIMPLIFIED), len);
4703 break;
4704 case XMB_SHADER_PIPELINE_RIBBON:
4705 strlcpy(s,
4706 msg_hash_to_str(
4707 MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_RIBBON), len);
4708 break;
4709 case XMB_SHADER_PIPELINE_SIMPLE_SNOW:
4710 strlcpy(s,
4711 msg_hash_to_str(
4712 MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_SIMPLE_SNOW), len);
4713 break;
4714 case XMB_SHADER_PIPELINE_SNOW:
4715 strlcpy(s,
4716 msg_hash_to_str(
4717 MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_SNOW), len);
4718 break;
4719 case XMB_SHADER_PIPELINE_BOKEH:
4720 strlcpy(s,
4721 msg_hash_to_str(
4722 MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_BOKEH), len);
4723 break;
4724 case XMB_SHADER_PIPELINE_SNOWFLAKE:
4725 strlcpy(s,
4726 msg_hash_to_str(
4727 MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_SNOWFLAKE), len);
4728 break;
4729 }
4730 }
4731 #endif
4732 #endif
4733
4734 #ifdef HAVE_SCREENSHOTS
4735 #ifdef HAVE_GFX_WIDGETS
setting_get_string_representation_uint_notification_show_screenshot_duration(rarch_setting_t * setting,char * s,size_t len)4736 static void setting_get_string_representation_uint_notification_show_screenshot_duration(
4737 rarch_setting_t *setting,
4738 char *s, size_t len)
4739 {
4740 if (!setting)
4741 return;
4742
4743 switch (*setting->value.target.unsigned_integer)
4744 {
4745 case NOTIFICATION_SHOW_SCREENSHOT_DURATION_NORMAL:
4746 strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NOTIFICATION_SHOW_SCREENSHOT_DURATION_NORMAL), len);
4747 break;
4748 case NOTIFICATION_SHOW_SCREENSHOT_DURATION_FAST:
4749 strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NOTIFICATION_SHOW_SCREENSHOT_DURATION_FAST), len);
4750 break;
4751 case NOTIFICATION_SHOW_SCREENSHOT_DURATION_VERY_FAST:
4752 strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NOTIFICATION_SHOW_SCREENSHOT_DURATION_VERY_FAST), len);
4753 break;
4754 case NOTIFICATION_SHOW_SCREENSHOT_DURATION_INSTANT:
4755 strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NOTIFICATION_SHOW_SCREENSHOT_DURATION_INSTANT), len);
4756 break;
4757 }
4758 }
4759
setting_get_string_representation_uint_notification_show_screenshot_flash(rarch_setting_t * setting,char * s,size_t len)4760 static void setting_get_string_representation_uint_notification_show_screenshot_flash(
4761 rarch_setting_t *setting,
4762 char *s, size_t len)
4763 {
4764 if (!setting)
4765 return;
4766
4767 switch (*setting->value.target.unsigned_integer)
4768 {
4769 case NOTIFICATION_SHOW_SCREENSHOT_FLASH_NORMAL:
4770 strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NOTIFICATION_SHOW_SCREENSHOT_FLASH_NORMAL), len);
4771 break;
4772 case NOTIFICATION_SHOW_SCREENSHOT_FLASH_FAST:
4773 strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NOTIFICATION_SHOW_SCREENSHOT_FLASH_FAST), len);
4774 break;
4775 case NOTIFICATION_SHOW_SCREENSHOT_FLASH_OFF:
4776 strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF), len);
4777 break;
4778 }
4779 }
4780 #endif
4781 #endif
4782
setting_get_string_representation_uint_video_monitor_index(rarch_setting_t * setting,char * s,size_t len)4783 static void setting_get_string_representation_uint_video_monitor_index(rarch_setting_t *setting,
4784 char *s, size_t len)
4785 {
4786 if (!setting)
4787 return;
4788
4789 if (*setting->value.target.unsigned_integer)
4790 snprintf(s, len, "%u",
4791 *setting->value.target.unsigned_integer);
4792 else
4793 strlcpy(s, "0 (Auto)", len);
4794 }
4795
setting_get_string_representation_uint_custom_viewport_width(rarch_setting_t * setting,char * s,size_t len)4796 static void setting_get_string_representation_uint_custom_viewport_width(rarch_setting_t *setting,
4797 char *s, size_t len)
4798 {
4799 struct retro_game_geometry *geom = NULL;
4800 struct retro_system_av_info *av_info = NULL;
4801 unsigned int rotation = retroarch_get_rotation();
4802 if (!setting)
4803 return;
4804
4805 av_info = video_viewport_get_system_av_info();
4806 geom = (struct retro_game_geometry*)&av_info->geometry;
4807
4808 if (!(rotation % 2) && (*setting->value.target.unsigned_integer%geom->base_width == 0))
4809 snprintf(s, len, "%u (%ux)",
4810 *setting->value.target.unsigned_integer,
4811 *setting->value.target.unsigned_integer / geom->base_width);
4812 else if ((rotation % 2) && (*setting->value.target.unsigned_integer%geom->base_height == 0))
4813 snprintf(s, len, "%u (%ux)",
4814 *setting->value.target.unsigned_integer,
4815 *setting->value.target.unsigned_integer / geom->base_height);
4816 else
4817 snprintf(s, len, "%u",
4818 *setting->value.target.unsigned_integer);
4819 }
4820
setting_get_string_representation_uint_custom_viewport_height(rarch_setting_t * setting,char * s,size_t len)4821 static void setting_get_string_representation_uint_custom_viewport_height(rarch_setting_t *setting,
4822 char *s, size_t len)
4823 {
4824 struct retro_game_geometry *geom = NULL;
4825 struct retro_system_av_info *av_info = NULL;
4826 unsigned int rotation = retroarch_get_rotation();
4827 if (!setting)
4828 return;
4829
4830 av_info = video_viewport_get_system_av_info();
4831 geom = (struct retro_game_geometry*)&av_info->geometry;
4832
4833 if (!(rotation % 2) && (*setting->value.target.unsigned_integer % geom->base_height == 0))
4834 snprintf(s, len, "%u (%ux)",
4835 *setting->value.target.unsigned_integer,
4836 *setting->value.target.unsigned_integer / geom->base_height);
4837 else if ((rotation % 2) && (*setting->value.target.unsigned_integer % geom->base_width == 0))
4838 snprintf(s, len, "%u (%ux)",
4839 *setting->value.target.unsigned_integer,
4840 *setting->value.target.unsigned_integer / geom->base_width);
4841 else
4842 snprintf(s, len, "%u",
4843 *setting->value.target.unsigned_integer);
4844 }
4845
4846 #ifdef HAVE_WASAPI
setting_get_string_representation_int_audio_wasapi_sh_buffer_length(rarch_setting_t * setting,char * s,size_t len)4847 static void setting_get_string_representation_int_audio_wasapi_sh_buffer_length(rarch_setting_t *setting,
4848 char *s, size_t len)
4849 {
4850 if (!setting)
4851 return;
4852
4853 if (*setting->value.target.integer > 0)
4854 snprintf(s, len, "%d",
4855 *setting->value.target.integer);
4856 else if (*setting->value.target.integer == 0)
4857 strlcpy(s, "0 (Off)", len);
4858 else
4859 strlcpy(s, "Auto", len);
4860 }
4861 #endif
4862
setting_get_string_representation_crt_switch_resolution_super(rarch_setting_t * setting,char * s,size_t len)4863 static void setting_get_string_representation_crt_switch_resolution_super(
4864 rarch_setting_t *setting,
4865 char *s, size_t len)
4866 {
4867 if (!setting)
4868 return;
4869
4870 if (*setting->value.target.unsigned_integer == 0)
4871 strlcpy(s, "NATIVE", len);
4872 else if (*setting->value.target.unsigned_integer == 1)
4873 strlcpy(s, "DYNAMIC", len);
4874 else
4875 snprintf(s, len, "%d", *setting->value.target.unsigned_integer);
4876 }
4877
setting_get_string_representation_uint_playlist_sublabel_runtime_type(rarch_setting_t * setting,char * s,size_t len)4878 static void setting_get_string_representation_uint_playlist_sublabel_runtime_type(
4879 rarch_setting_t *setting,
4880 char *s, size_t len)
4881 {
4882 if (!setting)
4883 return;
4884
4885 switch (*setting->value.target.unsigned_integer)
4886 {
4887 case PLAYLIST_RUNTIME_PER_CORE:
4888 strlcpy(s,
4889 msg_hash_to_str(
4890 MENU_ENUM_LABEL_VALUE_PLAYLIST_RUNTIME_PER_CORE),
4891 len);
4892 break;
4893 case PLAYLIST_RUNTIME_AGGREGATE:
4894 strlcpy(s,
4895 msg_hash_to_str(
4896 MENU_ENUM_LABEL_VALUE_PLAYLIST_RUNTIME_AGGREGATE),
4897 len);
4898 break;
4899 }
4900 }
4901
setting_get_string_representation_uint_playlist_sublabel_last_played_style(rarch_setting_t * setting,char * s,size_t len)4902 static void setting_get_string_representation_uint_playlist_sublabel_last_played_style(
4903 rarch_setting_t *setting,
4904 char *s, size_t len)
4905 {
4906 if (!setting)
4907 return;
4908
4909 switch (*setting->value.target.unsigned_integer)
4910 {
4911 case PLAYLIST_LAST_PLAYED_STYLE_YMD_HMS:
4912 strlcpy(s,
4913 msg_hash_to_str(
4914 MENU_ENUM_LABEL_VALUE_TIMEDATE_YMD_HMS),
4915 len);
4916 break;
4917 case PLAYLIST_LAST_PLAYED_STYLE_YMD_HM:
4918 strlcpy(s,
4919 msg_hash_to_str(
4920 MENU_ENUM_LABEL_VALUE_TIMEDATE_YMD_HM),
4921 len);
4922 break;
4923 case PLAYLIST_LAST_PLAYED_STYLE_YMD:
4924 strlcpy(s,
4925 msg_hash_to_str(
4926 MENU_ENUM_LABEL_VALUE_TIMEDATE_YMD),
4927 len);
4928 break;
4929 case PLAYLIST_LAST_PLAYED_STYLE_YM:
4930 strlcpy(s,
4931 msg_hash_to_str(
4932 MENU_ENUM_LABEL_VALUE_TIMEDATE_YM),
4933 len);
4934 break;
4935 case PLAYLIST_LAST_PLAYED_STYLE_MDYYYY_HMS:
4936 strlcpy(s,
4937 msg_hash_to_str(
4938 MENU_ENUM_LABEL_VALUE_TIMEDATE_MDYYYY_HMS),
4939 len);
4940 break;
4941 case PLAYLIST_LAST_PLAYED_STYLE_MDYYYY_HM:
4942 strlcpy(s,
4943 msg_hash_to_str(
4944 MENU_ENUM_LABEL_VALUE_TIMEDATE_MDYYYY_HM),
4945 len);
4946 break;
4947 case PLAYLIST_LAST_PLAYED_STYLE_MD_HM:
4948 strlcpy(s,
4949 msg_hash_to_str(
4950 MENU_ENUM_LABEL_VALUE_TIMEDATE_MD_HM),
4951 len);
4952 break;
4953 case PLAYLIST_LAST_PLAYED_STYLE_MDYYYY:
4954 strlcpy(s,
4955 msg_hash_to_str(
4956 MENU_ENUM_LABEL_VALUE_TIMEDATE_MDYYYY),
4957 len);
4958 break;
4959 case PLAYLIST_LAST_PLAYED_STYLE_MD:
4960 strlcpy(s,
4961 msg_hash_to_str(
4962 MENU_ENUM_LABEL_VALUE_TIMEDATE_MD),
4963 len);
4964 break;
4965 case PLAYLIST_LAST_PLAYED_STYLE_DDMMYYYY_HMS:
4966 strlcpy(s,
4967 msg_hash_to_str(
4968 MENU_ENUM_LABEL_VALUE_TIMEDATE_DDMMYYYY_HMS),
4969 len);
4970 break;
4971 case PLAYLIST_LAST_PLAYED_STYLE_DDMMYYYY_HM:
4972 strlcpy(s,
4973 msg_hash_to_str(
4974 MENU_ENUM_LABEL_VALUE_TIMEDATE_DDMMYYYY_HM),
4975 len);
4976 break;
4977 case PLAYLIST_LAST_PLAYED_STYLE_DDMM_HM:
4978 strlcpy(s,
4979 msg_hash_to_str(
4980 MENU_ENUM_LABEL_VALUE_TIMEDATE_DDMM_HM),
4981 len);
4982 break;
4983 case PLAYLIST_LAST_PLAYED_STYLE_DDMMYYYY:
4984 strlcpy(s,
4985 msg_hash_to_str(
4986 MENU_ENUM_LABEL_VALUE_TIMEDATE_DDMMYYYY),
4987 len);
4988 break;
4989 case PLAYLIST_LAST_PLAYED_STYLE_DDMM:
4990 strlcpy(s,
4991 msg_hash_to_str(
4992 MENU_ENUM_LABEL_VALUE_TIMEDATE_DDMM),
4993 len);
4994 break;
4995 case PLAYLIST_LAST_PLAYED_STYLE_YMD_HMS_AMPM:
4996 strlcpy(s,
4997 msg_hash_to_str(
4998 MENU_ENUM_LABEL_VALUE_TIMEDATE_YMD_HMS_AMPM),
4999 len);
5000 break;
5001 case PLAYLIST_LAST_PLAYED_STYLE_YMD_HM_AMPM:
5002 strlcpy(s,
5003 msg_hash_to_str(
5004 MENU_ENUM_LABEL_VALUE_TIMEDATE_YMD_HM_AMPM),
5005 len);
5006 break;
5007 case PLAYLIST_LAST_PLAYED_STYLE_MDYYYY_HMS_AMPM:
5008 strlcpy(s,
5009 msg_hash_to_str(
5010 MENU_ENUM_LABEL_VALUE_TIMEDATE_MDYYYY_HMS_AMPM),
5011 len);
5012 break;
5013 case PLAYLIST_LAST_PLAYED_STYLE_MDYYYY_HM_AMPM:
5014 strlcpy(s,
5015 msg_hash_to_str(
5016 MENU_ENUM_LABEL_VALUE_TIMEDATE_MDYYYY_HM_AMPM),
5017 len);
5018 break;
5019 case PLAYLIST_LAST_PLAYED_STYLE_MD_HM_AMPM:
5020 strlcpy(s,
5021 msg_hash_to_str(
5022 MENU_ENUM_LABEL_VALUE_TIMEDATE_MD_HM_AMPM),
5023 len);
5024 break;
5025 case PLAYLIST_LAST_PLAYED_STYLE_DDMMYYYY_HMS_AMPM:
5026 strlcpy(s,
5027 msg_hash_to_str(
5028 MENU_ENUM_LABEL_VALUE_TIMEDATE_DDMMYYYY_HMS_AMPM),
5029 len);
5030 break;
5031 case PLAYLIST_LAST_PLAYED_STYLE_DDMMYYYY_HM_AMPM:
5032 strlcpy(s,
5033 msg_hash_to_str(
5034 MENU_ENUM_LABEL_VALUE_TIMEDATE_DDMMYYYY_HM_AMPM),
5035 len);
5036 break;
5037 case PLAYLIST_LAST_PLAYED_STYLE_DDMM_HM_AMPM:
5038 strlcpy(s,
5039 msg_hash_to_str(
5040 MENU_ENUM_LABEL_VALUE_TIMEDATE_DDMM_HM_AMPM),
5041 len);
5042 break;
5043 }
5044
5045 /* Change date separator, if required */
5046 setting_set_string_representation_timedate_date_seperator(s);
5047 }
5048
setting_get_string_representation_uint_playlist_inline_core_display_type(rarch_setting_t * setting,char * s,size_t len)5049 static void setting_get_string_representation_uint_playlist_inline_core_display_type(
5050 rarch_setting_t *setting,
5051 char *s, size_t len)
5052 {
5053 if (!setting)
5054 return;
5055
5056 switch (*setting->value.target.unsigned_integer)
5057 {
5058 case PLAYLIST_INLINE_CORE_DISPLAY_HIST_FAV:
5059 strlcpy(s,
5060 msg_hash_to_str(
5061 MENU_ENUM_LABEL_VALUE_PLAYLIST_INLINE_CORE_DISPLAY_HIST_FAV),
5062 len);
5063 break;
5064 case PLAYLIST_INLINE_CORE_DISPLAY_ALWAYS:
5065 strlcpy(s,
5066 msg_hash_to_str(
5067 MENU_ENUM_LABEL_VALUE_PLAYLIST_INLINE_CORE_DISPLAY_ALWAYS),
5068 len);
5069 break;
5070 case PLAYLIST_INLINE_CORE_DISPLAY_NEVER:
5071 strlcpy(s,
5072 msg_hash_to_str(
5073 MENU_ENUM_LABEL_VALUE_PLAYLIST_INLINE_CORE_DISPLAY_NEVER),
5074 len);
5075 break;
5076 }
5077 }
5078
setting_get_string_representation_uint_playlist_entry_remove_enable(rarch_setting_t * setting,char * s,size_t len)5079 static void setting_get_string_representation_uint_playlist_entry_remove_enable(
5080 rarch_setting_t *setting,
5081 char *s, size_t len)
5082 {
5083 if (!setting)
5084 return;
5085
5086 switch (*setting->value.target.unsigned_integer)
5087 {
5088 case PLAYLIST_ENTRY_REMOVE_ENABLE_HIST_FAV:
5089 strlcpy(s,
5090 msg_hash_to_str(
5091 MENU_ENUM_LABEL_VALUE_PLAYLIST_ENTRY_REMOVE_ENABLE_HIST_FAV),
5092 len);
5093 break;
5094 case PLAYLIST_ENTRY_REMOVE_ENABLE_ALL:
5095 strlcpy(s,
5096 msg_hash_to_str(
5097 MENU_ENUM_LABEL_VALUE_PLAYLIST_ENTRY_REMOVE_ENABLE_ALL),
5098 len);
5099 break;
5100 case PLAYLIST_ENTRY_REMOVE_ENABLE_NONE:
5101 strlcpy(s,
5102 msg_hash_to_str(
5103 MENU_ENUM_LABEL_VALUE_PLAYLIST_ENTRY_REMOVE_ENABLE_NONE),
5104 len);
5105 break;
5106 }
5107 }
5108
5109 #if defined(_3DS)
setting_get_string_representation_uint_video_3ds_display_mode(rarch_setting_t * setting,char * s,size_t len)5110 static void setting_get_string_representation_uint_video_3ds_display_mode(
5111 rarch_setting_t *setting,
5112 char *s, size_t len)
5113 {
5114 if (!setting)
5115 return;
5116
5117 switch (*setting->value.target.unsigned_integer)
5118 {
5119 case CTR_VIDEO_MODE_3D:
5120 strlcpy(s,
5121 msg_hash_to_str(
5122 MENU_ENUM_LABEL_VALUE_CTR_VIDEO_MODE_3D),
5123 len);
5124 break;
5125 case CTR_VIDEO_MODE_2D:
5126 strlcpy(s,
5127 msg_hash_to_str(
5128 MENU_ENUM_LABEL_VALUE_CTR_VIDEO_MODE_2D),
5129 len);
5130 break;
5131 case CTR_VIDEO_MODE_2D_400X240:
5132 strlcpy(s,
5133 msg_hash_to_str(
5134 MENU_ENUM_LABEL_VALUE_CTR_VIDEO_MODE_2D_400X240),
5135 len);
5136 break;
5137 case CTR_VIDEO_MODE_2D_800X240:
5138 strlcpy(s,
5139 msg_hash_to_str(
5140 MENU_ENUM_LABEL_VALUE_CTR_VIDEO_MODE_2D_800X240),
5141 len);
5142 break;
5143 }
5144 }
5145 #endif
5146
5147 #if defined(DINGUX)
setting_get_string_representation_uint_video_dingux_ipu_filter_type(rarch_setting_t * setting,char * s,size_t len)5148 static void setting_get_string_representation_uint_video_dingux_ipu_filter_type(
5149 rarch_setting_t *setting,
5150 char *s, size_t len)
5151 {
5152 if (!setting)
5153 return;
5154
5155 switch (*setting->value.target.unsigned_integer)
5156 {
5157 case DINGUX_IPU_FILTER_BICUBIC:
5158 strlcpy(s,
5159 msg_hash_to_str(
5160 MENU_ENUM_LABEL_VALUE_VIDEO_DINGUX_IPU_FILTER_BICUBIC),
5161 len);
5162 break;
5163 case DINGUX_IPU_FILTER_BILINEAR:
5164 strlcpy(s,
5165 msg_hash_to_str(
5166 MENU_ENUM_LABEL_VALUE_VIDEO_DINGUX_IPU_FILTER_BILINEAR),
5167 len);
5168 break;
5169 case DINGUX_IPU_FILTER_NEAREST:
5170 strlcpy(s,
5171 msg_hash_to_str(
5172 MENU_ENUM_LABEL_VALUE_VIDEO_DINGUX_IPU_FILTER_NEAREST),
5173 len);
5174 break;
5175 }
5176 }
5177
5178 #if defined(DINGUX_BETA)
setting_get_string_representation_uint_video_dingux_refresh_rate(rarch_setting_t * setting,char * s,size_t len)5179 static void setting_get_string_representation_uint_video_dingux_refresh_rate(
5180 rarch_setting_t *setting,
5181 char *s, size_t len)
5182 {
5183 if (!setting)
5184 return;
5185
5186 switch (*setting->value.target.unsigned_integer)
5187 {
5188 case DINGUX_REFRESH_RATE_60HZ:
5189 strlcpy(s,
5190 msg_hash_to_str(
5191 MENU_ENUM_LABEL_VALUE_VIDEO_DINGUX_REFRESH_RATE_60HZ),
5192 len);
5193 break;
5194 case DINGUX_REFRESH_RATE_50HZ:
5195 strlcpy(s,
5196 msg_hash_to_str(
5197 MENU_ENUM_LABEL_VALUE_VIDEO_DINGUX_REFRESH_RATE_50HZ),
5198 len);
5199 break;
5200 }
5201 }
5202 #endif
5203
5204 #if defined(RS90)
setting_get_string_representation_uint_video_dingux_rs90_softfilter_type(rarch_setting_t * setting,char * s,size_t len)5205 static void setting_get_string_representation_uint_video_dingux_rs90_softfilter_type(
5206 rarch_setting_t *setting,
5207 char *s, size_t len)
5208 {
5209 if (!setting)
5210 return;
5211
5212 switch (*setting->value.target.unsigned_integer)
5213 {
5214 case DINGUX_RS90_SOFTFILTER_POINT:
5215 strlcpy(s,
5216 msg_hash_to_str(
5217 MENU_ENUM_LABEL_VALUE_VIDEO_DINGUX_RS90_SOFTFILTER_POINT),
5218 len);
5219 break;
5220 case DINGUX_RS90_SOFTFILTER_BRESENHAM_HORZ:
5221 strlcpy(s,
5222 msg_hash_to_str(
5223 MENU_ENUM_LABEL_VALUE_VIDEO_DINGUX_RS90_SOFTFILTER_BRESENHAM_HORZ),
5224 len);
5225 break;
5226 }
5227 }
5228 #endif
5229 #endif
5230
setting_get_string_representation_uint_input_auto_game_focus(rarch_setting_t * setting,char * s,size_t len)5231 static void setting_get_string_representation_uint_input_auto_game_focus(
5232 rarch_setting_t *setting,
5233 char *s, size_t len)
5234 {
5235 if (!setting)
5236 return;
5237
5238 switch (*setting->value.target.unsigned_integer)
5239 {
5240 case AUTO_GAME_FOCUS_OFF:
5241 strlcpy(s,
5242 msg_hash_to_str(
5243 MENU_ENUM_LABEL_VALUE_INPUT_AUTO_GAME_FOCUS_OFF),
5244 len);
5245 break;
5246 case AUTO_GAME_FOCUS_ON:
5247 strlcpy(s,
5248 msg_hash_to_str(
5249 MENU_ENUM_LABEL_VALUE_INPUT_AUTO_GAME_FOCUS_ON),
5250 len);
5251 break;
5252 case AUTO_GAME_FOCUS_DETECT:
5253 strlcpy(s,
5254 msg_hash_to_str(
5255 MENU_ENUM_LABEL_VALUE_INPUT_AUTO_GAME_FOCUS_DETECT),
5256 len);
5257 break;
5258 }
5259 }
5260
5261 #if defined(HAVE_OVERLAY)
setting_get_string_representation_uint_input_overlay_show_inputs(rarch_setting_t * setting,char * s,size_t len)5262 static void setting_get_string_representation_uint_input_overlay_show_inputs(
5263 rarch_setting_t *setting,
5264 char *s, size_t len)
5265 {
5266 if (!setting)
5267 return;
5268
5269 switch (*setting->value.target.unsigned_integer)
5270 {
5271 case OVERLAY_SHOW_INPUT_NONE:
5272 strlcpy(s,
5273 msg_hash_to_str(
5274 MENU_ENUM_LABEL_VALUE_OFF),
5275 len);
5276 break;
5277 case OVERLAY_SHOW_INPUT_TOUCHED:
5278 strlcpy(s,
5279 msg_hash_to_str(
5280 MENU_ENUM_LABEL_VALUE_INPUT_OVERLAY_SHOW_INPUTS_TOUCHED),
5281 len);
5282 break;
5283 case OVERLAY_SHOW_INPUT_PHYSICAL:
5284 strlcpy(s,
5285 msg_hash_to_str(
5286 MENU_ENUM_LABEL_VALUE_INPUT_OVERLAY_SHOW_INPUTS_PHYSICAL),
5287 len);
5288 break;
5289 }
5290 }
5291
setting_get_string_representation_uint_input_overlay_show_inputs_port(rarch_setting_t * setting,char * s,size_t len)5292 static void setting_get_string_representation_uint_input_overlay_show_inputs_port(
5293 rarch_setting_t *setting,
5294 char *s, size_t len)
5295 {
5296 if (setting)
5297 snprintf(s, len, "%u",
5298 *setting->value.target.unsigned_integer + 1);
5299 }
5300 #endif
5301
5302 /* A protected driver is such that the user cannot set to "null" using the UI.
5303 * Can prevent the user from locking him/herself out of the program. */
setting_is_protected_driver(rarch_setting_t * setting)5304 static bool setting_is_protected_driver(rarch_setting_t *setting)
5305 {
5306 if (setting)
5307 {
5308 switch (setting->enum_idx)
5309 {
5310 case MENU_ENUM_LABEL_INPUT_DRIVER:
5311 case MENU_ENUM_LABEL_JOYPAD_DRIVER:
5312 case MENU_ENUM_LABEL_VIDEO_DRIVER:
5313 case MENU_ENUM_LABEL_MENU_DRIVER:
5314 return true;
5315 default:
5316 break;
5317 }
5318 }
5319
5320 return false;
5321 }
5322
setting_action_left_analog_dpad_mode(rarch_setting_t * setting,size_t idx,bool wraparound)5323 static int setting_action_left_analog_dpad_mode(
5324 rarch_setting_t *setting, size_t idx, bool wraparound)
5325 {
5326 unsigned port = 0;
5327 settings_t *settings = config_get_ptr();
5328
5329 if (!setting)
5330 return -1;
5331
5332 port = setting->index_offset;
5333
5334 configuration_set_uint(settings, settings->uints.input_analog_dpad_mode[port],
5335 (settings->uints.input_analog_dpad_mode
5336 [port] + ANALOG_DPAD_LAST - 1) % ANALOG_DPAD_LAST);
5337
5338 return 0;
5339 }
5340
libretro_device_get_size(unsigned * devices,size_t devices_size,unsigned port)5341 unsigned libretro_device_get_size(unsigned *devices, size_t devices_size, unsigned port)
5342 {
5343 unsigned types = 0;
5344 const struct retro_controller_info *desc = NULL;
5345 rarch_system_info_t *system = runloop_get_system_info();
5346
5347 devices[types++] = RETRO_DEVICE_NONE;
5348 devices[types++] = RETRO_DEVICE_JOYPAD;
5349
5350 if (system)
5351 {
5352 /* Only push RETRO_DEVICE_ANALOG as default if we use an
5353 * older core which doesn't use SET_CONTROLLER_INFO. */
5354 if (!system->ports.size)
5355 devices[types++] = RETRO_DEVICE_ANALOG;
5356
5357 if (port < system->ports.size)
5358 desc = &system->ports.data[port];
5359 }
5360
5361 if (desc)
5362 {
5363 unsigned i;
5364 for (i = 0; i < desc->num_types; i++)
5365 {
5366 unsigned id = desc->types[i].id;
5367 if (types < devices_size &&
5368 id != RETRO_DEVICE_NONE &&
5369 id != RETRO_DEVICE_JOYPAD)
5370 devices[types++] = id;
5371 }
5372 }
5373
5374 return types;
5375 }
5376
setting_action_left_libretro_device_type(rarch_setting_t * setting,size_t idx,bool wraparound)5377 static int setting_action_left_libretro_device_type(
5378 rarch_setting_t *setting, size_t idx, bool wraparound)
5379 {
5380 bool refresh = false;
5381 retro_ctx_controller_info_t pad;
5382 unsigned current_device, current_idx, i, devices[128],
5383 types = 0, port = 0;
5384
5385 if (!setting)
5386 return -1;
5387
5388 port = setting->index_offset;
5389 types = libretro_device_get_size(devices, ARRAY_SIZE(devices), port);
5390 current_device = input_config_get_device(port);
5391 current_idx = 0;
5392 for (i = 0; i < types; i++)
5393 {
5394 if (current_device != devices[i])
5395 continue;
5396
5397 current_idx = i;
5398 break;
5399 }
5400
5401 current_device = devices
5402 [(current_idx + types - 1) % types];
5403
5404 input_config_set_device(port, current_device);
5405
5406 pad.port = port;
5407 pad.device = current_device;
5408
5409 core_set_controller_port_device(&pad);
5410
5411 menu_entries_ctl(MENU_ENTRIES_CTL_SET_REFRESH, &refresh);
5412 menu_driver_ctl(RARCH_MENU_CTL_SET_PREVENT_POPULATE, NULL);
5413 return 0;
5414 }
5415
setting_action_left_input_remap_port(rarch_setting_t * setting,size_t idx,bool wraparound)5416 static int setting_action_left_input_remap_port(
5417 rarch_setting_t *setting, size_t idx, bool wraparound)
5418 {
5419 bool refresh = false;
5420 unsigned port = 0;
5421 settings_t *settings = config_get_ptr();
5422
5423 if (!setting)
5424 return -1;
5425
5426 port = setting->index_offset;
5427
5428 if (settings->uints.input_remap_ports[port] > 0)
5429 settings->uints.input_remap_ports[port]--;
5430 else
5431 settings->uints.input_remap_ports[port] = MAX_USERS - 1;
5432
5433 /* Must be called whenever settings->uints.input_remap_ports
5434 * is modified */
5435 input_remapping_update_port_map();
5436
5437 /* Changing mapped port may leave a core port unused;
5438 * reinitialise controllers to ensure that any such
5439 * ports are set to 'RETRO_DEVICE_NONE' */
5440 command_event(CMD_EVENT_CONTROLLER_INIT, NULL);
5441
5442 menu_entries_ctl(MENU_ENTRIES_CTL_SET_REFRESH, &refresh);
5443 menu_driver_ctl(RARCH_MENU_CTL_SET_PREVENT_POPULATE, NULL);
5444 return 0;
5445 }
5446
setting_uint_action_left_crt_switch_resolution_super(rarch_setting_t * setting,size_t idx,bool wraparound)5447 static int setting_uint_action_left_crt_switch_resolution_super(
5448 rarch_setting_t *setting, size_t idx, bool wraparound)
5449 {
5450 if (!setting)
5451 return -1;
5452
5453 switch (*setting->value.target.unsigned_integer)
5454 {
5455 case 0:
5456 *setting->value.target.unsigned_integer = 3840;
5457 break;
5458 case 1: /* for dynamic super resolution switching - best fit */
5459 *setting->value.target.unsigned_integer = 0;
5460 break;
5461 case 1920:
5462 *setting->value.target.unsigned_integer = 1;
5463 break;
5464 case 2560:
5465 *setting->value.target.unsigned_integer = 1920;
5466 break;
5467 case 3840:
5468 *setting->value.target.unsigned_integer = 2560;
5469 break;
5470 }
5471
5472 return 0;
5473 }
5474
setting_action_left_bind_device(rarch_setting_t * setting,size_t idx,bool wraparound)5475 static int setting_action_left_bind_device(
5476 rarch_setting_t *setting, size_t idx, bool wraparound)
5477 {
5478 unsigned *p = NULL;
5479 unsigned index_offset = 0;
5480 unsigned max_devices = input_config_get_device_count();
5481 settings_t *settings = config_get_ptr();
5482
5483 if (!setting || max_devices == 0)
5484 return -1;
5485
5486 index_offset = setting->index_offset;
5487
5488 p = &settings->uints.input_joypad_index[index_offset];
5489
5490 if ((*p) >= max_devices)
5491 *p = max_devices - 1;
5492 else if ((*p) > 0)
5493 (*p)--;
5494
5495 return 0;
5496 }
5497
setting_action_left_mouse_index(rarch_setting_t * setting,size_t idx,bool wraparound)5498 static int setting_action_left_mouse_index(
5499 rarch_setting_t *setting, size_t idx, bool wraparound)
5500 {
5501 unsigned index_offset = 0;
5502 settings_t *settings = config_get_ptr();
5503
5504 if (!setting)
5505 return -1;
5506
5507 index_offset = setting->index_offset;
5508
5509 if (settings->uints.input_mouse_index[index_offset])
5510 --settings->uints.input_mouse_index[index_offset];
5511 else
5512 settings->uints.input_mouse_index[index_offset] = MAX_USERS - 1;
5513
5514 settings->modified = true;
5515 return 0;
5516 }
5517
setting_uint_action_left_custom_viewport_width(rarch_setting_t * setting,size_t idx,bool wraparound)5518 static int setting_uint_action_left_custom_viewport_width(
5519 rarch_setting_t *setting, size_t idx, bool wraparound)
5520 {
5521 video_viewport_t vp;
5522 struct retro_system_av_info *av_info = video_viewport_get_system_av_info();
5523 video_viewport_t *custom = video_viewport_get_custom();
5524 settings_t *settings = config_get_ptr();
5525 struct retro_game_geometry *geom = (struct retro_game_geometry*)
5526 &av_info->geometry;
5527
5528 if (!settings || !av_info)
5529 return -1;
5530
5531 video_driver_get_viewport_info(&vp);
5532
5533 if (custom->width <= 1)
5534 custom->width = 1;
5535 else if (settings->bools.video_scale_integer)
5536 {
5537 unsigned int rotation = retroarch_get_rotation();
5538 if (rotation % 2)
5539 {
5540 if (custom->width > geom->base_height)
5541 custom->width -= geom->base_height;
5542 }
5543 else
5544 {
5545 if (custom->width > geom->base_width)
5546 custom->width -= geom->base_width;
5547 }
5548 }
5549 else
5550 custom->width -= 1;
5551
5552 aspectratio_lut[ASPECT_RATIO_CUSTOM].value =
5553 (float)custom->width / custom->height;
5554
5555 return 0;
5556 }
5557
setting_uint_action_left_custom_viewport_height(rarch_setting_t * setting,size_t idx,bool wraparound)5558 static int setting_uint_action_left_custom_viewport_height(
5559 rarch_setting_t *setting, size_t idx, bool wraparound)
5560 {
5561 video_viewport_t vp;
5562 struct retro_system_av_info *av_info = video_viewport_get_system_av_info();
5563 video_viewport_t *custom = video_viewport_get_custom();
5564 settings_t *settings = config_get_ptr();
5565 struct retro_game_geometry *geom = (struct retro_game_geometry*)
5566 &av_info->geometry;
5567
5568 if (!settings || !av_info)
5569 return -1;
5570
5571 video_driver_get_viewport_info(&vp);
5572
5573 if (custom->height <= 1)
5574 custom->height = 1;
5575 else if (settings->bools.video_scale_integer)
5576 {
5577 unsigned int rotation = retroarch_get_rotation();
5578 if (rotation % 2)
5579 {
5580 if (custom->height > geom->base_width)
5581 custom->height -= geom->base_width;
5582 }
5583 else
5584 {
5585 if (custom->height > geom->base_height)
5586 custom->height -= geom->base_height;
5587 }
5588 }
5589 else
5590 custom->height -= 1;
5591
5592 aspectratio_lut[ASPECT_RATIO_CUSTOM].value =
5593 (float)custom->width / custom->height;
5594
5595 return 0;
5596 }
5597
5598 #if !defined(RARCH_CONSOLE)
setting_string_action_left_audio_device(rarch_setting_t * setting,size_t idx,bool wraparound)5599 static int setting_string_action_left_audio_device(
5600 rarch_setting_t *setting, size_t idx, bool wraparound)
5601 {
5602 int audio_device_index;
5603 struct string_list *ptr = NULL;
5604
5605 if (!audio_driver_get_devices_list((void**)&ptr))
5606 return -1;
5607
5608 if (!ptr)
5609 return -1;
5610
5611 /* Get index in the string list */
5612 audio_device_index = string_list_find_elem(
5613 ptr, setting->value.target.string) - 1;
5614 audio_device_index--;
5615
5616 /* Reset index if needed */
5617 if (audio_device_index < 0)
5618 audio_device_index = (int)(ptr->size - 1);
5619
5620 strlcpy(setting->value.target.string, ptr->elems[audio_device_index].data, setting->size);
5621
5622 return 0;
5623 }
5624 #endif
5625
setting_string_action_left_driver(rarch_setting_t * setting,size_t idx,bool wraparound)5626 static int setting_string_action_left_driver(
5627 rarch_setting_t *setting, size_t idx, bool wraparound)
5628 {
5629 driver_ctx_info_t drv;
5630 bool success = false;
5631
5632 if (!setting)
5633 return -1;
5634
5635 drv.label = setting->name;
5636 drv.s = setting->value.target.string;
5637 drv.len = setting->size;
5638
5639 /* Find the previous driver in the array of drivers.
5640 * If the driver is protected, keep finding more previous drivers while the
5641 * driver is null or until there are no more previous drivers. */
5642 success = driver_ctl(RARCH_DRIVER_CTL_FIND_PREV, &drv);
5643 if (setting_is_protected_driver(setting))
5644 {
5645 while (success &&
5646 string_is_equal(drv.s, "null") &&
5647 (success = driver_ctl(RARCH_DRIVER_CTL_FIND_PREV, &drv)));
5648 }
5649
5650 if (!success)
5651 {
5652 settings_t *settings = config_get_ptr();
5653 bool menu_navigation_wraparound_enable = settings ? settings->bools.menu_navigation_wraparound_enable: false;
5654
5655 if (menu_navigation_wraparound_enable)
5656 {
5657 /* If wraparound is enabled, find the LAST driver in the array of drivers.
5658 * If the driver is protected, find the previous driver and keep finding more
5659 * previous drivers while the driver is null or until there are no more previous drivers. */
5660 drv.label = setting->name;
5661 drv.s = setting->value.target.string;
5662 drv.len = setting->size;
5663 success = driver_ctl(RARCH_DRIVER_CTL_FIND_LAST, &drv);
5664 if (setting_is_protected_driver(setting))
5665 {
5666 while (success &&
5667 string_is_equal(drv.s, "null") &&
5668 (success = driver_ctl(RARCH_DRIVER_CTL_FIND_PREV, &drv)));
5669 }
5670 }
5671 else if (setting_is_protected_driver(setting))
5672 {
5673 /* If wraparound is disabled and if the driver is protected,
5674 * find the next driver in the array of drivers and keep finding more
5675 * next drivers while the driver is null or until there are no more next drivers. */
5676 success = driver_ctl(RARCH_DRIVER_CTL_FIND_NEXT, &drv);
5677 while (success &&
5678 string_is_equal(drv.s, "null") &&
5679 (success = driver_ctl(RARCH_DRIVER_CTL_FIND_NEXT, &drv)));
5680 }
5681 }
5682
5683 if (setting->change_handler)
5684 setting->change_handler(setting);
5685
5686 return 0;
5687 }
5688
5689 #ifdef HAVE_NETWORKING
setting_string_action_left_netplay_mitm_server(rarch_setting_t * setting,size_t idx,bool wraparound)5690 static int setting_string_action_left_netplay_mitm_server(
5691 rarch_setting_t *setting, size_t idx, bool wraparound)
5692 {
5693 unsigned i;
5694 int offset = 0;
5695 bool found = false;
5696 unsigned list_len = ARRAY_SIZE(netplay_mitm_server_list);
5697 if (!setting)
5698 return -1;
5699
5700 for (i = 0; i < list_len; i++)
5701 {
5702 /* find the currently selected server in the list */
5703 if (string_is_equal(setting->value.target.string, netplay_mitm_server_list[i].name))
5704 {
5705 /* move to the previous one in the list, wrap around if necessary */
5706 if (i >= 1)
5707 {
5708 found = true;
5709 offset = i - 1;
5710 }
5711 else if (wraparound)
5712 {
5713 found = true;
5714 offset = list_len - 1;
5715 }
5716
5717 if (found)
5718 break;
5719 }
5720 }
5721
5722 /* current entry was invalid, go back to the end */
5723 if (!found)
5724 offset = list_len - 1;
5725
5726 if (offset >= 0)
5727 strlcpy(setting->value.target.string,
5728 netplay_mitm_server_list[offset].name, setting->size);
5729
5730 return 0;
5731 }
5732
setting_string_action_right_netplay_mitm_server(rarch_setting_t * setting,size_t idx,bool wraparound)5733 static int setting_string_action_right_netplay_mitm_server(
5734 rarch_setting_t *setting, size_t idx, bool wraparound)
5735 {
5736 unsigned i;
5737 int offset = 0;
5738 bool found = false;
5739 unsigned list_len = ARRAY_SIZE(netplay_mitm_server_list);
5740 if (!setting)
5741 return -1;
5742
5743 for (i = 0; i < list_len; i++)
5744 {
5745 /* find the currently selected server in the list */
5746 if (string_is_equal(setting->value.target.string, netplay_mitm_server_list[i].name))
5747 {
5748 /* move to the next one in the list, wrap around if necessary */
5749 if (i + 1 < list_len)
5750 {
5751 offset = i + 1;
5752 found = true;
5753 }
5754 else if (wraparound)
5755 found = true;
5756
5757 if (found)
5758 break;
5759 }
5760 }
5761
5762 /* current entry was invalid, go back to the start */
5763 if (!found)
5764 offset = 0;
5765
5766 strlcpy(setting->value.target.string,
5767 netplay_mitm_server_list[offset].name, setting->size);
5768
5769 return 0;
5770 }
5771 #endif
5772
setting_uint_action_right_crt_switch_resolution_super(rarch_setting_t * setting,size_t idx,bool wraparound)5773 static int setting_uint_action_right_crt_switch_resolution_super(
5774 rarch_setting_t *setting, size_t idx, bool wraparound)
5775 {
5776 if (!setting)
5777 return -1;
5778
5779 switch (*setting->value.target.unsigned_integer)
5780 {
5781 case 0:
5782 *setting->value.target.unsigned_integer = 1;
5783 break;
5784 case 1: /* for dynamic super resolution switching - best fit */
5785 *setting->value.target.unsigned_integer = 1920;
5786 break;
5787 case 1920:
5788 *setting->value.target.unsigned_integer = 2560;
5789 break;
5790 case 2560:
5791 *setting->value.target.unsigned_integer = 3840;
5792 break;
5793 case 3840:
5794 *setting->value.target.unsigned_integer = 0;
5795 break;
5796 }
5797
5798 return 0;
5799 }
5800
setting_uint_action_right_custom_viewport_width(rarch_setting_t * setting,size_t idx,bool wraparound)5801 static int setting_uint_action_right_custom_viewport_width(
5802 rarch_setting_t *setting, size_t idx, bool wraparound)
5803 {
5804 video_viewport_t vp;
5805 struct retro_system_av_info *av_info = video_viewport_get_system_av_info();
5806 video_viewport_t *custom = video_viewport_get_custom();
5807 settings_t *settings = config_get_ptr();
5808 struct retro_game_geometry *geom = (struct retro_game_geometry*)
5809 &av_info->geometry;
5810
5811 if (!settings || !av_info)
5812 return -1;
5813
5814 video_driver_get_viewport_info(&vp);
5815
5816 if (settings->bools.video_scale_integer)
5817 {
5818 unsigned int rotation = retroarch_get_rotation();
5819 if (rotation % 2)
5820 custom->width += geom->base_height;
5821 else
5822 custom->width += geom->base_width;
5823 }
5824 else
5825 custom->width += 1;
5826
5827 aspectratio_lut[ASPECT_RATIO_CUSTOM].value =
5828 (float)custom->width / custom->height;
5829
5830 return 0;
5831 }
5832
setting_uint_action_right_custom_viewport_height(rarch_setting_t * setting,size_t idx,bool wraparound)5833 static int setting_uint_action_right_custom_viewport_height(
5834 rarch_setting_t *setting, size_t idx, bool wraparound)
5835 {
5836 video_viewport_t vp;
5837 struct retro_system_av_info *av_info = video_viewport_get_system_av_info();
5838 video_viewport_t *custom = video_viewport_get_custom();
5839 settings_t *settings = config_get_ptr();
5840 struct retro_game_geometry *geom = (struct retro_game_geometry*)
5841 &av_info->geometry;
5842
5843 if (!settings || !av_info)
5844 return -1;
5845
5846 video_driver_get_viewport_info(&vp);
5847
5848 if (settings->bools.video_scale_integer)
5849 {
5850 unsigned int rotation = retroarch_get_rotation();
5851 if (rotation % 2)
5852 custom->height += geom->base_width;
5853 else
5854 custom->height += geom->base_height;
5855 }
5856 else
5857 custom->height += 1;
5858
5859 aspectratio_lut[ASPECT_RATIO_CUSTOM].value =
5860 (float)custom->width / custom->height;
5861
5862 return 0;
5863 }
5864
5865 #if !defined(RARCH_CONSOLE)
setting_string_action_right_audio_device(rarch_setting_t * setting,size_t idx,bool wraparound)5866 static int setting_string_action_right_audio_device(
5867 rarch_setting_t *setting, size_t idx, bool wraparound)
5868 {
5869 int audio_device_index;
5870 struct string_list *ptr = NULL;
5871
5872 if (!audio_driver_get_devices_list((void**)&ptr))
5873 return -1;
5874
5875 if (!ptr)
5876 return -1;
5877
5878 /* Get index in the string list */
5879 audio_device_index = string_list_find_elem(ptr,setting->value.target.string) -1;
5880 audio_device_index++;
5881
5882 /* Reset index if needed */
5883 if (audio_device_index == (signed)ptr->size)
5884 audio_device_index = 0;
5885
5886 strlcpy(setting->value.target.string,
5887 ptr->elems[audio_device_index].data, setting->size);
5888
5889 return 0;
5890 }
5891 #endif
5892
setting_string_action_right_driver(rarch_setting_t * setting,size_t idx,bool wraparound)5893 static int setting_string_action_right_driver(
5894 rarch_setting_t *setting, size_t idx, bool wraparound)
5895 {
5896 driver_ctx_info_t drv;
5897 bool success = false;
5898
5899 if (!setting)
5900 return -1;
5901
5902 drv.label = setting->name;
5903 drv.s = setting->value.target.string;
5904 drv.len = setting->size;
5905
5906 /* Find the next driver in the array of drivers.
5907 * If the driver is protected, keep finding next drivers while the
5908 * driver is null or until there are no more next drivers. */
5909 success = driver_ctl(RARCH_DRIVER_CTL_FIND_NEXT, &drv);
5910 if (setting_is_protected_driver(setting))
5911 {
5912 while (success &&
5913 string_is_equal(drv.s, "null") &&
5914 (success = driver_ctl(RARCH_DRIVER_CTL_FIND_NEXT, &drv)));
5915 }
5916
5917 if (!success)
5918 {
5919 settings_t *settings = config_get_ptr();
5920 bool menu_navigation_wraparound_enable = settings ? settings->bools.menu_navigation_wraparound_enable: false;
5921
5922 if (menu_navigation_wraparound_enable)
5923 {
5924 /* If wraparound is enabled, find the first driver in the array of drivers.
5925 * If the driver is protected, find the next driver and keep finding more
5926 * next drivers while the driver is null or until there are no more next drivers. */
5927 drv.label = setting->name;
5928 drv.s = setting->value.target.string;
5929 drv.len = setting->size;
5930 success = driver_ctl(RARCH_DRIVER_CTL_FIND_FIRST, &drv);
5931 if (setting_is_protected_driver(setting))
5932 {
5933 while (success &&
5934 string_is_equal(drv.s, "null") &&
5935 (success = driver_ctl(RARCH_DRIVER_CTL_FIND_NEXT, &drv)));
5936 }
5937 }
5938 else if (setting_is_protected_driver(setting))
5939 {
5940 /* If wraparound is disabled and if the driver is protected,
5941 * find the previous driver in the array of drivers and keep finding more
5942 * previous drivers while the driver is null or until there are no more previous drivers. */
5943 success = driver_ctl(RARCH_DRIVER_CTL_FIND_PREV, &drv);
5944 while (success &&
5945 string_is_equal(drv.s, "null") &&
5946 (success = driver_ctl(RARCH_DRIVER_CTL_FIND_PREV, &drv)));
5947 }
5948 }
5949
5950 if (setting->change_handler)
5951 setting->change_handler(setting);
5952
5953 return 0;
5954 }
5955
setting_string_action_left_midi_input(rarch_setting_t * setting,size_t idx,bool wraparound)5956 static int setting_string_action_left_midi_input(
5957 rarch_setting_t *setting, size_t idx, bool wraparound)
5958 {
5959 struct string_list *list = midi_driver_get_avail_inputs();
5960
5961 if (list && list->size > 1)
5962 {
5963 int i = string_list_find_elem(list, setting->value.target.string) - 2;
5964
5965 if (wraparound && i == -1)
5966 i = (int)list->size - 1;
5967 if (i >= 0)
5968 {
5969 strlcpy(setting->value.target.string,
5970 list->elems[i].data, setting->size);
5971 return 0;
5972 }
5973 }
5974
5975 return -1;
5976 }
5977
setting_string_action_right_midi_input(rarch_setting_t * setting,size_t idx,bool wraparound)5978 static int setting_string_action_right_midi_input(
5979 rarch_setting_t *setting, size_t idx, bool wraparound)
5980 {
5981 struct string_list *list = midi_driver_get_avail_inputs();
5982
5983 if (list && list->size > 1)
5984 {
5985 int i = string_list_find_elem(list, setting->value.target.string);
5986
5987 if (wraparound && i == (int)list->size)
5988 i = 0;
5989 if (i >= 0 && i < (int)list->size)
5990 {
5991 strlcpy(setting->value.target.string,
5992 list->elems[i].data, setting->size);
5993 return 0;
5994 }
5995 }
5996
5997 return -1;
5998 }
5999
setting_string_action_left_midi_output(rarch_setting_t * setting,size_t idx,bool wraparound)6000 static int setting_string_action_left_midi_output(
6001 rarch_setting_t *setting, size_t idx, bool wraparound)
6002 {
6003 struct string_list *list = midi_driver_get_avail_outputs();
6004
6005 if (list && list->size > 1)
6006 {
6007 int i = string_list_find_elem(list, setting->value.target.string) - 2;
6008
6009 if (wraparound && i == -1)
6010 i = (int)list->size - 1;
6011 if (i >= 0)
6012 {
6013 strlcpy(setting->value.target.string,
6014 list->elems[i].data, setting->size);
6015 return 0;
6016 }
6017 }
6018
6019 return -1;
6020 }
6021
setting_string_action_right_midi_output(rarch_setting_t * setting,size_t idx,bool wraparound)6022 static int setting_string_action_right_midi_output(
6023 rarch_setting_t *setting, size_t idx, bool wraparound)
6024 {
6025 struct string_list *list = midi_driver_get_avail_outputs();
6026
6027 if (list && list->size > 1)
6028 {
6029 int i = string_list_find_elem(list, setting->value.target.string);
6030
6031 if (wraparound && i == (int)list->size)
6032 i = 0;
6033 if (i >= 0 && i < (int)list->size)
6034 {
6035 strlcpy(setting->value.target.string,
6036 list->elems[i].data, setting->size);
6037 return 0;
6038 }
6039 }
6040
6041 return -1;
6042 }
6043
6044 #ifdef HAVE_CHEATS
setting_get_string_representation_uint_cheat_exact(rarch_setting_t * setting,char * s,size_t len)6045 static void setting_get_string_representation_uint_cheat_exact(rarch_setting_t *setting,
6046 char *s, size_t len)
6047 {
6048 if (setting)
6049 snprintf(s, len, msg_hash_to_str(MENU_ENUM_LABEL_CHEAT_SEARCH_EXACT_VAL),
6050 *setting->value.target.unsigned_integer, *setting->value.target.unsigned_integer);
6051 }
6052
setting_get_string_representation_uint_cheat_lt(rarch_setting_t * setting,char * s,size_t len)6053 static void setting_get_string_representation_uint_cheat_lt(rarch_setting_t *setting,
6054 char *s, size_t len)
6055 {
6056 if (setting)
6057 strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_CHEAT_SEARCH_LT_VAL), len);
6058 }
6059
setting_get_string_representation_uint_cheat_gt(rarch_setting_t * setting,char * s,size_t len)6060 static void setting_get_string_representation_uint_cheat_gt(rarch_setting_t *setting,
6061 char *s, size_t len)
6062 {
6063 if (setting)
6064 strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_CHEAT_SEARCH_GT_VAL), len);
6065 }
6066
setting_get_string_representation_uint_cheat_lte(rarch_setting_t * setting,char * s,size_t len)6067 static void setting_get_string_representation_uint_cheat_lte(rarch_setting_t *setting,
6068 char *s, size_t len)
6069 {
6070 if (setting)
6071 strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_CHEAT_SEARCH_LTE_VAL), len);
6072 }
6073
setting_get_string_representation_uint_cheat_gte(rarch_setting_t * setting,char * s,size_t len)6074 static void setting_get_string_representation_uint_cheat_gte(rarch_setting_t *setting,
6075 char *s, size_t len)
6076 {
6077 if (setting)
6078 strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_CHEAT_SEARCH_GTE_VAL), len);
6079 }
6080
setting_get_string_representation_uint_cheat_eq(rarch_setting_t * setting,char * s,size_t len)6081 static void setting_get_string_representation_uint_cheat_eq(rarch_setting_t *setting,
6082 char *s, size_t len)
6083 {
6084 if (setting)
6085 strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_CHEAT_SEARCH_EQ_VAL), len);
6086 }
6087
setting_get_string_representation_uint_cheat_neq(rarch_setting_t * setting,char * s,size_t len)6088 static void setting_get_string_representation_uint_cheat_neq(rarch_setting_t *setting,
6089 char *s, size_t len)
6090 {
6091 if (setting)
6092 strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_CHEAT_SEARCH_NEQ_VAL), len);
6093 }
6094
setting_get_string_representation_uint_cheat_eqplus(rarch_setting_t * setting,char * s,size_t len)6095 static void setting_get_string_representation_uint_cheat_eqplus(rarch_setting_t *setting,
6096 char *s, size_t len)
6097 {
6098 if (setting)
6099 snprintf(s, len, msg_hash_to_str(MENU_ENUM_LABEL_CHEAT_SEARCH_EQPLUS_VAL),
6100 *setting->value.target.unsigned_integer, *setting->value.target.unsigned_integer);
6101 }
6102
setting_get_string_representation_uint_cheat_eqminus(rarch_setting_t * setting,char * s,size_t len)6103 static void setting_get_string_representation_uint_cheat_eqminus(rarch_setting_t *setting,
6104 char *s, size_t len)
6105 {
6106 if (setting)
6107 snprintf(s, len, msg_hash_to_str(MENU_ENUM_LABEL_CHEAT_SEARCH_EQMINUS_VAL),
6108 *setting->value.target.unsigned_integer, *setting->value.target.unsigned_integer);
6109 }
6110
setting_get_string_representation_uint_cheat_browse_address(rarch_setting_t * setting,char * s,size_t len)6111 static void setting_get_string_representation_uint_cheat_browse_address(
6112 rarch_setting_t *setting,
6113 char *s, size_t len)
6114 {
6115 unsigned int address = cheat_manager_state.browse_address;
6116 unsigned int address_mask = 0;
6117 unsigned int prev_val = 0;
6118 unsigned int curr_val = 0;
6119
6120 if (setting)
6121 snprintf(s, len, msg_hash_to_str(MENU_ENUM_LABEL_CHEAT_SEARCH_EQMINUS_VAL),
6122 *setting->value.target.unsigned_integer, *setting->value.target.unsigned_integer);
6123
6124 cheat_manager_match_action(CHEAT_MATCH_ACTION_TYPE_BROWSE, cheat_manager_state.match_idx, &address, &address_mask, &prev_val, &curr_val);
6125
6126 snprintf(s, len, "Prev: %u Curr: %u", prev_val, curr_val);
6127
6128 }
6129 #endif
6130
setting_get_string_representation_uint_video_rotation(rarch_setting_t * setting,char * s,size_t len)6131 static void setting_get_string_representation_uint_video_rotation(rarch_setting_t *setting,
6132 char *s, size_t len)
6133 {
6134 if (setting)
6135 {
6136 char rotation_lut[4][32] =
6137 {
6138 "Normal",
6139 "90 deg",
6140 "180 deg",
6141 "270 deg"
6142 };
6143
6144 strlcpy(s, rotation_lut[*setting->value.target.unsigned_integer],
6145 len);
6146 }
6147 }
6148
setting_get_string_representation_uint_screen_orientation(rarch_setting_t * setting,char * s,size_t len)6149 static void setting_get_string_representation_uint_screen_orientation(rarch_setting_t *setting,
6150 char *s, size_t len)
6151 {
6152 if (setting)
6153 {
6154 char rotation_lut[4][32] =
6155 {
6156 "Normal",
6157 "90 deg",
6158 "180 deg",
6159 "270 deg"
6160 };
6161
6162 strlcpy(s, rotation_lut[*setting->value.target.unsigned_integer],
6163 len);
6164 }
6165 }
6166
setting_get_string_representation_uint_aspect_ratio_index(rarch_setting_t * setting,char * s,size_t len)6167 static void setting_get_string_representation_uint_aspect_ratio_index(
6168 rarch_setting_t *setting,
6169 char *s, size_t len)
6170 {
6171 if (setting)
6172 strlcpy(s,
6173 aspectratio_lut[*setting->value.target.unsigned_integer].name,
6174 len);
6175 }
6176
setting_get_string_representation_uint_crt_switch_resolutions(rarch_setting_t * setting,char * s,size_t len)6177 static void setting_get_string_representation_uint_crt_switch_resolutions(
6178 rarch_setting_t *setting,
6179 char *s, size_t len)
6180 {
6181 if (!setting)
6182 return;
6183
6184 switch (*setting->value.target.unsigned_integer)
6185 {
6186 case CRT_SWITCH_NONE:
6187 strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF), len);
6188 break;
6189 case CRT_SWITCH_15KHZ:
6190 strlcpy(s, "15 KHz", len);
6191 break;
6192 case CRT_SWITCH_31KHZ:
6193 strlcpy(s, "31 KHz, Standard", len);
6194 break;
6195 case CRT_SWITCH_32_120:
6196 strlcpy(s, "31 KHz, 120Hz", len);
6197 break;
6198 case CRT_SWITCH_INI:
6199 strlcpy(s, "INI", len);
6200 break;
6201 }
6202 }
6203
setting_get_string_representation_uint_audio_resampler_quality(rarch_setting_t * setting,char * s,size_t len)6204 static void setting_get_string_representation_uint_audio_resampler_quality(
6205 rarch_setting_t *setting,
6206 char *s, size_t len)
6207 {
6208 if (!setting)
6209 return;
6210
6211 switch (*setting->value.target.unsigned_integer)
6212 {
6213 case RESAMPLER_QUALITY_DONTCARE:
6214 strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_DONT_CARE),
6215 len);
6216 break;
6217 case RESAMPLER_QUALITY_LOWEST:
6218 strlcpy(s, msg_hash_to_str(MSG_RESAMPLER_QUALITY_LOWEST),
6219 len);
6220 break;
6221 case RESAMPLER_QUALITY_LOWER:
6222 strlcpy(s, msg_hash_to_str(MSG_RESAMPLER_QUALITY_LOWER),
6223 len);
6224 break;
6225 case RESAMPLER_QUALITY_HIGHER:
6226 strlcpy(s, msg_hash_to_str(MSG_RESAMPLER_QUALITY_HIGHER),
6227 len);
6228 break;
6229 case RESAMPLER_QUALITY_HIGHEST:
6230 strlcpy(s, msg_hash_to_str(MSG_RESAMPLER_QUALITY_HIGHEST),
6231 len);
6232 break;
6233 case RESAMPLER_QUALITY_NORMAL:
6234 strlcpy(s, msg_hash_to_str(MSG_RESAMPLER_QUALITY_NORMAL),
6235 len);
6236 break;
6237 }
6238 }
6239
setting_get_string_representation_uint_libretro_device(rarch_setting_t * setting,char * s,size_t len)6240 static void setting_get_string_representation_uint_libretro_device(
6241 rarch_setting_t *setting,
6242 char *s, size_t len)
6243 {
6244 unsigned index_offset, device;
6245 const struct retro_controller_description *desc = NULL;
6246 const char *name = NULL;
6247 rarch_system_info_t *system = runloop_get_system_info();
6248
6249 if (!setting)
6250 return;
6251
6252 index_offset = setting->index_offset;
6253 device = input_config_get_device(index_offset);
6254
6255 if (system)
6256 {
6257 if (index_offset < system->ports.size)
6258 desc = libretro_find_controller_description(
6259 &system->ports.data[index_offset],
6260 device);
6261 }
6262
6263 if (desc)
6264 name = desc->desc;
6265
6266 if (!name)
6267 {
6268 /* Find generic name. */
6269 switch (device)
6270 {
6271 case RETRO_DEVICE_NONE:
6272 name = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NONE);
6273 break;
6274 case RETRO_DEVICE_JOYPAD:
6275 name = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_RETROPAD);
6276 break;
6277 case RETRO_DEVICE_ANALOG:
6278 name = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_RETROPAD_WITH_ANALOG);
6279 break;
6280 default:
6281 name = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_UNKNOWN);
6282 break;
6283 }
6284 }
6285
6286 if (!string_is_empty(name))
6287 strlcpy(s, name, len);
6288 }
6289
setting_get_string_representation_uint_analog_dpad_mode(rarch_setting_t * setting,char * s,size_t len)6290 static void setting_get_string_representation_uint_analog_dpad_mode(
6291 rarch_setting_t *setting,
6292 char *s, size_t len)
6293 {
6294 const char *modes[5];
6295
6296 modes[0] = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NONE);
6297 modes[1] = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_LEFT_ANALOG);
6298 modes[2] = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_RIGHT_ANALOG);
6299 modes[3] = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_LEFT_ANALOG_FORCED);
6300 modes[4] = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_RIGHT_ANALOG_FORCED);
6301
6302 strlcpy(s, modes[*setting->value.target.unsigned_integer % ANALOG_DPAD_LAST], len);
6303 }
6304
setting_get_string_representation_uint_input_remap_port(rarch_setting_t * setting,char * s,size_t len)6305 static void setting_get_string_representation_uint_input_remap_port(
6306 rarch_setting_t *setting,
6307 char *s, size_t len)
6308 {
6309 if (setting)
6310 snprintf(s, len, "%u", *setting->value.target.unsigned_integer + 1);
6311 }
6312
6313 #ifdef HAVE_THREADS
setting_get_string_representation_uint_autosave_interval(rarch_setting_t * setting,char * s,size_t len)6314 static void setting_get_string_representation_uint_autosave_interval(
6315 rarch_setting_t *setting,
6316 char *s, size_t len)
6317 {
6318 if (!setting)
6319 return;
6320
6321 if (*setting->value.target.unsigned_integer)
6322 snprintf(s, len, "%u %s",
6323 *setting->value.target.unsigned_integer, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SECONDS));
6324 else
6325 strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF), len);
6326 }
6327 #endif
6328
6329 #if defined(HAVE_NETWORKING)
setting_get_string_representation_netplay_mitm_server(rarch_setting_t * setting,char * s,size_t len)6330 static void setting_get_string_representation_netplay_mitm_server(
6331 rarch_setting_t *setting,
6332 char *s, size_t len)
6333 {
6334
6335 }
6336 #endif
6337
setting_get_string_representation_toggle_gamepad_combo(rarch_setting_t * setting,char * s,size_t len)6338 static void setting_get_string_representation_toggle_gamepad_combo(
6339 rarch_setting_t *setting,
6340 char *s, size_t len)
6341 {
6342 if (!setting)
6343 return;
6344
6345 switch (*setting->value.target.unsigned_integer)
6346 {
6347 case INPUT_TOGGLE_NONE:
6348 strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NONE), len);
6349 break;
6350 case INPUT_TOGGLE_DOWN_Y_L_R:
6351 strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_DOWN_Y_L_R), len);
6352 break;
6353 case INPUT_TOGGLE_L3_R3:
6354 strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_L3_R3), len);
6355 break;
6356 case INPUT_TOGGLE_L1_R1_START_SELECT:
6357 strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_L1_R1_START_SELECT), len);
6358 break;
6359 case INPUT_TOGGLE_START_SELECT:
6360 strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_START_SELECT), len);
6361 break;
6362 case INPUT_TOGGLE_L3_R:
6363 strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_L3_R), len);
6364 break;
6365 case INPUT_TOGGLE_L_R:
6366 strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_L_R), len);
6367 break;
6368 case INPUT_TOGGLE_HOLD_START:
6369 strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_HOLD_START), len);
6370 break;
6371 case INPUT_TOGGLE_HOLD_SELECT:
6372 strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_HOLD_SELECT), len);
6373 break;
6374 case INPUT_TOGGLE_DOWN_SELECT:
6375 strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_DOWN_SELECT), len);
6376 break;
6377 case INPUT_TOGGLE_L2_R2:
6378 strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_L2_R2), len);
6379 break;
6380 }
6381 }
6382
setting_get_string_representation_turbo_mode(rarch_setting_t * setting,char * s,size_t len)6383 static void setting_get_string_representation_turbo_mode(
6384 rarch_setting_t *setting,
6385 char *s, size_t len)
6386 {
6387 if (!setting)
6388 return;
6389
6390 switch (*setting->value.target.unsigned_integer)
6391 {
6392 case INPUT_TURBO_MODE_CLASSIC:
6393 strlcpy(s, "Classic", len);
6394 break;
6395 case INPUT_TURBO_MODE_SINGLEBUTTON:
6396 strlcpy(s, "Single Button (Toggle)", len);
6397 break;
6398 case INPUT_TURBO_MODE_SINGLEBUTTON_HOLD:
6399 strlcpy(s, "Single Button (Hold)", len);
6400 break;
6401 }
6402 }
6403
setting_get_string_representation_turbo_default_button(rarch_setting_t * setting,char * s,size_t len)6404 static void setting_get_string_representation_turbo_default_button(
6405 rarch_setting_t *setting,
6406 char *s, size_t len)
6407 {
6408 if (!setting)
6409 return;
6410
6411 switch (*setting->value.target.unsigned_integer)
6412 {
6413 case INPUT_TURBO_DEFAULT_BUTTON_B:
6414 strlcpy(s, "B", len);
6415 break;
6416 case INPUT_TURBO_DEFAULT_BUTTON_Y:
6417 strlcpy(s, "Y", len);
6418 break;
6419 case INPUT_TURBO_DEFAULT_BUTTON_A:
6420 strlcpy(s, "A", len);
6421 break;
6422 case INPUT_TURBO_DEFAULT_BUTTON_X:
6423 strlcpy(s, "X", len);
6424 break;
6425 case INPUT_TURBO_DEFAULT_BUTTON_L:
6426 strlcpy(s, "L", len);
6427 break;
6428 case INPUT_TURBO_DEFAULT_BUTTON_R:
6429 strlcpy(s, "R", len);
6430 break;
6431 case INPUT_TURBO_DEFAULT_BUTTON_L2:
6432 strlcpy(s, "L2", len);
6433 break;
6434 case INPUT_TURBO_DEFAULT_BUTTON_R2:
6435 strlcpy(s, "R2", len);
6436 break;
6437 case INPUT_TURBO_DEFAULT_BUTTON_L3:
6438 strlcpy(s, "L3", len);
6439 break;
6440 case INPUT_TURBO_DEFAULT_BUTTON_R3:
6441 strlcpy(s, "R3", len);
6442 break;
6443 }
6444 }
6445
6446 #ifdef HAVE_NETWORKING
setting_get_string_representation_netplay_share_digital(rarch_setting_t * setting,char * s,size_t len)6447 static void setting_get_string_representation_netplay_share_digital(
6448 rarch_setting_t *setting,
6449 char *s, size_t len)
6450 {
6451 if (!setting)
6452 return;
6453
6454 switch (*setting->value.target.unsigned_integer)
6455 {
6456 case RARCH_NETPLAY_SHARE_DIGITAL_NO_PREFERENCE:
6457 strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NETPLAY_SHARE_NO_PREFERENCE), len);
6458 break;
6459
6460 case RARCH_NETPLAY_SHARE_DIGITAL_OR:
6461 strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NETPLAY_SHARE_DIGITAL_OR), len);
6462 break;
6463
6464 case RARCH_NETPLAY_SHARE_DIGITAL_XOR:
6465 strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NETPLAY_SHARE_DIGITAL_XOR), len);
6466 break;
6467
6468 case RARCH_NETPLAY_SHARE_DIGITAL_VOTE:
6469 strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NETPLAY_SHARE_DIGITAL_VOTE), len);
6470 break;
6471
6472 default:
6473 strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NETPLAY_SHARE_NONE), len);
6474 break;
6475 }
6476 }
6477
setting_get_string_representation_netplay_share_analog(rarch_setting_t * setting,char * s,size_t len)6478 static void setting_get_string_representation_netplay_share_analog(
6479 rarch_setting_t *setting,
6480 char *s, size_t len)
6481 {
6482 if (!setting)
6483 return;
6484
6485 switch (*setting->value.target.unsigned_integer)
6486 {
6487 case RARCH_NETPLAY_SHARE_ANALOG_NO_PREFERENCE:
6488 strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NETPLAY_SHARE_NO_PREFERENCE), len);
6489 break;
6490
6491 case RARCH_NETPLAY_SHARE_ANALOG_MAX:
6492 strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NETPLAY_SHARE_ANALOG_MAX), len);
6493 break;
6494
6495 case RARCH_NETPLAY_SHARE_ANALOG_AVERAGE:
6496 strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NETPLAY_SHARE_ANALOG_AVERAGE), len);
6497 break;
6498
6499 default:
6500 strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NETPLAY_SHARE_NONE), len);
6501 break;
6502 }
6503 }
6504 #endif
6505
setting_get_string_representation_poll_type_behavior(rarch_setting_t * setting,char * s,size_t len)6506 static void setting_get_string_representation_poll_type_behavior(
6507 rarch_setting_t *setting,
6508 char *s, size_t len)
6509 {
6510 if (!setting)
6511 return;
6512
6513 switch (*setting->value.target.unsigned_integer)
6514 {
6515 case 0:
6516 strlcpy(s,
6517 msg_hash_to_str(
6518 MENU_ENUM_LABEL_VALUE_INPUT_POLL_TYPE_BEHAVIOR_EARLY), len);
6519 break;
6520 case 1:
6521 strlcpy(s,
6522 msg_hash_to_str(
6523 MENU_ENUM_LABEL_VALUE_INPUT_POLL_TYPE_BEHAVIOR_NORMAL), len);
6524 break;
6525 case 2:
6526 strlcpy(s,
6527 msg_hash_to_str(
6528 MENU_ENUM_LABEL_VALUE_INPUT_POLL_TYPE_BEHAVIOR_LATE), len);
6529 break;
6530 }
6531 }
6532
setting_get_string_representation_input_touch_scale(rarch_setting_t * setting,char * s,size_t len)6533 static void setting_get_string_representation_input_touch_scale(rarch_setting_t *setting,
6534 char *s, size_t len)
6535 {
6536 if (setting)
6537 snprintf(s, len, "x%d", *setting->value.target.unsigned_integer);
6538 }
6539
6540 #ifdef HAVE_LANGEXTRA
setting_get_string_representation_uint_user_language(rarch_setting_t * setting,char * s,size_t len)6541 static void setting_get_string_representation_uint_user_language(
6542 rarch_setting_t *setting,
6543 char *s, size_t len)
6544 {
6545 const char *modes[RETRO_LANGUAGE_LAST];
6546
6547 modes[RETRO_LANGUAGE_ENGLISH] = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_LANG_ENGLISH);
6548 modes[RETRO_LANGUAGE_JAPANESE] = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_LANG_JAPANESE);
6549 modes[RETRO_LANGUAGE_FRENCH] = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_LANG_FRENCH);
6550 modes[RETRO_LANGUAGE_SPANISH] = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_LANG_SPANISH);
6551 modes[RETRO_LANGUAGE_GERMAN] = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_LANG_GERMAN);
6552 modes[RETRO_LANGUAGE_ITALIAN] = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_LANG_ITALIAN);
6553 modes[RETRO_LANGUAGE_DUTCH] = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_LANG_DUTCH);
6554 modes[RETRO_LANGUAGE_PORTUGUESE_BRAZIL] = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_LANG_PORTUGUESE_BRAZIL);
6555 modes[RETRO_LANGUAGE_PORTUGUESE_PORTUGAL] = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_LANG_PORTUGUESE_PORTUGAL);
6556 modes[RETRO_LANGUAGE_RUSSIAN] = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_LANG_RUSSIAN);
6557 modes[RETRO_LANGUAGE_KOREAN] = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_LANG_KOREAN);
6558 modes[RETRO_LANGUAGE_CHINESE_TRADITIONAL] = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_LANG_CHINESE_TRADITIONAL);
6559 modes[RETRO_LANGUAGE_CHINESE_SIMPLIFIED] = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_LANG_CHINESE_SIMPLIFIED);
6560 modes[RETRO_LANGUAGE_ESPERANTO] = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_LANG_ESPERANTO);
6561 modes[RETRO_LANGUAGE_POLISH] = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_LANG_POLISH);
6562 modes[RETRO_LANGUAGE_VIETNAMESE] = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_LANG_VIETNAMESE);
6563 modes[RETRO_LANGUAGE_ARABIC] = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_LANG_ARABIC);
6564 modes[RETRO_LANGUAGE_GREEK] = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_LANG_GREEK);
6565 modes[RETRO_LANGUAGE_TURKISH] = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_LANG_TURKISH);
6566 modes[RETRO_LANGUAGE_SLOVAK] = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_LANG_SLOVAK);
6567 modes[RETRO_LANGUAGE_PERSIAN] = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_LANG_PERSIAN);
6568 modes[RETRO_LANGUAGE_HEBREW] = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_LANG_HEBREW);
6569 modes[RETRO_LANGUAGE_ASTURIAN] = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_LANG_ASTURIAN);
6570 modes[RETRO_LANGUAGE_FINNISH] = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_LANG_FINNISH);
6571 strlcpy(s, modes[*msg_hash_get_uint(MSG_HASH_USER_LANGUAGE)], len);
6572 }
6573 #endif
6574
setting_get_string_representation_uint_libretro_log_level(rarch_setting_t * setting,char * s,size_t len)6575 static void setting_get_string_representation_uint_libretro_log_level(
6576 rarch_setting_t *setting,
6577 char *s, size_t len)
6578 {
6579 if (setting)
6580 {
6581 static const char *modes[] = {
6582 "0 (Debug)",
6583 "1 (Info)",
6584 "2 (Warning)",
6585 "3 (Error)"
6586 };
6587 strlcpy(s, modes[*setting->value.target.unsigned_integer],
6588 len);
6589 }
6590 }
6591
setting_get_string_representation_uint_quit_on_close_content(rarch_setting_t * setting,char * s,size_t len)6592 static void setting_get_string_representation_uint_quit_on_close_content(
6593 rarch_setting_t *setting,
6594 char *s, size_t len)
6595 {
6596 if (!setting)
6597 return;
6598
6599 switch (*setting->value.target.unsigned_integer)
6600 {
6601 case QUIT_ON_CLOSE_CONTENT_DISABLED:
6602 strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF), len);
6603 break;
6604 case QUIT_ON_CLOSE_CONTENT_ENABLED:
6605 strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_ON), len);
6606 break;
6607 case QUIT_ON_CLOSE_CONTENT_CLI:
6608 strlcpy(s, "CLI", len);
6609 break;
6610 }
6611 }
6612
setting_get_string_representation_uint_menu_screensaver_timeout(rarch_setting_t * setting,char * s,size_t len)6613 static void setting_get_string_representation_uint_menu_screensaver_timeout(
6614 rarch_setting_t *setting,
6615 char *s, size_t len)
6616 {
6617 if (!setting)
6618 return;
6619
6620 if (*setting->value.target.unsigned_integer == 0)
6621 strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF), len);
6622 else
6623 snprintf(s, len, "%u %s",
6624 *setting->value.target.unsigned_integer,
6625 msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SECONDS));
6626 }
6627
6628 #if defined(HAVE_MATERIALUI) || defined(HAVE_XMB) || defined(HAVE_OZONE)
setting_get_string_representation_uint_menu_screensaver_animation(rarch_setting_t * setting,char * s,size_t len)6629 static void setting_get_string_representation_uint_menu_screensaver_animation(
6630 rarch_setting_t *setting,
6631 char *s, size_t len)
6632 {
6633 if (!setting)
6634 return;
6635
6636 switch (*setting->value.target.unsigned_integer)
6637 {
6638 case MENU_SCREENSAVER_BLANK:
6639 strlcpy(s,
6640 msg_hash_to_str(
6641 MENU_ENUM_LABEL_VALUE_OFF),
6642 len);
6643 break;
6644 case MENU_SCREENSAVER_SNOW:
6645 strlcpy(s,
6646 msg_hash_to_str(
6647 MENU_ENUM_LABEL_VALUE_MENU_SCREENSAVER_ANIMATION_SNOW),
6648 len);
6649 break;
6650 case MENU_SCREENSAVER_STARFIELD:
6651 strlcpy(s,
6652 msg_hash_to_str(
6653 MENU_ENUM_LABEL_VALUE_MENU_SCREENSAVER_ANIMATION_STARFIELD),
6654 len);
6655 break;
6656 case MENU_SCREENSAVER_VORTEX:
6657 strlcpy(s,
6658 msg_hash_to_str(
6659 MENU_ENUM_LABEL_VALUE_MENU_SCREENSAVER_ANIMATION_VORTEX),
6660 len);
6661 break;
6662 }
6663 }
6664 #endif
6665
menu_setting_get_browser_selection_type(rarch_setting_t * setting)6666 enum setting_type menu_setting_get_browser_selection_type(rarch_setting_t *setting)
6667 {
6668 if (!setting)
6669 return ST_NONE;
6670 return setting->browser_selection_type;
6671 }
6672
menu_settings_list_current_add_range(rarch_setting_t ** list,rarch_setting_info_t * list_info,float min,float max,float step,bool enforce_minrange_enable,bool enforce_maxrange_enable)6673 static void menu_settings_list_current_add_range(
6674 rarch_setting_t **list,
6675 rarch_setting_info_t *list_info,
6676 float min, float max, float step,
6677 bool enforce_minrange_enable, bool enforce_maxrange_enable)
6678 {
6679 unsigned idx = list_info->index - 1;
6680
6681 if ((*list)[idx].type == ST_FLOAT)
6682 (*list)[list_info->index - 1].ui_type
6683 = ST_UI_TYPE_FLOAT_SLIDER_AND_SPINBOX;
6684
6685 (*list)[idx].min = min;
6686 (*list)[idx].step = step;
6687 (*list)[idx].max = max;
6688 (*list)[idx].enforce_minrange = enforce_minrange_enable;
6689 (*list)[idx].enforce_maxrange = enforce_maxrange_enable;
6690
6691 (*list)[list_info->index - 1].flags |= SD_FLAG_HAS_RANGE;
6692 }
6693
menu_setting_generic(rarch_setting_t * setting,size_t idx,bool wraparound)6694 int menu_setting_generic(rarch_setting_t *setting, size_t idx, bool wraparound)
6695 {
6696 uint64_t flags = setting->flags;
6697 if (setting_generic_action_ok_default(setting, idx, wraparound) != 0)
6698 return -1;
6699
6700 if (setting->change_handler)
6701 setting->change_handler(setting);
6702
6703 if ((flags & SD_FLAG_EXIT) && setting->cmd_trigger_event_triggered)
6704 {
6705 setting->cmd_trigger_event_triggered = false;
6706 return -1;
6707 }
6708
6709 return 0;
6710 }
6711
menu_action_handle_setting(rarch_setting_t * setting,unsigned type,unsigned action,bool wraparound)6712 int menu_action_handle_setting(rarch_setting_t *setting,
6713 unsigned type, unsigned action, bool wraparound)
6714 {
6715 if (!setting)
6716 return -1;
6717
6718 switch (setting->type)
6719 {
6720 case ST_PATH:
6721 if (action == MENU_ACTION_OK)
6722 {
6723 menu_displaylist_info_t info;
6724 settings_t *settings = config_get_ptr();
6725 file_list_t *menu_stack = menu_entries_get_menu_stack_ptr(0);
6726 const char *name = setting->name;
6727 size_t selection = menu_navigation_get_selection();
6728
6729 menu_displaylist_info_init(&info);
6730
6731 info.path = strdup(setting->default_value.string);
6732 info.label = strdup(name);
6733 info.type = type;
6734 info.directory_ptr = selection;
6735 info.list = menu_stack;
6736
6737 if (menu_displaylist_ctl(DISPLAYLIST_GENERIC, &info, settings))
6738 menu_displaylist_process(&info);
6739
6740 menu_displaylist_info_free(&info);
6741 }
6742 /* fall-through. */
6743 case ST_BOOL:
6744 case ST_INT:
6745 case ST_UINT:
6746 case ST_SIZE:
6747 case ST_HEX:
6748 case ST_FLOAT:
6749 case ST_STRING:
6750 case ST_STRING_OPTIONS:
6751 case ST_DIR:
6752 case ST_BIND:
6753 case ST_ACTION:
6754 {
6755 int ret = -1;
6756 size_t selection = menu_navigation_get_selection();
6757 switch (action)
6758 {
6759 case MENU_ACTION_UP:
6760 if (setting->action_up)
6761 ret = setting->action_up(setting);
6762 break;
6763 case MENU_ACTION_DOWN:
6764 if (setting->action_down)
6765 ret = setting->action_down(setting);
6766 break;
6767 case MENU_ACTION_LEFT:
6768 if (setting->action_left)
6769 {
6770 ret = setting->action_left(setting, selection, false);
6771 menu_driver_ctl(
6772 RARCH_MENU_CTL_UPDATE_SAVESTATE_THUMBNAIL_PATH,
6773 NULL);
6774 menu_driver_ctl(
6775 RARCH_MENU_CTL_UPDATE_SAVESTATE_THUMBNAIL_IMAGE,
6776 NULL);
6777 }
6778 break;
6779 case MENU_ACTION_RIGHT:
6780 if (setting->action_right)
6781 {
6782 ret = setting->action_right(setting, selection, false);
6783 menu_driver_ctl(
6784 RARCH_MENU_CTL_UPDATE_SAVESTATE_THUMBNAIL_PATH,
6785 NULL);
6786 menu_driver_ctl(
6787 RARCH_MENU_CTL_UPDATE_SAVESTATE_THUMBNAIL_IMAGE,
6788 NULL);
6789 }
6790 break;
6791 case MENU_ACTION_SELECT:
6792 if (setting->action_select)
6793 ret = setting->action_select(setting, selection, true);
6794 break;
6795 case MENU_ACTION_OK:
6796 if (setting->action_ok)
6797 ret = setting->action_ok(setting, selection, false);
6798 break;
6799 case MENU_ACTION_CANCEL:
6800 if (setting->action_cancel)
6801 ret = setting->action_cancel(setting);
6802 break;
6803 case MENU_ACTION_START:
6804 if (setting->action_start)
6805 ret = setting->action_start(setting);
6806 break;
6807 }
6808
6809 if (ret == 0)
6810 return menu_setting_generic(setting, selection, wraparound);
6811 }
6812 break;
6813 default:
6814 break;
6815 }
6816
6817 return -1;
6818 }
6819
6820 /**
6821 * menu_setting_find:
6822 * @settings : pointer to settings
6823 * @name : name of setting to search for
6824 *
6825 * Search for a setting with a specified name (@name).
6826 *
6827 * Returns: pointer to setting if found, NULL otherwise.
6828 **/
menu_setting_find(const char * label)6829 rarch_setting_t *menu_setting_find(const char *label)
6830 {
6831 rarch_setting_t *setting = NULL;
6832 rarch_setting_t **list = &setting;
6833
6834 if (!label)
6835 return NULL;
6836
6837 menu_entries_ctl(MENU_ENTRIES_CTL_SETTINGS_GET, &setting);
6838
6839 if (!setting)
6840 return NULL;
6841
6842 for (; setting->type != ST_NONE; (*list = *list + 1))
6843 {
6844 const char *name = setting->name;
6845 const char *short_description = setting->short_description;
6846
6847 if (
6848 string_is_equal(label, name) &&
6849 (setting->type <= ST_GROUP))
6850 {
6851 if (string_is_empty(short_description))
6852 break;
6853
6854 if (setting->read_handler)
6855 setting->read_handler(setting);
6856
6857 return setting;
6858 }
6859 }
6860
6861 return NULL;
6862 }
6863
menu_setting_find_enum(enum msg_hash_enums enum_idx)6864 rarch_setting_t *menu_setting_find_enum(enum msg_hash_enums enum_idx)
6865 {
6866 rarch_setting_t *setting = NULL;
6867 rarch_setting_t **list = &setting;
6868
6869 if (enum_idx == 0)
6870 return NULL;
6871
6872 menu_entries_ctl(MENU_ENTRIES_CTL_SETTINGS_GET, &setting);
6873
6874 if (!setting)
6875 return NULL;
6876 for (; setting->type != ST_NONE; (*list = *list + 1))
6877 {
6878 if ( setting->enum_idx == enum_idx &&
6879 setting->type <= ST_GROUP)
6880 {
6881 const char *short_description = setting->short_description;
6882 if (string_is_empty(short_description))
6883 return NULL;
6884
6885 if (setting->read_handler)
6886 setting->read_handler(setting);
6887
6888 return setting;
6889 }
6890 }
6891
6892 return NULL;
6893 }
6894
menu_setting_set(unsigned type,unsigned action,bool wraparound)6895 int menu_setting_set(unsigned type, unsigned action, bool wraparound)
6896 {
6897 int ret = 0;
6898 file_list_t *selection_buf = menu_entries_get_selection_buf_ptr(0);
6899 size_t selection = menu_navigation_get_selection();
6900 menu_file_list_cbs_t *cbs = selection_buf ?
6901 (menu_file_list_cbs_t*)file_list_get_actiondata_at_offset(selection_buf, selection) : NULL;
6902
6903 if (!cbs)
6904 return 0;
6905
6906 ret = menu_action_handle_setting(cbs->setting,
6907 type, action, wraparound);
6908
6909 if (ret == -1)
6910 return 0;
6911 return ret;
6912 }
6913
6914 /**
6915 * setting_action_start_savestates:
6916 * @data : pointer to setting
6917 *
6918 * Function callback for 'Savestate' action's 'Action Start'
6919 * function pointer.
6920 *
6921 * Returns: 0 on success, -1 on error.
6922 **/
setting_action_start_bind_device(rarch_setting_t * setting)6923 static int setting_action_start_bind_device(rarch_setting_t *setting)
6924 {
6925 settings_t *settings = config_get_ptr();
6926
6927 if (!setting || !settings)
6928 return -1;
6929
6930 configuration_set_uint(settings,
6931 settings->uints.input_joypad_index[setting->index_offset], setting->index_offset);
6932 return 0;
6933 }
6934
setting_action_start_custom_viewport_width(rarch_setting_t * setting)6935 static int setting_action_start_custom_viewport_width(rarch_setting_t *setting)
6936 {
6937 video_viewport_t vp;
6938 struct retro_system_av_info *av_info = video_viewport_get_system_av_info();
6939 video_viewport_t *custom = video_viewport_get_custom();
6940 settings_t *settings = config_get_ptr();
6941 struct retro_game_geometry *geom = (struct retro_game_geometry*)
6942 &av_info->geometry;
6943
6944 if (!settings || !av_info)
6945 return -1;
6946
6947 video_driver_get_viewport_info(&vp);
6948
6949 if (settings->bools.video_scale_integer)
6950 {
6951 unsigned int rotation = retroarch_get_rotation();
6952 if (rotation % 2)
6953 custom->width = ((custom->width + geom->base_height - 1) /
6954 geom->base_height) * geom->base_height;
6955 else
6956 custom->width = ((custom->width + geom->base_width - 1) /
6957 geom->base_width) * geom->base_width;
6958 }
6959 else
6960 custom->width = vp.full_width - custom->x;
6961
6962 aspectratio_lut[ASPECT_RATIO_CUSTOM].value =
6963 (float)custom->width / custom->height;
6964
6965 return 0;
6966 }
6967
setting_action_start_custom_viewport_height(rarch_setting_t * setting)6968 static int setting_action_start_custom_viewport_height(rarch_setting_t *setting)
6969 {
6970 video_viewport_t vp;
6971 struct retro_system_av_info *av_info = video_viewport_get_system_av_info();
6972 video_viewport_t *custom = video_viewport_get_custom();
6973 settings_t *settings = config_get_ptr();
6974 struct retro_game_geometry *geom = (struct retro_game_geometry*)
6975 &av_info->geometry;
6976
6977 if (!settings || !av_info)
6978 return -1;
6979
6980 video_driver_get_viewport_info(&vp);
6981
6982 if (settings->bools.video_scale_integer)
6983 {
6984 unsigned int rotation = retroarch_get_rotation();
6985 if (rotation % 2)
6986 {
6987 custom->height = ((custom->height + geom->base_width - 1) /
6988 geom->base_width) * geom->base_width;
6989 }
6990 else
6991 custom->height = ((custom->height + geom->base_height - 1) /
6992 geom->base_height) * geom->base_height;
6993 }
6994 else
6995 custom->height = vp.full_height - custom->y;
6996
6997 aspectratio_lut[ASPECT_RATIO_CUSTOM].value =
6998 (float)custom->width / custom->height;
6999
7000 return 0;
7001 }
7002
setting_action_start_analog_dpad_mode(rarch_setting_t * setting)7003 static int setting_action_start_analog_dpad_mode(rarch_setting_t *setting)
7004 {
7005 if (!setting)
7006 return -1;
7007
7008 *setting->value.target.unsigned_integer = 0;
7009
7010 return 0;
7011 }
7012
setting_action_start_libretro_device_type(rarch_setting_t * setting)7013 static int setting_action_start_libretro_device_type(rarch_setting_t *setting)
7014 {
7015 retro_ctx_controller_info_t pad;
7016 unsigned port = 0;
7017
7018 if (!setting || setting_generic_action_start_default(setting) != 0)
7019 return -1;
7020
7021 port = setting->index_offset;
7022
7023 input_config_set_device(port, RETRO_DEVICE_JOYPAD);
7024
7025 pad.port = port;
7026 pad.device = RETRO_DEVICE_JOYPAD;
7027
7028 core_set_controller_port_device(&pad);
7029
7030 return 0;
7031 }
7032
setting_action_start_input_remap_port(rarch_setting_t * setting)7033 static int setting_action_start_input_remap_port(rarch_setting_t *setting)
7034 {
7035 bool refresh = false;
7036 settings_t *settings = config_get_ptr();
7037 unsigned port;
7038
7039 if (!setting)
7040 return -1;
7041
7042 port = setting->index_offset;
7043 settings->uints.input_remap_ports[port] = port;
7044
7045 /* Must be called whenever settings->uints.input_remap_ports
7046 * is modified */
7047 input_remapping_update_port_map();
7048
7049 /* Changing mapped port may leave a core port unused;
7050 * reinitialise controllers to ensure that any such
7051 * ports are set to 'RETRO_DEVICE_NONE' */
7052 command_event(CMD_EVENT_CONTROLLER_INIT, NULL);
7053
7054 menu_entries_ctl(MENU_ENTRIES_CTL_SET_REFRESH, &refresh);
7055 menu_driver_ctl(RARCH_MENU_CTL_SET_PREVENT_POPULATE, NULL);
7056 return 0;
7057 }
7058
setting_action_start_video_refresh_rate_auto(rarch_setting_t * setting)7059 static int setting_action_start_video_refresh_rate_auto(
7060 rarch_setting_t *setting)
7061 {
7062 (void)setting;
7063
7064 video_driver_monitor_reset();
7065 return 0;
7066 }
7067
setting_action_start_mouse_index(rarch_setting_t * setting)7068 static int setting_action_start_mouse_index(rarch_setting_t *setting)
7069 {
7070 settings_t *settings = config_get_ptr();
7071
7072 if (!setting)
7073 return -1;
7074
7075 settings->uints.input_mouse_index[setting->index_offset] = 0;
7076 settings->modified = true;
7077 return 0;
7078 }
7079
7080 /**
7081 ******* ACTION TOGGLE CALLBACK FUNCTIONS *******
7082 **/
7083
setting_action_right_analog_dpad_mode(rarch_setting_t * setting,size_t idx,bool wraparound)7084 static int setting_action_right_analog_dpad_mode(
7085 rarch_setting_t *setting, size_t idx, bool wraparound)
7086 {
7087 unsigned port = 0;
7088 settings_t *settings = config_get_ptr();
7089
7090 if (!setting)
7091 return -1;
7092
7093 port = setting->index_offset;
7094
7095 settings->modified = true;
7096 settings->uints.input_analog_dpad_mode[port] =
7097 (settings->uints.input_analog_dpad_mode[port] + 1)
7098 % ANALOG_DPAD_LAST;
7099
7100 return 0;
7101 }
7102
setting_action_right_libretro_device_type(rarch_setting_t * setting,size_t idx,bool wraparound)7103 static int setting_action_right_libretro_device_type(
7104 rarch_setting_t *setting, size_t idx, bool wraparound)
7105 {
7106 bool refresh = false;
7107 retro_ctx_controller_info_t pad;
7108 unsigned current_device, current_idx, i, devices[128],
7109 types = 0, port = 0;
7110
7111 if (!setting)
7112 return -1;
7113
7114 port = setting->index_offset;
7115 types = libretro_device_get_size(devices, ARRAY_SIZE(devices), port);
7116 current_device = input_config_get_device(port);
7117 current_idx = 0;
7118 for (i = 0; i < types; i++)
7119 {
7120 if (current_device != devices[i])
7121 continue;
7122
7123 current_idx = i;
7124 break;
7125 }
7126
7127 current_device = devices
7128 [(current_idx + 1) % types];
7129
7130 input_config_set_device(port, current_device);
7131
7132 pad.port = port;
7133 pad.device = current_device;
7134
7135 core_set_controller_port_device(&pad);
7136
7137 menu_entries_ctl(MENU_ENTRIES_CTL_SET_REFRESH, &refresh);
7138 menu_driver_ctl(RARCH_MENU_CTL_SET_PREVENT_POPULATE, NULL);
7139 return 0;
7140 }
7141
setting_action_right_input_remap_port(rarch_setting_t * setting,size_t idx,bool wraparound)7142 static int setting_action_right_input_remap_port(
7143 rarch_setting_t *setting, size_t idx, bool wraparound)
7144 {
7145 bool refresh = false;
7146 unsigned port = 0;
7147 settings_t *settings = config_get_ptr();
7148
7149 if (!setting)
7150 return -1;
7151
7152 port = setting->index_offset;
7153
7154 if (settings->uints.input_remap_ports[port] < MAX_USERS - 1)
7155 settings->uints.input_remap_ports[port]++;
7156 else
7157 settings->uints.input_remap_ports[port] = 0;
7158
7159 /* Must be called whenever settings->uints.input_remap_ports
7160 * is modified */
7161 input_remapping_update_port_map();
7162
7163 /* Changing mapped port may leave a core port unused;
7164 * reinitialise controllers to ensure that any such
7165 * ports are set to 'RETRO_DEVICE_NONE' */
7166 command_event(CMD_EVENT_CONTROLLER_INIT, NULL);
7167
7168 menu_entries_ctl(MENU_ENTRIES_CTL_SET_REFRESH, &refresh);
7169 menu_driver_ctl(RARCH_MENU_CTL_SET_PREVENT_POPULATE, NULL);
7170 return 0;
7171 }
7172
setting_action_right_bind_device(rarch_setting_t * setting,size_t idx,bool wraparound)7173 static int setting_action_right_bind_device(
7174 rarch_setting_t *setting, size_t idx, bool wraparound)
7175 {
7176 unsigned index_offset;
7177 unsigned *p = NULL;
7178 unsigned max_devices = input_config_get_device_count();
7179 settings_t *settings = config_get_ptr();
7180
7181 if (!setting)
7182 return -1;
7183
7184 index_offset = setting->index_offset;
7185
7186 p = &settings->uints.input_joypad_index[index_offset];
7187
7188 if (*p < max_devices)
7189 (*p)++;
7190
7191 return 0;
7192 }
7193
setting_action_right_mouse_index(rarch_setting_t * setting,size_t idx,bool wraparound)7194 static int setting_action_right_mouse_index(
7195 rarch_setting_t *setting, size_t idx, bool wraparound)
7196 {
7197 settings_t *settings = config_get_ptr();
7198
7199 if (!setting)
7200 return -1;
7201
7202 if (settings->uints.input_mouse_index[setting->index_offset] < MAX_USERS - 1)
7203 ++settings->uints.input_mouse_index[setting->index_offset];
7204 else
7205 settings->uints.input_mouse_index[setting->index_offset] = 0;
7206
7207 settings->modified = true;
7208 return 0;
7209 }
7210
7211 /**
7212 ******* ACTION OK CALLBACK FUNCTIONS *******
7213 **/
7214
7215 static void
setting_get_string_representation_st_float_video_refresh_rate_polled(rarch_setting_t * setting,char * s,size_t len)7216 setting_get_string_representation_st_float_video_refresh_rate_polled(
7217 rarch_setting_t *setting, char *s, size_t len)
7218 {
7219 snprintf(s, len, "%.3f Hz", video_driver_get_refresh_rate());
7220 }
7221
7222 static void
setting_get_string_representation_st_float_video_refresh_rate_auto(rarch_setting_t * setting,char * s,size_t len)7223 setting_get_string_representation_st_float_video_refresh_rate_auto(
7224 rarch_setting_t *setting, char *s, size_t len)
7225 {
7226 double video_refresh_rate = 0.0;
7227 double deviation = 0.0;
7228 unsigned sample_points = 0;
7229 if (!setting)
7230 return;
7231
7232 if (video_monitor_fps_statistics(&video_refresh_rate,
7233 &deviation, &sample_points))
7234 {
7235 gfx_animation_t *p_anim = anim_get_ptr();
7236 snprintf(s, len, "%.3f Hz (%.1f%% dev, %u samples)",
7237 video_refresh_rate, 100.0 * deviation, sample_points);
7238 GFX_ANIMATION_SET_ACTIVE(p_anim);
7239 }
7240 else
7241 strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NOT_AVAILABLE), len);
7242 }
7243
7244 #ifdef HAVE_LIBNX
get_string_representation_split_joycon(rarch_setting_t * setting,char * s,size_t len)7245 static void get_string_representation_split_joycon(rarch_setting_t *setting, char *s,
7246 size_t len)
7247 {
7248 settings_t *settings = config_get_ptr();
7249 unsigned index_offset = setting->index_offset;
7250 unsigned map = settings->uints.input_split_joycon[index_offset];
7251
7252 if (map == 0)
7253 strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF), len);
7254 else
7255 strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_ON), len);
7256 }
7257 #endif
7258
get_string_representation_bind_device(rarch_setting_t * setting,char * s,size_t len)7259 static void get_string_representation_bind_device(rarch_setting_t *setting, char *s,
7260 size_t len)
7261 {
7262 unsigned index_offset, map = 0;
7263 unsigned max_devices = input_config_get_device_count();
7264 settings_t *settings = config_get_ptr();
7265
7266 if (!setting)
7267 return;
7268
7269 index_offset = setting->index_offset;
7270 map = settings->uints.input_joypad_index[index_offset];
7271
7272 if (map < max_devices)
7273 {
7274 const char *device_name = input_config_get_device_display_name(map) ?
7275 input_config_get_device_display_name(map) : input_config_get_device_name(map);
7276
7277 if (!string_is_empty(device_name))
7278 {
7279 unsigned idx = input_config_get_device_name_index(map);
7280
7281 /*if idx is non-zero, it's part of a set*/
7282 if ( idx > 0)
7283 snprintf(s, len,
7284 "%s (#%u)",
7285 device_name,
7286 idx);
7287 else
7288 strlcpy(s, device_name, len);
7289 }
7290 else
7291 snprintf(s, len,
7292 "%s (%s #%u)",
7293 msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NOT_AVAILABLE),
7294 msg_hash_to_str(MENU_ENUM_LABEL_VALUE_PORT),
7295 map);
7296 }
7297 else
7298 strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_DISABLED), len);
7299 }
7300
read_handler_audio_rate_control_delta(rarch_setting_t * setting)7301 static void read_handler_audio_rate_control_delta(rarch_setting_t *setting)
7302 {
7303 settings_t *settings = config_get_ptr();
7304
7305 if (!setting || setting->enum_idx == MSG_UNKNOWN)
7306 return;
7307
7308 *setting->value.target.fraction = *(audio_get_float_ptr(AUDIO_ACTION_RATE_CONTROL_DELTA));
7309 if (*setting->value.target.fraction < 0.0005)
7310 {
7311 configuration_set_bool(settings, settings->bools.audio_rate_control, false);
7312 audio_set_float(AUDIO_ACTION_RATE_CONTROL_DELTA, 0.0f);
7313 }
7314 else
7315 {
7316 configuration_set_bool(settings, settings->bools.audio_rate_control, true);
7317 audio_set_float(AUDIO_ACTION_RATE_CONTROL_DELTA, *setting->value.target.fraction);
7318 }
7319 }
7320
general_read_handler(rarch_setting_t * setting)7321 static void general_read_handler(rarch_setting_t *setting)
7322 {
7323 settings_t *settings = config_get_ptr();
7324
7325 if (!setting || setting->enum_idx == MSG_UNKNOWN)
7326 return;
7327
7328 switch (setting->enum_idx)
7329 {
7330 case MENU_ENUM_LABEL_AUDIO_MAX_TIMING_SKEW:
7331 *setting->value.target.fraction = settings->floats.audio_max_timing_skew;
7332 break;
7333 case MENU_ENUM_LABEL_VIDEO_REFRESH_RATE_AUTO:
7334 *setting->value.target.fraction = settings->floats.video_refresh_rate;
7335 break;
7336 case MENU_ENUM_LABEL_INPUT_PLAYER1_JOYPAD_INDEX:
7337 case MENU_ENUM_LABEL_INPUT_PLAYER2_JOYPAD_INDEX:
7338 case MENU_ENUM_LABEL_INPUT_PLAYER3_JOYPAD_INDEX:
7339 case MENU_ENUM_LABEL_INPUT_PLAYER4_JOYPAD_INDEX:
7340 case MENU_ENUM_LABEL_INPUT_PLAYER5_JOYPAD_INDEX:
7341 *setting->value.target.integer = settings->uints.input_joypad_index[setting->enum_idx - MENU_ENUM_LABEL_INPUT_PLAYER1_JOYPAD_INDEX];
7342 break;
7343 default:
7344 break;
7345 }
7346 }
7347
write_handler_get_cmd(rarch_setting_t * setting)7348 static enum event_command write_handler_get_cmd(rarch_setting_t *setting)
7349 {
7350 if (setting && setting->cmd_trigger_idx != CMD_EVENT_NONE)
7351 {
7352 if (setting->flags & SD_FLAG_EXIT)
7353 if (*setting->value.target.boolean)
7354 *setting->value.target.boolean = false;
7355
7356 if (setting->cmd_trigger_event_triggered ||
7357 (setting->flags & SD_FLAG_CMD_APPLY_AUTO))
7358 return setting->cmd_trigger_idx;
7359 }
7360 return CMD_EVENT_NONE;
7361 }
7362
write_handler_audio_rate_control_delta(rarch_setting_t * setting)7363 static void write_handler_audio_rate_control_delta(rarch_setting_t *setting)
7364 {
7365 settings_t *settings = config_get_ptr();
7366 enum event_command rarch_cmd = CMD_EVENT_NONE;
7367
7368 if (!setting)
7369 return;
7370
7371 rarch_cmd = write_handler_get_cmd(setting);
7372
7373 if (*setting->value.target.fraction < 0.0005)
7374 {
7375 configuration_set_bool(settings,
7376 settings->bools.audio_rate_control, false);
7377 audio_set_float(AUDIO_ACTION_RATE_CONTROL_DELTA, 0.0f);
7378 }
7379 else
7380 {
7381 configuration_set_bool(settings, settings->bools.audio_rate_control, true);
7382 audio_set_float(AUDIO_ACTION_RATE_CONTROL_DELTA, *setting->value.target.fraction);
7383 }
7384
7385 if (rarch_cmd || setting->cmd_trigger_event_triggered)
7386 command_event(rarch_cmd, NULL);
7387 }
7388
write_handler_logging_verbosity(rarch_setting_t * setting)7389 static void write_handler_logging_verbosity(rarch_setting_t *setting)
7390 {
7391 enum event_command rarch_cmd = CMD_EVENT_NONE;
7392
7393 if (!setting)
7394 return;
7395
7396 rarch_cmd = write_handler_get_cmd(setting);
7397
7398 if (!verbosity_is_enabled())
7399 {
7400 settings_t *settings = config_get_ptr();
7401 rarch_log_file_init(
7402 settings->bools.log_to_file,
7403 settings->bools.log_to_file_timestamp,
7404 settings->paths.log_dir);
7405 verbosity_enable();
7406 }
7407 else
7408 {
7409 verbosity_disable();
7410 rarch_log_file_deinit();
7411 }
7412 retroarch_override_setting_unset(RARCH_OVERRIDE_SETTING_VERBOSITY, NULL);
7413
7414 if (rarch_cmd || setting->cmd_trigger_event_triggered)
7415 command_event(rarch_cmd, NULL);
7416 }
7417
general_write_handler(rarch_setting_t * setting)7418 static void general_write_handler(rarch_setting_t *setting)
7419 {
7420 enum event_command rarch_cmd = CMD_EVENT_NONE;
7421
7422 if (!setting)
7423 return;
7424
7425 rarch_cmd = write_handler_get_cmd(setting);
7426
7427 switch (setting->enum_idx)
7428 {
7429 case MENU_ENUM_LABEL_VIDEO_SHADERS_ENABLE:
7430 #if defined(HAVE_CG) || defined(HAVE_GLSL) || defined(HAVE_SLANG) || defined(HAVE_HLSL)
7431 {
7432 if (*setting->value.target.boolean)
7433 {
7434 bool refresh = false;
7435 menu_entries_ctl(MENU_ENTRIES_CTL_SET_REFRESH, &refresh);
7436 menu_driver_ctl(RARCH_MENU_CTL_SET_PREVENT_POPULATE, NULL);
7437 }
7438 else
7439 {
7440 bool refresh = false;
7441 settings_t *settings = config_get_ptr();
7442 struct video_shader *shader = menu_shader_get();
7443
7444 shader->passes = 0;
7445 shader->modified = true;
7446
7447 menu_entries_ctl(MENU_ENTRIES_CTL_SET_REFRESH, &refresh);
7448 menu_driver_ctl(RARCH_MENU_CTL_SET_PREVENT_POPULATE, NULL);
7449 command_event(CMD_EVENT_SHADERS_APPLY_CHANGES, NULL);
7450 configuration_set_bool(settings, settings->bools.video_shader_enable, false);
7451 }
7452 }
7453 #endif
7454 break;
7455 case MENU_ENUM_LABEL_VIDEO_THREADED:
7456 {
7457 if (*setting->value.target.boolean)
7458 task_queue_set_threaded();
7459 else
7460 task_queue_unset_threaded();
7461 }
7462 break;
7463 case MENU_ENUM_LABEL_INPUT_POLL_TYPE_BEHAVIOR:
7464 core_set_poll_type(*setting->value.target.integer);
7465 break;
7466 case MENU_ENUM_LABEL_VIDEO_SCALE_INTEGER:
7467 {
7468 video_viewport_t vp;
7469 struct retro_system_av_info *av_info = video_viewport_get_system_av_info();
7470 video_viewport_t *custom = video_viewport_get_custom();
7471 struct retro_game_geometry *geom = (struct retro_game_geometry*)
7472 &av_info->geometry;
7473
7474 video_driver_get_viewport_info(&vp);
7475
7476 if (*setting->value.target.boolean)
7477 {
7478 unsigned int rotation = retroarch_get_rotation();
7479
7480 custom->x = 0;
7481 custom->y = 0;
7482
7483 if (rotation % 2)
7484 {
7485 custom->width = ((custom->width + geom->base_height - 1) / geom->base_height) * geom->base_height;
7486 custom->height = ((custom->height + geom->base_width - 1) / geom->base_width) * geom->base_width;
7487 }
7488 else
7489 {
7490 custom->width = ((custom->width + geom->base_width - 1) / geom->base_width) * geom->base_width;
7491 custom->height = ((custom->height + geom->base_height - 1) / geom->base_height) * geom->base_height;
7492 }
7493 aspectratio_lut[ASPECT_RATIO_CUSTOM].value =
7494 (float)custom->width / custom->height;
7495 }
7496 }
7497 break;
7498 case MENU_ENUM_LABEL_HELP:
7499 if (*setting->value.target.boolean)
7500 {
7501 menu_displaylist_info_t info;
7502 settings_t *settings = config_get_ptr();
7503 file_list_t *menu_stack = menu_entries_get_menu_stack_ptr(0);
7504
7505 menu_displaylist_info_init(&info);
7506
7507 info.enum_idx = MENU_ENUM_LABEL_HELP;
7508 info.label = strdup(
7509 msg_hash_to_str(MENU_ENUM_LABEL_HELP));
7510 info.list = menu_stack;
7511
7512 if (menu_displaylist_ctl(DISPLAYLIST_GENERIC, &info, settings))
7513 menu_displaylist_process(&info);
7514 menu_displaylist_info_free(&info);
7515 setting_set_with_string_representation(setting, "false");
7516 }
7517 break;
7518 case MENU_ENUM_LABEL_AUDIO_MAX_TIMING_SKEW:
7519 {
7520 settings_t *settings = config_get_ptr();
7521 configuration_set_float(settings,
7522 settings->floats.audio_max_timing_skew,
7523 *setting->value.target.fraction);
7524 }
7525 break;
7526 case MENU_ENUM_LABEL_VIDEO_REFRESH_RATE_AUTO:
7527 driver_ctl(RARCH_DRIVER_CTL_SET_REFRESH_RATE, setting->value.target.fraction);
7528
7529 /* In case refresh rate update forced non-block video. */
7530 rarch_cmd = CMD_EVENT_VIDEO_SET_BLOCKING_STATE;
7531 break;
7532 case MENU_ENUM_LABEL_VIDEO_REFRESH_RATE_POLLED:
7533 driver_ctl(RARCH_DRIVER_CTL_SET_REFRESH_RATE, setting->value.target.fraction);
7534
7535 /* In case refresh rate update forced non-block video. */
7536 rarch_cmd = CMD_EVENT_VIDEO_SET_BLOCKING_STATE;
7537 break;
7538 #if defined(DINGUX) && defined(DINGUX_BETA)
7539 case MENU_ENUM_LABEL_VIDEO_DINGUX_REFRESH_RATE:
7540 {
7541 settings_t *settings = config_get_ptr();
7542 enum dingux_refresh_rate
7543 current_refresh_rate = DINGUX_REFRESH_RATE_60HZ;
7544 enum dingux_refresh_rate
7545 target_refresh_rate =
7546 (enum dingux_refresh_rate)settings->uints.video_dingux_refresh_rate;
7547 bool refresh_rate_valid = false;
7548
7549 /* Get current refresh rate */
7550 refresh_rate_valid = dingux_get_video_refresh_rate(¤t_refresh_rate);
7551
7552 /* Check if refresh rate has changed */
7553 if (!refresh_rate_valid ||
7554 (current_refresh_rate != target_refresh_rate))
7555 {
7556 /* Get floating point representation of
7557 * new refresh rate */
7558 float hw_refresh_rate = 60.0f;
7559
7560 switch (target_refresh_rate)
7561 {
7562 case DINGUX_REFRESH_RATE_50HZ:
7563 hw_refresh_rate = 50.0f;
7564 default:
7565 break;
7566 }
7567
7568 /* Manually update 'settings->floats.video_refresh_rate'
7569 * (required for correct timing adjustments when
7570 * reinitialising drivers) */
7571 configuration_set_float(settings,
7572 settings->floats.video_refresh_rate,
7573 hw_refresh_rate);
7574
7575 /* Trigger driver reinitialisation */
7576 rarch_cmd = CMD_EVENT_REINIT;
7577 }
7578 }
7579 break;
7580 #endif
7581 case MENU_ENUM_LABEL_VIDEO_SCALE:
7582 {
7583 settings_t *settings = config_get_ptr();
7584 settings->modified = true;
7585 settings->floats.video_scale = roundf(*setting->value.target.fraction);
7586
7587 if (!settings->bools.video_fullscreen)
7588 rarch_cmd = CMD_EVENT_REINIT;
7589 }
7590 break;
7591 case MENU_ENUM_LABEL_INPUT_MAX_USERS:
7592 command_event(CMD_EVENT_CONTROLLER_INIT, NULL);
7593 break;
7594 case MENU_ENUM_LABEL_INPUT_PLAYER1_JOYPAD_INDEX:
7595 case MENU_ENUM_LABEL_INPUT_PLAYER2_JOYPAD_INDEX:
7596 case MENU_ENUM_LABEL_INPUT_PLAYER3_JOYPAD_INDEX:
7597 case MENU_ENUM_LABEL_INPUT_PLAYER4_JOYPAD_INDEX:
7598 case MENU_ENUM_LABEL_INPUT_PLAYER5_JOYPAD_INDEX:
7599 {
7600 settings_t *settings = config_get_ptr();
7601 settings->modified = true;
7602 settings->uints.input_joypad_index[setting->enum_idx - MENU_ENUM_LABEL_INPUT_PLAYER1_JOYPAD_INDEX] = *setting->value.target.integer;
7603 }
7604 break;
7605 case MENU_ENUM_LABEL_LOG_TO_FILE:
7606 if (verbosity_is_enabled())
7607 {
7608 settings_t *settings = config_get_ptr();
7609 bool log_to_file = settings->bools.log_to_file;
7610 bool log_to_file_timestamp = settings->bools.log_to_file_timestamp;
7611 const char *log_dir = settings->paths.log_dir;
7612 bool logging_to_file = is_logging_to_file();
7613
7614 if (log_to_file && !logging_to_file)
7615 rarch_log_file_init(
7616 log_to_file,
7617 log_to_file_timestamp,
7618 log_dir);
7619 else if (!log_to_file && logging_to_file)
7620 rarch_log_file_deinit();
7621 }
7622 retroarch_override_setting_unset(RARCH_OVERRIDE_SETTING_LOG_TO_FILE, NULL);
7623 break;
7624 case MENU_ENUM_LABEL_LOG_DIR:
7625 case MENU_ENUM_LABEL_LOG_TO_FILE_TIMESTAMP:
7626 if (verbosity_is_enabled() && is_logging_to_file())
7627 {
7628 settings_t *settings = config_get_ptr();
7629 bool log_to_file = settings->bools.log_to_file;
7630 bool log_to_file_timestamp = settings->bools.log_to_file_timestamp;
7631 const char *log_dir = settings->paths.log_dir;
7632
7633 rarch_log_file_deinit();
7634 rarch_log_file_init(
7635 log_to_file,
7636 log_to_file_timestamp,
7637 log_dir);
7638 }
7639 break;
7640 case MENU_ENUM_LABEL_VIDEO_SMOOTH:
7641 case MENU_ENUM_LABEL_VIDEO_CTX_SCALING:
7642 #if defined(DINGUX)
7643 case MENU_ENUM_LABEL_VIDEO_DINGUX_IPU_FILTER_TYPE:
7644 #if defined(RS90)
7645 case MENU_ENUM_LABEL_VIDEO_DINGUX_RS90_SOFTFILTER_TYPE:
7646 #endif
7647 #endif
7648 {
7649 settings_t *settings = config_get_ptr();
7650 video_driver_set_filtering(1, settings->bools.video_smooth,
7651 settings->bools.video_ctx_scaling);
7652 }
7653 break;
7654 case MENU_ENUM_LABEL_VIDEO_ROTATION:
7655 {
7656 rarch_system_info_t *system = runloop_get_system_info();
7657 video_viewport_t vp;
7658 struct retro_system_av_info *av_info = video_viewport_get_system_av_info();
7659 video_viewport_t *custom = video_viewport_get_custom();
7660 struct retro_game_geometry *geom = (struct retro_game_geometry*)
7661 &av_info->geometry;
7662
7663 if (system)
7664 {
7665 unsigned int rotation = retroarch_get_rotation();
7666
7667 video_driver_set_rotation(
7668 (*setting->value.target.unsigned_integer +
7669 system->rotation) % 4);
7670
7671 /* Update Custom Aspect Ratio values */
7672 video_driver_get_viewport_info(&vp);
7673 custom->x = 0;
7674 custom->y = 0;
7675 /* Round down when rotation is "horizontal", round up when rotation is "vertical"
7676 to avoid expanding viewport each time user rotates */
7677 if (rotation % 2)
7678 {
7679 custom->width = MAX(1,(custom->width / geom->base_height)) * geom->base_height;
7680 custom->height = MAX(1,(custom->height/ geom->base_width )) * geom->base_width;
7681 }
7682 else
7683 {
7684 custom->width = ((custom->width + geom->base_width - 1) / geom->base_width) * geom->base_width;
7685 custom->height = ((custom->height + geom->base_height - 1) / geom->base_height) * geom->base_height;
7686 }
7687 aspectratio_lut[ASPECT_RATIO_CUSTOM].value =
7688 (float)custom->width / custom->height;
7689
7690 /* Update Aspect Ratio (only useful for 1:1 PAR) */
7691 video_driver_set_aspect_ratio();
7692 }
7693 }
7694 break;
7695 case MENU_ENUM_LABEL_SCREEN_ORIENTATION:
7696 {
7697 #ifndef ANDROID
7698 /* FIXME: Changing at runtime on Android causes setting to somehow be incremented again, many times */
7699 video_display_server_set_screen_orientation(
7700 (enum rotation)(*setting->value.target.unsigned_integer));
7701 #endif
7702 }
7703 break;
7704 case MENU_ENUM_LABEL_AUDIO_VOLUME:
7705 audio_set_float(AUDIO_ACTION_VOLUME_GAIN, *setting->value.target.fraction);
7706 break;
7707 case MENU_ENUM_LABEL_AUDIO_MIXER_VOLUME:
7708 #ifdef HAVE_AUDIOMIXER
7709 audio_set_float(AUDIO_ACTION_MIXER_VOLUME_GAIN, *setting->value.target.fraction);
7710 #endif
7711 break;
7712 case MENU_ENUM_LABEL_AUDIO_LATENCY:
7713 case MENU_ENUM_LABEL_AUDIO_OUTPUT_RATE:
7714 case MENU_ENUM_LABEL_AUDIO_WASAPI_EXCLUSIVE_MODE:
7715 case MENU_ENUM_LABEL_AUDIO_WASAPI_FLOAT_FORMAT:
7716 case MENU_ENUM_LABEL_AUDIO_WASAPI_SH_BUFFER_LENGTH:
7717 rarch_cmd = CMD_EVENT_AUDIO_REINIT;
7718 break;
7719 case MENU_ENUM_LABEL_PAL60_ENABLE:
7720 {
7721 global_t *global = global_get_ptr();
7722 if (*setting->value.target.boolean && global->console.screen.pal_enable)
7723 rarch_cmd = CMD_EVENT_REINIT;
7724 else
7725 setting_set_with_string_representation(setting, "false");
7726 }
7727 break;
7728 case MENU_ENUM_LABEL_SYSTEM_BGM_ENABLE:
7729 if (*setting->value.target.boolean)
7730 {
7731 #if !defined(__PSL1GHT__) && defined(__PS3__)
7732 cellSysutilEnableBgmPlayback();
7733 #endif
7734 }
7735 else
7736 {
7737 #if !defined(__PSL1GHT__) && defined(__PS3__)
7738 cellSysutilDisableBgmPlayback();
7739 #endif
7740 }
7741 break;
7742 case MENU_ENUM_LABEL_AUDIO_ENABLE_MENU:
7743 {
7744 #ifdef HAVE_AUDIOMIXER
7745 settings_t *settings = config_get_ptr();
7746 if (settings->bools.audio_enable_menu)
7747 audio_driver_load_system_sounds();
7748 else
7749 audio_driver_mixer_stop_stream(AUDIO_MIXER_SYSTEM_SLOT_BGM);
7750 #endif
7751 }
7752 break;
7753 case MENU_ENUM_LABEL_MENU_SOUND_BGM:
7754 {
7755 #ifdef HAVE_AUDIOMIXER
7756 settings_t *settings = config_get_ptr();
7757 if (settings->bools.audio_enable_menu)
7758 {
7759 if (settings->bools.audio_enable_menu_bgm)
7760 audio_driver_mixer_play_menu_sound_looped(AUDIO_MIXER_SYSTEM_SLOT_BGM);
7761 else
7762 audio_driver_mixer_stop_stream(AUDIO_MIXER_SYSTEM_SLOT_BGM);
7763 }
7764 #endif
7765 }
7766 break;
7767 case MENU_ENUM_LABEL_VIDEO_WINDOW_OPACITY:
7768 {
7769 settings_t *settings = config_get_ptr();
7770 video_display_server_set_window_opacity(settings->uints.video_window_opacity);
7771 }
7772 break;
7773 case MENU_ENUM_LABEL_VIDEO_WINDOW_SHOW_DECORATIONS:
7774 {
7775 settings_t *settings = config_get_ptr();
7776 video_display_server_set_window_decorations(settings->bools.video_window_show_decorations);
7777 }
7778 break;
7779 case MENU_ENUM_LABEL_MIDI_INPUT:
7780 {
7781 settings_t *settings = config_get_ptr();
7782 midi_driver_set_input(settings->arrays.midi_input);
7783 }
7784 break;
7785 case MENU_ENUM_LABEL_MIDI_OUTPUT:
7786 {
7787 settings_t *settings = config_get_ptr();
7788 midi_driver_set_output(settings->arrays.midi_output);
7789 }
7790 break;
7791 case MENU_ENUM_LABEL_MIDI_VOLUME:
7792 {
7793 settings_t *settings = config_get_ptr();
7794 midi_driver_set_volume(settings->uints.midi_volume);
7795 }
7796 break;
7797 case MENU_ENUM_LABEL_SUSTAINED_PERFORMANCE_MODE:
7798 {
7799 settings_t *settings = config_get_ptr();
7800 frontend_driver_set_sustained_performance_mode(settings->bools.sustained_performance_mode);
7801 }
7802 break;
7803 case MENU_ENUM_LABEL_REWIND_BUFFER_SIZE_STEP:
7804 {
7805 rarch_setting_t *buffer_size_setting = menu_setting_find_enum(MENU_ENUM_LABEL_REWIND_BUFFER_SIZE);
7806 if (buffer_size_setting)
7807 buffer_size_setting->step = (*setting->value.target.unsigned_integer)*1024*1024;
7808 }
7809 break;
7810 case MENU_ENUM_LABEL_CHEAT_MEMORY_SEARCH_SIZE:
7811 #ifdef HAVE_CHEATS
7812 {
7813 rarch_setting_t *setting = menu_setting_find_enum(MENU_ENUM_LABEL_CHEAT_VALUE);
7814 if (setting)
7815 {
7816 *(setting->value.target.unsigned_integer) = 0;
7817 setting->max = cheat_manager_get_state_search_size(cheat_manager_state.working_cheat.memory_search_size);
7818 }
7819 setting = menu_setting_find_enum(MENU_ENUM_LABEL_CHEAT_RUMBLE_VALUE);
7820 if (setting)
7821 {
7822 *setting->value.target.unsigned_integer = 0;
7823 setting->max = cheat_manager_get_state_search_size(cheat_manager_state.working_cheat.memory_search_size);
7824 }
7825 setting = menu_setting_find_enum(MENU_ENUM_LABEL_CHEAT_ADDRESS_BIT_POSITION);
7826 if (setting)
7827 {
7828 int max_bit_position;
7829 *setting->value.target.unsigned_integer = 0;
7830 max_bit_position = cheat_manager_state.working_cheat.memory_search_size<3 ? 255 : 0;
7831 setting->max = max_bit_position;
7832 }
7833 }
7834 #endif
7835 break;
7836 case MENU_ENUM_LABEL_CHEAT_START_OR_RESTART:
7837 #ifdef HAVE_CHEATS
7838 {
7839 rarch_setting_t *setting = menu_setting_find_enum(MENU_ENUM_LABEL_CHEAT_SEARCH_EXACT);
7840 if (setting)
7841 {
7842 *setting->value.target.unsigned_integer = 0;
7843 setting->max = cheat_manager_get_state_search_size(cheat_manager_state.search_bit_size);
7844 }
7845 setting = menu_setting_find_enum(MENU_ENUM_LABEL_CHEAT_SEARCH_EQPLUS);
7846 if (setting)
7847 {
7848 *setting->value.target.unsigned_integer = 0;
7849 setting->max = cheat_manager_get_state_search_size(cheat_manager_state.search_bit_size);
7850 }
7851 setting = menu_setting_find_enum(MENU_ENUM_LABEL_CHEAT_SEARCH_EQMINUS);
7852 if (setting)
7853 {
7854 *setting->value.target.unsigned_integer = 0;
7855 setting->max = cheat_manager_get_state_search_size(cheat_manager_state.search_bit_size);
7856 }
7857 }
7858 #endif
7859 break;
7860 case MENU_ENUM_LABEL_CONTENT_FAVORITES_SIZE:
7861 {
7862 unsigned new_capacity;
7863 settings_t *settings = config_get_ptr();
7864 int content_favorites_size = settings->ints.content_favorites_size;
7865
7866 /* Get new size */
7867 if (content_favorites_size < 0)
7868 new_capacity = COLLECTION_SIZE;
7869 else
7870 new_capacity = (unsigned)content_favorites_size;
7871
7872 /* Check whether capacity has changed */
7873 if (new_capacity != playlist_capacity(g_defaults.content_favorites))
7874 {
7875 /* Remove excess entries, if required */
7876 while (playlist_size(g_defaults.content_favorites) > new_capacity)
7877 playlist_delete_index(
7878 g_defaults.content_favorites,
7879 playlist_size(g_defaults.content_favorites) - 1);
7880
7881 /* In all cases, need to close and reopen
7882 * playlist file (to update maximum capacity) */
7883 rarch_favorites_deinit();
7884 rarch_favorites_init();
7885 }
7886 }
7887 break;
7888 case MENU_ENUM_LABEL_MANUAL_CONTENT_SCAN_SYSTEM_NAME_CUSTOM:
7889 /* Ensure that custom system name includes no
7890 * invalid characters */
7891 manual_content_scan_scrub_system_name_custom();
7892 break;
7893 case MENU_ENUM_LABEL_MANUAL_CONTENT_SCAN_FILE_EXTS:
7894 /* Ensure that custom file extension list includes
7895 * no period (full stop) characters, and converts
7896 * string to lower case */
7897 manual_content_scan_scrub_file_exts_custom();
7898 break;
7899 case MENU_ENUM_LABEL_MANUAL_CONTENT_SCAN_DAT_FILE:
7900 /* Ensure that DAT file path is valid
7901 * (cannot check file contents here - DAT
7902 * files are too large to load in the UI
7903 * thread - have to wait until the scan task
7904 * is pushed) */
7905 switch (manual_content_scan_validate_dat_file_path())
7906 {
7907 case MANUAL_CONTENT_SCAN_DAT_FILE_INVALID:
7908 runloop_msg_queue_push(
7909 msg_hash_to_str(MSG_MANUAL_CONTENT_SCAN_DAT_FILE_INVALID),
7910 1, 100, true,
7911 NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO);
7912 break;
7913 case MANUAL_CONTENT_SCAN_DAT_FILE_TOO_LARGE:
7914 runloop_msg_queue_push(
7915 msg_hash_to_str(MSG_MANUAL_CONTENT_SCAN_DAT_FILE_TOO_LARGE),
7916 1, 100, true,
7917 NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO);
7918 break;
7919 default:
7920 /* No action required */
7921 break;
7922 }
7923 break;
7924 case MENU_ENUM_LABEL_CHEEVOS_USERNAME:
7925 {
7926 settings_t *settings = config_get_ptr();
7927 /* when changing the username, clear out the password and token */
7928 settings->arrays.cheevos_password[0] = '\0';
7929 settings->arrays.cheevos_token[0] = '\0';
7930 }
7931 break;
7932 case MENU_ENUM_LABEL_CHEEVOS_PASSWORD:
7933 {
7934 settings_t *settings = config_get_ptr();
7935 /* when changing the password, clear out the token */
7936 settings->arrays.cheevos_token[0] = '\0';
7937 }
7938 break;
7939 case MENU_ENUM_LABEL_CHEEVOS_UNLOCK_SOUND_ENABLE:
7940 {
7941 #ifdef HAVE_AUDIOMIXER
7942 settings_t *settings = config_get_ptr();
7943 if (settings->bools.cheevos_unlock_sound_enable)
7944 audio_driver_load_system_sounds();
7945 #endif
7946 }
7947 break;
7948 case MENU_ENUM_LABEL_INPUT_SENSORS_ENABLE:
7949 /* When toggling sensor input off, ensure
7950 * that all sensors are actually disabled */
7951 if (!*setting->value.target.boolean)
7952 {
7953 unsigned i;
7954
7955 for (i = 0; i < DEFAULT_MAX_PADS; i++)
7956 {
7957 /* Event rate does not matter when disabling
7958 * sensors - set to zero */
7959 input_sensor_set_state(i,
7960 RETRO_SENSOR_ACCELEROMETER_DISABLE, 0);
7961 input_sensor_set_state(i,
7962 RETRO_SENSOR_GYROSCOPE_DISABLE, 0);
7963 input_sensor_set_state(i,
7964 RETRO_SENSOR_ILLUMINANCE_DISABLE, 0);
7965 }
7966 }
7967 break;
7968 case MENU_ENUM_LABEL_BRIGHTNESS_CONTROL:
7969 {
7970 frontend_driver_set_screen_brightness(
7971 *setting->value.target.unsigned_integer);
7972 }
7973 break;
7974 case MENU_ENUM_LABEL_WIFI_ENABLED:
7975 #ifdef HAVE_NETWORKING
7976 if (*setting->value.target.boolean)
7977 task_push_wifi_enable(NULL);
7978 else
7979 task_push_wifi_disable(NULL);
7980 #endif
7981 break;
7982 case MENU_ENUM_LABEL_CORE_INFO_CACHE_ENABLE:
7983 {
7984 settings_t *settings = config_get_ptr();
7985 const char *dir_libretro = settings->paths.directory_libretro;
7986 const char *path_libretro_info = settings->paths.path_libretro_info;
7987
7988 /* When enabling the core info cache,
7989 * force a cache refresh on the next
7990 * core info initialisation */
7991 if (*setting->value.target.boolean)
7992 if (!core_info_cache_force_refresh(!string_is_empty(path_libretro_info) ?
7993 path_libretro_info : dir_libretro))
7994 {
7995 /* core_info_cache_force_refresh() will fail
7996 * if we cannot write to the the core_info
7997 * directory. This will typically only happen
7998 * on platforms where the core_info directory
7999 * is explicitly (and intentionally) placed on
8000 * read-only storage. In this case, core info
8001 * caching cannot function correctly anyway,
8002 * so we simply force-disable the feature */
8003 configuration_set_bool(settings,
8004 settings->bools.core_info_cache_enable, false);
8005 runloop_msg_queue_push(
8006 msg_hash_to_str(MSG_CORE_INFO_CACHE_UNSUPPORTED),
8007 1, 100, true,
8008 NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO);
8009 }
8010 }
8011 break;
8012 default:
8013 /* Special cases */
8014
8015 /* > Mapped Port (virtual -> 'physical' port mapping)
8016 * Occupies a range of enum indices, so cannot
8017 * simply switch on the value */
8018 if ((setting->enum_idx >= MENU_ENUM_LABEL_INPUT_REMAP_PORT) &&
8019 (setting->enum_idx <= MENU_ENUM_LABEL_INPUT_REMAP_PORT_LAST))
8020 {
8021 /* Must be called whenever settings->uints.input_remap_ports
8022 * is modified */
8023 input_remapping_update_port_map();
8024
8025 /* Changing mapped port may leave a core port unused;
8026 * reinitialise controllers to ensure that any such
8027 * ports are set to 'RETRO_DEVICE_NONE' */
8028 command_event(CMD_EVENT_CONTROLLER_INIT, NULL);
8029 }
8030
8031 break;
8032 }
8033
8034 if (rarch_cmd || setting->cmd_trigger_event_triggered)
8035 command_event(rarch_cmd, NULL);
8036 }
8037
frontend_log_level_change_handler(rarch_setting_t * setting)8038 static void frontend_log_level_change_handler(rarch_setting_t *setting)
8039 {
8040 if (!setting)
8041 return;
8042
8043 verbosity_set_log_level(*setting->value.target.unsigned_integer);
8044 }
8045
8046 #ifdef HAVE_OVERLAY
overlay_enable_toggle_change_handler(rarch_setting_t * setting)8047 static void overlay_enable_toggle_change_handler(rarch_setting_t *setting)
8048 {
8049 settings_t *settings = config_get_ptr();
8050 bool input_overlay_hide_in_menu = settings ? settings->bools.input_overlay_hide_in_menu : false;
8051
8052 if (!setting)
8053 return;
8054
8055 if (input_overlay_hide_in_menu)
8056 {
8057 command_event(CMD_EVENT_OVERLAY_DEINIT, NULL);
8058 return;
8059 }
8060
8061 if (setting->value.target.boolean)
8062 command_event(CMD_EVENT_OVERLAY_INIT, NULL);
8063 else
8064 command_event(CMD_EVENT_OVERLAY_DEINIT, NULL);
8065 }
8066
overlay_auto_rotate_toggle_change_handler(rarch_setting_t * setting)8067 static void overlay_auto_rotate_toggle_change_handler(rarch_setting_t *setting)
8068 {
8069 settings_t *settings = config_get_ptr();
8070
8071 if (!setting || !settings)
8072 return;
8073
8074 /* This is very simple...
8075 * The menu is currently active, so if:
8076 * - Overlays are enabled
8077 * - Overlays are not hidden in menus
8078 * ...we just need to de-initialise then
8079 * initialise the current overlay and the
8080 * auto-rotate setting will be applied
8081 * (i.e. There's no need to explicitly
8082 * call the internal 'rotate overlay'
8083 * function - saves having to expose it
8084 * via the API) */
8085 if (settings->bools.input_overlay_enable &&
8086 !settings->bools.input_overlay_hide_in_menu)
8087 {
8088 command_event(CMD_EVENT_OVERLAY_DEINIT, NULL);
8089 command_event(CMD_EVENT_OVERLAY_INIT, NULL);
8090 }
8091 }
8092 #endif
8093
8094 #ifdef HAVE_VIDEO_LAYOUT
change_handler_video_layout_enable(rarch_setting_t * setting)8095 static void change_handler_video_layout_enable(rarch_setting_t *setting)
8096 {
8097 if (*setting->value.target.boolean)
8098 {
8099 settings_t *settings = config_get_ptr();
8100 void *driver = video_driver_get_ptr();
8101
8102 video_layout_init(driver, video_driver_layout_render_interface());
8103 video_layout_load(settings->paths.path_video_layout);
8104 video_layout_view_select(settings->uints.video_layout_selected_view);
8105 }
8106 else
8107 {
8108 video_layout_deinit();
8109 }
8110 }
8111
change_handler_video_layout_path(rarch_setting_t * setting)8112 static void change_handler_video_layout_path(rarch_setting_t *setting)
8113 {
8114 settings_t *settings = config_get_ptr();
8115 configuration_set_uint(settings,
8116 settings->uints.video_layout_selected_view, 0);
8117
8118 video_layout_load(setting->value.target.string);
8119 }
8120
change_handler_video_layout_selected_view(rarch_setting_t * setting)8121 static void change_handler_video_layout_selected_view(rarch_setting_t *setting)
8122 {
8123 unsigned *v = setting->value.target.unsigned_integer;
8124 *v = video_layout_view_select(*v);
8125 }
8126 #endif
8127
8128 #ifdef HAVE_CHEEVOS
achievement_hardcore_mode_write_handler(rarch_setting_t * setting)8129 static void achievement_hardcore_mode_write_handler(rarch_setting_t *setting)
8130 {
8131 rcheevos_hardcore_enabled_changed();
8132 }
8133
achievement_leaderboards_enabled_write_handler(rarch_setting_t * setting)8134 static void achievement_leaderboards_enabled_write_handler(rarch_setting_t* setting)
8135 {
8136 rcheevos_leaderboards_enabled_changed();
8137 }
8138
achievement_leaderboards_get_string_representation(rarch_setting_t * setting,char * s,size_t len)8139 static void achievement_leaderboards_get_string_representation(rarch_setting_t* setting, char* s, size_t len)
8140 {
8141 const char* value = setting->value.target.string;
8142 #if defined(HAVE_GFX_WIDGETS)
8143 if (string_is_equal(value, "true"))
8144 strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_ENABLED), len);
8145 else if (string_is_equal(value, "trackers"))
8146 strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CHEEVOS_TRACKERS_ONLY), len);
8147 else if (string_is_equal(value, "notifications"))
8148 strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CHEEVOS_NOTIFICATIONS_ONLY), len);
8149 else
8150 strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_DISABLED), len);
8151 #else
8152 /* using these enum strings makes the widget behave like a boolean toggle */
8153 if (string_is_equal(value, "true"))
8154 strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_ON), len);
8155 else
8156 strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF), len);
8157 #endif
8158 }
8159
8160 #endif
8161
update_streaming_url_write_handler(rarch_setting_t * setting)8162 static void update_streaming_url_write_handler(rarch_setting_t *setting)
8163 {
8164 recording_driver_update_streaming_url();
8165 }
8166
8167 #ifdef HAVE_LAKKA
systemd_service_toggle(const char * path,char * unit,bool enable)8168 static void systemd_service_toggle(const char *path, char *unit, bool enable)
8169 {
8170 pid_t pid = fork();
8171 char* args[] = {(char*)"systemctl",
8172 enable ? (char*)"start" : (char*)"stop",
8173 unit,
8174 NULL};
8175
8176 if (pid == 0)
8177 {
8178 if (enable)
8179 filestream_close(filestream_open(path,
8180 RETRO_VFS_FILE_ACCESS_WRITE,
8181 RETRO_VFS_FILE_ACCESS_HINT_NONE));
8182 else
8183 filestream_delete(path);
8184
8185 execvp(args[0], args);
8186 }
8187 }
8188
ssh_enable_toggle_change_handler(rarch_setting_t * setting)8189 static void ssh_enable_toggle_change_handler(rarch_setting_t *setting)
8190 {
8191 systemd_service_toggle(LAKKA_SSH_PATH, (char*)"sshd.service",
8192 *setting->value.target.boolean);
8193 }
8194
samba_enable_toggle_change_handler(rarch_setting_t * setting)8195 static void samba_enable_toggle_change_handler(rarch_setting_t *setting)
8196 {
8197 systemd_service_toggle(LAKKA_SAMBA_PATH, (char*)"smbd.service",
8198 *setting->value.target.boolean);
8199 }
8200
bluetooth_enable_toggle_change_handler(rarch_setting_t * setting)8201 static void bluetooth_enable_toggle_change_handler(rarch_setting_t *setting)
8202 {
8203 systemd_service_toggle(LAKKA_BLUETOOTH_PATH, (char*)"bluetooth.service",
8204 *setting->value.target.boolean);
8205 }
8206
localap_enable_toggle_change_handler(rarch_setting_t * setting)8207 static void localap_enable_toggle_change_handler(rarch_setting_t *setting)
8208 {
8209 driver_wifi_tether_start_stop(*setting->value.target.boolean,
8210 LAKKA_LOCALAP_PATH);
8211 }
8212
timezone_change_handler(rarch_setting_t * setting)8213 static void timezone_change_handler(rarch_setting_t *setting)
8214 {
8215 if (!setting)
8216 return;
8217
8218 config_set_timezone(setting->value.target.string);
8219
8220 RFILE *tzfp = filestream_open(LAKKA_TIMEZONE_PATH,
8221 RETRO_VFS_FILE_ACCESS_WRITE,
8222 RETRO_VFS_FILE_ACCESS_HINT_NONE);
8223
8224 if (tzfp != NULL)
8225 {
8226 filestream_printf(tzfp, "TIMEZONE=%s", setting->value.target.string);
8227 filestream_close(tzfp);
8228 }
8229 }
8230 #endif
8231
setting_append_list_input_player_options(rarch_setting_t ** list,rarch_setting_info_t * list_info,const char * parent_group,unsigned user)8232 static bool setting_append_list_input_player_options(
8233 rarch_setting_t **list,
8234 rarch_setting_info_t *list_info,
8235 const char *parent_group,
8236 unsigned user)
8237 {
8238 /* This constants matches the string length.
8239 * Keep it up to date or you'll get some really obvious bugs.
8240 * 2 is the length of '99'; we don't need more users than that.
8241 */
8242 static char buffer[MAX_USERS][13+2+1];
8243 static char group_lbl[MAX_USERS][255];
8244 unsigned i, j;
8245 rarch_setting_group_info_t group_info;
8246 rarch_setting_group_info_t subgroup_info;
8247 settings_t *settings = config_get_ptr();
8248 rarch_system_info_t *system = runloop_get_system_info();
8249 const struct retro_keybind* const defaults =
8250 (user == 0) ? retro_keybinds_1 : retro_keybinds_rest;
8251 const char *temp_value = msg_hash_to_str
8252 ((enum msg_hash_enums)(MENU_ENUM_LABEL_INPUT_USER_1_BINDS + user));
8253
8254 group_info.name = NULL;
8255 subgroup_info.name = NULL;
8256
8257 strlcat(buffer[user], "", sizeof(buffer[user]));
8258
8259 strlcpy(group_lbl[user], temp_value, sizeof(group_lbl[user]));
8260
8261 START_GROUP(list, list_info, &group_info, group_lbl[user], parent_group);
8262
8263 parent_group = msg_hash_to_str(MENU_ENUM_LABEL_SETTINGS);
8264
8265 START_SUB_GROUP(
8266 list,
8267 list_info,
8268 buffer[user],
8269 &group_info,
8270 &subgroup_info,
8271 parent_group);
8272
8273 {
8274 char tmp_string[PATH_MAX_LENGTH];
8275 /* These constants match the string lengths.
8276 * Keep them up to date or you'll get some really obvious bugs.
8277 * 2 is the length of '99'; we don't need more users than that.
8278 */
8279 /* FIXME/TODO - really need to clean up this mess in some way. */
8280 static char key[MAX_USERS][64];
8281 static char key_type[MAX_USERS][64];
8282 static char key_analog[MAX_USERS][64];
8283 static char key_bind_all[MAX_USERS][64];
8284 static char key_bind_all_save_autoconfig[MAX_USERS][64];
8285 static char split_joycon[MAX_USERS][64];
8286 static char split_joycon_lbl[MAX_USERS][64];
8287 static char key_bind_defaults[MAX_USERS][64];
8288 static char mouse_index[MAX_USERS][64];
8289
8290 static char label[MAX_USERS][64];
8291 static char label_type[MAX_USERS][64];
8292 static char label_analog[MAX_USERS][64];
8293 static char label_bind_all[MAX_USERS][64];
8294 static char label_bind_all_save_autoconfig[MAX_USERS][64];
8295 static char label_bind_defaults[MAX_USERS][64];
8296 static char label_mouse_index[MAX_USERS][64];
8297
8298 tmp_string[0] = '\0';
8299
8300 snprintf(tmp_string, sizeof(tmp_string), "input_player%u", user + 1);
8301
8302 fill_pathname_join_delim(key[user], tmp_string, "joypad_index", '_',
8303 sizeof(key[user]));
8304 snprintf(key_type[user], sizeof(key_type[user]),
8305 msg_hash_to_str(MENU_ENUM_LABEL_INPUT_LIBRETRO_DEVICE),
8306 user + 1);
8307 snprintf(key_analog[user], sizeof(key_analog[user]),
8308 msg_hash_to_str(MENU_ENUM_LABEL_INPUT_PLAYER_ANALOG_DPAD_MODE),
8309 user + 1);
8310 snprintf(split_joycon[user], sizeof(split_joycon[user]),
8311 "%s_%u",
8312 msg_hash_to_str(MENU_ENUM_LABEL_INPUT_SPLIT_JOYCON),
8313 user + 1);
8314 fill_pathname_join_delim(key_bind_all[user], tmp_string, "bind_all", '_',
8315 sizeof(key_bind_all[user]));
8316 fill_pathname_join_delim(key_bind_all_save_autoconfig[user],
8317 tmp_string, "bind_all_save_autoconfig", '_',
8318 sizeof(key_bind_all_save_autoconfig[user]));
8319 fill_pathname_join_delim(key_bind_defaults[user],
8320 tmp_string, "bind_defaults", '_',
8321 sizeof(key_bind_defaults[user]));
8322 fill_pathname_join_delim(mouse_index[user], tmp_string, "mouse_index", '_',
8323 sizeof(mouse_index[user]));
8324
8325 snprintf(split_joycon_lbl[user], sizeof(label[user]),
8326 "%s %u", msg_hash_to_str(MENU_ENUM_LABEL_VALUE_INPUT_SPLIT_JOYCON), user + 1);
8327
8328 snprintf(label[user], sizeof(label[user]),
8329 "%s",
8330 msg_hash_to_str(MENU_ENUM_LABEL_VALUE_INPUT_DEVICE_INDEX));
8331 snprintf(label_type[user], sizeof(label_type[user]),
8332 "%s",
8333 msg_hash_to_str(MENU_ENUM_LABEL_VALUE_INPUT_DEVICE_TYPE));
8334 snprintf(label_analog[user], sizeof(label_analog[user]),
8335 "%s",
8336 msg_hash_to_str(MENU_ENUM_LABEL_VALUE_INPUT_ADC_TYPE));
8337 snprintf(label_bind_all[user], sizeof(label_bind_all[user]),
8338 "%s",
8339 msg_hash_to_str(MENU_ENUM_LABEL_VALUE_INPUT_BIND_ALL));
8340 snprintf(label_bind_defaults[user], sizeof(label_bind_defaults[user]),
8341 "%s",
8342 msg_hash_to_str(MENU_ENUM_LABEL_VALUE_INPUT_BIND_DEFAULT_ALL));
8343 snprintf(label_bind_all_save_autoconfig[user], sizeof(label_bind_all_save_autoconfig[user]),
8344 "%s",
8345 msg_hash_to_str(MENU_ENUM_LABEL_VALUE_INPUT_SAVE_AUTOCONFIG));
8346 snprintf(label_mouse_index[user], sizeof(label_mouse_index[user]),
8347 "%s",
8348 msg_hash_to_str(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_INDEX));
8349
8350 CONFIG_UINT_ALT(
8351 list, list_info,
8352 input_config_get_device_ptr(user),
8353 key_type[user],
8354 label_type[user],
8355 user,
8356 &group_info,
8357 &subgroup_info,
8358 parent_group,
8359 general_write_handler,
8360 general_read_handler);
8361 (*list)[list_info->index - 1].index = user + 1;
8362 (*list)[list_info->index - 1].index_offset = user;
8363 (*list)[list_info->index - 1].action_left = &setting_action_left_libretro_device_type;
8364 (*list)[list_info->index - 1].action_right = &setting_action_right_libretro_device_type;
8365 (*list)[list_info->index - 1].action_select = &setting_action_right_libretro_device_type;
8366 (*list)[list_info->index - 1].action_start = &setting_action_start_libretro_device_type;
8367 (*list)[list_info->index - 1].action_ok = &setting_action_ok_libretro_device_type;
8368 (*list)[list_info->index - 1].get_string_representation =
8369 &setting_get_string_representation_uint_libretro_device;
8370 MENU_SETTINGS_LIST_CURRENT_ADD_ENUM_IDX_PTR(list, list_info,
8371 (enum msg_hash_enums)(MENU_ENUM_LABEL_INPUT_LIBRETRO_DEVICE + user));
8372
8373 CONFIG_UINT_ALT(
8374 list, list_info,
8375 &settings->uints.input_analog_dpad_mode[user],
8376 key_analog[user],
8377 label_analog[user],
8378 user,
8379 &group_info,
8380 &subgroup_info,
8381 parent_group,
8382 general_write_handler,
8383 general_read_handler);
8384 (*list)[list_info->index - 1].index = user + 1;
8385 (*list)[list_info->index - 1].index_offset = user;
8386 (*list)[list_info->index - 1].action_left = &setting_action_left_analog_dpad_mode;
8387 (*list)[list_info->index - 1].action_right = &setting_action_right_analog_dpad_mode;
8388 (*list)[list_info->index - 1].action_select = &setting_action_right_analog_dpad_mode;
8389 (*list)[list_info->index - 1].action_start = &setting_action_start_analog_dpad_mode;
8390 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
8391 (*list)[list_info->index - 1].get_string_representation =
8392 &setting_get_string_representation_uint_analog_dpad_mode;
8393 menu_settings_list_current_add_range(list, list_info, 0, ANALOG_DPAD_LAST-1, 1.0, true, true);
8394 MENU_SETTINGS_LIST_CURRENT_ADD_ENUM_IDX_PTR(list, list_info,
8395 (enum msg_hash_enums)(MENU_ENUM_LABEL_INPUT_PLAYER_ANALOG_DPAD_MODE + user));
8396
8397 #ifdef HAVE_LIBNX
8398 CONFIG_UINT_ALT(
8399 list, list_info,
8400 &settings->uints.input_split_joycon[user],
8401 split_joycon[user],
8402 split_joycon_lbl[user],
8403 user,
8404 &group_info,
8405 &subgroup_info,
8406 parent_group,
8407 general_write_handler,
8408 general_read_handler);
8409 (*list)[list_info->index - 1].index = user + 1;
8410 (*list)[list_info->index - 1].index_offset = user;
8411 #if 0
8412 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
8413 (*list)[list_info->index - 1].action_start = &setting_action_start_bind_device;
8414 (*list)[list_info->index - 1].action_left = &setting_action_left_bind_device;
8415 (*list)[list_info->index - 1].action_right = &setting_action_right_bind_device;
8416 (*list)[list_info->index - 1].action_select = &setting_action_right_bind_device;
8417 #endif
8418 (*list)[list_info->index - 1].get_string_representation = &get_string_representation_split_joycon;
8419 menu_settings_list_current_add_range(list, list_info, 0, 1, 1.0, true, true);
8420 #endif
8421
8422 CONFIG_ACTION_ALT(
8423 list, list_info,
8424 key[user],
8425 label[user],
8426 &group_info,
8427 &subgroup_info,
8428 parent_group);
8429 (*list)[list_info->index - 1].index = user + 1;
8430 (*list)[list_info->index - 1].index_offset = user;
8431 (*list)[list_info->index - 1].action_start = &setting_action_start_bind_device;
8432 (*list)[list_info->index - 1].action_left = &setting_action_left_bind_device;
8433 (*list)[list_info->index - 1].action_right = &setting_action_right_bind_device;
8434 (*list)[list_info->index - 1].action_select = &setting_action_right_bind_device;
8435 (*list)[list_info->index - 1].action_ok = &setting_action_ok_bind_device;
8436 (*list)[list_info->index - 1].get_string_representation =
8437 &get_string_representation_bind_device;
8438 MENU_SETTINGS_LIST_CURRENT_ADD_ENUM_IDX_PTR(list, list_info,
8439 (enum msg_hash_enums)(MENU_ENUM_LABEL_INPUT_DEVICE_INDEX + user));
8440
8441 CONFIG_UINT_ALT(
8442 list, list_info,
8443 &settings->uints.input_mouse_index[user],
8444 mouse_index[user],
8445 label_mouse_index[user],
8446 0,
8447 &group_info,
8448 &subgroup_info,
8449 parent_group,
8450 general_write_handler,
8451 general_read_handler);
8452 (*list)[list_info->index - 1].index = user + 1;
8453 (*list)[list_info->index - 1].index_offset = user;
8454 (*list)[list_info->index - 1].action_start = &setting_action_start_mouse_index;
8455 (*list)[list_info->index - 1].action_left = &setting_action_left_mouse_index;
8456 (*list)[list_info->index - 1].action_right = &setting_action_right_mouse_index;
8457 (*list)[list_info->index - 1].action_select = &setting_action_right_mouse_index;
8458 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
8459 menu_settings_list_current_add_range(list, list_info, 0, MAX_USERS - 1, 1.0, true, true);
8460 MENU_SETTINGS_LIST_CURRENT_ADD_ENUM_IDX_PTR(list, list_info,
8461 (enum msg_hash_enums)(MENU_ENUM_LABEL_INPUT_MOUSE_INDEX + user));
8462
8463 CONFIG_ACTION_ALT(
8464 list, list_info,
8465 key_bind_all[user],
8466 label_bind_all[user],
8467 &group_info,
8468 &subgroup_info,
8469 parent_group);
8470 (*list)[list_info->index - 1].index = user + 1;
8471 (*list)[list_info->index - 1].index_offset = user;
8472 (*list)[list_info->index - 1].action_ok = &setting_action_ok_bind_all;
8473 (*list)[list_info->index - 1].action_cancel = NULL;
8474
8475 CONFIG_ACTION_ALT(
8476 list, list_info,
8477 key_bind_defaults[user],
8478 label_bind_defaults[user],
8479 &group_info,
8480 &subgroup_info,
8481 parent_group);
8482 (*list)[list_info->index - 1].index = user + 1;
8483 (*list)[list_info->index - 1].index_offset = user;
8484 (*list)[list_info->index - 1].action_ok = &setting_action_ok_bind_defaults;
8485 (*list)[list_info->index - 1].action_cancel = NULL;
8486
8487 #ifdef HAVE_CONFIGFILE
8488 CONFIG_ACTION_ALT(
8489 list, list_info,
8490 key_bind_all_save_autoconfig[user],
8491 label_bind_all_save_autoconfig[user],
8492 &group_info,
8493 &subgroup_info,
8494 parent_group);
8495 (*list)[list_info->index - 1].index = user + 1;
8496 (*list)[list_info->index - 1].index_offset = user;
8497 (*list)[list_info->index - 1].action_ok = &setting_action_ok_bind_all_save_autoconfig;
8498 (*list)[list_info->index - 1].action_cancel = NULL;
8499 #endif
8500 }
8501
8502 for (j = 0; j < RARCH_BIND_LIST_END; j++)
8503 {
8504 char label[255];
8505 char name[255];
8506
8507 i = (j < RARCH_ANALOG_BIND_LIST_END) ? input_config_bind_order[j] : j;
8508
8509 if (input_config_bind_map_get_meta(i))
8510 continue;
8511
8512 label[0] = name[0] = '\0';
8513
8514 if (!string_is_empty(buffer[user]))
8515 fill_pathname_noext(label, buffer[user],
8516 " ",
8517 sizeof(label));
8518
8519 if (
8520 settings->bools.input_descriptor_label_show
8521 && (i < RARCH_FIRST_META_KEY)
8522 && core_has_set_input_descriptor()
8523 && (i != RARCH_TURBO_ENABLE)
8524 )
8525 {
8526 if (system->input_desc_btn[user][i])
8527 strlcat(label,
8528 system->input_desc_btn[user][i],
8529 sizeof(label));
8530 else
8531 {
8532 strlcat(label, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NOT_AVAILABLE),
8533 sizeof(label));
8534
8535 if (settings->bools.input_descriptor_hide_unbound)
8536 continue;
8537 }
8538 }
8539 else
8540 strlcat(label, input_config_bind_map_get_desc(i), sizeof(label));
8541
8542 snprintf(name, sizeof(name), "p%u_%s", user + 1, input_config_bind_map_get_base(i));
8543
8544 CONFIG_BIND_ALT(
8545 list, list_info,
8546 &input_config_binds[user][i],
8547 user + 1,
8548 user,
8549 strdup(name),
8550 strdup(label),
8551 &defaults[i],
8552 &group_info,
8553 &subgroup_info,
8554 parent_group);
8555 (*list)[list_info->index - 1].bind_type = i + MENU_SETTINGS_BIND_BEGIN;
8556 }
8557
8558 END_SUB_GROUP(list, list_info, parent_group);
8559 END_GROUP(list, list_info, parent_group);
8560
8561 return true;
8562 }
8563
setting_append_list_input_remap_port_options(rarch_setting_t ** list,rarch_setting_info_t * list_info,const char * parent_group)8564 static bool setting_append_list_input_remap_port_options(
8565 rarch_setting_t **list,
8566 rarch_setting_info_t *list_info,
8567 const char *parent_group)
8568 {
8569 settings_t *settings = config_get_ptr();
8570 rarch_setting_group_info_t group_info;
8571 rarch_setting_group_info_t subgroup_info;
8572 static char key_port[MAX_USERS][64];
8573 static char label_port[MAX_USERS][64];
8574 unsigned user;
8575
8576 group_info.name = NULL;
8577 subgroup_info.name = NULL;
8578
8579 START_GROUP(list, list_info, &group_info,
8580 "Mapped Ports", parent_group);
8581
8582 parent_group = msg_hash_to_str(MENU_ENUM_LABEL_SETTINGS);
8583
8584 START_SUB_GROUP(list, list_info, "State", &group_info,
8585 &subgroup_info, parent_group);
8586
8587 for (user = 0; user < MAX_USERS; user++)
8588 {
8589 key_port[user][0] = '\0';
8590 label_port[user][0] = '\0';
8591
8592 snprintf(key_port[user], sizeof(key_port[user]),
8593 msg_hash_to_str(MENU_ENUM_LABEL_INPUT_REMAP_PORT),
8594 user + 1);
8595
8596 snprintf(label_port[user], sizeof(label_port[user]), "%s",
8597 msg_hash_to_str(MENU_ENUM_LABEL_VALUE_INPUT_REMAP_PORT));
8598
8599 CONFIG_UINT_ALT(
8600 list, list_info,
8601 &settings->uints.input_remap_ports[user],
8602 key_port[user],
8603 label_port[user],
8604 user,
8605 &group_info,
8606 &subgroup_info,
8607 parent_group,
8608 general_write_handler,
8609 general_read_handler);
8610 (*list)[list_info->index - 1].index = user + 1;
8611 (*list)[list_info->index - 1].index_offset = user;
8612 (*list)[list_info->index - 1].action_left = &setting_action_left_input_remap_port;
8613 (*list)[list_info->index - 1].action_right = &setting_action_right_input_remap_port;
8614 (*list)[list_info->index - 1].action_select = &setting_action_right_input_remap_port;
8615 (*list)[list_info->index - 1].action_start = &setting_action_start_input_remap_port;
8616 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
8617 (*list)[list_info->index - 1].get_string_representation =
8618 &setting_get_string_representation_uint_input_remap_port;
8619 menu_settings_list_current_add_range(list, list_info, 0, MAX_USERS-1, 1.0, true, true);
8620 MENU_SETTINGS_LIST_CURRENT_ADD_ENUM_IDX_PTR(list, list_info,
8621 (enum msg_hash_enums)(MENU_ENUM_LABEL_INPUT_REMAP_PORT + user));
8622 }
8623
8624 END_SUB_GROUP(list, list_info, parent_group);
8625 END_GROUP(list, list_info, parent_group);
8626
8627 return true;
8628 }
8629
8630 /**
8631 * config_get_audio_resampler_driver_options:
8632 *
8633 * Get an enumerated list of all resampler driver names, separated by '|'.
8634 *
8635 * Returns: string listing of all resampler driver names, separated by '|'.
8636 **/
config_get_audio_resampler_driver_options(void)8637 static const char* config_get_audio_resampler_driver_options(void)
8638 {
8639 return char_list_new_special(STRING_LIST_AUDIO_RESAMPLER_DRIVERS, NULL);
8640 }
8641
directory_action_start_generic(rarch_setting_t * setting)8642 static int directory_action_start_generic(rarch_setting_t *setting)
8643 {
8644 if (!setting)
8645 return -1;
8646
8647 setting_set_with_string_representation(setting,
8648 setting->default_value.string);
8649
8650 return 0;
8651 }
8652
setting_append_list(settings_t * settings,global_t * global,enum settings_list_type type,rarch_setting_t ** list,rarch_setting_info_t * list_info,const char * parent_group)8653 static bool setting_append_list(
8654 settings_t *settings,
8655 global_t *global,
8656 enum settings_list_type type,
8657 rarch_setting_t **list,
8658 rarch_setting_info_t *list_info,
8659 const char *parent_group)
8660 {
8661 unsigned user;
8662 rarch_setting_group_info_t group_info;
8663 rarch_setting_group_info_t subgroup_info;
8664
8665 group_info.name = NULL;
8666 subgroup_info.name = NULL;
8667
8668
8669 switch (type)
8670 {
8671 case SETTINGS_LIST_MAIN_MENU:
8672 START_GROUP(list, list_info, &group_info, msg_hash_to_str(MENU_ENUM_LABEL_MAIN_MENU), parent_group);
8673 MENU_SETTINGS_LIST_CURRENT_ADD_ENUM_IDX_PTR(list, list_info, MENU_ENUM_LABEL_MAIN_MENU);
8674 START_SUB_GROUP(list, list_info, "State", &group_info, &subgroup_info, parent_group);
8675
8676 CONFIG_INT(
8677 list, list_info,
8678 &settings->ints.state_slot,
8679 MENU_ENUM_LABEL_STATE_SLOT,
8680 MENU_ENUM_LABEL_VALUE_STATE_SLOT,
8681 0,
8682 &group_info,
8683 &subgroup_info,
8684 parent_group,
8685 general_write_handler,
8686 general_read_handler);
8687 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
8688 (*list)[list_info->index - 1].offset_by = -1;
8689 (*list)[list_info->index - 1].get_string_representation =
8690 &setting_get_string_representation_state_slot;
8691 menu_settings_list_current_add_range(list, list_info, -1, 999, 1, true, true);
8692
8693 CONFIG_ACTION(
8694 list, list_info,
8695 MENU_ENUM_LABEL_START_CORE,
8696 MENU_ENUM_LABEL_VALUE_START_CORE,
8697 &group_info,
8698 &subgroup_info,
8699 parent_group);
8700
8701 #if defined(HAVE_VIDEOPROCESSOR)
8702 CONFIG_ACTION(
8703 list, list_info,
8704 MENU_ENUM_LABEL_START_VIDEO_PROCESSOR,
8705 MENU_ENUM_LABEL_VALUE_START_VIDEO_PROCESSOR,
8706 &group_info,
8707 &subgroup_info,
8708 parent_group);
8709 #endif
8710
8711 #if defined(HAVE_NETWORKING) && defined(HAVE_NETWORKGAMEPAD)
8712 CONFIG_ACTION(
8713 list, list_info,
8714 MENU_ENUM_LABEL_START_NET_RETROPAD,
8715 MENU_ENUM_LABEL_VALUE_START_NET_RETROPAD,
8716 &group_info,
8717 &subgroup_info,
8718 parent_group);
8719 #endif
8720
8721 CONFIG_ACTION(
8722 list, list_info,
8723 MENU_ENUM_LABEL_CONTENT_SETTINGS,
8724 MENU_ENUM_LABEL_VALUE_CONTENT_SETTINGS,
8725 &group_info,
8726 &subgroup_info,
8727 parent_group);
8728
8729 CONFIG_ACTION(
8730 list, list_info,
8731 MENU_ENUM_LABEL_XMB_MAIN_MENU_ENABLE_SETTINGS,
8732 MENU_ENUM_LABEL_VALUE_XMB_MAIN_MENU_ENABLE_SETTINGS,
8733 &group_info,
8734 &subgroup_info,
8735 parent_group);
8736
8737 CONFIG_ACTION(
8738 list, list_info,
8739 MENU_ENUM_LABEL_MENU_DISABLE_KIOSK_MODE,
8740 MENU_ENUM_LABEL_VALUE_MENU_DISABLE_KIOSK_MODE,
8741 &group_info,
8742 &subgroup_info,
8743 parent_group);
8744
8745 #ifndef HAVE_DYNAMIC
8746 if (frontend_driver_has_fork())
8747 #endif
8748 {
8749 char ext_name[255];
8750
8751 ext_name[0] = '\0';
8752
8753 if (frontend_driver_get_core_extension(ext_name, sizeof(ext_name)))
8754 {
8755 CONFIG_ACTION(
8756 list, list_info,
8757 MENU_ENUM_LABEL_CORE_LIST,
8758 MENU_ENUM_LABEL_VALUE_CORE_LIST,
8759 &group_info,
8760 &subgroup_info,
8761 parent_group);
8762 (*list)[list_info->index - 1].size = (uint32_t)path_get_realsize(RARCH_PATH_CORE);
8763 (*list)[list_info->index - 1].value.target.string = path_get_ptr(RARCH_PATH_CORE);
8764 (*list)[list_info->index - 1].values = ext_name;
8765 MENU_SETTINGS_LIST_CURRENT_ADD_CMD(list, list_info, CMD_EVENT_LOAD_CORE);
8766 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_BROWSER_ACTION);
8767 }
8768 }
8769
8770 CONFIG_ACTION(
8771 list, list_info,
8772 MENU_ENUM_LABEL_LOAD_CONTENT_LIST,
8773 MENU_ENUM_LABEL_VALUE_LOAD_CONTENT_LIST,
8774 &group_info,
8775 &subgroup_info,
8776 parent_group);
8777
8778 CONFIG_ACTION(
8779 list, list_info,
8780 MENU_ENUM_LABEL_SUBSYSTEM_SETTINGS,
8781 MENU_ENUM_LABEL_VALUE_SUBSYSTEM_SETTINGS,
8782 &group_info,
8783 &subgroup_info,
8784 parent_group);
8785
8786 if (settings->bools.history_list_enable)
8787 {
8788 CONFIG_ACTION(
8789 list, list_info,
8790 MENU_ENUM_LABEL_LOAD_CONTENT_HISTORY,
8791 MENU_ENUM_LABEL_VALUE_LOAD_CONTENT_HISTORY,
8792 &group_info,
8793 &subgroup_info,
8794 parent_group);
8795 }
8796
8797 #ifdef HAVE_CDROM
8798 /* TODO/FIXME - add check seeing if CDROM is inserted into tray
8799 */
8800 {
8801 struct string_list *drive_list = cdrom_get_available_drives();
8802
8803 if (drive_list)
8804 {
8805 if (drive_list->size)
8806 {
8807 CONFIG_ACTION(
8808 list, list_info,
8809 MENU_ENUM_LABEL_LOAD_DISC,
8810 MENU_ENUM_LABEL_VALUE_LOAD_DISC,
8811 &group_info,
8812 &subgroup_info,
8813 parent_group);
8814
8815 CONFIG_ACTION(
8816 list, list_info,
8817 MENU_ENUM_LABEL_DUMP_DISC,
8818 MENU_ENUM_LABEL_VALUE_DUMP_DISC,
8819 &group_info,
8820 &subgroup_info,
8821 parent_group);
8822 }
8823
8824 string_list_free(drive_list);
8825 }
8826 }
8827 #endif
8828
8829 if (string_is_not_equal(settings->arrays.menu_driver, "xmb") && string_is_not_equal(settings->arrays.menu_driver, "ozone"))
8830 {
8831 CONFIG_ACTION(
8832 list, list_info,
8833 MENU_ENUM_LABEL_ADD_CONTENT_LIST,
8834 MENU_ENUM_LABEL_VALUE_ADD_CONTENT_LIST,
8835 &group_info,
8836 &subgroup_info,
8837 parent_group);
8838 }
8839
8840 #if defined(HAVE_NETWORKING)
8841 CONFIG_ACTION(
8842 list, list_info,
8843 MENU_ENUM_LABEL_NETPLAY,
8844 MENU_ENUM_LABEL_VALUE_NETPLAY,
8845 &group_info,
8846 &subgroup_info,
8847 parent_group);
8848
8849 CONFIG_ACTION(
8850 list, list_info,
8851 MENU_ENUM_LABEL_ONLINE_UPDATER,
8852 MENU_ENUM_LABEL_VALUE_ONLINE_UPDATER,
8853 &group_info,
8854 &subgroup_info,
8855 parent_group);
8856 #endif
8857
8858 CONFIG_ACTION(
8859 list, list_info,
8860 MENU_ENUM_LABEL_SETTINGS,
8861 MENU_ENUM_LABEL_VALUE_SETTINGS,
8862 &group_info,
8863 &subgroup_info,
8864 parent_group);
8865
8866 CONFIG_ACTION(
8867 list, list_info,
8868 MENU_ENUM_LABEL_INFORMATION_LIST,
8869 MENU_ENUM_LABEL_VALUE_INFORMATION_LIST,
8870 &group_info,
8871 &subgroup_info,
8872 parent_group);
8873
8874 #if !defined(IOS) && !defined(HAVE_LAKKA)
8875 if (frontend_driver_has_fork())
8876 {
8877 CONFIG_ACTION(
8878 list, list_info,
8879 MENU_ENUM_LABEL_RESTART_RETROARCH,
8880 MENU_ENUM_LABEL_VALUE_RESTART_RETROARCH,
8881 &group_info,
8882 &subgroup_info,
8883 parent_group);
8884 MENU_SETTINGS_LIST_CURRENT_ADD_CMD(list, list_info, CMD_EVENT_RESTART_RETROARCH);
8885 }
8886 #endif
8887
8888 CONFIG_ACTION(
8889 list, list_info,
8890 MENU_ENUM_LABEL_CONFIGURATIONS_LIST,
8891 MENU_ENUM_LABEL_VALUE_CONFIGURATIONS_LIST,
8892 &group_info,
8893 &subgroup_info,
8894 parent_group);
8895 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED);
8896
8897 CONFIG_ACTION(
8898 list, list_info,
8899 MENU_ENUM_LABEL_CONFIGURATIONS,
8900 MENU_ENUM_LABEL_VALUE_CONFIGURATIONS,
8901 &group_info,
8902 &subgroup_info,
8903 parent_group);
8904 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED);
8905
8906 CONFIG_ACTION(
8907 list, list_info,
8908 MENU_ENUM_LABEL_RESET_TO_DEFAULT_CONFIG,
8909 MENU_ENUM_LABEL_VALUE_RESET_TO_DEFAULT_CONFIG,
8910 &group_info,
8911 &subgroup_info,
8912 parent_group);
8913 MENU_SETTINGS_LIST_CURRENT_ADD_CMD(list, list_info, CMD_EVENT_MENU_RESET_TO_DEFAULT_CONFIG);
8914 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED);
8915
8916 CONFIG_ACTION(
8917 list, list_info,
8918 MENU_ENUM_LABEL_SAVE_CURRENT_CONFIG,
8919 MENU_ENUM_LABEL_VALUE_SAVE_CURRENT_CONFIG,
8920 &group_info,
8921 &subgroup_info,
8922 parent_group);
8923 MENU_SETTINGS_LIST_CURRENT_ADD_CMD(list, list_info, CMD_EVENT_MENU_SAVE_CURRENT_CONFIG);
8924 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED);
8925
8926 CONFIG_ACTION(
8927 list, list_info,
8928 MENU_ENUM_LABEL_SAVE_NEW_CONFIG,
8929 MENU_ENUM_LABEL_VALUE_SAVE_NEW_CONFIG,
8930 &group_info,
8931 &subgroup_info,
8932 parent_group);
8933 MENU_SETTINGS_LIST_CURRENT_ADD_CMD(list, list_info, CMD_EVENT_MENU_SAVE_CONFIG);
8934 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED);
8935
8936 CONFIG_ACTION(
8937 list, list_info,
8938 MENU_ENUM_LABEL_SAVE_CURRENT_CONFIG_OVERRIDE_CORE,
8939 MENU_ENUM_LABEL_VALUE_SAVE_CURRENT_CONFIG_OVERRIDE_CORE,
8940 &group_info,
8941 &subgroup_info,
8942 parent_group);
8943 MENU_SETTINGS_LIST_CURRENT_ADD_CMD(list, list_info, CMD_EVENT_MENU_SAVE_CURRENT_CONFIG_OVERRIDE_CORE);
8944 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED);
8945
8946 CONFIG_ACTION(
8947 list, list_info,
8948 MENU_ENUM_LABEL_SAVE_CURRENT_CONFIG_OVERRIDE_CONTENT_DIR,
8949 MENU_ENUM_LABEL_VALUE_SAVE_CURRENT_CONFIG_OVERRIDE_CONTENT_DIR,
8950 &group_info,
8951 &subgroup_info,
8952 parent_group);
8953 MENU_SETTINGS_LIST_CURRENT_ADD_CMD(list, list_info, CMD_EVENT_MENU_SAVE_CURRENT_CONFIG_OVERRIDE_CONTENT_DIR);
8954 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED);
8955
8956 CONFIG_ACTION(
8957 list, list_info,
8958 MENU_ENUM_LABEL_SAVE_CURRENT_CONFIG_OVERRIDE_GAME,
8959 MENU_ENUM_LABEL_VALUE_SAVE_CURRENT_CONFIG_OVERRIDE_GAME,
8960 &group_info,
8961 &subgroup_info,
8962 parent_group);
8963 MENU_SETTINGS_LIST_CURRENT_ADD_CMD(list, list_info, CMD_EVENT_MENU_SAVE_CURRENT_CONFIG_OVERRIDE_GAME);
8964 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED);
8965
8966 CONFIG_ACTION(
8967 list, list_info,
8968 MENU_ENUM_LABEL_HELP_LIST,
8969 MENU_ENUM_LABEL_VALUE_HELP_LIST,
8970 &group_info,
8971 &subgroup_info,
8972 parent_group);
8973 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED);
8974 #ifdef HAVE_QT
8975 CONFIG_ACTION(
8976 list, list_info,
8977 MENU_ENUM_LABEL_SHOW_WIMP,
8978 MENU_ENUM_LABEL_VALUE_SHOW_WIMP,
8979 &group_info,
8980 &subgroup_info,
8981 parent_group);
8982 MENU_SETTINGS_LIST_CURRENT_ADD_CMD(list, list_info, CMD_EVENT_UI_COMPANION_TOGGLE);
8983 #endif
8984 #if !defined(IOS)
8985 /* Apple rejects iOS apps that let you forcibly quit them. */
8986 #ifdef HAVE_LAKKA
8987 CONFIG_ACTION(
8988 list, list_info,
8989 MENU_ENUM_LABEL_QUIT_RETROARCH,
8990 MENU_ENUM_LABEL_VALUE_RESTART_RETROARCH,
8991 &group_info,
8992 &subgroup_info,
8993 parent_group);
8994 #else
8995 CONFIG_ACTION(
8996 list, list_info,
8997 MENU_ENUM_LABEL_QUIT_RETROARCH,
8998 MENU_ENUM_LABEL_VALUE_QUIT_RETROARCH,
8999 &group_info,
9000 &subgroup_info,
9001 parent_group);
9002 #endif
9003 MENU_SETTINGS_LIST_CURRENT_ADD_CMD(list, list_info, CMD_EVENT_QUIT);
9004 #endif
9005
9006 #if defined(HAVE_LAKKA_SWITCH) || defined(HAVE_LIBNX)
9007 CONFIG_ACTION(
9008 list, list_info,
9009 MENU_ENUM_LABEL_SWITCH_CPU_PROFILE,
9010 MENU_ENUM_LABEL_VALUE_SWITCH_CPU_PROFILE,
9011 &group_info,
9012 &subgroup_info,
9013 parent_group);
9014 #endif
9015
9016 #if defined(HAVE_LAKKA)
9017 #ifdef HAVE_LAKKA_SWITCH
9018 CONFIG_ACTION(
9019 list, list_info,
9020 MENU_ENUM_LABEL_SWITCH_GPU_PROFILE,
9021 MENU_ENUM_LABEL_VALUE_SWITCH_GPU_PROFILE,
9022 &group_info,
9023 &subgroup_info,
9024 parent_group);
9025 #endif
9026 CONFIG_ACTION(
9027 list, list_info,
9028 MENU_ENUM_LABEL_REBOOT,
9029 MENU_ENUM_LABEL_VALUE_REBOOT,
9030 &group_info,
9031 &subgroup_info,
9032 parent_group);
9033
9034 MENU_SETTINGS_LIST_CURRENT_ADD_CMD(list, list_info, CMD_EVENT_REBOOT);
9035
9036 CONFIG_ACTION(
9037 list, list_info,
9038 MENU_ENUM_LABEL_SHUTDOWN,
9039 MENU_ENUM_LABEL_VALUE_SHUTDOWN,
9040 &group_info,
9041 &subgroup_info,
9042 parent_group);
9043 MENU_SETTINGS_LIST_CURRENT_ADD_CMD(list, list_info, CMD_EVENT_SHUTDOWN);
9044 #endif
9045
9046 CONFIG_ACTION(
9047 list, list_info,
9048 MENU_ENUM_LABEL_DRIVER_SETTINGS,
9049 MENU_ENUM_LABEL_VALUE_DRIVER_SETTINGS,
9050 &group_info,
9051 &subgroup_info,
9052 parent_group);
9053 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED);
9054
9055 CONFIG_ACTION(
9056 list, list_info,
9057 MENU_ENUM_LABEL_VIDEO_SETTINGS,
9058 MENU_ENUM_LABEL_VALUE_VIDEO_SETTINGS,
9059 &group_info,
9060 &subgroup_info,
9061 parent_group);
9062
9063 CONFIG_ACTION(
9064 list, list_info,
9065 MENU_ENUM_LABEL_CRT_SWITCHRES_SETTINGS,
9066 MENU_ENUM_LABEL_VALUE_CRT_SWITCHRES_SETTINGS,
9067 &group_info,
9068 &subgroup_info,
9069 parent_group);
9070
9071 CONFIG_ACTION(
9072 list, list_info,
9073 MENU_ENUM_LABEL_VIDEO_OUTPUT_SETTINGS,
9074 MENU_ENUM_LABEL_VALUE_VIDEO_OUTPUT_SETTINGS,
9075 &group_info,
9076 &subgroup_info,
9077 parent_group);
9078
9079 CONFIG_ACTION(
9080 list, list_info,
9081 MENU_ENUM_LABEL_AUDIO_SETTINGS,
9082 MENU_ENUM_LABEL_VALUE_AUDIO_SETTINGS,
9083 &group_info,
9084 &subgroup_info,
9085 parent_group);
9086
9087 #ifdef HAVE_AUDIOMIXER
9088 CONFIG_ACTION(
9089 list, list_info,
9090 MENU_ENUM_LABEL_AUDIO_MIXER_SETTINGS,
9091 MENU_ENUM_LABEL_VALUE_AUDIO_MIXER_SETTINGS,
9092 &group_info,
9093 &subgroup_info,
9094 parent_group);
9095 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED);
9096 #endif
9097
9098 #ifdef HAVE_AUDIOMIXER
9099 CONFIG_ACTION(
9100 list, list_info,
9101 MENU_ENUM_LABEL_MENU_SOUNDS,
9102 MENU_ENUM_LABEL_VALUE_MENU_SOUNDS,
9103 &group_info,
9104 &subgroup_info,
9105 parent_group);
9106 #endif
9107
9108 CONFIG_ACTION(
9109 list, list_info,
9110 MENU_ENUM_LABEL_INPUT_SETTINGS,
9111 MENU_ENUM_LABEL_VALUE_INPUT_SETTINGS,
9112 &group_info,
9113 &subgroup_info,
9114 parent_group);
9115
9116 CONFIG_ACTION(
9117 list, list_info,
9118 MENU_ENUM_LABEL_LATENCY_SETTINGS,
9119 MENU_ENUM_LABEL_VALUE_LATENCY_SETTINGS,
9120 &group_info,
9121 &subgroup_info,
9122 parent_group);
9123 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED);
9124
9125 CONFIG_ACTION(
9126 list, list_info,
9127 MENU_ENUM_LABEL_CORE_SETTINGS,
9128 MENU_ENUM_LABEL_VALUE_CORE_SETTINGS,
9129 &group_info,
9130 &subgroup_info,
9131 parent_group);
9132 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ADVANCED);
9133
9134 CONFIG_ACTION(
9135 list, list_info,
9136 MENU_ENUM_LABEL_CONFIGURATION_SETTINGS,
9137 MENU_ENUM_LABEL_VALUE_CONFIGURATION_SETTINGS,
9138 &group_info,
9139 &subgroup_info,
9140 parent_group);
9141 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED);
9142
9143 CONFIG_ACTION(
9144 list, list_info,
9145 MENU_ENUM_LABEL_SAVING_SETTINGS,
9146 MENU_ENUM_LABEL_VALUE_SAVING_SETTINGS,
9147 &group_info,
9148 &subgroup_info,
9149 parent_group);
9150 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED);
9151
9152 CONFIG_ACTION(
9153 list, list_info,
9154 MENU_ENUM_LABEL_LOGGING_SETTINGS,
9155 MENU_ENUM_LABEL_VALUE_LOGGING_SETTINGS,
9156 &group_info,
9157 &subgroup_info,
9158 parent_group);
9159
9160 CONFIG_ACTION(
9161 list, list_info,
9162 MENU_ENUM_LABEL_FRAME_THROTTLE_SETTINGS,
9163 MENU_ENUM_LABEL_VALUE_FRAME_THROTTLE_SETTINGS,
9164 &group_info,
9165 &subgroup_info,
9166 parent_group);
9167 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED);
9168
9169 CONFIG_ACTION(
9170 list, list_info,
9171 MENU_ENUM_LABEL_REWIND_SETTINGS,
9172 MENU_ENUM_LABEL_VALUE_REWIND_SETTINGS,
9173 &group_info,
9174 &subgroup_info,
9175 parent_group);
9176
9177 CONFIG_ACTION(
9178 list, list_info,
9179 MENU_ENUM_LABEL_FRAME_TIME_COUNTER_SETTINGS,
9180 MENU_ENUM_LABEL_VALUE_FRAME_TIME_COUNTER_SETTINGS,
9181 &group_info,
9182 &subgroup_info,
9183 parent_group);
9184 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED);
9185
9186 CONFIG_ACTION(
9187 list, list_info,
9188 MENU_ENUM_LABEL_CHEAT_DETAILS_SETTINGS,
9189 MENU_ENUM_LABEL_VALUE_CHEAT_DETAILS_SETTINGS,
9190 &group_info,
9191 &subgroup_info,
9192 parent_group);
9193
9194 CONFIG_ACTION(
9195 list, list_info,
9196 MENU_ENUM_LABEL_CHEAT_SEARCH_SETTINGS,
9197 MENU_ENUM_LABEL_VALUE_CHEAT_SEARCH_SETTINGS,
9198 &group_info,
9199 &subgroup_info,
9200 parent_group);
9201
9202 if (string_is_not_equal(settings->arrays.record_driver, "null"))
9203 {
9204 CONFIG_ACTION(
9205 list, list_info,
9206 MENU_ENUM_LABEL_RECORDING_SETTINGS,
9207 MENU_ENUM_LABEL_VALUE_RECORDING_SETTINGS,
9208 &group_info,
9209 &subgroup_info,
9210 parent_group);
9211 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED);
9212 }
9213
9214 CONFIG_ACTION(
9215 list, list_info,
9216 MENU_ENUM_LABEL_ONSCREEN_DISPLAY_SETTINGS,
9217 MENU_ENUM_LABEL_VALUE_ONSCREEN_DISPLAY_SETTINGS,
9218 &group_info,
9219 &subgroup_info,
9220 parent_group);
9221 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED);
9222
9223 #ifdef HAVE_OVERLAY
9224 CONFIG_ACTION(
9225 list, list_info,
9226 MENU_ENUM_LABEL_ONSCREEN_OVERLAY_SETTINGS,
9227 MENU_ENUM_LABEL_VALUE_ONSCREEN_OVERLAY_SETTINGS,
9228 &group_info,
9229 &subgroup_info,
9230 parent_group);
9231 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED);
9232 #endif
9233
9234 #ifdef HAVE_VIDEO_LAYOUT
9235 CONFIG_ACTION(
9236 list, list_info,
9237 MENU_ENUM_LABEL_ONSCREEN_VIDEO_LAYOUT_SETTINGS,
9238 MENU_ENUM_LABEL_VALUE_ONSCREEN_VIDEO_LAYOUT_SETTINGS,
9239 &group_info,
9240 &subgroup_info,
9241 parent_group);
9242 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED);
9243 #endif
9244
9245 CONFIG_ACTION(
9246 list, list_info,
9247 MENU_ENUM_LABEL_ONSCREEN_NOTIFICATIONS_SETTINGS,
9248 MENU_ENUM_LABEL_VALUE_ONSCREEN_NOTIFICATIONS_SETTINGS,
9249 &group_info,
9250 &subgroup_info,
9251 parent_group);
9252 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED);
9253
9254 CONFIG_ACTION(
9255 list, list_info,
9256 MENU_ENUM_LABEL_ONSCREEN_NOTIFICATIONS_VIEWS_SETTINGS,
9257 MENU_ENUM_LABEL_VALUE_ONSCREEN_NOTIFICATIONS_VIEWS_SETTINGS,
9258 &group_info,
9259 &subgroup_info,
9260 parent_group);
9261
9262 CONFIG_ACTION(
9263 list, list_info,
9264 MENU_ENUM_LABEL_MENU_SETTINGS,
9265 MENU_ENUM_LABEL_VALUE_MENU_SETTINGS,
9266 &group_info,
9267 &subgroup_info,
9268 parent_group);
9269
9270 CONFIG_ACTION(
9271 list, list_info,
9272 MENU_ENUM_LABEL_MENU_VIEWS_SETTINGS,
9273 MENU_ENUM_LABEL_VALUE_MENU_VIEWS_SETTINGS,
9274 &group_info,
9275 &subgroup_info,
9276 parent_group);
9277
9278 CONFIG_ACTION(
9279 list, list_info,
9280 MENU_ENUM_LABEL_QUICK_MENU_VIEWS_SETTINGS,
9281 MENU_ENUM_LABEL_VALUE_QUICK_MENU_VIEWS_SETTINGS,
9282 &group_info,
9283 &subgroup_info,
9284 parent_group);
9285
9286 CONFIG_ACTION(
9287 list, list_info,
9288 MENU_ENUM_LABEL_SETTINGS_VIEWS_SETTINGS,
9289 MENU_ENUM_LABEL_VALUE_SETTINGS_VIEWS_SETTINGS,
9290 &group_info,
9291 &subgroup_info,
9292 parent_group);
9293
9294 CONFIG_ACTION(
9295 list, list_info,
9296 MENU_ENUM_LABEL_USER_INTERFACE_SETTINGS,
9297 MENU_ENUM_LABEL_VALUE_USER_INTERFACE_SETTINGS,
9298 &group_info,
9299 &subgroup_info,
9300 parent_group);
9301
9302 CONFIG_ACTION(
9303 list, list_info,
9304 MENU_ENUM_LABEL_AI_SERVICE_SETTINGS,
9305 MENU_ENUM_LABEL_VALUE_AI_SERVICE_SETTINGS,
9306 &group_info,
9307 &subgroup_info,
9308 parent_group);
9309
9310 #ifdef HAVE_ACCESSIBILITY
9311 CONFIG_ACTION(
9312 list, list_info,
9313 MENU_ENUM_LABEL_ACCESSIBILITY_SETTINGS,
9314 MENU_ENUM_LABEL_VALUE_ACCESSIBILITY_SETTINGS,
9315 &group_info,
9316 &subgroup_info,
9317 parent_group);
9318 #endif
9319
9320 CONFIG_ACTION(
9321 list, list_info,
9322 MENU_ENUM_LABEL_POWER_MANAGEMENT_SETTINGS,
9323 MENU_ENUM_LABEL_VALUE_POWER_MANAGEMENT_SETTINGS,
9324 &group_info,
9325 &subgroup_info,
9326 parent_group);
9327 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED);
9328
9329 CONFIG_ACTION(
9330 list, list_info,
9331 MENU_ENUM_LABEL_MENU_FILE_BROWSER_SETTINGS,
9332 MENU_ENUM_LABEL_VALUE_MENU_FILE_BROWSER_SETTINGS,
9333 &group_info,
9334 &subgroup_info,
9335 parent_group);
9336 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED);
9337
9338 #ifdef HAVE_CHEEVOS
9339 CONFIG_ACTION(
9340 list, list_info,
9341 MENU_ENUM_LABEL_RETRO_ACHIEVEMENTS_SETTINGS,
9342 MENU_ENUM_LABEL_VALUE_RETRO_ACHIEVEMENTS_SETTINGS,
9343 &group_info,
9344 &subgroup_info,
9345 parent_group);
9346 #endif
9347
9348 CONFIG_ACTION(
9349 list, list_info,
9350 MENU_ENUM_LABEL_UPDATER_SETTINGS,
9351 MENU_ENUM_LABEL_VALUE_UPDATER_SETTINGS,
9352 &group_info,
9353 &subgroup_info,
9354 parent_group);
9355 #ifdef HAVE_LAKKA
9356 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ADVANCED);
9357 #endif
9358
9359 #ifdef HAVE_BLUETOOTH
9360 if (string_is_not_equal(settings->arrays.bluetooth_driver, "null"))
9361 {
9362 CONFIG_ACTION(
9363 list, list_info,
9364 MENU_ENUM_LABEL_BLUETOOTH_SETTINGS,
9365 MENU_ENUM_LABEL_VALUE_BLUETOOTH_SETTINGS,
9366 &group_info,
9367 &subgroup_info,
9368 parent_group);
9369 }
9370 #endif
9371
9372 #if defined(HAVE_LAKKA) || defined(HAVE_WIFI)
9373 if (string_is_not_equal(settings->arrays.wifi_driver, "null"))
9374 {
9375 CONFIG_ACTION(
9376 list, list_info,
9377 MENU_ENUM_LABEL_WIFI_SETTINGS,
9378 MENU_ENUM_LABEL_VALUE_WIFI_SETTINGS,
9379 &group_info,
9380 &subgroup_info,
9381 parent_group);
9382 }
9383 #endif
9384
9385 CONFIG_ACTION(
9386 list, list_info,
9387 MENU_ENUM_LABEL_NETWORK_SETTINGS,
9388 MENU_ENUM_LABEL_VALUE_NETWORK_SETTINGS,
9389 &group_info,
9390 &subgroup_info,
9391 parent_group);
9392 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED);
9393
9394 #ifdef HAVE_LAKKA
9395 CONFIG_ACTION(
9396 list, list_info,
9397 MENU_ENUM_LABEL_LAKKA_SERVICES,
9398 MENU_ENUM_LABEL_VALUE_LAKKA_SERVICES,
9399 &group_info,
9400 &subgroup_info,
9401 parent_group);
9402 #endif
9403
9404 CONFIG_ACTION(
9405 list, list_info,
9406 MENU_ENUM_LABEL_PLAYLIST_SETTINGS,
9407 MENU_ENUM_LABEL_VALUE_PLAYLIST_SETTINGS,
9408 &group_info,
9409 &subgroup_info,
9410 parent_group);
9411 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED);
9412
9413 CONFIG_ACTION(
9414 list, list_info,
9415 MENU_ENUM_LABEL_USER_SETTINGS,
9416 MENU_ENUM_LABEL_VALUE_USER_SETTINGS,
9417 &group_info,
9418 &subgroup_info,
9419 parent_group);
9420
9421 CONFIG_ACTION(
9422 list, list_info,
9423 MENU_ENUM_LABEL_DIRECTORY_SETTINGS,
9424 MENU_ENUM_LABEL_VALUE_DIRECTORY_SETTINGS,
9425 &group_info,
9426 &subgroup_info,
9427 parent_group);
9428
9429 CONFIG_ACTION(
9430 list, list_info,
9431 MENU_ENUM_LABEL_PRIVACY_SETTINGS,
9432 MENU_ENUM_LABEL_VALUE_PRIVACY_SETTINGS,
9433 &group_info,
9434 &subgroup_info,
9435 parent_group);
9436
9437 CONFIG_ACTION(
9438 list, list_info,
9439 MENU_ENUM_LABEL_AUDIO_RESAMPLER_SETTINGS,
9440 MENU_ENUM_LABEL_VALUE_AUDIO_RESAMPLER_SETTINGS,
9441 &group_info,
9442 &subgroup_info,
9443 parent_group);
9444
9445 CONFIG_ACTION(
9446 list, list_info,
9447 MENU_ENUM_LABEL_AUDIO_OUTPUT_SETTINGS,
9448 MENU_ENUM_LABEL_VALUE_AUDIO_OUTPUT_SETTINGS,
9449 &group_info,
9450 &subgroup_info,
9451 parent_group);
9452
9453 CONFIG_ACTION(
9454 list, list_info,
9455 MENU_ENUM_LABEL_AUDIO_SYNCHRONIZATION_SETTINGS,
9456 MENU_ENUM_LABEL_VALUE_AUDIO_SYNCHRONIZATION_SETTINGS,
9457 &group_info,
9458 &subgroup_info,
9459 parent_group);
9460
9461 if (string_is_not_equal(settings->arrays.midi_driver, "null"))
9462 {
9463 CONFIG_ACTION(
9464 list, list_info,
9465 MENU_ENUM_LABEL_MIDI_SETTINGS,
9466 MENU_ENUM_LABEL_VALUE_MIDI_SETTINGS,
9467 &group_info,
9468 &subgroup_info,
9469 parent_group);
9470 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED);
9471 }
9472
9473 for (user = 0; user < MAX_USERS; user++)
9474 setting_append_list_input_player_options(list, list_info, parent_group, user);
9475
9476 setting_append_list_input_remap_port_options(list, list_info, parent_group);
9477
9478 END_SUB_GROUP(list, list_info, parent_group);
9479 END_GROUP(list, list_info, parent_group);
9480 break;
9481 case SETTINGS_LIST_DRIVERS:
9482 {
9483 unsigned i;
9484 struct string_options_entry string_options_entries[12];
9485
9486 START_GROUP(list, list_info, &group_info, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_DRIVER_SETTINGS), parent_group);
9487 MENU_SETTINGS_LIST_CURRENT_ADD_ENUM_IDX_PTR(list, list_info, MENU_ENUM_LABEL_DRIVER_SETTINGS);
9488
9489 parent_group = msg_hash_to_str(MENU_ENUM_LABEL_SETTINGS);
9490
9491 START_SUB_GROUP(list, list_info, "State", &group_info,
9492 &subgroup_info, parent_group);
9493
9494 string_options_entries[0].target = settings->arrays.input_driver;
9495 string_options_entries[0].len = sizeof(settings->arrays.input_driver);
9496 string_options_entries[0].name_enum_idx = MENU_ENUM_LABEL_INPUT_DRIVER;
9497 string_options_entries[0].SHORT_enum_idx = MENU_ENUM_LABEL_VALUE_INPUT_DRIVER;
9498 string_options_entries[0].default_value = config_get_default_input();
9499 string_options_entries[0].values = config_get_input_driver_options();
9500
9501 string_options_entries[1].target = settings->arrays.input_joypad_driver;
9502 string_options_entries[1].len = sizeof(settings->arrays.input_joypad_driver);
9503 string_options_entries[1].name_enum_idx = MENU_ENUM_LABEL_JOYPAD_DRIVER;
9504 string_options_entries[1].SHORT_enum_idx = MENU_ENUM_LABEL_VALUE_JOYPAD_DRIVER;
9505 string_options_entries[1].default_value = config_get_default_joypad();
9506 string_options_entries[1].values = config_get_joypad_driver_options();
9507
9508 string_options_entries[2].target = settings->arrays.video_driver;
9509 string_options_entries[2].len = sizeof(settings->arrays.video_driver);
9510 string_options_entries[2].name_enum_idx = MENU_ENUM_LABEL_VIDEO_DRIVER;
9511 string_options_entries[2].SHORT_enum_idx = MENU_ENUM_LABEL_VALUE_VIDEO_DRIVER;
9512 string_options_entries[2].default_value = config_get_default_video();
9513 string_options_entries[2].values = config_get_video_driver_options();
9514
9515 string_options_entries[3].target = settings->arrays.audio_driver;
9516 string_options_entries[3].len = sizeof(settings->arrays.audio_driver);
9517 string_options_entries[3].name_enum_idx = MENU_ENUM_LABEL_AUDIO_DRIVER;
9518 string_options_entries[3].SHORT_enum_idx = MENU_ENUM_LABEL_VALUE_AUDIO_DRIVER;
9519 string_options_entries[3].default_value = config_get_default_audio();
9520 string_options_entries[3].values = config_get_audio_driver_options();
9521
9522 string_options_entries[4].target = settings->arrays.audio_resampler;
9523 string_options_entries[4].len = sizeof(settings->arrays.audio_resampler);
9524 string_options_entries[4].name_enum_idx = MENU_ENUM_LABEL_AUDIO_RESAMPLER_DRIVER;
9525 string_options_entries[4].SHORT_enum_idx = MENU_ENUM_LABEL_VALUE_AUDIO_RESAMPLER_DRIVER;
9526 string_options_entries[4].default_value = config_get_default_audio_resampler();
9527 string_options_entries[4].values = config_get_audio_resampler_driver_options();
9528
9529 string_options_entries[5].target = settings->arrays.camera_driver;
9530 string_options_entries[5].len = sizeof(settings->arrays.camera_driver);
9531 string_options_entries[5].name_enum_idx = MENU_ENUM_LABEL_CAMERA_DRIVER;
9532 string_options_entries[5].SHORT_enum_idx = MENU_ENUM_LABEL_VALUE_CAMERA_DRIVER;
9533 string_options_entries[5].default_value = config_get_default_camera();
9534 string_options_entries[5].values = config_get_camera_driver_options();
9535
9536 string_options_entries[6].target = settings->arrays.bluetooth_driver;
9537 string_options_entries[6].len = sizeof(settings->arrays.bluetooth_driver);
9538 string_options_entries[6].name_enum_idx = MENU_ENUM_LABEL_BLUETOOTH_DRIVER;
9539 string_options_entries[6].SHORT_enum_idx = MENU_ENUM_LABEL_VALUE_BLUETOOTH_DRIVER;
9540 string_options_entries[6].default_value = config_get_default_bluetooth();
9541 string_options_entries[6].values = config_get_bluetooth_driver_options();
9542
9543 string_options_entries[7].target = settings->arrays.wifi_driver;
9544 string_options_entries[7].len = sizeof(settings->arrays.wifi_driver);
9545 string_options_entries[7].name_enum_idx = MENU_ENUM_LABEL_WIFI_DRIVER;
9546 string_options_entries[7].SHORT_enum_idx = MENU_ENUM_LABEL_VALUE_WIFI_DRIVER;
9547 string_options_entries[7].default_value = config_get_default_wifi();
9548 string_options_entries[7].values = config_get_wifi_driver_options();
9549
9550 string_options_entries[8].target = settings->arrays.location_driver;
9551 string_options_entries[8].len = sizeof(settings->arrays.location_driver);
9552 string_options_entries[8].name_enum_idx = MENU_ENUM_LABEL_LOCATION_DRIVER;
9553 string_options_entries[8].SHORT_enum_idx = MENU_ENUM_LABEL_VALUE_LOCATION_DRIVER;
9554 string_options_entries[8].default_value = config_get_default_location();
9555 string_options_entries[8].values = config_get_location_driver_options();
9556
9557 string_options_entries[9].target = settings->arrays.menu_driver;
9558 string_options_entries[9].len = sizeof(settings->arrays.menu_driver);
9559 string_options_entries[9].name_enum_idx = MENU_ENUM_LABEL_MENU_DRIVER;
9560 string_options_entries[9].SHORT_enum_idx = MENU_ENUM_LABEL_VALUE_MENU_DRIVER;
9561 string_options_entries[9].default_value = config_get_default_menu();
9562 string_options_entries[9].values = config_get_menu_driver_options();
9563
9564 string_options_entries[10].target = settings->arrays.record_driver;
9565 string_options_entries[10].len = sizeof(settings->arrays.record_driver);
9566 string_options_entries[10].name_enum_idx = MENU_ENUM_LABEL_RECORD_DRIVER;
9567 string_options_entries[10].SHORT_enum_idx = MENU_ENUM_LABEL_VALUE_RECORD_DRIVER;
9568 string_options_entries[10].default_value = config_get_default_record();
9569 string_options_entries[10].values = config_get_record_driver_options();
9570
9571 string_options_entries[11].target = settings->arrays.midi_driver;
9572 string_options_entries[11].len = sizeof(settings->arrays.midi_driver);
9573 string_options_entries[11].name_enum_idx = MENU_ENUM_LABEL_MIDI_DRIVER;
9574 string_options_entries[11].SHORT_enum_idx = MENU_ENUM_LABEL_VALUE_MIDI_DRIVER;
9575 string_options_entries[11].default_value = config_get_default_midi();
9576 string_options_entries[11].values = config_get_midi_driver_options();
9577
9578 for (i = 0; i < ARRAY_SIZE(string_options_entries); i++)
9579 {
9580 CONFIG_STRING_OPTIONS(
9581 list, list_info,
9582 string_options_entries[i].target,
9583 string_options_entries[i].len,
9584 string_options_entries[i].name_enum_idx,
9585 string_options_entries[i].SHORT_enum_idx,
9586 string_options_entries[i].default_value,
9587 string_options_entries[i].values,
9588 &group_info,
9589 &subgroup_info,
9590 parent_group,
9591 general_read_handler,
9592 general_write_handler);
9593 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_IS_DRIVER);
9594 (*list)[list_info->index - 1].action_ok = setting_action_ok_uint;
9595 (*list)[list_info->index - 1].action_left = setting_string_action_left_driver;
9596 (*list)[list_info->index - 1].action_right = setting_string_action_right_driver;
9597 }
9598
9599 END_SUB_GROUP(list, list_info, parent_group);
9600 END_GROUP(list, list_info, parent_group);
9601 }
9602 break;
9603 case SETTINGS_LIST_CORE:
9604 {
9605 unsigned i, listing = 0;
9606 #ifndef HAVE_DYNAMIC
9607 struct bool_entry bool_entries[8];
9608 #else
9609 struct bool_entry bool_entries[7];
9610 #endif
9611 START_GROUP(list, list_info, &group_info,
9612 msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CORE_SETTINGS), parent_group);
9613 MENU_SETTINGS_LIST_CURRENT_ADD_ENUM_IDX_PTR(list, list_info, MENU_ENUM_LABEL_CORE_SETTINGS);
9614
9615 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ADVANCED);
9616
9617 parent_group = msg_hash_to_str(MENU_ENUM_LABEL_SETTINGS);
9618
9619 START_SUB_GROUP(list, list_info, "State", &group_info, &subgroup_info,
9620 parent_group);
9621
9622 bool_entries[listing].target = &settings->bools.video_shared_context;
9623 bool_entries[listing].name_enum_idx = MENU_ENUM_LABEL_VIDEO_SHARED_CONTEXT;
9624 bool_entries[listing].SHORT_enum_idx = MENU_ENUM_LABEL_VALUE_VIDEO_SHARED_CONTEXT;
9625 bool_entries[listing].default_value = DEFAULT_VIDEO_SHARED_CONTEXT;
9626 bool_entries[listing].flags = SD_FLAG_ADVANCED;
9627 listing++;
9628
9629 bool_entries[listing].target = &settings->bools.driver_switch_enable;
9630 bool_entries[listing].name_enum_idx = MENU_ENUM_LABEL_DRIVER_SWITCH_ENABLE;
9631 bool_entries[listing].SHORT_enum_idx = MENU_ENUM_LABEL_VALUE_DRIVER_SWITCH_ENABLE;
9632 bool_entries[listing].default_value = DEFAULT_DRIVER_SWITCH_ENABLE;
9633 bool_entries[listing].flags = SD_FLAG_ADVANCED;
9634 listing++;
9635
9636 bool_entries[listing].target = &settings->bools.load_dummy_on_core_shutdown;
9637 bool_entries[listing].name_enum_idx = MENU_ENUM_LABEL_DUMMY_ON_CORE_SHUTDOWN;
9638 bool_entries[listing].SHORT_enum_idx = MENU_ENUM_LABEL_VALUE_DUMMY_ON_CORE_SHUTDOWN;
9639 bool_entries[listing].default_value = DEFAULT_LOAD_DUMMY_ON_CORE_SHUTDOWN;
9640 bool_entries[listing].flags = SD_FLAG_ADVANCED;
9641 listing++;
9642
9643 bool_entries[listing].target = &settings->bools.set_supports_no_game_enable;
9644 bool_entries[listing].name_enum_idx = MENU_ENUM_LABEL_CORE_SET_SUPPORTS_NO_CONTENT_ENABLE;
9645 bool_entries[listing].SHORT_enum_idx = MENU_ENUM_LABEL_VALUE_CORE_SET_SUPPORTS_NO_CONTENT_ENABLE;
9646 bool_entries[listing].default_value = true;
9647 bool_entries[listing].flags = SD_FLAG_ADVANCED;
9648 listing++;
9649
9650 bool_entries[listing].target = &settings->bools.check_firmware_before_loading;
9651 bool_entries[listing].name_enum_idx = MENU_ENUM_LABEL_CHECK_FOR_MISSING_FIRMWARE;
9652 bool_entries[listing].SHORT_enum_idx = MENU_ENUM_LABEL_VALUE_CHECK_FOR_MISSING_FIRMWARE;
9653 bool_entries[listing].default_value = DEFAULT_CHECK_FIRMWARE_BEFORE_LOADING;
9654 bool_entries[listing].flags = SD_FLAG_ADVANCED;
9655 listing++;
9656
9657 bool_entries[listing].target = &settings->bools.video_allow_rotate;
9658 bool_entries[listing].name_enum_idx = MENU_ENUM_LABEL_VIDEO_ALLOW_ROTATE;
9659 bool_entries[listing].SHORT_enum_idx = MENU_ENUM_LABEL_VALUE_VIDEO_ALLOW_ROTATE;
9660 bool_entries[listing].default_value = DEFAULT_ALLOW_ROTATE;
9661 bool_entries[listing].flags = SD_FLAG_ADVANCED;
9662 listing++;
9663
9664 bool_entries[listing].target = &settings->bools.core_info_cache_enable;
9665 bool_entries[listing].name_enum_idx = MENU_ENUM_LABEL_CORE_INFO_CACHE_ENABLE;
9666 bool_entries[listing].SHORT_enum_idx = MENU_ENUM_LABEL_VALUE_CORE_INFO_CACHE_ENABLE;
9667 bool_entries[listing].default_value = DEFAULT_CORE_INFO_CACHE_ENABLE;
9668 bool_entries[listing].flags = SD_FLAG_NONE;
9669 listing++;
9670
9671 #ifndef HAVE_DYNAMIC
9672 bool_entries[listing].target = &settings->bools.always_reload_core_on_run_content;
9673 bool_entries[listing].name_enum_idx = MENU_ENUM_LABEL_ALWAYS_RELOAD_CORE_ON_RUN_CONTENT;
9674 bool_entries[listing].SHORT_enum_idx = MENU_ENUM_LABEL_VALUE_ALWAYS_RELOAD_CORE_ON_RUN_CONTENT;
9675 bool_entries[listing].default_value = DEFAULT_ALWAYS_RELOAD_CORE_ON_RUN_CONTENT;
9676 bool_entries[listing].flags = SD_FLAG_ADVANCED;
9677 listing++;
9678 #endif
9679 for (i = 0; i < ARRAY_SIZE(bool_entries); i++)
9680 {
9681 #if defined(IOS)
9682 if (bool_entries[i].name_enum_idx ==
9683 MENU_ENUM_LABEL_CORE_INFO_CACHE_ENABLE)
9684 continue;
9685 #endif
9686 CONFIG_BOOL(
9687 list, list_info,
9688 bool_entries[i].target,
9689 bool_entries[i].name_enum_idx,
9690 bool_entries[i].SHORT_enum_idx,
9691 bool_entries[i].default_value,
9692 MENU_ENUM_LABEL_VALUE_OFF,
9693 MENU_ENUM_LABEL_VALUE_ON,
9694 &group_info,
9695 &subgroup_info,
9696 parent_group,
9697 general_write_handler,
9698 general_read_handler,
9699 bool_entries[i].flags);
9700 }
9701
9702 END_SUB_GROUP(list, list_info, parent_group);
9703 END_GROUP(list, list_info, parent_group);
9704 }
9705 break;
9706 case SETTINGS_LIST_CONFIGURATION:
9707 {
9708 uint8_t i;
9709 struct bool_entry bool_entries[7];
9710 START_GROUP(list, list_info, &group_info,
9711 msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CONFIGURATION_SETTINGS), parent_group);
9712
9713 parent_group = msg_hash_to_str(MENU_ENUM_LABEL_CONFIGURATION_SETTINGS);
9714
9715 START_SUB_GROUP(list, list_info, "State", &group_info, &subgroup_info,
9716 parent_group);
9717
9718 bool_entries[0].target = &settings->bools.config_save_on_exit;
9719 bool_entries[0].name_enum_idx = MENU_ENUM_LABEL_CONFIG_SAVE_ON_EXIT;
9720 bool_entries[0].SHORT_enum_idx = MENU_ENUM_LABEL_VALUE_CONFIG_SAVE_ON_EXIT;
9721 bool_entries[0].default_value = DEFAULT_CONFIG_SAVE_ON_EXIT;
9722 bool_entries[0].flags = SD_FLAG_NONE;
9723
9724 bool_entries[1].target = &settings->bools.show_hidden_files;
9725 bool_entries[1].name_enum_idx = MENU_ENUM_LABEL_SHOW_HIDDEN_FILES;
9726 bool_entries[1].SHORT_enum_idx = MENU_ENUM_LABEL_VALUE_SHOW_HIDDEN_FILES;
9727 bool_entries[1].default_value = DEFAULT_SHOW_HIDDEN_FILES;
9728 bool_entries[1].flags = SD_FLAG_NONE;
9729
9730 bool_entries[2].target = &settings->bools.game_specific_options;
9731 bool_entries[2].name_enum_idx = MENU_ENUM_LABEL_GAME_SPECIFIC_OPTIONS;
9732 bool_entries[2].SHORT_enum_idx = MENU_ENUM_LABEL_VALUE_GAME_SPECIFIC_OPTIONS;
9733 bool_entries[2].default_value = default_game_specific_options;
9734 bool_entries[2].flags = SD_FLAG_ADVANCED;
9735
9736 bool_entries[3].target = &settings->bools.auto_overrides_enable;
9737 bool_entries[3].name_enum_idx = MENU_ENUM_LABEL_AUTO_OVERRIDES_ENABLE;
9738 bool_entries[3].SHORT_enum_idx = MENU_ENUM_LABEL_VALUE_AUTO_OVERRIDES_ENABLE;
9739 bool_entries[3].default_value = default_auto_overrides_enable;
9740 bool_entries[3].flags = SD_FLAG_ADVANCED;
9741
9742 bool_entries[4].target = &settings->bools.auto_remaps_enable;
9743 bool_entries[4].name_enum_idx = MENU_ENUM_LABEL_AUTO_REMAPS_ENABLE;
9744 bool_entries[4].SHORT_enum_idx = MENU_ENUM_LABEL_VALUE_AUTO_REMAPS_ENABLE;
9745 bool_entries[4].default_value = default_auto_remaps_enable;
9746 bool_entries[4].flags = SD_FLAG_ADVANCED;
9747
9748 bool_entries[5].target = &settings->bools.auto_shaders_enable;
9749 bool_entries[5].name_enum_idx = MENU_ENUM_LABEL_AUTO_SHADERS_ENABLE;
9750 bool_entries[5].SHORT_enum_idx = MENU_ENUM_LABEL_VALUE_AUTO_SHADERS_ENABLE;
9751 bool_entries[5].default_value = default_auto_shaders_enable;
9752 bool_entries[5].flags = SD_FLAG_NONE;
9753
9754 bool_entries[6].target = &settings->bools.global_core_options;
9755 bool_entries[6].name_enum_idx = MENU_ENUM_LABEL_GLOBAL_CORE_OPTIONS;
9756 bool_entries[6].SHORT_enum_idx = MENU_ENUM_LABEL_VALUE_GLOBAL_CORE_OPTIONS;
9757 bool_entries[6].default_value = default_global_core_options;
9758 bool_entries[6].flags = SD_FLAG_NONE;
9759
9760 for (i = 0; i < ARRAY_SIZE(bool_entries); i++)
9761 {
9762 CONFIG_BOOL(
9763 list, list_info,
9764 bool_entries[i].target,
9765 bool_entries[i].name_enum_idx,
9766 bool_entries[i].SHORT_enum_idx,
9767 bool_entries[i].default_value,
9768 MENU_ENUM_LABEL_VALUE_OFF,
9769 MENU_ENUM_LABEL_VALUE_ON,
9770 &group_info,
9771 &subgroup_info,
9772 parent_group,
9773 general_write_handler,
9774 general_read_handler,
9775 bool_entries[i].flags);
9776 }
9777
9778 CONFIG_BOOL(
9779 list, list_info,
9780 &settings->bools.video_shader_enable,
9781 MENU_ENUM_LABEL_VIDEO_SHADERS_ENABLE,
9782 MENU_ENUM_LABEL_VALUE_VIDEO_SHADERS_ENABLE,
9783 DEFAULT_SHADER_ENABLE,
9784 MENU_ENUM_LABEL_VALUE_OFF,
9785 MENU_ENUM_LABEL_VALUE_ON,
9786 &group_info,
9787 &subgroup_info,
9788 parent_group,
9789 general_write_handler,
9790 general_read_handler,
9791 SD_FLAG_NONE);
9792
9793 CONFIG_BOOL(
9794 list, list_info,
9795 &settings->bools.video_shader_preset_save_reference_enable,
9796 MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_SAVE_REFERENCE,
9797 MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_REFERENCE,
9798 DEFAULT_VIDEO_SHADER_PRESET_SAVE_REFERENCE_ENABLE,
9799 MENU_ENUM_LABEL_VALUE_OFF,
9800 MENU_ENUM_LABEL_VALUE_ON,
9801 &group_info,
9802 &subgroup_info,
9803 parent_group,
9804 general_write_handler,
9805 general_read_handler,
9806 SD_FLAG_NONE);
9807
9808 END_SUB_GROUP(list, list_info, parent_group);
9809 END_GROUP(list, list_info, parent_group);
9810 }
9811 break;
9812 case SETTINGS_LIST_LOGGING:
9813 {
9814 bool *tmp_b = NULL;
9815 START_GROUP(list, list_info, &group_info, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_LOGGING_SETTINGS), parent_group);
9816 parent_group = msg_hash_to_str(MENU_ENUM_LABEL_LOGGING_SETTINGS);
9817
9818 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ADVANCED);
9819
9820 START_SUB_GROUP(list, list_info, "State", &group_info, &subgroup_info,
9821 parent_group);
9822
9823 CONFIG_BOOL(
9824 list, list_info,
9825 verbosity_get_ptr(),
9826 MENU_ENUM_LABEL_LOG_VERBOSITY,
9827 MENU_ENUM_LABEL_VALUE_LOG_VERBOSITY,
9828 false,
9829 MENU_ENUM_LABEL_VALUE_OFF,
9830 MENU_ENUM_LABEL_VALUE_ON,
9831 &group_info,
9832 &subgroup_info,
9833 parent_group,
9834 write_handler_logging_verbosity,
9835 general_read_handler,
9836 SD_FLAG_NONE);
9837 (*list)[list_info->index - 1].action_ok = &setting_bool_action_left_with_refresh;
9838 (*list)[list_info->index - 1].action_left = &setting_bool_action_left_with_refresh;
9839 (*list)[list_info->index - 1].action_right = &setting_bool_action_right_with_refresh;
9840
9841 CONFIG_UINT(
9842 list, list_info,
9843 &settings->uints.frontend_log_level,
9844 MENU_ENUM_LABEL_FRONTEND_LOG_LEVEL,
9845 MENU_ENUM_LABEL_VALUE_FRONTEND_LOG_LEVEL,
9846 DEFAULT_FRONTEND_LOG_LEVEL,
9847 &group_info,
9848 &subgroup_info,
9849 parent_group,
9850 general_write_handler,
9851 general_read_handler);
9852 (*list)[list_info->index - 1].change_handler = frontend_log_level_change_handler;
9853 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_RADIO_BUTTONS;
9854 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
9855 menu_settings_list_current_add_range(list, list_info, 0, 3, 1.0, true, true);
9856 (*list)[list_info->index - 1].get_string_representation =
9857 &setting_get_string_representation_uint_libretro_log_level;
9858
9859 CONFIG_UINT(
9860 list, list_info,
9861 &settings->uints.libretro_log_level,
9862 MENU_ENUM_LABEL_LIBRETRO_LOG_LEVEL,
9863 MENU_ENUM_LABEL_VALUE_LIBRETRO_LOG_LEVEL,
9864 DEFAULT_LIBRETRO_LOG_LEVEL,
9865 &group_info,
9866 &subgroup_info,
9867 parent_group,
9868 general_write_handler,
9869 general_read_handler);
9870 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_RADIO_BUTTONS;
9871 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
9872 menu_settings_list_current_add_range(list, list_info, 0, 3, 1.0, true, true);
9873 (*list)[list_info->index - 1].get_string_representation =
9874 &setting_get_string_representation_uint_libretro_log_level;
9875
9876 CONFIG_BOOL(
9877 list, list_info,
9878 &settings->bools.log_to_file,
9879 MENU_ENUM_LABEL_LOG_TO_FILE,
9880 MENU_ENUM_LABEL_VALUE_LOG_TO_FILE,
9881 DEFAULT_LOG_TO_FILE,
9882 MENU_ENUM_LABEL_VALUE_OFF,
9883 MENU_ENUM_LABEL_VALUE_ON,
9884 &group_info,
9885 &subgroup_info,
9886 parent_group,
9887 general_write_handler,
9888 general_read_handler,
9889 SD_FLAG_NONE);
9890 (*list)[list_info->index - 1].action_ok = &setting_bool_action_left_with_refresh;
9891 (*list)[list_info->index - 1].action_left = &setting_bool_action_left_with_refresh;
9892 (*list)[list_info->index - 1].action_right = &setting_bool_action_right_with_refresh;
9893
9894 CONFIG_BOOL(
9895 list, list_info,
9896 &settings->bools.log_to_file_timestamp,
9897 MENU_ENUM_LABEL_LOG_TO_FILE_TIMESTAMP,
9898 MENU_ENUM_LABEL_VALUE_LOG_TO_FILE_TIMESTAMP,
9899 DEFAULT_LOG_TO_FILE_TIMESTAMP,
9900 MENU_ENUM_LABEL_VALUE_OFF,
9901 MENU_ENUM_LABEL_VALUE_ON,
9902 &group_info,
9903 &subgroup_info,
9904 parent_group,
9905 general_write_handler,
9906 general_read_handler,
9907 SD_FLAG_NONE);
9908
9909 END_SUB_GROUP(list, list_info, parent_group);
9910
9911 START_SUB_GROUP(list, list_info, "Performance Counters", &group_info, &subgroup_info,
9912 parent_group);
9913
9914 rarch_ctl(RARCH_CTL_GET_PERFCNT, &tmp_b);
9915
9916 CONFIG_BOOL(
9917 list, list_info,
9918 tmp_b,
9919 MENU_ENUM_LABEL_PERFCNT_ENABLE,
9920 MENU_ENUM_LABEL_VALUE_PERFCNT_ENABLE,
9921 false,
9922 MENU_ENUM_LABEL_VALUE_OFF,
9923 MENU_ENUM_LABEL_VALUE_ON,
9924 &group_info,
9925 &subgroup_info,
9926 parent_group,
9927 general_write_handler,
9928 general_read_handler,
9929 SD_FLAG_ADVANCED);
9930 }
9931 END_SUB_GROUP(list, list_info, parent_group);
9932 END_GROUP(list, list_info, parent_group);
9933 break;
9934 case SETTINGS_LIST_SAVING:
9935 {
9936 uint8_t i;
9937 struct bool_entry bool_entries[13];
9938
9939 START_GROUP(list, list_info, &group_info, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SAVING_SETTINGS), parent_group);
9940 parent_group = msg_hash_to_str(MENU_ENUM_LABEL_SAVING_SETTINGS);
9941
9942 START_SUB_GROUP(list, list_info, "State", &group_info, &subgroup_info,
9943 parent_group);
9944
9945 bool_entries[0].target = &settings->bools.sort_savefiles_enable;
9946 bool_entries[0].name_enum_idx = MENU_ENUM_LABEL_SORT_SAVEFILES_ENABLE;
9947 bool_entries[0].SHORT_enum_idx = MENU_ENUM_LABEL_VALUE_SORT_SAVEFILES_ENABLE;
9948 bool_entries[0].default_value = default_sort_savefiles_enable;
9949 bool_entries[0].flags = SD_FLAG_ADVANCED;
9950
9951 bool_entries[1].target = &settings->bools.sort_savestates_enable;
9952 bool_entries[1].name_enum_idx = MENU_ENUM_LABEL_SORT_SAVESTATES_ENABLE;
9953 bool_entries[1].SHORT_enum_idx = MENU_ENUM_LABEL_VALUE_SORT_SAVESTATES_ENABLE;
9954 bool_entries[1].default_value = default_sort_savestates_enable;
9955 bool_entries[1].flags = SD_FLAG_ADVANCED;
9956
9957 bool_entries[2].target = &settings->bools.sort_savefiles_by_content_enable;
9958 bool_entries[2].name_enum_idx = MENU_ENUM_LABEL_SORT_SAVEFILES_BY_CONTENT_ENABLE;
9959 bool_entries[2].SHORT_enum_idx = MENU_ENUM_LABEL_VALUE_SORT_SAVEFILES_BY_CONTENT_ENABLE;
9960 bool_entries[2].default_value = default_sort_savefiles_by_content_enable;
9961 bool_entries[2].flags = SD_FLAG_ADVANCED;
9962
9963 bool_entries[3].target = &settings->bools.sort_savestates_by_content_enable;
9964 bool_entries[3].name_enum_idx = MENU_ENUM_LABEL_SORT_SAVESTATES_BY_CONTENT_ENABLE;
9965 bool_entries[3].SHORT_enum_idx = MENU_ENUM_LABEL_VALUE_SORT_SAVESTATES_BY_CONTENT_ENABLE;
9966 bool_entries[3].default_value = default_sort_savestates_by_content_enable;
9967 bool_entries[3].flags = SD_FLAG_ADVANCED;
9968
9969 bool_entries[4].target = &settings->bools.sort_screenshots_by_content_enable;
9970 bool_entries[4].name_enum_idx = MENU_ENUM_LABEL_SORT_SCREENSHOTS_BY_CONTENT_ENABLE;
9971 bool_entries[4].SHORT_enum_idx = MENU_ENUM_LABEL_VALUE_SORT_SCREENSHOTS_BY_CONTENT_ENABLE;
9972 bool_entries[4].default_value = default_sort_screenshots_by_content_enable;
9973 bool_entries[4].flags = SD_FLAG_ADVANCED;
9974
9975 bool_entries[5].target = &settings->bools.block_sram_overwrite;
9976 bool_entries[5].name_enum_idx = MENU_ENUM_LABEL_BLOCK_SRAM_OVERWRITE;
9977 bool_entries[5].SHORT_enum_idx = MENU_ENUM_LABEL_VALUE_BLOCK_SRAM_OVERWRITE;
9978 bool_entries[5].default_value = DEFAULT_BLOCK_SRAM_OVERWRITE;
9979 bool_entries[5].flags = SD_FLAG_NONE;
9980
9981 bool_entries[6].target = &settings->bools.savestate_auto_save;
9982 bool_entries[6].name_enum_idx = MENU_ENUM_LABEL_SAVESTATE_AUTO_SAVE;
9983 bool_entries[6].SHORT_enum_idx = MENU_ENUM_LABEL_VALUE_SAVESTATE_AUTO_SAVE;
9984 bool_entries[6].default_value = savestate_auto_save;
9985 bool_entries[6].flags = SD_FLAG_NONE;
9986
9987 bool_entries[7].target = &settings->bools.savestate_auto_load;
9988 bool_entries[7].name_enum_idx = MENU_ENUM_LABEL_SAVESTATE_AUTO_LOAD;
9989 bool_entries[7].SHORT_enum_idx = MENU_ENUM_LABEL_VALUE_SAVESTATE_AUTO_LOAD;
9990 bool_entries[7].default_value = savestate_auto_load;
9991 bool_entries[7].flags = SD_FLAG_NONE;
9992
9993 bool_entries[8].target = &settings->bools.savestate_thumbnail_enable;
9994 bool_entries[8].name_enum_idx = MENU_ENUM_LABEL_SAVESTATE_THUMBNAIL_ENABLE;
9995 bool_entries[8].SHORT_enum_idx = MENU_ENUM_LABEL_VALUE_SAVESTATE_THUMBNAIL_ENABLE;
9996 bool_entries[8].default_value = savestate_thumbnail_enable;
9997 bool_entries[8].flags = SD_FLAG_ADVANCED;
9998
9999 bool_entries[9].target = &settings->bools.savefiles_in_content_dir;
10000 bool_entries[9].name_enum_idx = MENU_ENUM_LABEL_SAVEFILES_IN_CONTENT_DIR_ENABLE;
10001 bool_entries[9].SHORT_enum_idx = MENU_ENUM_LABEL_VALUE_SAVEFILES_IN_CONTENT_DIR_ENABLE;
10002 bool_entries[9].default_value = default_savefiles_in_content_dir;
10003 bool_entries[9].flags = SD_FLAG_ADVANCED;
10004
10005 bool_entries[10].target = &settings->bools.savestates_in_content_dir;
10006 bool_entries[10].name_enum_idx = MENU_ENUM_LABEL_SAVESTATES_IN_CONTENT_DIR_ENABLE;
10007 bool_entries[10].SHORT_enum_idx = MENU_ENUM_LABEL_VALUE_SAVESTATES_IN_CONTENT_DIR_ENABLE;
10008 bool_entries[10].default_value = default_savestates_in_content_dir;
10009 bool_entries[10].flags = SD_FLAG_ADVANCED;
10010
10011 bool_entries[11].target = &settings->bools.systemfiles_in_content_dir;
10012 bool_entries[11].name_enum_idx = MENU_ENUM_LABEL_SYSTEMFILES_IN_CONTENT_DIR_ENABLE;
10013 bool_entries[11].SHORT_enum_idx = MENU_ENUM_LABEL_VALUE_SYSTEMFILES_IN_CONTENT_DIR_ENABLE;
10014 bool_entries[11].default_value = default_systemfiles_in_content_dir;
10015 bool_entries[11].flags = SD_FLAG_ADVANCED;
10016
10017 bool_entries[12].target = &settings->bools.screenshots_in_content_dir;
10018 bool_entries[12].name_enum_idx = MENU_ENUM_LABEL_SCREENSHOTS_IN_CONTENT_DIR_ENABLE;
10019 bool_entries[12].SHORT_enum_idx = MENU_ENUM_LABEL_VALUE_SCREENSHOTS_IN_CONTENT_DIR_ENABLE;
10020 bool_entries[12].default_value = default_screenshots_in_content_dir;
10021 bool_entries[12].flags = SD_FLAG_ADVANCED;
10022
10023 for (i = 0; i < ARRAY_SIZE(bool_entries); i++)
10024 {
10025 CONFIG_BOOL(
10026 list, list_info,
10027 bool_entries[i].target,
10028 bool_entries[i].name_enum_idx,
10029 bool_entries[i].SHORT_enum_idx,
10030 bool_entries[i].default_value,
10031 MENU_ENUM_LABEL_VALUE_OFF,
10032 MENU_ENUM_LABEL_VALUE_ON,
10033 &group_info,
10034 &subgroup_info,
10035 parent_group,
10036 general_write_handler,
10037 general_read_handler,
10038 bool_entries[i].flags);
10039 }
10040
10041 #ifdef HAVE_THREADS
10042 CONFIG_UINT(
10043 list, list_info,
10044 &settings->uints.autosave_interval,
10045 MENU_ENUM_LABEL_AUTOSAVE_INTERVAL,
10046 MENU_ENUM_LABEL_VALUE_AUTOSAVE_INTERVAL,
10047 DEFAULT_AUTOSAVE_INTERVAL,
10048 &group_info,
10049 &subgroup_info,
10050 parent_group,
10051 general_write_handler,
10052 general_read_handler);
10053 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
10054 MENU_SETTINGS_LIST_CURRENT_ADD_CMD(list, list_info, CMD_EVENT_AUTOSAVE_INIT);
10055 menu_settings_list_current_add_range(list, list_info, 0, 0, 1, true, false);
10056 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_CMD_APPLY_AUTO);
10057 (*list)[list_info->index - 1].get_string_representation =
10058 &setting_get_string_representation_uint_autosave_interval;
10059 #endif
10060 CONFIG_BOOL(
10061 list, list_info,
10062 &settings->bools.savestate_auto_index,
10063 MENU_ENUM_LABEL_SAVESTATE_AUTO_INDEX,
10064 MENU_ENUM_LABEL_VALUE_SAVESTATE_AUTO_INDEX,
10065 savestate_auto_index,
10066 MENU_ENUM_LABEL_VALUE_OFF,
10067 MENU_ENUM_LABEL_VALUE_ON,
10068 &group_info,
10069 &subgroup_info,
10070 parent_group,
10071 general_write_handler,
10072 general_read_handler,
10073 SD_FLAG_NONE);
10074 (*list)[list_info->index - 1].action_ok = &setting_bool_action_left_with_refresh;
10075 (*list)[list_info->index - 1].action_left = &setting_bool_action_left_with_refresh;
10076 (*list)[list_info->index - 1].action_right = &setting_bool_action_right_with_refresh;
10077
10078 CONFIG_UINT(
10079 list, list_info,
10080 &settings->uints.savestate_max_keep,
10081 MENU_ENUM_LABEL_SAVESTATE_MAX_KEEP,
10082 MENU_ENUM_LABEL_VALUE_SAVESTATE_MAX_KEEP,
10083 DEFAULT_SAVESTATE_MAX_KEEP,
10084 &group_info,
10085 &subgroup_info,
10086 parent_group,
10087 general_write_handler,
10088 general_read_handler);
10089 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
10090 menu_settings_list_current_add_range(list, list_info, 0, 999, 1, true, true);
10091
10092 CONFIG_BOOL(
10093 list, list_info,
10094 &settings->bools.content_runtime_log,
10095 MENU_ENUM_LABEL_CONTENT_RUNTIME_LOG,
10096 MENU_ENUM_LABEL_VALUE_CONTENT_RUNTIME_LOG,
10097 DEFAULT_CONTENT_RUNTIME_LOG,
10098 MENU_ENUM_LABEL_VALUE_OFF,
10099 MENU_ENUM_LABEL_VALUE_ON,
10100 &group_info,
10101 &subgroup_info,
10102 parent_group,
10103 general_write_handler,
10104 general_read_handler,
10105 SD_FLAG_NONE);
10106
10107 CONFIG_BOOL(
10108 list, list_info,
10109 &settings->bools.content_runtime_log_aggregate,
10110 MENU_ENUM_LABEL_CONTENT_RUNTIME_LOG_AGGREGATE,
10111 MENU_ENUM_LABEL_VALUE_CONTENT_RUNTIME_LOG_AGGREGATE,
10112 DEFAULT_CONTENT_RUNTIME_LOG_AGGREGATE,
10113 MENU_ENUM_LABEL_VALUE_OFF,
10114 MENU_ENUM_LABEL_VALUE_ON,
10115 &group_info,
10116 &subgroup_info,
10117 parent_group,
10118 general_write_handler,
10119 general_read_handler,
10120 SD_FLAG_NONE);
10121
10122 #if defined(HAVE_ZLIB)
10123 CONFIG_BOOL(
10124 list, list_info,
10125 &settings->bools.save_file_compression,
10126 MENU_ENUM_LABEL_SAVE_FILE_COMPRESSION,
10127 MENU_ENUM_LABEL_VALUE_SAVE_FILE_COMPRESSION,
10128 DEFAULT_SAVE_FILE_COMPRESSION,
10129 MENU_ENUM_LABEL_VALUE_OFF,
10130 MENU_ENUM_LABEL_VALUE_ON,
10131 &group_info,
10132 &subgroup_info,
10133 parent_group,
10134 general_write_handler,
10135 general_read_handler,
10136 SD_FLAG_NONE);
10137
10138 CONFIG_BOOL(
10139 list, list_info,
10140 &settings->bools.savestate_file_compression,
10141 MENU_ENUM_LABEL_SAVESTATE_FILE_COMPRESSION,
10142 MENU_ENUM_LABEL_VALUE_SAVESTATE_FILE_COMPRESSION,
10143 DEFAULT_SAVESTATE_FILE_COMPRESSION,
10144 MENU_ENUM_LABEL_VALUE_OFF,
10145 MENU_ENUM_LABEL_VALUE_ON,
10146 &group_info,
10147 &subgroup_info,
10148 parent_group,
10149 general_write_handler,
10150 general_read_handler,
10151 SD_FLAG_NONE);
10152 #endif
10153
10154 /* TODO/FIXME: This is in the wrong group... */
10155 CONFIG_BOOL(
10156 list, list_info,
10157 &settings->bools.scan_without_core_match,
10158 MENU_ENUM_LABEL_SCAN_WITHOUT_CORE_MATCH,
10159 MENU_ENUM_LABEL_VALUE_SCAN_WITHOUT_CORE_MATCH,
10160 DEFAULT_SCAN_WITHOUT_CORE_MATCH,
10161 MENU_ENUM_LABEL_VALUE_OFF,
10162 MENU_ENUM_LABEL_VALUE_ON,
10163 &group_info,
10164 &subgroup_info,
10165 parent_group,
10166 general_write_handler,
10167 general_read_handler,
10168 SD_FLAG_NONE);
10169
10170 END_SUB_GROUP(list, list_info, parent_group);
10171 END_GROUP(list, list_info, parent_group);
10172 }
10173
10174 break;
10175 case SETTINGS_LIST_FRAME_TIME_COUNTER:
10176 START_GROUP(list, list_info, &group_info, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_FRAME_TIME_COUNTER_SETTINGS), parent_group);
10177
10178 parent_group = msg_hash_to_str(MENU_ENUM_LABEL_FRAME_TIME_COUNTER_SETTINGS);
10179
10180 START_SUB_GROUP(list, list_info, "State", &group_info, &subgroup_info, parent_group);
10181
10182 CONFIG_BOOL(
10183 list, list_info,
10184 &settings->bools.frame_time_counter_reset_after_fastforwarding,
10185 MENU_ENUM_LABEL_FRAME_TIME_COUNTER_RESET_AFTER_FASTFORWARDING,
10186 MENU_ENUM_LABEL_VALUE_FRAME_TIME_COUNTER_RESET_AFTER_FASTFORWARDING,
10187 false,
10188 MENU_ENUM_LABEL_VALUE_OFF,
10189 MENU_ENUM_LABEL_VALUE_ON,
10190 &group_info,
10191 &subgroup_info,
10192 parent_group,
10193 general_write_handler,
10194 general_read_handler,
10195 SD_FLAG_NONE);
10196
10197 CONFIG_BOOL(
10198 list, list_info,
10199 &settings->bools.frame_time_counter_reset_after_load_state,
10200 MENU_ENUM_LABEL_FRAME_TIME_COUNTER_RESET_AFTER_LOAD_STATE,
10201 MENU_ENUM_LABEL_VALUE_FRAME_TIME_COUNTER_RESET_AFTER_LOAD_STATE,
10202 false,
10203 MENU_ENUM_LABEL_VALUE_OFF,
10204 MENU_ENUM_LABEL_VALUE_ON,
10205 &group_info,
10206 &subgroup_info,
10207 parent_group,
10208 general_write_handler,
10209 general_read_handler,
10210 SD_FLAG_NONE);
10211
10212 CONFIG_BOOL(
10213 list, list_info,
10214 &settings->bools.frame_time_counter_reset_after_save_state,
10215 MENU_ENUM_LABEL_FRAME_TIME_COUNTER_RESET_AFTER_SAVE_STATE,
10216 MENU_ENUM_LABEL_VALUE_FRAME_TIME_COUNTER_RESET_AFTER_SAVE_STATE,
10217 false,
10218 MENU_ENUM_LABEL_VALUE_OFF,
10219 MENU_ENUM_LABEL_VALUE_ON,
10220 &group_info,
10221 &subgroup_info,
10222 parent_group,
10223 general_write_handler,
10224 general_read_handler,
10225 SD_FLAG_NONE);
10226
10227 END_SUB_GROUP(list, list_info, parent_group);
10228 END_GROUP(list, list_info, parent_group);
10229 break;
10230 case SETTINGS_LIST_REWIND:
10231 START_GROUP(list, list_info, &group_info, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_REWIND_SETTINGS), parent_group);
10232
10233 parent_group = msg_hash_to_str(MENU_ENUM_LABEL_REWIND_SETTINGS);
10234
10235 START_SUB_GROUP(list, list_info, "State", &group_info, &subgroup_info, parent_group);
10236
10237 CONFIG_BOOL(
10238 list, list_info,
10239 &settings->bools.rewind_enable,
10240 MENU_ENUM_LABEL_REWIND_ENABLE,
10241 MENU_ENUM_LABEL_VALUE_REWIND_ENABLE,
10242 DEFAULT_REWIND_ENABLE,
10243 MENU_ENUM_LABEL_VALUE_OFF,
10244 MENU_ENUM_LABEL_VALUE_ON,
10245 &group_info,
10246 &subgroup_info,
10247 parent_group,
10248 general_write_handler,
10249 general_read_handler,
10250 SD_FLAG_CMD_APPLY_AUTO);
10251 (*list)[list_info->index - 1].action_ok = &setting_bool_action_left_with_refresh;
10252 (*list)[list_info->index - 1].action_left = &setting_bool_action_left_with_refresh;
10253 (*list)[list_info->index - 1].action_right = &setting_bool_action_right_with_refresh;
10254 MENU_SETTINGS_LIST_CURRENT_ADD_CMD(list, list_info, CMD_EVENT_REWIND_TOGGLE);
10255
10256 CONFIG_UINT(
10257 list, list_info,
10258 &settings->uints.rewind_granularity,
10259 MENU_ENUM_LABEL_REWIND_GRANULARITY,
10260 MENU_ENUM_LABEL_VALUE_REWIND_GRANULARITY,
10261 DEFAULT_REWIND_GRANULARITY,
10262 &group_info,
10263 &subgroup_info,
10264 parent_group,
10265 general_write_handler,
10266 general_read_handler);
10267 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
10268 (*list)[list_info->index - 1].offset_by = 1;
10269 menu_settings_list_current_add_range(list, list_info, 1, 32768, 1, true, true);
10270
10271 CONFIG_SIZE(
10272 list, list_info,
10273 &settings->sizes.rewind_buffer_size,
10274 MENU_ENUM_LABEL_REWIND_BUFFER_SIZE,
10275 MENU_ENUM_LABEL_VALUE_REWIND_BUFFER_SIZE,
10276 DEFAULT_REWIND_BUFFER_SIZE,
10277 &group_info,
10278 &subgroup_info,
10279 parent_group,
10280 general_write_handler,
10281 general_read_handler,
10282 &setting_get_string_representation_size_in_mb);
10283 menu_settings_list_current_add_range(list, list_info, 1024*1024, 1024*1024*1024, settings->uints.rewind_buffer_size_step*1024*1024, true, true);
10284
10285 CONFIG_UINT(
10286 list, list_info,
10287 &settings->uints.rewind_buffer_size_step,
10288 MENU_ENUM_LABEL_REWIND_BUFFER_SIZE_STEP,
10289 MENU_ENUM_LABEL_VALUE_REWIND_BUFFER_SIZE_STEP,
10290 DEFAULT_REWIND_BUFFER_SIZE_STEP,
10291 &group_info,
10292 &subgroup_info,
10293 parent_group,
10294 general_write_handler,
10295 general_read_handler);
10296 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
10297 (*list)[list_info->index - 1].offset_by = 1;
10298 menu_settings_list_current_add_range(list, list_info, 1, 100, 1, true, true);
10299
10300 END_SUB_GROUP(list, list_info, parent_group);
10301 END_GROUP(list, list_info, parent_group);
10302 break;
10303 case SETTINGS_LIST_CHEATS:
10304 {
10305 START_GROUP(list, list_info, &group_info, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CHEAT_SETTINGS), parent_group);
10306
10307 parent_group = msg_hash_to_str(MENU_ENUM_LABEL_CHEAT_SETTINGS);
10308
10309 START_SUB_GROUP(list, list_info, "State", &group_info, &subgroup_info, parent_group);
10310
10311 CONFIG_BOOL(
10312 list, list_info,
10313 &settings->bools.apply_cheats_after_load,
10314 MENU_ENUM_LABEL_CHEAT_APPLY_AFTER_LOAD,
10315 MENU_ENUM_LABEL_VALUE_CHEAT_APPLY_AFTER_LOAD,
10316 DEFAULT_APPLY_CHEATS_AFTER_LOAD,
10317 MENU_ENUM_LABEL_VALUE_OFF,
10318 MENU_ENUM_LABEL_VALUE_ON,
10319 &group_info,
10320 &subgroup_info,
10321 parent_group,
10322 general_write_handler,
10323 general_read_handler,
10324 SD_FLAG_CMD_APPLY_AUTO);
10325
10326 CONFIG_BOOL(
10327 list, list_info,
10328 &settings->bools.apply_cheats_after_toggle,
10329 MENU_ENUM_LABEL_CHEAT_APPLY_AFTER_TOGGLE,
10330 MENU_ENUM_LABEL_VALUE_CHEAT_APPLY_AFTER_TOGGLE,
10331 DEFAULT_APPLY_CHEATS_AFTER_TOGGLE,
10332 MENU_ENUM_LABEL_VALUE_OFF,
10333 MENU_ENUM_LABEL_VALUE_ON,
10334 &group_info,
10335 &subgroup_info,
10336 parent_group,
10337 general_write_handler,
10338 general_read_handler,
10339 SD_FLAG_CMD_APPLY_AUTO);
10340
10341 END_SUB_GROUP(list, list_info, parent_group);
10342 END_GROUP(list, list_info, parent_group);
10343 break;
10344 }
10345 case SETTINGS_LIST_CHEAT_DETAILS:
10346 #ifdef HAVE_CHEATS
10347 {
10348 int max_bit_position;
10349 if (!cheat_manager_state.cheats)
10350 break;
10351
10352 START_GROUP(list, list_info, &group_info, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CHEAT_DETAILS_SETTINGS), parent_group);
10353
10354 parent_group = msg_hash_to_str(MENU_ENUM_LABEL_CHEAT_DETAILS_SETTINGS);
10355
10356 START_SUB_GROUP(list, list_info, "State", &group_info, &subgroup_info, parent_group);
10357
10358 CONFIG_UINT_CBS(cheat_manager_state.working_cheat.idx, CHEAT_IDX,
10359 NULL,NULL,
10360 0,&setting_get_string_representation_uint,0,cheat_manager_get_size()-1,1);
10361
10362 CONFIG_BOOL(
10363 list, list_info,
10364 &cheat_manager_state.working_cheat.state,
10365 MENU_ENUM_LABEL_CHEAT_STATE,
10366 MENU_ENUM_LABEL_VALUE_CHEAT_STATE,
10367 cheat_manager_state.working_cheat.state,
10368 MENU_ENUM_LABEL_VALUE_OFF,
10369 MENU_ENUM_LABEL_VALUE_ON,
10370 &group_info,
10371 &subgroup_info,
10372 parent_group,
10373 general_write_handler,
10374 general_read_handler,
10375 SD_FLAG_NONE);
10376
10377 CONFIG_STRING(
10378 list, list_info,
10379 cheat_manager_state.working_desc,
10380 sizeof(cheat_manager_state.working_desc),
10381 MENU_ENUM_LABEL_CHEAT_DESC,
10382 MENU_ENUM_LABEL_VALUE_CHEAT_DESC,
10383 "",
10384 &group_info,
10385 &subgroup_info,
10386 parent_group,
10387 general_write_handler,
10388 general_read_handler);
10389 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ALLOW_INPUT);
10390 (*list)[list_info->index - 1].action_start = setting_generic_action_start_default;
10391
10392 CONFIG_STRING(
10393 list, list_info,
10394 cheat_manager_state.working_code,
10395 sizeof(cheat_manager_state.working_code),
10396 MENU_ENUM_LABEL_CHEAT_CODE,
10397 MENU_ENUM_LABEL_VALUE_CHEAT_CODE,
10398 "",
10399 &group_info,
10400 &subgroup_info,
10401 parent_group,
10402 general_write_handler,
10403 general_read_handler);
10404 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ALLOW_INPUT);
10405 (*list)[list_info->index - 1].action_start = setting_generic_action_start_default;
10406
10407 CONFIG_UINT_CBS(cheat_manager_state.working_cheat.handler, CHEAT_HANDLER,
10408 setting_uint_action_left_with_refresh,setting_uint_action_right_with_refresh,
10409 MENU_ENUM_LABEL_CHEAT_HANDLER_TYPE_EMU,
10410 &setting_get_string_representation_uint_as_enum,
10411 CHEAT_HANDLER_TYPE_EMU,CHEAT_HANDLER_TYPE_RETRO,1);
10412 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
10413
10414 CONFIG_STRING(
10415 list, list_info,
10416 cheat_manager_state.working_code,
10417 sizeof(cheat_manager_state.working_code),
10418 MENU_ENUM_LABEL_CHEAT_CODE,
10419 MENU_ENUM_LABEL_VALUE_CHEAT_CODE,
10420 "",
10421 &group_info,
10422 &subgroup_info,
10423 parent_group,
10424 general_write_handler,
10425 general_read_handler);
10426 (*list)[list_info->index - 1].action_start = setting_generic_action_start_default;
10427
10428 CONFIG_UINT_CBS(cheat_manager_state.working_cheat.memory_search_size, CHEAT_MEMORY_SEARCH_SIZE,
10429 setting_uint_action_left_with_refresh,setting_uint_action_right_with_refresh,
10430 MENU_ENUM_LABEL_CHEAT_MEMORY_SIZE_1,
10431 &setting_get_string_representation_uint_as_enum,
10432 0,5,1);
10433 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
10434
10435 CONFIG_UINT_CBS(cheat_manager_state.working_cheat.cheat_type, CHEAT_TYPE,
10436 setting_uint_action_left_default,setting_uint_action_right_default,
10437 MENU_ENUM_LABEL_CHEAT_TYPE_DISABLED,
10438 &setting_get_string_representation_uint_as_enum,
10439 CHEAT_TYPE_DISABLED,CHEAT_TYPE_RUN_NEXT_IF_GT,1);
10440 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
10441
10442 CONFIG_UINT_CBS(cheat_manager_state.working_cheat.value, CHEAT_VALUE,
10443 setting_uint_action_left_default,setting_uint_action_right_default,
10444 0,&setting_get_string_representation_hex_and_uint,
10445 0,cheat_manager_get_state_search_size(cheat_manager_state.working_cheat.memory_search_size),1);
10446 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
10447
10448 CONFIG_UINT_CBS(cheat_manager_state.working_cheat.address, CHEAT_ADDRESS,
10449 setting_uint_action_left_with_refresh,setting_uint_action_right_with_refresh,
10450 0,&setting_get_string_representation_hex_and_uint,
10451 0,cheat_manager_state.total_memory_size==0?0:cheat_manager_state.total_memory_size-1,1);
10452
10453 max_bit_position = cheat_manager_state.working_cheat.memory_search_size<3 ? 255 : 0;
10454 CONFIG_UINT_CBS(cheat_manager_state.working_cheat.address_mask, CHEAT_ADDRESS_BIT_POSITION,
10455 setting_uint_action_left_default,setting_uint_action_right_default,
10456 0,&setting_get_string_representation_hex_and_uint,0,max_bit_position,1);
10457
10458 CONFIG_BOOL(
10459 list, list_info,
10460 &cheat_manager_state.working_cheat.big_endian,
10461 MENU_ENUM_LABEL_CHEAT_BIG_ENDIAN,
10462 MENU_ENUM_LABEL_VALUE_CHEAT_BIG_ENDIAN,
10463 cheat_manager_state.working_cheat.big_endian,
10464 MENU_ENUM_LABEL_VALUE_OFF,
10465 MENU_ENUM_LABEL_VALUE_ON,
10466 &group_info,
10467 &subgroup_info,
10468 parent_group,
10469 general_write_handler,
10470 general_read_handler,
10471 SD_FLAG_NONE);
10472
10473 CONFIG_UINT_CBS(cheat_manager_state.working_cheat.repeat_count, CHEAT_REPEAT_COUNT,
10474 setting_uint_action_left_default,setting_uint_action_right_default,
10475 0,&setting_get_string_representation_hex_and_uint,1,2048,1);
10476 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
10477
10478 CONFIG_UINT_CBS(cheat_manager_state.working_cheat.repeat_add_to_address, CHEAT_REPEAT_ADD_TO_ADDRESS,
10479 setting_uint_action_left_default,setting_uint_action_right_default,
10480 0,&setting_get_string_representation_hex_and_uint,1,2048,1);
10481 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
10482
10483 CONFIG_UINT_CBS(cheat_manager_state.working_cheat.repeat_add_to_value, CHEAT_REPEAT_ADD_TO_VALUE,
10484 setting_uint_action_left_default,setting_uint_action_right_default,
10485 0,&setting_get_string_representation_hex_and_uint,0,0xFFFF,1);
10486 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
10487
10488 CONFIG_UINT_CBS(cheat_manager_state.working_cheat.rumble_type, CHEAT_RUMBLE_TYPE,
10489 setting_uint_action_left_default,setting_uint_action_right_default,
10490 MENU_ENUM_LABEL_RUMBLE_TYPE_DISABLED,
10491 &setting_get_string_representation_uint_as_enum,
10492 RUMBLE_TYPE_DISABLED,RUMBLE_TYPE_END_LIST-1,1);
10493 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
10494
10495 CONFIG_UINT_CBS(cheat_manager_state.working_cheat.rumble_value, CHEAT_RUMBLE_VALUE,
10496 setting_uint_action_left_default,setting_uint_action_right_default,
10497 0,&setting_get_string_representation_hex_and_uint,
10498 0,cheat_manager_get_state_search_size(cheat_manager_state.working_cheat.memory_search_size),1);
10499 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
10500
10501 CONFIG_UINT_CBS(cheat_manager_state.working_cheat.rumble_port, CHEAT_RUMBLE_PORT,
10502 setting_uint_action_left_default,setting_uint_action_right_default,
10503 MENU_ENUM_LABEL_RUMBLE_PORT_0,
10504 &setting_get_string_representation_uint_as_enum,
10505 0,16,1);
10506 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
10507
10508 CONFIG_UINT_CBS(cheat_manager_state.working_cheat.rumble_primary_strength, CHEAT_RUMBLE_PRIMARY_STRENGTH,
10509 setting_uint_action_left_default,setting_uint_action_right_default,
10510 0,&setting_get_string_representation_hex_and_uint,0,65535,1);
10511
10512 CONFIG_UINT_CBS(cheat_manager_state.working_cheat.rumble_primary_duration, CHEAT_RUMBLE_PRIMARY_DURATION,
10513 setting_uint_action_left_default,setting_uint_action_right_default,
10514 0,&setting_get_string_representation_uint,0,5000,1);
10515 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
10516
10517 CONFIG_UINT_CBS(cheat_manager_state.working_cheat.rumble_secondary_strength, CHEAT_RUMBLE_SECONDARY_STRENGTH,
10518 setting_uint_action_left_default,setting_uint_action_right_default,
10519 0,&setting_get_string_representation_hex_and_uint,0,65535,1);
10520
10521 CONFIG_UINT_CBS(cheat_manager_state.working_cheat.rumble_secondary_duration, CHEAT_RUMBLE_SECONDARY_DURATION,
10522 setting_uint_action_left_default,setting_uint_action_right_default,
10523 0,&setting_get_string_representation_uint,0,5000,1);
10524 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
10525
10526 END_SUB_GROUP(list, list_info, parent_group);
10527 END_GROUP(list, list_info, parent_group);
10528 }
10529 #endif
10530 break;
10531 case SETTINGS_LIST_CHEAT_SEARCH:
10532 #ifdef HAVE_CHEATS
10533 if (!cheat_manager_state.cheats)
10534 break;
10535
10536 START_GROUP(list, list_info, &group_info, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CHEAT_SEARCH_SETTINGS), parent_group);
10537
10538 parent_group = msg_hash_to_str(MENU_ENUM_LABEL_CHEAT_SEARCH_SETTINGS);
10539
10540 START_SUB_GROUP(list, list_info, "State", &group_info, &subgroup_info, parent_group);
10541
10542 CONFIG_UINT_CBS(cheat_manager_state.search_bit_size, CHEAT_START_OR_RESTART,
10543 setting_uint_action_left_with_refresh,setting_uint_action_right_with_refresh,
10544 MENU_ENUM_LABEL_CHEAT_MEMORY_SIZE_1,
10545 &setting_get_string_representation_uint_as_enum,
10546 0,5,1);
10547 (*list)[list_info->index - 1].action_ok = &cheat_manager_initialize_memory;
10548
10549 CONFIG_BOOL(
10550 list, list_info,
10551 &cheat_manager_state.big_endian,
10552 MENU_ENUM_LABEL_CHEAT_BIG_ENDIAN,
10553 MENU_ENUM_LABEL_VALUE_CHEAT_BIG_ENDIAN,
10554 cheat_manager_state.big_endian,
10555 MENU_ENUM_LABEL_VALUE_OFF,
10556 MENU_ENUM_LABEL_VALUE_ON,
10557 &group_info,
10558 &subgroup_info,
10559 parent_group,
10560 general_write_handler,
10561 general_read_handler,
10562 SD_FLAG_NONE);
10563
10564 CONFIG_UINT(
10565 list, list_info,
10566 &cheat_manager_state.search_exact_value,
10567 MENU_ENUM_LABEL_CHEAT_SEARCH_EXACT,
10568 MENU_ENUM_LABEL_VALUE_CHEAT_SEARCH_EXACT,
10569 cheat_manager_state.search_exact_value,
10570 &group_info,
10571 &subgroup_info,
10572 parent_group,
10573 general_write_handler,
10574 general_read_handler);
10575 menu_settings_list_current_add_range(list, list_info,
10576 0, cheat_manager_get_state_search_size(cheat_manager_state.search_bit_size), 1, true, true);
10577 (*list)[list_info->index - 1].get_string_representation = &setting_get_string_representation_uint_cheat_exact;
10578 (*list)[list_info->index - 1].action_ok = &cheat_manager_search_exact;
10579
10580 CONFIG_UINT(
10581 list, list_info,
10582 &cheat_manager_state.dummy,
10583 MENU_ENUM_LABEL_CHEAT_SEARCH_LT,
10584 MENU_ENUM_LABEL_VALUE_CHEAT_SEARCH_LT,
10585 cheat_manager_state.dummy,
10586 &group_info,
10587 &subgroup_info,
10588 parent_group,
10589 general_write_handler,
10590 general_read_handler);
10591 (*list)[list_info->index - 1].get_string_representation = &setting_get_string_representation_uint_cheat_lt;
10592 (*list)[list_info->index - 1].action_ok = &cheat_manager_search_lt;
10593
10594 CONFIG_UINT(
10595 list, list_info,
10596 &cheat_manager_state.dummy,
10597 MENU_ENUM_LABEL_CHEAT_SEARCH_LTE,
10598 MENU_ENUM_LABEL_VALUE_CHEAT_SEARCH_LTE,
10599 cheat_manager_state.dummy,
10600 &group_info,
10601 &subgroup_info,
10602 parent_group,
10603 general_write_handler,
10604 general_read_handler);
10605 (*list)[list_info->index - 1].get_string_representation = &setting_get_string_representation_uint_cheat_lte;
10606 (*list)[list_info->index - 1].action_ok = &cheat_manager_search_lte;
10607
10608 CONFIG_UINT(
10609 list, list_info,
10610 &cheat_manager_state.dummy,
10611 MENU_ENUM_LABEL_CHEAT_SEARCH_GT,
10612 MENU_ENUM_LABEL_VALUE_CHEAT_SEARCH_GT,
10613 cheat_manager_state.dummy,
10614 &group_info,
10615 &subgroup_info,
10616 parent_group,
10617 general_write_handler,
10618 general_read_handler);
10619 (*list)[list_info->index - 1].get_string_representation = &setting_get_string_representation_uint_cheat_gt;
10620 (*list)[list_info->index - 1].action_ok = &cheat_manager_search_gt;
10621
10622 CONFIG_UINT(
10623 list, list_info,
10624 &cheat_manager_state.dummy,
10625 MENU_ENUM_LABEL_CHEAT_SEARCH_GTE,
10626 MENU_ENUM_LABEL_VALUE_CHEAT_SEARCH_GTE,
10627 cheat_manager_state.dummy,
10628 &group_info,
10629 &subgroup_info,
10630 parent_group,
10631 general_write_handler,
10632 general_read_handler);
10633 (*list)[list_info->index - 1].get_string_representation = &setting_get_string_representation_uint_cheat_gte;
10634 (*list)[list_info->index - 1].action_ok = &cheat_manager_search_gte;
10635
10636 CONFIG_UINT(
10637 list, list_info,
10638 &cheat_manager_state.dummy,
10639 MENU_ENUM_LABEL_CHEAT_SEARCH_EQ,
10640 MENU_ENUM_LABEL_VALUE_CHEAT_SEARCH_EQ,
10641 cheat_manager_state.dummy,
10642 &group_info,
10643 &subgroup_info,
10644 parent_group,
10645 general_write_handler,
10646 general_read_handler);
10647 (*list)[list_info->index - 1].get_string_representation = &setting_get_string_representation_uint_cheat_eq;
10648 (*list)[list_info->index - 1].action_ok = &cheat_manager_search_eq;
10649
10650 CONFIG_UINT(
10651 list, list_info,
10652 &cheat_manager_state.dummy,
10653 MENU_ENUM_LABEL_CHEAT_SEARCH_NEQ,
10654 MENU_ENUM_LABEL_VALUE_CHEAT_SEARCH_NEQ,
10655 cheat_manager_state.dummy,
10656 &group_info,
10657 &subgroup_info,
10658 parent_group,
10659 general_write_handler,
10660 general_read_handler);
10661 (*list)[list_info->index - 1].get_string_representation = &setting_get_string_representation_uint_cheat_neq;
10662 (*list)[list_info->index - 1].action_ok = &cheat_manager_search_neq;
10663
10664 CONFIG_UINT(
10665 list, list_info,
10666 &cheat_manager_state.search_eqplus_value,
10667 MENU_ENUM_LABEL_CHEAT_SEARCH_EQPLUS,
10668 MENU_ENUM_LABEL_VALUE_CHEAT_SEARCH_EQPLUS,
10669 cheat_manager_state.search_eqplus_value,
10670 &group_info,
10671 &subgroup_info,
10672 parent_group,
10673 general_write_handler,
10674 general_read_handler);
10675 menu_settings_list_current_add_range(list, list_info,
10676 0, cheat_manager_get_state_search_size(cheat_manager_state.search_bit_size), 1, true, true);
10677 (*list)[list_info->index - 1].get_string_representation = &setting_get_string_representation_uint_cheat_eqplus;
10678 (*list)[list_info->index - 1].action_ok = &cheat_manager_search_eqplus;
10679
10680 CONFIG_UINT(
10681 list, list_info,
10682 &cheat_manager_state.search_eqminus_value,
10683 MENU_ENUM_LABEL_CHEAT_SEARCH_EQMINUS,
10684 MENU_ENUM_LABEL_VALUE_CHEAT_SEARCH_EQMINUS,
10685 cheat_manager_state.search_eqminus_value,
10686 &group_info,
10687 &subgroup_info,
10688 parent_group,
10689 general_write_handler,
10690 general_read_handler);
10691 menu_settings_list_current_add_range(list, list_info,
10692 0, cheat_manager_get_state_search_size(cheat_manager_state.search_bit_size), 1, true, true);
10693 (*list)[list_info->index - 1].get_string_representation = &setting_get_string_representation_uint_cheat_eqminus;
10694 (*list)[list_info->index - 1].action_ok = &cheat_manager_search_eqminus;
10695
10696 CONFIG_UINT(
10697 list, list_info,
10698 &cheat_manager_state.match_idx,
10699 MENU_ENUM_LABEL_CHEAT_DELETE_MATCH,
10700 MENU_ENUM_LABEL_VALUE_CHEAT_DELETE_MATCH,
10701 cheat_manager_state.match_idx,
10702 &group_info,
10703 &subgroup_info,
10704 parent_group,
10705 general_write_handler,
10706 general_read_handler);
10707 menu_settings_list_current_add_range(list, list_info, 0, cheat_manager_state.num_matches-1, 1, true, true);
10708 (*list)[list_info->index - 1].action_left = &setting_uint_action_left_with_refresh;
10709 (*list)[list_info->index - 1].action_right = &setting_uint_action_right_with_refresh;
10710 (*list)[list_info->index - 1].action_ok = &cheat_manager_delete_match;
10711
10712 CONFIG_UINT(
10713 list, list_info,
10714 &cheat_manager_state.match_idx,
10715 MENU_ENUM_LABEL_CHEAT_COPY_MATCH,
10716 MENU_ENUM_LABEL_VALUE_CHEAT_COPY_MATCH,
10717 cheat_manager_state.match_idx,
10718 &group_info,
10719 &subgroup_info,
10720 parent_group,
10721 general_write_handler,
10722 general_read_handler);
10723 menu_settings_list_current_add_range(list, list_info, 0, cheat_manager_state.num_matches-1, 1, true, true);
10724 (*list)[list_info->index - 1].action_left = &setting_uint_action_left_with_refresh;
10725 (*list)[list_info->index - 1].action_right = &setting_uint_action_right_with_refresh;
10726 (*list)[list_info->index - 1].action_ok = &cheat_manager_copy_match;
10727
10728 CONFIG_UINT(
10729 list, list_info,
10730 &cheat_manager_state.browse_address,
10731 MENU_ENUM_LABEL_CHEAT_BROWSE_MEMORY,
10732 MENU_ENUM_LABEL_VALUE_CHEAT_BROWSE_MEMORY,
10733 cheat_manager_state.browse_address,
10734 &group_info,
10735 &subgroup_info,
10736 parent_group,
10737 general_write_handler,
10738 general_read_handler);
10739 menu_settings_list_current_add_range(list, list_info, 0, cheat_manager_state.total_memory_size>0?cheat_manager_state.total_memory_size-1:0, 1, true, true);
10740 (*list)[list_info->index - 1].action_left = &setting_uint_action_left_with_refresh;
10741 (*list)[list_info->index - 1].action_right = &setting_uint_action_right_with_refresh;
10742 (*list)[list_info->index - 1].get_string_representation = &setting_get_string_representation_uint_cheat_browse_address;
10743
10744 END_SUB_GROUP(list, list_info, parent_group);
10745 END_GROUP(list, list_info, parent_group);
10746 #endif
10747 break;
10748 case SETTINGS_LIST_VIDEO:
10749 {
10750 struct video_viewport *custom_vp = video_viewport_get_custom();
10751 START_GROUP(list, list_info, &group_info, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_SETTINGS), parent_group);
10752 MENU_SETTINGS_LIST_CURRENT_ADD_ENUM_IDX_PTR(list, list_info, MENU_ENUM_LABEL_VIDEO_SETTINGS);
10753
10754 parent_group = msg_hash_to_str(MENU_ENUM_LABEL_SETTINGS);
10755
10756 START_SUB_GROUP(list, list_info, "State", &group_info, &subgroup_info, parent_group);
10757
10758 #if !defined(RARCH_CONSOLE) && !defined(RARCH_MOBILE)
10759 CONFIG_BOOL(
10760 list, list_info,
10761 &settings->bools.ui_suspend_screensaver_enable,
10762 MENU_ENUM_LABEL_SUSPEND_SCREENSAVER_ENABLE,
10763 MENU_ENUM_LABEL_VALUE_SUSPEND_SCREENSAVER_ENABLE,
10764 true,
10765 MENU_ENUM_LABEL_VALUE_OFF,
10766 MENU_ENUM_LABEL_VALUE_ON,
10767 &group_info,
10768 &subgroup_info,
10769 parent_group,
10770 general_write_handler,
10771 general_read_handler,
10772 SD_FLAG_NONE);
10773 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED);
10774 #endif
10775
10776 END_SUB_GROUP(list, list_info, parent_group);
10777 START_SUB_GROUP(list, list_info, "Platform-specific", &group_info, &subgroup_info, parent_group);
10778
10779 video_driver_menu_settings((void**)list, (void*)list_info, (void*)&group_info, (void*)&subgroup_info, parent_group);
10780
10781 END_SUB_GROUP(list, list_info, parent_group);
10782 START_SUB_GROUP(list, list_info, "Monitor", &group_info, &subgroup_info, parent_group);
10783
10784 CONFIG_UINT(
10785 list, list_info,
10786 &settings->uints.video_monitor_index,
10787 MENU_ENUM_LABEL_VIDEO_MONITOR_INDEX,
10788 MENU_ENUM_LABEL_VALUE_VIDEO_MONITOR_INDEX,
10789 DEFAULT_MONITOR_INDEX,
10790 &group_info,
10791 &subgroup_info,
10792 parent_group,
10793 general_write_handler,
10794 general_read_handler);
10795 MENU_SETTINGS_LIST_CURRENT_ADD_CMD(list, list_info, CMD_EVENT_REINIT);
10796 menu_settings_list_current_add_range(list, list_info, 0, 1, 1, true, false);
10797 (*list)[list_info->index - 1].get_string_representation =
10798 &setting_get_string_representation_uint_video_monitor_index;
10799
10800 /* prevent unused function warning on unsupported builds */
10801 (void)setting_get_string_representation_int_gpu_index;
10802
10803 #ifdef ANDROID
10804 CONFIG_BOOL(
10805 list, list_info,
10806 &settings->bools.video_notch_write_over_enable,
10807 MENU_ENUM_LABEL_VIDEO_NOTCH_WRITE_OVER,
10808 MENU_ENUM_LABEL_VALUE_VIDEO_NOTCH_WRITE_OVER,
10809 DEFAULT_NOTCH_WRITE_OVER_ENABLE,
10810 MENU_ENUM_LABEL_VALUE_OFF,
10811 MENU_ENUM_LABEL_VALUE_ON,
10812 &group_info,
10813 &subgroup_info,
10814 parent_group,
10815 general_write_handler,
10816 general_read_handler,
10817 SD_FLAG_NONE);
10818 #endif
10819
10820 #ifdef HAVE_VULKAN
10821 if (string_is_equal(video_driver_get_ident(), "vulkan"))
10822 {
10823 CONFIG_INT(
10824 list, list_info,
10825 &settings->ints.vulkan_gpu_index,
10826 MENU_ENUM_LABEL_VIDEO_GPU_INDEX,
10827 MENU_ENUM_LABEL_VALUE_VIDEO_GPU_INDEX,
10828 0,
10829 &group_info,
10830 &subgroup_info,
10831 parent_group,
10832 general_write_handler,
10833 general_read_handler);
10834 menu_settings_list_current_add_range(list, list_info, 0, 15, 1, true, true);
10835 (*list)[list_info->index - 1].get_string_representation =
10836 &setting_get_string_representation_int_gpu_index;
10837 }
10838 #endif
10839
10840 #ifdef HAVE_D3D10
10841 if (string_is_equal(video_driver_get_ident(), "d3d10"))
10842 {
10843 CONFIG_INT(
10844 list, list_info,
10845 &settings->ints.d3d10_gpu_index,
10846 MENU_ENUM_LABEL_VIDEO_GPU_INDEX,
10847 MENU_ENUM_LABEL_VALUE_VIDEO_GPU_INDEX,
10848 0,
10849 &group_info,
10850 &subgroup_info,
10851 parent_group,
10852 general_write_handler,
10853 general_read_handler);
10854 menu_settings_list_current_add_range(list, list_info, 0, 15, 1, true, true);
10855 (*list)[list_info->index - 1].get_string_representation =
10856 &setting_get_string_representation_int_gpu_index;
10857 }
10858 #endif
10859
10860 #ifdef HAVE_D3D11
10861 if (string_is_equal(video_driver_get_ident(), "d3d11"))
10862 {
10863 CONFIG_INT(
10864 list, list_info,
10865 &settings->ints.d3d11_gpu_index,
10866 MENU_ENUM_LABEL_VIDEO_GPU_INDEX,
10867 MENU_ENUM_LABEL_VALUE_VIDEO_GPU_INDEX,
10868 0,
10869 &group_info,
10870 &subgroup_info,
10871 parent_group,
10872 general_write_handler,
10873 general_read_handler);
10874 menu_settings_list_current_add_range(list, list_info, 0, 15, 1, true, true);
10875 (*list)[list_info->index - 1].get_string_representation =
10876 &setting_get_string_representation_int_gpu_index;
10877 }
10878 #endif
10879
10880 #ifdef HAVE_D3D12
10881 if (string_is_equal(video_driver_get_ident(), "d3d12"))
10882 {
10883 CONFIG_INT(
10884 list, list_info,
10885 &settings->ints.d3d12_gpu_index,
10886 MENU_ENUM_LABEL_VIDEO_GPU_INDEX,
10887 MENU_ENUM_LABEL_VALUE_VIDEO_GPU_INDEX,
10888 0,
10889 &group_info,
10890 &subgroup_info,
10891 parent_group,
10892 general_write_handler,
10893 general_read_handler);
10894 menu_settings_list_current_add_range(list, list_info, 0, 15, 1, true, true);
10895 (*list)[list_info->index - 1].get_string_representation =
10896 &setting_get_string_representation_int_gpu_index;
10897 }
10898 #endif
10899
10900 if (video_driver_has_windowed())
10901 {
10902 CONFIG_ACTION(
10903 list, list_info,
10904 MENU_ENUM_LABEL_VIDEO_FULLSCREEN_MODE_SETTINGS,
10905 MENU_ENUM_LABEL_VALUE_VIDEO_FULLSCREEN_MODE_SETTINGS,
10906 &group_info,
10907 &subgroup_info,
10908 parent_group);
10909
10910 CONFIG_ACTION(
10911 list, list_info,
10912 MENU_ENUM_LABEL_VIDEO_WINDOWED_MODE_SETTINGS,
10913 MENU_ENUM_LABEL_VALUE_VIDEO_WINDOWED_MODE_SETTINGS,
10914 &group_info,
10915 &subgroup_info,
10916 parent_group);
10917 }
10918
10919
10920 CONFIG_BOOL(
10921 list, list_info,
10922 &settings->bools.video_fullscreen,
10923 MENU_ENUM_LABEL_VIDEO_FULLSCREEN,
10924 MENU_ENUM_LABEL_VALUE_VIDEO_FULLSCREEN,
10925 DEFAULT_FULLSCREEN,
10926 MENU_ENUM_LABEL_VALUE_OFF,
10927 MENU_ENUM_LABEL_VALUE_ON,
10928 &group_info,
10929 &subgroup_info,
10930 parent_group,
10931 general_write_handler,
10932 general_read_handler,
10933 SD_FLAG_CMD_APPLY_AUTO);
10934 MENU_SETTINGS_LIST_CURRENT_ADD_CMD(list, list_info, CMD_EVENT_REINIT_FROM_TOGGLE);
10935 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED);
10936
10937 {
10938 CONFIG_BOOL(
10939 list, list_info,
10940 &settings->bools.video_windowed_fullscreen,
10941 MENU_ENUM_LABEL_VIDEO_WINDOWED_FULLSCREEN,
10942 MENU_ENUM_LABEL_VALUE_VIDEO_WINDOWED_FULLSCREEN,
10943 DEFAULT_WINDOWED_FULLSCREEN,
10944 MENU_ENUM_LABEL_VALUE_OFF,
10945 MENU_ENUM_LABEL_VALUE_ON,
10946 &group_info,
10947 &subgroup_info,
10948 parent_group,
10949 general_write_handler,
10950 general_read_handler,
10951 SD_FLAG_NONE);
10952 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED);
10953
10954 CONFIG_UINT(
10955 list, list_info,
10956 &settings->uints.video_fullscreen_x,
10957 MENU_ENUM_LABEL_VIDEO_FULLSCREEN_X,
10958 MENU_ENUM_LABEL_VALUE_VIDEO_FULLSCREEN_X,
10959 DEFAULT_FULLSCREEN_X,
10960 &group_info,
10961 &subgroup_info,
10962 parent_group,
10963 general_write_handler,
10964 general_read_handler);
10965 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint_special;
10966 menu_settings_list_current_add_range(list, list_info, 0, 7680, 8, true, true);
10967 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ADVANCED);
10968
10969 CONFIG_UINT(
10970 list, list_info,
10971 &settings->uints.video_fullscreen_y,
10972 MENU_ENUM_LABEL_VIDEO_FULLSCREEN_Y,
10973 MENU_ENUM_LABEL_VALUE_VIDEO_FULLSCREEN_Y,
10974 DEFAULT_FULLSCREEN_Y,
10975 &group_info,
10976 &subgroup_info,
10977 parent_group,
10978 general_write_handler,
10979 general_read_handler);
10980 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint_special;
10981 menu_settings_list_current_add_range(list, list_info, 0, 4320, 8, true, true);
10982 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ADVANCED);
10983
10984 CONFIG_BOOL(
10985 list, list_info,
10986 &settings->bools.video_force_resolution,
10987 MENU_ENUM_LABEL_VIDEO_FORCE_RESOLUTION,
10988 MENU_ENUM_LABEL_VALUE_VIDEO_FORCE_RESOLUTION,
10989 DEFAULT_FORCE_RESOLUTION,
10990 MENU_ENUM_LABEL_VALUE_OFF,
10991 MENU_ENUM_LABEL_VALUE_ON,
10992 &group_info,
10993 &subgroup_info,
10994 parent_group,
10995 general_write_handler,
10996 general_read_handler,
10997 SD_FLAG_CMD_APPLY_AUTO);
10998 MENU_SETTINGS_LIST_CURRENT_ADD_CMD(list, list_info, CMD_EVENT_REINIT_FROM_TOGGLE);
10999 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED);
11000 }
11001
11002 #if defined(DINGUX) && defined(DINGUX_BETA)
11003 if (string_is_equal(settings->arrays.video_driver, "sdl_dingux") ||
11004 string_is_equal(settings->arrays.video_driver, "sdl_rs90"))
11005 {
11006 CONFIG_UINT(
11007 list, list_info,
11008 &settings->uints.video_dingux_refresh_rate,
11009 MENU_ENUM_LABEL_VIDEO_DINGUX_REFRESH_RATE,
11010 MENU_ENUM_LABEL_VALUE_VIDEO_DINGUX_REFRESH_RATE,
11011 DEFAULT_DINGUX_REFRESH_RATE,
11012 &group_info,
11013 &subgroup_info,
11014 parent_group,
11015 general_write_handler,
11016 general_read_handler);
11017 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
11018 (*list)[list_info->index - 1].get_string_representation =
11019 &setting_get_string_representation_uint_video_dingux_refresh_rate;
11020 menu_settings_list_current_add_range(list, list_info, 0, DINGUX_REFRESH_RATE_LAST - 1, 1, true, true);
11021 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_COMBOBOX;
11022 }
11023 else
11024 #endif
11025 {
11026 float actual_refresh_rate = video_driver_get_refresh_rate();
11027
11028 CONFIG_FLOAT(
11029 list, list_info,
11030 &settings->floats.video_refresh_rate,
11031 MENU_ENUM_LABEL_VIDEO_REFRESH_RATE,
11032 MENU_ENUM_LABEL_VALUE_VIDEO_REFRESH_RATE,
11033 DEFAULT_REFRESH_RATE,
11034 "%.3f Hz",
11035 &group_info,
11036 &subgroup_info,
11037 parent_group,
11038 general_write_handler,
11039 general_read_handler);
11040 menu_settings_list_current_add_range(list, list_info, 0, 0, 0.001, true, false);
11041 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED);
11042
11043 CONFIG_FLOAT(
11044 list, list_info,
11045 &settings->floats.video_refresh_rate,
11046 MENU_ENUM_LABEL_VIDEO_REFRESH_RATE_AUTO,
11047 MENU_ENUM_LABEL_VALUE_VIDEO_REFRESH_RATE_AUTO,
11048 DEFAULT_REFRESH_RATE,
11049 "%.3f Hz",
11050 &group_info,
11051 &subgroup_info,
11052 parent_group,
11053 general_write_handler,
11054 general_read_handler);
11055 (*list)[list_info->index - 1].action_start = &setting_action_start_video_refresh_rate_auto;
11056 (*list)[list_info->index - 1].action_ok = &setting_action_ok_video_refresh_rate_auto;
11057 (*list)[list_info->index - 1].action_select = &setting_action_ok_video_refresh_rate_auto;
11058 (*list)[list_info->index - 1].get_string_representation =
11059 &setting_get_string_representation_st_float_video_refresh_rate_auto;
11060 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED);
11061
11062 if (actual_refresh_rate > 0.0)
11063 {
11064 CONFIG_FLOAT(
11065 list, list_info,
11066 &settings->floats.video_refresh_rate,
11067 MENU_ENUM_LABEL_VIDEO_REFRESH_RATE_POLLED,
11068 MENU_ENUM_LABEL_VALUE_VIDEO_REFRESH_RATE_POLLED,
11069 actual_refresh_rate,
11070 "%.3f Hz",
11071 &group_info,
11072 &subgroup_info,
11073 parent_group,
11074 general_write_handler,
11075 general_read_handler);
11076 (*list)[list_info->index - 1].action_ok = &setting_action_ok_video_refresh_rate_polled;
11077 (*list)[list_info->index - 1].action_select = &setting_action_ok_video_refresh_rate_polled;
11078 (*list)[list_info->index - 1].get_string_representation =
11079 &setting_get_string_representation_st_float_video_refresh_rate_polled;
11080 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED);
11081 }
11082 }
11083
11084 if (string_is_equal(settings->arrays.video_driver, "gl"))
11085 {
11086 CONFIG_BOOL(
11087 list, list_info,
11088 &settings->bools.video_force_srgb_disable,
11089 MENU_ENUM_LABEL_VIDEO_FORCE_SRGB_DISABLE,
11090 MENU_ENUM_LABEL_VALUE_VIDEO_FORCE_SRGB_DISABLE,
11091 false,
11092 MENU_ENUM_LABEL_VALUE_OFF,
11093 MENU_ENUM_LABEL_VALUE_ON,
11094 &group_info,
11095 &subgroup_info,
11096 parent_group,
11097 general_write_handler,
11098 general_read_handler,
11099 SD_FLAG_CMD_APPLY_AUTO | SD_FLAG_ADVANCED
11100 );
11101 MENU_SETTINGS_LIST_CURRENT_ADD_CMD(list, list_info, CMD_EVENT_REINIT);
11102 }
11103
11104 END_SUB_GROUP(list, list_info, parent_group);
11105 START_SUB_GROUP(list, list_info, "Aspect", &group_info, &subgroup_info, parent_group);
11106
11107 CONFIG_UINT(
11108 list, list_info,
11109 &settings->uints.video_aspect_ratio_idx,
11110 MENU_ENUM_LABEL_VIDEO_ASPECT_RATIO_INDEX,
11111 MENU_ENUM_LABEL_VALUE_VIDEO_ASPECT_RATIO_INDEX,
11112 DEFAULT_ASPECT_RATIO_IDX,
11113 &group_info,
11114 &subgroup_info,
11115 parent_group,
11116 general_write_handler,
11117 general_read_handler);
11118 MENU_SETTINGS_LIST_CURRENT_ADD_CMD(
11119 list,
11120 list_info,
11121 CMD_EVENT_VIDEO_SET_ASPECT_RATIO);
11122 menu_settings_list_current_add_range(
11123 list,
11124 list_info,
11125 0,
11126 LAST_ASPECT_RATIO,
11127 1,
11128 true,
11129 true);
11130 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_CMD_APPLY_AUTO);
11131 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
11132 (*list)[list_info->index - 1].get_string_representation =
11133 &setting_get_string_representation_uint_aspect_ratio_index;
11134 (*list)[list_info->index - 1].action_left = setting_uint_action_left_with_refresh;
11135 (*list)[list_info->index - 1].action_right = setting_uint_action_right_with_refresh;
11136
11137 CONFIG_FLOAT(
11138 list, list_info,
11139 &settings->floats.video_aspect_ratio,
11140 MENU_ENUM_LABEL_VIDEO_ASPECT_RATIO,
11141 MENU_ENUM_LABEL_VALUE_VIDEO_ASPECT_RATIO,
11142 1.33,
11143 "%.2f",
11144 &group_info,
11145 &subgroup_info,
11146 parent_group,
11147 general_write_handler,
11148 general_read_handler);
11149 MENU_SETTINGS_LIST_CURRENT_ADD_CMD(
11150 list,
11151 list_info,
11152 CMD_EVENT_VIDEO_SET_ASPECT_RATIO);
11153 menu_settings_list_current_add_range(list, list_info, 0.1, 16.0, 0.01, true, false);
11154
11155 CONFIG_INT(
11156 list, list_info,
11157 &custom_vp->x,
11158 MENU_ENUM_LABEL_VIDEO_VIEWPORT_CUSTOM_X,
11159 MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_X,
11160 0,
11161 &group_info,
11162 &subgroup_info,
11163 parent_group,
11164 general_write_handler,
11165 general_read_handler);
11166 menu_settings_list_current_add_range(list, list_info, -9999, 9999, 1, true, true);
11167 (*list)[list_info->index - 1].offset_by = -9999;
11168 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
11169 MENU_SETTINGS_LIST_CURRENT_ADD_CMD(
11170 list,
11171 list_info,
11172 CMD_EVENT_VIDEO_APPLY_STATE_CHANGES);
11173 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED);
11174
11175 CONFIG_INT(
11176 list, list_info,
11177 &custom_vp->y,
11178 MENU_ENUM_LABEL_VIDEO_VIEWPORT_CUSTOM_Y,
11179 MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_Y,
11180 0,
11181 &group_info,
11182 &subgroup_info,
11183 parent_group,
11184 general_write_handler,
11185 general_read_handler);
11186 menu_settings_list_current_add_range(list, list_info, -9999, 9999, 1, true, true);
11187 (*list)[list_info->index - 1].offset_by = -9999;
11188 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
11189 MENU_SETTINGS_LIST_CURRENT_ADD_CMD(
11190 list,
11191 list_info,
11192 CMD_EVENT_VIDEO_APPLY_STATE_CHANGES);
11193 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED);
11194
11195 #if defined(GEKKO) || !defined(__PSL1GHT__) && defined(__PS3__)
11196 if (true)
11197 #else
11198 if (!string_is_equal(video_display_server_get_ident(), "null"))
11199 #endif
11200 {
11201 CONFIG_ACTION(
11202 list, list_info,
11203 MENU_ENUM_LABEL_SCREEN_RESOLUTION,
11204 MENU_ENUM_LABEL_VALUE_SCREEN_RESOLUTION,
11205 &group_info,
11206 &subgroup_info,
11207 parent_group);
11208 }
11209
11210 CONFIG_UINT(
11211 list, list_info,
11212 &custom_vp->width,
11213 MENU_ENUM_LABEL_VIDEO_VIEWPORT_CUSTOM_WIDTH,
11214 MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_WIDTH,
11215 0,
11216 &group_info,
11217 &subgroup_info,
11218 parent_group,
11219 general_write_handler,
11220 general_read_handler);
11221 menu_settings_list_current_add_range(list, list_info, 0, 0, 1, true, false);
11222 (*list)[list_info->index - 1].get_string_representation =
11223 &setting_get_string_representation_uint_custom_viewport_width;
11224 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
11225 (*list)[list_info->index - 1].action_start = &setting_action_start_custom_viewport_width;
11226 (*list)[list_info->index - 1].action_left = setting_uint_action_left_custom_viewport_width;
11227 (*list)[list_info->index - 1].action_right = setting_uint_action_right_custom_viewport_width;
11228 MENU_SETTINGS_LIST_CURRENT_ADD_CMD(
11229 list,
11230 list_info,
11231 CMD_EVENT_VIDEO_APPLY_STATE_CHANGES);
11232 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED);
11233
11234 CONFIG_UINT(
11235 list, list_info,
11236 &custom_vp->height,
11237 MENU_ENUM_LABEL_VIDEO_VIEWPORT_CUSTOM_HEIGHT,
11238 MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_HEIGHT,
11239 0,
11240 &group_info,
11241 &subgroup_info,
11242 parent_group,
11243 general_write_handler,
11244 general_read_handler);
11245 menu_settings_list_current_add_range(list, list_info, 0, 0, 1, true, false);
11246 (*list)[list_info->index - 1].get_string_representation =
11247 &setting_get_string_representation_uint_custom_viewport_height;
11248 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
11249 (*list)[list_info->index - 1].action_start = &setting_action_start_custom_viewport_height;
11250 (*list)[list_info->index - 1].action_left = setting_uint_action_left_custom_viewport_height;
11251 (*list)[list_info->index - 1].action_right = setting_uint_action_right_custom_viewport_height;
11252 MENU_SETTINGS_LIST_CURRENT_ADD_CMD(
11253 list,
11254 list_info,
11255 CMD_EVENT_VIDEO_APPLY_STATE_CHANGES);
11256 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED);
11257
11258 #if defined(DINGUX)
11259 if (string_is_equal(settings->arrays.video_driver, "sdl_dingux") ||
11260 string_is_equal(settings->arrays.video_driver, "sdl_rs90"))
11261 {
11262 CONFIG_BOOL(
11263 list, list_info,
11264 &settings->bools.video_dingux_ipu_keep_aspect,
11265 MENU_ENUM_LABEL_VIDEO_DINGUX_IPU_KEEP_ASPECT,
11266 MENU_ENUM_LABEL_VALUE_VIDEO_DINGUX_IPU_KEEP_ASPECT,
11267 DEFAULT_DINGUX_IPU_KEEP_ASPECT,
11268 MENU_ENUM_LABEL_VALUE_OFF,
11269 MENU_ENUM_LABEL_VALUE_ON,
11270 &group_info,
11271 &subgroup_info,
11272 parent_group,
11273 general_write_handler,
11274 general_read_handler,
11275 SD_FLAG_NONE);
11276 MENU_SETTINGS_LIST_CURRENT_ADD_CMD(
11277 list,
11278 list_info,
11279 CMD_EVENT_VIDEO_APPLY_STATE_CHANGES);
11280 }
11281 #endif
11282
11283 END_SUB_GROUP(list, list_info, parent_group);
11284 START_SUB_GROUP(list, list_info, "Scaling", &group_info, &subgroup_info, parent_group);
11285
11286 CONFIG_ACTION(
11287 list, list_info,
11288 MENU_ENUM_LABEL_VIDEO_SYNCHRONIZATION_SETTINGS,
11289 MENU_ENUM_LABEL_VALUE_VIDEO_SYNCHRONIZATION_SETTINGS,
11290 &group_info,
11291 &subgroup_info,
11292 parent_group);
11293
11294 CONFIG_ACTION(
11295 list, list_info,
11296 MENU_ENUM_LABEL_VIDEO_SCALING_SETTINGS,
11297 MENU_ENUM_LABEL_VALUE_VIDEO_SCALING_SETTINGS,
11298 &group_info,
11299 &subgroup_info,
11300 parent_group);
11301
11302 if (video_driver_has_windowed())
11303 {
11304 CONFIG_FLOAT(
11305 list, list_info,
11306 &settings->floats.video_scale,
11307 MENU_ENUM_LABEL_VIDEO_SCALE,
11308 MENU_ENUM_LABEL_VALUE_VIDEO_SCALE,
11309 DEFAULT_SCALE,
11310 "%.1fx",
11311 &group_info,
11312 &subgroup_info,
11313 parent_group,
11314 general_write_handler,
11315 general_read_handler);
11316 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
11317 menu_settings_list_current_add_range(list, list_info, 1.0, 10.0, 1.0, true, true);
11318 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED);
11319 CONFIG_UINT(
11320 list, list_info,
11321 &settings->uints.window_position_width,
11322 MENU_ENUM_LABEL_VIDEO_WINDOW_WIDTH,
11323 MENU_ENUM_LABEL_VALUE_VIDEO_WINDOW_WIDTH,
11324 DEFAULT_WINDOW_WIDTH,
11325 &group_info,
11326 &subgroup_info,
11327 parent_group,
11328 general_write_handler,
11329 general_read_handler);
11330 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint_special;
11331 menu_settings_list_current_add_range(list, list_info, 0, 7680, 8, true, true);
11332 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED);
11333 CONFIG_UINT(
11334 list, list_info,
11335 &settings->uints.window_position_height,
11336 MENU_ENUM_LABEL_VIDEO_WINDOW_HEIGHT,
11337 MENU_ENUM_LABEL_VALUE_VIDEO_WINDOW_HEIGHT,
11338 DEFAULT_WINDOW_HEIGHT,
11339 &group_info,
11340 &subgroup_info,
11341 parent_group,
11342 general_write_handler,
11343 general_read_handler);
11344 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint_special;
11345 menu_settings_list_current_add_range(list, list_info, 0, 4320, 8, true, true);
11346 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED);
11347 CONFIG_UINT(
11348 list, list_info,
11349 &settings->uints.video_window_opacity,
11350 MENU_ENUM_LABEL_VIDEO_WINDOW_OPACITY,
11351 MENU_ENUM_LABEL_VALUE_VIDEO_WINDOW_OPACITY,
11352 DEFAULT_WINDOW_OPACITY,
11353 &group_info,
11354 &subgroup_info,
11355 parent_group,
11356 general_write_handler,
11357 general_read_handler);
11358 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
11359 (*list)[list_info->index - 1].offset_by = 1;
11360 menu_settings_list_current_add_range(list, list_info, 1, 100, 1, true, true);
11361 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED);
11362 }
11363
11364 CONFIG_BOOL(
11365 list, list_info,
11366 &settings->bools.video_window_show_decorations,
11367 MENU_ENUM_LABEL_VIDEO_WINDOW_SHOW_DECORATIONS,
11368 MENU_ENUM_LABEL_VALUE_VIDEO_WINDOW_SHOW_DECORATIONS,
11369 DEFAULT_WINDOW_DECORATIONS,
11370 MENU_ENUM_LABEL_VALUE_OFF,
11371 MENU_ENUM_LABEL_VALUE_ON,
11372 &group_info,
11373 &subgroup_info,
11374 parent_group,
11375 general_write_handler,
11376 general_read_handler,
11377 SD_FLAG_NONE);
11378 MENU_SETTINGS_LIST_CURRENT_ADD_CMD(list, list_info, CMD_EVENT_REINIT);
11379
11380 CONFIG_BOOL(
11381 list, list_info,
11382 &settings->bools.video_window_save_positions,
11383 MENU_ENUM_LABEL_VIDEO_WINDOW_SAVE_POSITION,
11384 MENU_ENUM_LABEL_VALUE_VIDEO_WINDOW_SAVE_POSITION,
11385 false,
11386 MENU_ENUM_LABEL_VALUE_OFF,
11387 MENU_ENUM_LABEL_VALUE_ON,
11388 &group_info,
11389 &subgroup_info,
11390 parent_group,
11391 general_write_handler,
11392 general_read_handler,
11393 SD_FLAG_NONE);
11394
11395 CONFIG_BOOL(
11396 list, list_info,
11397 &settings->bools.video_scale_integer,
11398 MENU_ENUM_LABEL_VIDEO_SCALE_INTEGER,
11399 MENU_ENUM_LABEL_VALUE_VIDEO_SCALE_INTEGER,
11400 DEFAULT_SCALE_INTEGER,
11401 MENU_ENUM_LABEL_VALUE_OFF,
11402 MENU_ENUM_LABEL_VALUE_ON,
11403 &group_info,
11404 &subgroup_info,
11405 parent_group,
11406 general_write_handler,
11407 general_read_handler,
11408 SD_FLAG_NONE);
11409 (*list)[list_info->index - 1].action_ok = setting_bool_action_left_with_refresh;
11410 (*list)[list_info->index - 1].action_left = setting_bool_action_left_with_refresh;
11411 (*list)[list_info->index - 1].action_right = setting_bool_action_right_with_refresh;
11412 MENU_SETTINGS_LIST_CURRENT_ADD_CMD(
11413 list,
11414 list_info,
11415 CMD_EVENT_VIDEO_APPLY_STATE_CHANGES);
11416
11417 CONFIG_BOOL(
11418 list, list_info,
11419 &settings->bools.video_scale_integer_overscale,
11420 MENU_ENUM_LABEL_VIDEO_SCALE_INTEGER_OVERSCALE,
11421 MENU_ENUM_LABEL_VALUE_VIDEO_SCALE_INTEGER_OVERSCALE,
11422 DEFAULT_SCALE_INTEGER_OVERSCALE,
11423 MENU_ENUM_LABEL_VALUE_OFF,
11424 MENU_ENUM_LABEL_VALUE_ON,
11425 &group_info,
11426 &subgroup_info,
11427 parent_group,
11428 general_write_handler,
11429 general_read_handler,
11430 SD_FLAG_NONE);
11431 (*list)[list_info->index - 1].action_ok = setting_bool_action_left_with_refresh;
11432 (*list)[list_info->index - 1].action_left = setting_bool_action_left_with_refresh;
11433 (*list)[list_info->index - 1].action_right = setting_bool_action_right_with_refresh;
11434 MENU_SETTINGS_LIST_CURRENT_ADD_CMD(
11435 list,
11436 list_info,
11437 CMD_EVENT_VIDEO_APPLY_STATE_CHANGES);
11438
11439 #ifdef GEKKO
11440 CONFIG_UINT(
11441 list, list_info,
11442 &settings->uints.video_viwidth,
11443 MENU_ENUM_LABEL_VIDEO_VI_WIDTH,
11444 MENU_ENUM_LABEL_VALUE_VIDEO_VI_WIDTH,
11445 DEFAULT_VIDEO_VI_WIDTH,
11446 &group_info,
11447 &subgroup_info,
11448 parent_group,
11449 general_write_handler,
11450 general_read_handler);
11451 menu_settings_list_current_add_range(list, list_info, 640, 720, 2, true, true);
11452
11453 CONFIG_BOOL(
11454 list, list_info,
11455 &settings->bools.video_vfilter,
11456 MENU_ENUM_LABEL_VIDEO_VFILTER,
11457 MENU_ENUM_LABEL_VALUE_VIDEO_VFILTER,
11458 DEFAULT_VIDEO_VFILTER,
11459 MENU_ENUM_LABEL_VALUE_OFF,
11460 MENU_ENUM_LABEL_VALUE_ON,
11461 &group_info,
11462 &subgroup_info,
11463 parent_group,
11464 general_write_handler,
11465 general_read_handler,
11466 SD_FLAG_NONE);
11467
11468 CONFIG_UINT(
11469 list, list_info,
11470 &settings->uints.video_overscan_correction_top,
11471 MENU_ENUM_LABEL_VIDEO_OVERSCAN_CORRECTION_TOP,
11472 MENU_ENUM_LABEL_VALUE_VIDEO_OVERSCAN_CORRECTION_TOP,
11473 DEFAULT_VIDEO_OVERSCAN_CORRECTION_TOP,
11474 &group_info,
11475 &subgroup_info,
11476 parent_group,
11477 general_write_handler,
11478 general_read_handler);
11479 menu_settings_list_current_add_range(list, list_info, 0, 24, 1, true, true);
11480
11481 CONFIG_UINT(
11482 list, list_info,
11483 &settings->uints.video_overscan_correction_bottom,
11484 MENU_ENUM_LABEL_VIDEO_OVERSCAN_CORRECTION_BOTTOM,
11485 MENU_ENUM_LABEL_VALUE_VIDEO_OVERSCAN_CORRECTION_BOTTOM,
11486 DEFAULT_VIDEO_OVERSCAN_CORRECTION_BOTTOM,
11487 &group_info,
11488 &subgroup_info,
11489 parent_group,
11490 general_write_handler,
11491 general_read_handler);
11492 menu_settings_list_current_add_range(list, list_info, 0, 24, 1, true, true);
11493 #endif
11494
11495 #if defined(DINGUX)
11496 if (string_is_equal(settings->arrays.video_driver, "sdl_dingux"))
11497 {
11498 CONFIG_UINT(
11499 list, list_info,
11500 &settings->uints.video_dingux_ipu_filter_type,
11501 MENU_ENUM_LABEL_VIDEO_DINGUX_IPU_FILTER_TYPE,
11502 MENU_ENUM_LABEL_VALUE_VIDEO_DINGUX_IPU_FILTER_TYPE,
11503 DEFAULT_DINGUX_IPU_FILTER_TYPE,
11504 &group_info,
11505 &subgroup_info,
11506 parent_group,
11507 general_write_handler,
11508 general_read_handler);
11509 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
11510 (*list)[list_info->index - 1].get_string_representation =
11511 &setting_get_string_representation_uint_video_dingux_ipu_filter_type;
11512 menu_settings_list_current_add_range(list, list_info, 0, DINGUX_IPU_FILTER_LAST - 1, 1, true, true);
11513 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_COMBOBOX;
11514 }
11515 #if defined(RS90)
11516 else if (string_is_equal(settings->arrays.video_driver, "sdl_rs90"))
11517 {
11518 CONFIG_UINT(
11519 list, list_info,
11520 &settings->uints.video_dingux_rs90_softfilter_type,
11521 MENU_ENUM_LABEL_VIDEO_DINGUX_RS90_SOFTFILTER_TYPE,
11522 MENU_ENUM_LABEL_VALUE_VIDEO_DINGUX_RS90_SOFTFILTER_TYPE,
11523 DEFAULT_DINGUX_RS90_SOFTFILTER_TYPE,
11524 &group_info,
11525 &subgroup_info,
11526 parent_group,
11527 general_write_handler,
11528 general_read_handler);
11529 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
11530 (*list)[list_info->index - 1].get_string_representation =
11531 &setting_get_string_representation_uint_video_dingux_rs90_softfilter_type;
11532 menu_settings_list_current_add_range(list, list_info, 0, DINGUX_RS90_SOFTFILTER_LAST - 1, 1, true, true);
11533 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_COMBOBOX;
11534 }
11535 #endif
11536 else
11537 #endif
11538 {
11539 CONFIG_BOOL(
11540 list, list_info,
11541 &settings->bools.video_smooth,
11542 MENU_ENUM_LABEL_VIDEO_SMOOTH,
11543 MENU_ENUM_LABEL_VALUE_VIDEO_SMOOTH,
11544 DEFAULT_VIDEO_SMOOTH,
11545 MENU_ENUM_LABEL_VALUE_OFF,
11546 MENU_ENUM_LABEL_VALUE_ON,
11547 &group_info,
11548 &subgroup_info,
11549 parent_group,
11550 general_write_handler,
11551 general_read_handler,
11552 SD_FLAG_NONE
11553 );
11554 MENU_SETTINGS_LIST_CURRENT_ADD_CMD(list, list_info, CMD_EVENT_REINIT);
11555 }
11556
11557 #ifdef HAVE_ODROIDGO2
11558 CONFIG_BOOL(
11559 list, list_info,
11560 &settings->bools.video_ctx_scaling,
11561 MENU_ENUM_LABEL_VIDEO_CTX_SCALING,
11562 MENU_ENUM_LABEL_VALUE_VIDEO_RGA_SCALING,
11563 DEFAULT_VIDEO_CTX_SCALING,
11564 MENU_ENUM_LABEL_VALUE_OFF,
11565 MENU_ENUM_LABEL_VALUE_ON,
11566 &group_info,
11567 &subgroup_info,
11568 parent_group,
11569 general_write_handler,
11570 general_read_handler,
11571 SD_FLAG_NONE
11572 );
11573 MENU_SETTINGS_LIST_CURRENT_ADD_CMD(list, list_info, CMD_EVENT_REINIT);
11574 #endif
11575
11576 CONFIG_UINT(
11577 list, list_info,
11578 &settings->uints.video_rotation,
11579 MENU_ENUM_LABEL_VIDEO_ROTATION,
11580 MENU_ENUM_LABEL_VALUE_VIDEO_ROTATION,
11581 0,
11582 &group_info,
11583 &subgroup_info,
11584 parent_group,
11585 general_write_handler,
11586 general_read_handler);
11587 menu_settings_list_current_add_range(list, list_info, 0, 3, 1, true, true);
11588 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_COMBOBOX;
11589 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
11590 (*list)[list_info->index - 1].get_string_representation =
11591 &setting_get_string_representation_uint_video_rotation;
11592 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ADVANCED);
11593
11594 CONFIG_UINT(
11595 list, list_info,
11596 &settings->uints.screen_orientation,
11597 MENU_ENUM_LABEL_SCREEN_ORIENTATION,
11598 MENU_ENUM_LABEL_VALUE_SCREEN_ORIENTATION,
11599 0,
11600 &group_info,
11601 &subgroup_info,
11602 parent_group,
11603 general_write_handler,
11604 general_read_handler);
11605 menu_settings_list_current_add_range(list, list_info, 0, 3, 1, true, true);
11606 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
11607 (*list)[list_info->index - 1].get_string_representation =
11608 &setting_get_string_representation_uint_screen_orientation;
11609 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ADVANCED);
11610
11611 END_SUB_GROUP(list, list_info, parent_group);
11612 START_SUB_GROUP(
11613 list,
11614 list_info,
11615 msg_hash_to_str(MENU_ENUM_LABEL_VALUE_AUDIO_SYNC),
11616 &group_info,
11617 &subgroup_info,
11618 parent_group);
11619
11620 if (frontend_driver_can_set_screen_brightness())
11621 {
11622 CONFIG_UINT(
11623 list, list_info,
11624 &settings->uints.screen_brightness,
11625 MENU_ENUM_LABEL_BRIGHTNESS_CONTROL,
11626 MENU_ENUM_LABEL_VALUE_BRIGHTNESS_CONTROL,
11627 DEFAULT_SCREEN_BRIGHTNESS,
11628 &group_info,
11629 &subgroup_info,
11630 parent_group,
11631 general_write_handler,
11632 general_read_handler);
11633 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_COMBOBOX;
11634 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint_special;
11635 (*list)[list_info->index - 1].get_string_representation =
11636 &setting_get_string_representation_percentage;
11637 menu_settings_list_current_add_range(list, list_info, 5, 100, 5, true, true);
11638 }
11639
11640 #if defined(HAVE_THREADS) && !defined(__PSL1GHT__) && !defined(__PS3__)
11641 CONFIG_BOOL(
11642 list, list_info,
11643 video_driver_get_threaded(),
11644 MENU_ENUM_LABEL_VIDEO_THREADED,
11645 MENU_ENUM_LABEL_VALUE_VIDEO_THREADED,
11646 DEFAULT_VIDEO_THREADED,
11647 MENU_ENUM_LABEL_VALUE_OFF,
11648 MENU_ENUM_LABEL_VALUE_ON,
11649 &group_info,
11650 &subgroup_info,
11651 parent_group,
11652 general_write_handler,
11653 general_read_handler,
11654 SD_FLAG_CMD_APPLY_AUTO
11655 );
11656 MENU_SETTINGS_LIST_CURRENT_ADD_CMD(list, list_info, CMD_EVENT_REINIT);
11657 #endif
11658
11659 CONFIG_BOOL(
11660 list, list_info,
11661 &settings->bools.video_vsync,
11662 MENU_ENUM_LABEL_VIDEO_VSYNC,
11663 MENU_ENUM_LABEL_VALUE_VIDEO_VSYNC,
11664 DEFAULT_VSYNC,
11665 MENU_ENUM_LABEL_VALUE_OFF,
11666 MENU_ENUM_LABEL_VALUE_ON,
11667 &group_info,
11668 &subgroup_info,
11669 parent_group,
11670 general_write_handler,
11671 general_read_handler,
11672 SD_FLAG_NONE
11673 );
11674 (*list)[list_info->index - 1].action_ok = setting_bool_action_left_with_refresh;
11675 (*list)[list_info->index - 1].action_left = setting_bool_action_left_with_refresh;
11676 (*list)[list_info->index - 1].action_right = setting_bool_action_right_with_refresh;
11677
11678 CONFIG_UINT(
11679 list, list_info,
11680 &settings->uints.video_swap_interval,
11681 MENU_ENUM_LABEL_VIDEO_SWAP_INTERVAL,
11682 MENU_ENUM_LABEL_VALUE_VIDEO_SWAP_INTERVAL,
11683 DEFAULT_SWAP_INTERVAL,
11684 &group_info,
11685 &subgroup_info,
11686 parent_group,
11687 general_write_handler,
11688 general_read_handler);
11689 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
11690 (*list)[list_info->index - 1].offset_by = 1;
11691 MENU_SETTINGS_LIST_CURRENT_ADD_CMD(list, list_info, CMD_EVENT_VIDEO_SET_BLOCKING_STATE);
11692 menu_settings_list_current_add_range(list, list_info, 1, 4, 1, true, true);
11693 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_CMD_APPLY_AUTO);
11694 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED);
11695
11696 CONFIG_UINT(
11697 list, list_info,
11698 &settings->uints.video_max_swapchain_images,
11699 MENU_ENUM_LABEL_VIDEO_MAX_SWAPCHAIN_IMAGES,
11700 MENU_ENUM_LABEL_VALUE_VIDEO_MAX_SWAPCHAIN_IMAGES,
11701 DEFAULT_MAX_SWAPCHAIN_IMAGES,
11702 &group_info,
11703 &subgroup_info,
11704 parent_group,
11705 general_write_handler,
11706 general_read_handler);
11707 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
11708 (*list)[list_info->index - 1].offset_by = 1;
11709 menu_settings_list_current_add_range(list, list_info, 1, 4, 1, true, true);
11710 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_CMD_APPLY_AUTO);
11711
11712 CONFIG_BOOL(
11713 list, list_info,
11714 &settings->bools.video_hard_sync,
11715 MENU_ENUM_LABEL_VIDEO_HARD_SYNC,
11716 MENU_ENUM_LABEL_VALUE_VIDEO_HARD_SYNC,
11717 DEFAULT_HARD_SYNC,
11718 MENU_ENUM_LABEL_VALUE_OFF,
11719 MENU_ENUM_LABEL_VALUE_ON,
11720 &group_info,
11721 &subgroup_info,
11722 parent_group,
11723 general_write_handler,
11724 general_read_handler,
11725 SD_FLAG_NONE);
11726 (*list)[list_info->index - 1].action_ok = setting_bool_action_left_with_refresh;
11727 (*list)[list_info->index - 1].action_left = setting_bool_action_left_with_refresh;
11728 (*list)[list_info->index - 1].action_right = setting_bool_action_right_with_refresh;
11729
11730 CONFIG_UINT(
11731 list, list_info,
11732 &settings->uints.video_hard_sync_frames,
11733 MENU_ENUM_LABEL_VIDEO_HARD_SYNC_FRAMES,
11734 MENU_ENUM_LABEL_VALUE_VIDEO_HARD_SYNC_FRAMES,
11735 DEFAULT_HARD_SYNC_FRAMES,
11736 &group_info,
11737 &subgroup_info,
11738 parent_group,
11739 general_write_handler,
11740 general_read_handler);
11741 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
11742 menu_settings_list_current_add_range(list, list_info, 0, 3, 1, true, true);
11743
11744 if (video_driver_test_all_flags(GFX_CTX_FLAGS_ADAPTIVE_VSYNC))
11745 {
11746 CONFIG_BOOL(
11747 list, list_info,
11748 &settings->bools.video_adaptive_vsync,
11749 MENU_ENUM_LABEL_VIDEO_ADAPTIVE_VSYNC,
11750 MENU_ENUM_LABEL_VALUE_VIDEO_ADAPTIVE_VSYNC,
11751 DEFAULT_ADAPTIVE_VSYNC,
11752 MENU_ENUM_LABEL_VALUE_OFF,
11753 MENU_ENUM_LABEL_VALUE_ON,
11754 &group_info,
11755 &subgroup_info,
11756 parent_group,
11757 general_write_handler,
11758 general_read_handler,
11759 SD_FLAG_NONE
11760 );
11761 }
11762
11763 CONFIG_UINT(
11764 list, list_info,
11765 &settings->uints.video_frame_delay,
11766 MENU_ENUM_LABEL_VIDEO_FRAME_DELAY,
11767 MENU_ENUM_LABEL_VALUE_VIDEO_FRAME_DELAY,
11768 DEFAULT_FRAME_DELAY,
11769 &group_info,
11770 &subgroup_info,
11771 parent_group,
11772 general_write_handler,
11773 general_read_handler);
11774 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
11775 menu_settings_list_current_add_range(list, list_info, 0, MAXIMUM_FRAME_DELAY, 1, true, true);
11776 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED);
11777
11778 /* Unlike all other shader-related menu entries
11779 * (which appear in the shaders quick menu, and
11780 * are thus hidden automatically on platforms
11781 * without shader support), VIDEO_SHADER_DELAY
11782 * is shown in 'Settings > Video'. It therefore
11783 * requires an explicit guard to prevent display
11784 * on unsupported platforms */
11785 #if defined(HAVE_CG) || defined(HAVE_GLSL) || defined(HAVE_SLANG) || defined(HAVE_HLSL)
11786 if (video_shader_any_supported())
11787 {
11788 CONFIG_UINT(
11789 list, list_info,
11790 &settings->uints.video_shader_delay,
11791 MENU_ENUM_LABEL_VIDEO_SHADER_DELAY,
11792 MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_DELAY,
11793 DEFAULT_SHADER_DELAY,
11794 &group_info,
11795 &subgroup_info,
11796 parent_group,
11797 general_write_handler,
11798 general_read_handler);
11799 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
11800 menu_settings_list_current_add_range(list, list_info, 0, 0, 1, true, false);
11801 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ADVANCED);
11802 }
11803 #endif
11804
11805 CONFIG_BOOL(
11806 list, list_info,
11807 &settings->bools.video_shader_watch_files,
11808 MENU_ENUM_LABEL_SHADER_WATCH_FOR_CHANGES,
11809 MENU_ENUM_LABEL_VALUE_SHADER_WATCH_FOR_CHANGES,
11810 DEFAULT_VIDEO_SHADER_WATCH_FILES,
11811 MENU_ENUM_LABEL_VALUE_OFF,
11812 MENU_ENUM_LABEL_VALUE_ON,
11813 &group_info,
11814 &subgroup_info,
11815 parent_group,
11816 general_write_handler,
11817 general_read_handler,
11818 SD_FLAG_NONE
11819 );
11820
11821 CONFIG_BOOL(
11822 list, list_info,
11823 &settings->bools.video_shader_remember_last_dir,
11824 MENU_ENUM_LABEL_VIDEO_SHADER_REMEMBER_LAST_DIR,
11825 MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_REMEMBER_LAST_DIR,
11826 DEFAULT_VIDEO_SHADER_REMEMBER_LAST_DIR,
11827 MENU_ENUM_LABEL_VALUE_OFF,
11828 MENU_ENUM_LABEL_VALUE_ON,
11829 &group_info,
11830 &subgroup_info,
11831 parent_group,
11832 general_write_handler,
11833 general_read_handler,
11834 SD_FLAG_NONE
11835 );
11836
11837 #if !defined(RARCH_MOBILE)
11838 if (video_driver_test_all_flags(GFX_CTX_FLAGS_BLACK_FRAME_INSERTION))
11839 {
11840
11841 CONFIG_UINT(
11842 list, list_info,
11843 &settings->uints.video_black_frame_insertion,
11844 MENU_ENUM_LABEL_VIDEO_BLACK_FRAME_INSERTION,
11845 MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION,
11846 DEFAULT_BLACK_FRAME_INSERTION,
11847 &group_info,
11848 &subgroup_info,
11849 parent_group,
11850 general_write_handler,
11851 general_read_handler);
11852 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
11853 menu_settings_list_current_add_range(list, list_info, 0, 5, 1, true, true);
11854 }
11855 #endif
11856 END_SUB_GROUP(list, list_info, parent_group);
11857 START_SUB_GROUP(
11858 list,
11859 list_info,
11860 "Miscellaneous",
11861 &group_info,
11862 &subgroup_info,
11863 parent_group);
11864
11865 CONFIG_BOOL(
11866 list, list_info,
11867 &settings->bools.video_gpu_screenshot,
11868 MENU_ENUM_LABEL_VIDEO_GPU_SCREENSHOT,
11869 MENU_ENUM_LABEL_VALUE_VIDEO_GPU_SCREENSHOT,
11870 DEFAULT_GPU_SCREENSHOT,
11871 MENU_ENUM_LABEL_VALUE_OFF,
11872 MENU_ENUM_LABEL_VALUE_ON,
11873 &group_info,
11874 &subgroup_info,
11875 parent_group,
11876 general_write_handler,
11877 general_read_handler,
11878 SD_FLAG_NONE
11879 );
11880 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ADVANCED);
11881
11882 CONFIG_BOOL(
11883 list, list_info,
11884 &settings->bools.video_crop_overscan,
11885 MENU_ENUM_LABEL_VIDEO_CROP_OVERSCAN,
11886 MENU_ENUM_LABEL_VALUE_VIDEO_CROP_OVERSCAN,
11887 DEFAULT_CROP_OVERSCAN,
11888 MENU_ENUM_LABEL_VALUE_OFF,
11889 MENU_ENUM_LABEL_VALUE_ON,
11890 &group_info,
11891 &subgroup_info,
11892 parent_group,
11893 general_write_handler,
11894 general_read_handler,
11895 SD_FLAG_NONE
11896 );
11897 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED);
11898
11899 CONFIG_PATH(
11900 list, list_info,
11901 settings->paths.path_softfilter_plugin,
11902 sizeof(settings->paths.path_softfilter_plugin),
11903 MENU_ENUM_LABEL_VIDEO_FILTER,
11904 MENU_ENUM_LABEL_VALUE_VIDEO_FILTER,
11905 settings->paths.directory_video_filter,
11906 &group_info,
11907 &subgroup_info,
11908 parent_group,
11909 general_write_handler,
11910 general_read_handler);
11911 (*list)[list_info->index - 1].get_string_representation =
11912 &setting_get_string_representation_video_filter;
11913 MENU_SETTINGS_LIST_CURRENT_ADD_VALUES(list, list_info, "filt");
11914 MENU_SETTINGS_LIST_CURRENT_ADD_CMD(list, list_info, CMD_EVENT_REINIT);
11915 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED);
11916
11917 END_SUB_GROUP(list, list_info, parent_group);
11918 END_GROUP(list, list_info, parent_group);
11919 }
11920 break;
11921 case SETTINGS_LIST_CRT_SWITCHRES:
11922 START_GROUP(list, list_info, &group_info,
11923 msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CRT_SWITCHRES_SETTINGS), parent_group);
11924 MENU_SETTINGS_LIST_CURRENT_ADD_ENUM_IDX_PTR(list, list_info, MENU_ENUM_LABEL_CRT_SWITCHRES_SETTINGS);
11925
11926 parent_group = msg_hash_to_str(MENU_ENUM_LABEL_SETTINGS);
11927
11928 START_SUB_GROUP(list, list_info, "State", &group_info, &subgroup_info, parent_group);
11929
11930 CONFIG_UINT(
11931 list, list_info,
11932 &settings->uints.crt_switch_resolution,
11933 MENU_ENUM_LABEL_CRT_SWITCH_RESOLUTION,
11934 MENU_ENUM_LABEL_VALUE_CRT_SWITCH_RESOLUTION,
11935 DEFAULT_CRT_SWITCH_RESOLUTION,
11936 &group_info,
11937 &subgroup_info,
11938 parent_group,
11939 general_write_handler,
11940 general_read_handler);
11941 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_COMBOBOX;
11942 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
11943 (*list)[list_info->index - 1].get_string_representation =
11944 &setting_get_string_representation_uint_crt_switch_resolutions;
11945 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ADVANCED);
11946 menu_settings_list_current_add_range(list, list_info, CRT_SWITCH_NONE, CRT_SWITCH_INI, 1.0, true, true);
11947
11948 CONFIG_UINT(
11949 list, list_info,
11950 &settings->uints.crt_switch_resolution_super,
11951 MENU_ENUM_LABEL_CRT_SWITCH_RESOLUTION_SUPER,
11952 MENU_ENUM_LABEL_VALUE_CRT_SWITCH_RESOLUTION_SUPER,
11953 DEFAULT_CRT_SWITCH_RESOLUTION_SUPER,
11954 &group_info,
11955 &subgroup_info,
11956 parent_group,
11957 general_write_handler,
11958 general_read_handler);
11959 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ADVANCED);
11960 (*list)[list_info->index - 1].action_left = &setting_uint_action_left_crt_switch_resolution_super;
11961 (*list)[list_info->index - 1].action_right = &setting_uint_action_right_crt_switch_resolution_super;
11962 (*list)[list_info->index - 1].get_string_representation =
11963 &setting_get_string_representation_crt_switch_resolution_super;
11964
11965 CONFIG_INT(
11966 list, list_info,
11967 &settings->ints.crt_switch_center_adjust,
11968 MENU_ENUM_LABEL_CRT_SWITCH_X_AXIS_CENTERING,
11969 MENU_ENUM_LABEL_VALUE_CRT_SWITCH_X_AXIS_CENTERING,
11970 DEFAULT_CRT_SWITCH_CENTER_ADJUST,
11971 &group_info,
11972 &subgroup_info,
11973 parent_group,
11974 general_write_handler,
11975 general_read_handler);
11976 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_SPINBOX;
11977 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
11978 (*list)[list_info->index - 1].offset_by = -3;
11979 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ADVANCED);
11980 menu_settings_list_current_add_range(list, list_info, -3, 4, 1.0, true, true);
11981
11982 CONFIG_INT(
11983 list, list_info,
11984 &settings->ints.crt_switch_porch_adjust,
11985 MENU_ENUM_LABEL_CRT_SWITCH_PORCH_ADJUST,
11986 MENU_ENUM_LABEL_VALUE_CRT_SWITCH_PORCH_ADJUST,
11987 DEFAULT_CRT_SWITCH_PORCH_ADJUST,
11988 &group_info,
11989 &subgroup_info,
11990 parent_group,
11991 general_write_handler,
11992 general_read_handler);
11993 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_SPINBOX;
11994 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
11995 (*list)[list_info->index - 1].offset_by = 0;
11996 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ADVANCED);
11997 menu_settings_list_current_add_range(list, list_info, -20, 20, 1.0, true, true);
11998
11999 CONFIG_BOOL(
12000 list, list_info,
12001 &settings->bools.crt_switch_custom_refresh_enable,
12002 MENU_ENUM_LABEL_CRT_SWITCH_RESOLUTION_USE_CUSTOM_REFRESH_RATE,
12003 MENU_ENUM_LABEL_VALUE_CRT_SWITCH_RESOLUTION_USE_CUSTOM_REFRESH_RATE,
12004 false,
12005 MENU_ENUM_LABEL_VALUE_OFF,
12006 MENU_ENUM_LABEL_VALUE_ON,
12007 &group_info,
12008 &subgroup_info,
12009 parent_group,
12010 general_write_handler,
12011 general_read_handler,
12012 SD_FLAG_NONE
12013 );
12014
12015 CONFIG_BOOL(
12016 list, list_info,
12017 &settings->bools.crt_switch_hires_menu,
12018 MENU_ENUM_LABEL_CRT_SWITCH_HIRES_MENU,
12019 MENU_ENUM_LABEL_VALUE_CRT_SWITCH_HIRES_MENU,
12020 false,
12021 MENU_ENUM_LABEL_VALUE_OFF,
12022 MENU_ENUM_LABEL_VALUE_ON,
12023 &group_info,
12024 &subgroup_info,
12025 parent_group,
12026 general_write_handler,
12027 general_read_handler,
12028 SD_FLAG_NONE
12029 );
12030
12031 END_SUB_GROUP(list, list_info, parent_group);
12032 END_GROUP(list, list_info, parent_group);
12033 break;
12034 case SETTINGS_LIST_MENU_SOUNDS:
12035 START_GROUP(list, list_info, &group_info,
12036 msg_hash_to_str(MENU_ENUM_LABEL_VALUE_MENU_SOUNDS),
12037 parent_group);
12038 parent_group = msg_hash_to_str(MENU_ENUM_LABEL_AUDIO_SETTINGS);
12039
12040 START_SUB_GROUP(list, list_info, "State", &group_info, &subgroup_info, parent_group);
12041
12042 CONFIG_BOOL(
12043 list, list_info,
12044 &settings->bools.audio_enable_menu,
12045 MENU_ENUM_LABEL_AUDIO_ENABLE_MENU,
12046 MENU_ENUM_LABEL_VALUE_AUDIO_ENABLE_MENU,
12047 audio_enable_menu,
12048 MENU_ENUM_LABEL_VALUE_OFF,
12049 MENU_ENUM_LABEL_VALUE_ON,
12050 &group_info,
12051 &subgroup_info,
12052 parent_group,
12053 general_write_handler,
12054 general_read_handler,
12055 SD_FLAG_NONE
12056 );
12057
12058 CONFIG_BOOL(
12059 list, list_info,
12060 &settings->bools.audio_enable_menu_ok,
12061 MENU_ENUM_LABEL_MENU_SOUND_OK,
12062 MENU_ENUM_LABEL_VALUE_MENU_SOUND_OK,
12063 audio_enable_menu_ok,
12064 MENU_ENUM_LABEL_VALUE_OFF,
12065 MENU_ENUM_LABEL_VALUE_ON,
12066 &group_info,
12067 &subgroup_info,
12068 parent_group,
12069 general_write_handler,
12070 general_read_handler,
12071 SD_FLAG_NONE
12072 );
12073
12074 CONFIG_BOOL(
12075 list, list_info,
12076 &settings->bools.audio_enable_menu_cancel,
12077 MENU_ENUM_LABEL_MENU_SOUND_CANCEL,
12078 MENU_ENUM_LABEL_VALUE_MENU_SOUND_CANCEL,
12079 audio_enable_menu_cancel,
12080 MENU_ENUM_LABEL_VALUE_OFF,
12081 MENU_ENUM_LABEL_VALUE_ON,
12082 &group_info,
12083 &subgroup_info,
12084 parent_group,
12085 general_write_handler,
12086 general_read_handler,
12087 SD_FLAG_NONE
12088 );
12089
12090 CONFIG_BOOL(
12091 list, list_info,
12092 &settings->bools.audio_enable_menu_notice,
12093 MENU_ENUM_LABEL_MENU_SOUND_NOTICE,
12094 MENU_ENUM_LABEL_VALUE_MENU_SOUND_NOTICE,
12095 audio_enable_menu_notice,
12096 MENU_ENUM_LABEL_VALUE_OFF,
12097 MENU_ENUM_LABEL_VALUE_ON,
12098 &group_info,
12099 &subgroup_info,
12100 parent_group,
12101 general_write_handler,
12102 general_read_handler,
12103 SD_FLAG_NONE
12104 );
12105
12106 CONFIG_BOOL(
12107 list, list_info,
12108 &settings->bools.audio_enable_menu_bgm,
12109 MENU_ENUM_LABEL_MENU_SOUND_BGM,
12110 MENU_ENUM_LABEL_VALUE_MENU_SOUND_BGM,
12111 audio_enable_menu_bgm,
12112 MENU_ENUM_LABEL_VALUE_OFF,
12113 MENU_ENUM_LABEL_VALUE_ON,
12114 &group_info,
12115 &subgroup_info,
12116 parent_group,
12117 general_write_handler,
12118 general_read_handler,
12119 SD_FLAG_NONE
12120 );
12121
12122 END_SUB_GROUP(list, list_info, parent_group);
12123 END_GROUP(list, list_info, parent_group);
12124 break;
12125 case SETTINGS_LIST_AUDIO:
12126 START_GROUP(list, list_info, &group_info,
12127 msg_hash_to_str(MENU_ENUM_LABEL_VALUE_AUDIO_SETTINGS), parent_group);
12128 MENU_SETTINGS_LIST_CURRENT_ADD_ENUM_IDX_PTR(list, list_info, MENU_ENUM_LABEL_AUDIO_SETTINGS);
12129
12130 parent_group = msg_hash_to_str(MENU_ENUM_LABEL_SETTINGS);
12131
12132 START_SUB_GROUP(list, list_info, "State", &group_info, &subgroup_info, parent_group);
12133
12134 CONFIG_BOOL(
12135 list, list_info,
12136 &settings->bools.audio_enable,
12137 MENU_ENUM_LABEL_AUDIO_ENABLE,
12138 MENU_ENUM_LABEL_VALUE_AUDIO_ENABLE,
12139 DEFAULT_AUDIO_ENABLE,
12140 MENU_ENUM_LABEL_VALUE_OFF,
12141 MENU_ENUM_LABEL_VALUE_ON,
12142 &group_info,
12143 &subgroup_info,
12144 parent_group,
12145 general_write_handler,
12146 general_read_handler,
12147 SD_FLAG_NONE
12148 );
12149
12150 CONFIG_BOOL(
12151 list, list_info,
12152 audio_get_bool_ptr(AUDIO_ACTION_MUTE_ENABLE),
12153 MENU_ENUM_LABEL_AUDIO_MUTE,
12154 MENU_ENUM_LABEL_VALUE_AUDIO_MUTE,
12155 false,
12156 MENU_ENUM_LABEL_VALUE_OFF,
12157 MENU_ENUM_LABEL_VALUE_ON,
12158 &group_info,
12159 &subgroup_info,
12160 parent_group,
12161 general_write_handler,
12162 general_read_handler,
12163 SD_FLAG_NONE
12164 );
12165
12166 #ifdef HAVE_AUDIOMIXER
12167 CONFIG_BOOL(
12168 list, list_info,
12169 audio_get_bool_ptr(AUDIO_ACTION_MIXER_MUTE_ENABLE),
12170 MENU_ENUM_LABEL_AUDIO_MIXER_MUTE,
12171 MENU_ENUM_LABEL_VALUE_AUDIO_MIXER_MUTE,
12172 false,
12173 MENU_ENUM_LABEL_VALUE_OFF,
12174 MENU_ENUM_LABEL_VALUE_ON,
12175 &group_info,
12176 &subgroup_info,
12177 parent_group,
12178 general_write_handler,
12179 general_read_handler,
12180 SD_FLAG_LAKKA_ADVANCED
12181 );
12182 #endif
12183 CONFIG_BOOL(
12184 list, list_info,
12185 &settings->bools.audio_fastforward_mute,
12186 MENU_ENUM_LABEL_AUDIO_FASTFORWARD_MUTE,
12187 MENU_ENUM_LABEL_VALUE_AUDIO_FASTFORWARD_MUTE,
12188 DEFAULT_AUDIO_FASTFORWARD_MUTE,
12189 MENU_ENUM_LABEL_VALUE_OFF,
12190 MENU_ENUM_LABEL_VALUE_ON,
12191 &group_info,
12192 &subgroup_info,
12193 parent_group,
12194 general_write_handler,
12195 general_read_handler,
12196 SD_FLAG_NONE
12197 );
12198
12199 CONFIG_FLOAT(
12200 list, list_info,
12201 &settings->floats.audio_volume,
12202 MENU_ENUM_LABEL_AUDIO_VOLUME,
12203 MENU_ENUM_LABEL_VALUE_AUDIO_VOLUME,
12204 DEFAULT_AUDIO_VOLUME,
12205 "%.1f",
12206 &group_info,
12207 &subgroup_info,
12208 parent_group,
12209 general_write_handler,
12210 general_read_handler);
12211 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
12212 menu_settings_list_current_add_range(list, list_info, -80, 12, 1.0, true, true);
12213
12214 #ifdef HAVE_AUDIOMIXER
12215 CONFIG_FLOAT(
12216 list, list_info,
12217 &settings->floats.audio_mixer_volume,
12218 MENU_ENUM_LABEL_AUDIO_MIXER_VOLUME,
12219 MENU_ENUM_LABEL_VALUE_AUDIO_MIXER_VOLUME,
12220 DEFAULT_AUDIO_MIXER_VOLUME,
12221 "%.1f",
12222 &group_info,
12223 &subgroup_info,
12224 parent_group,
12225 general_write_handler,
12226 general_read_handler);
12227 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
12228 menu_settings_list_current_add_range(list, list_info, -80, 12, 1.0, true, true);
12229 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED);
12230 #endif
12231
12232 END_SUB_GROUP(list, list_info, parent_group);
12233
12234 parent_group = msg_hash_to_str(MENU_ENUM_LABEL_SETTINGS);
12235
12236 START_SUB_GROUP(
12237 list,
12238 list_info,
12239 msg_hash_to_str(MENU_ENUM_LABEL_VALUE_AUDIO_SYNC),
12240 &group_info,
12241 &subgroup_info,
12242 parent_group);
12243
12244 CONFIG_BOOL(
12245 list, list_info,
12246 &settings->bools.audio_sync,
12247 MENU_ENUM_LABEL_AUDIO_SYNC,
12248 MENU_ENUM_LABEL_VALUE_AUDIO_SYNC,
12249 DEFAULT_AUDIO_SYNC,
12250 MENU_ENUM_LABEL_VALUE_OFF,
12251 MENU_ENUM_LABEL_VALUE_ON,
12252 &group_info,
12253 &subgroup_info,
12254 parent_group,
12255 general_write_handler,
12256 general_read_handler,
12257 SD_FLAG_NONE
12258 );
12259 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED);
12260
12261 CONFIG_UINT(
12262 list, list_info,
12263 &settings->uints.audio_latency,
12264 MENU_ENUM_LABEL_AUDIO_LATENCY,
12265 MENU_ENUM_LABEL_VALUE_AUDIO_LATENCY,
12266 g_defaults.settings_out_latency ?
12267 g_defaults.settings_out_latency : DEFAULT_OUT_LATENCY,
12268 &group_info,
12269 &subgroup_info,
12270 parent_group,
12271 general_write_handler,
12272 general_read_handler);
12273 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
12274 menu_settings_list_current_add_range(list, list_info, 0, 512, 1.0, true, true);
12275 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED);
12276
12277 CONFIG_UINT(
12278 list, list_info,
12279 &settings->uints.audio_resampler_quality,
12280 MENU_ENUM_LABEL_AUDIO_RESAMPLER_QUALITY,
12281 MENU_ENUM_LABEL_VALUE_AUDIO_RESAMPLER_QUALITY,
12282 audio_resampler_quality_level,
12283 &group_info,
12284 &subgroup_info,
12285 parent_group,
12286 general_write_handler,
12287 general_read_handler);
12288 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_COMBOBOX;
12289 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
12290 (*list)[list_info->index - 1].get_string_representation =
12291 &setting_get_string_representation_uint_audio_resampler_quality;
12292 menu_settings_list_current_add_range(list, list_info, RESAMPLER_QUALITY_DONTCARE, RESAMPLER_QUALITY_HIGHEST, 1.0, true, true);
12293
12294 CONFIG_FLOAT(
12295 list, list_info,
12296 audio_get_float_ptr(AUDIO_ACTION_RATE_CONTROL_DELTA),
12297 MENU_ENUM_LABEL_AUDIO_RATE_CONTROL_DELTA,
12298 MENU_ENUM_LABEL_VALUE_AUDIO_RATE_CONTROL_DELTA,
12299 DEFAULT_RATE_CONTROL_DELTA,
12300 "%.3f",
12301 &group_info,
12302 &subgroup_info,
12303 parent_group,
12304 write_handler_audio_rate_control_delta,
12305 read_handler_audio_rate_control_delta);
12306 menu_settings_list_current_add_range(
12307 list,
12308 list_info,
12309 0,
12310 0,
12311 0.001,
12312 true,
12313 false);
12314 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ADVANCED);
12315
12316 CONFIG_FLOAT(
12317 list, list_info,
12318 &settings->floats.audio_max_timing_skew,
12319 MENU_ENUM_LABEL_AUDIO_MAX_TIMING_SKEW,
12320 MENU_ENUM_LABEL_VALUE_AUDIO_MAX_TIMING_SKEW,
12321 DEFAULT_MAX_TIMING_SKEW,
12322 "%.2f",
12323 &group_info,
12324 &subgroup_info,
12325 parent_group,
12326 general_write_handler,
12327 general_read_handler);
12328 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
12329 menu_settings_list_current_add_range(
12330 list,
12331 list_info,
12332 0.0,
12333 0.5,
12334 0.01,
12335 true,
12336 true);
12337 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ADVANCED);
12338
12339 #ifdef RARCH_MOBILE
12340 CONFIG_UINT(
12341 list, list_info,
12342 &settings->uints.audio_block_frames,
12343 MENU_ENUM_LABEL_AUDIO_BLOCK_FRAMES,
12344 MENU_ENUM_LABEL_VALUE_AUDIO_BLOCK_FRAMES,
12345 0,
12346 &group_info,
12347 &subgroup_info,
12348 parent_group,
12349 general_write_handler,
12350 general_read_handler);
12351 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ADVANCED);
12352 #endif
12353
12354 END_SUB_GROUP(list, list_info, parent_group);
12355
12356 parent_group = msg_hash_to_str(MENU_ENUM_LABEL_SETTINGS);
12357
12358 START_SUB_GROUP(
12359 list,
12360 list_info,
12361 "Miscellaneous",
12362 &group_info,
12363 &subgroup_info,
12364 parent_group);
12365
12366 #if !defined(RARCH_CONSOLE)
12367 CONFIG_STRING(
12368 list, list_info,
12369 settings->arrays.audio_device,
12370 sizeof(settings->arrays.audio_device),
12371 MENU_ENUM_LABEL_AUDIO_DEVICE,
12372 MENU_ENUM_LABEL_VALUE_AUDIO_DEVICE,
12373 "",
12374 &group_info,
12375 &subgroup_info,
12376 parent_group,
12377 general_write_handler,
12378 general_read_handler);
12379 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ALLOW_INPUT);
12380 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_STRING_LINE_EDIT;
12381 (*list)[list_info->index - 1].action_start = setting_generic_action_start_default;
12382 (*list)[list_info->index - 1].action_left = &setting_string_action_left_audio_device;
12383 (*list)[list_info->index - 1].action_right = &setting_string_action_right_audio_device;
12384 #endif
12385
12386 CONFIG_UINT(
12387 list, list_info,
12388 &settings->uints.audio_output_sample_rate,
12389 MENU_ENUM_LABEL_AUDIO_OUTPUT_RATE,
12390 MENU_ENUM_LABEL_VALUE_AUDIO_OUTPUT_RATE,
12391 DEFAULT_OUTPUT_RATE,
12392 &group_info,
12393 &subgroup_info,
12394 parent_group,
12395 general_write_handler,
12396 general_read_handler);
12397 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint_special;
12398 menu_settings_list_current_add_range(list, list_info, 1000, 192000, 100.0, true, true);
12399 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ADVANCED);
12400
12401 CONFIG_PATH(
12402 list, list_info,
12403 settings->paths.path_audio_dsp_plugin,
12404 sizeof(settings->paths.path_audio_dsp_plugin),
12405 MENU_ENUM_LABEL_AUDIO_DSP_PLUGIN,
12406 MENU_ENUM_LABEL_VALUE_AUDIO_DSP_PLUGIN,
12407 settings->paths.directory_audio_filter,
12408 &group_info,
12409 &subgroup_info,
12410 parent_group,
12411 general_write_handler,
12412 general_read_handler);
12413 MENU_SETTINGS_LIST_CURRENT_ADD_VALUES(list, list_info, "dsp");
12414 MENU_SETTINGS_LIST_CURRENT_ADD_CMD(list, list_info, CMD_EVENT_DSP_FILTER_INIT);
12415 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED);
12416
12417 #ifdef HAVE_WASAPI
12418 if (string_is_equal(settings->arrays.audio_driver, "wasapi"))
12419 {
12420 CONFIG_BOOL(
12421 list, list_info,
12422 &settings->bools.audio_wasapi_exclusive_mode,
12423 MENU_ENUM_LABEL_AUDIO_WASAPI_EXCLUSIVE_MODE,
12424 MENU_ENUM_LABEL_VALUE_AUDIO_WASAPI_EXCLUSIVE_MODE,
12425 DEFAULT_WASAPI_EXCLUSIVE_MODE,
12426 MENU_ENUM_LABEL_VALUE_OFF,
12427 MENU_ENUM_LABEL_VALUE_ON,
12428 &group_info,
12429 &subgroup_info,
12430 parent_group,
12431 general_write_handler,
12432 general_read_handler,
12433 SD_FLAG_NONE
12434 );
12435
12436 CONFIG_BOOL(
12437 list, list_info,
12438 &settings->bools.audio_wasapi_float_format,
12439 MENU_ENUM_LABEL_AUDIO_WASAPI_FLOAT_FORMAT,
12440 MENU_ENUM_LABEL_VALUE_AUDIO_WASAPI_FLOAT_FORMAT,
12441 DEFAULT_WASAPI_FLOAT_FORMAT,
12442 MENU_ENUM_LABEL_VALUE_OFF,
12443 MENU_ENUM_LABEL_VALUE_ON,
12444 &group_info,
12445 &subgroup_info,
12446 parent_group,
12447 general_write_handler,
12448 general_read_handler,
12449 SD_FLAG_NONE
12450 );
12451
12452 CONFIG_INT(
12453 list, list_info,
12454 &settings->ints.audio_wasapi_sh_buffer_length,
12455 MENU_ENUM_LABEL_AUDIO_WASAPI_SH_BUFFER_LENGTH,
12456 MENU_ENUM_LABEL_VALUE_AUDIO_WASAPI_SH_BUFFER_LENGTH,
12457 DEFAULT_WASAPI_SH_BUFFER_LENGTH,
12458 &group_info,
12459 &subgroup_info,
12460 parent_group,
12461 general_write_handler,
12462 general_read_handler);
12463 menu_settings_list_current_add_range(list, list_info, -16.0f, 0.0f, 16.0f, true, false);
12464 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ADVANCED);
12465 (*list)[list_info->index - 1].get_string_representation =
12466 &setting_get_string_representation_int_audio_wasapi_sh_buffer_length;
12467 }
12468 #endif
12469
12470 END_SUB_GROUP(list, list_info, parent_group);
12471 END_GROUP(list, list_info, parent_group);
12472 break;
12473 case SETTINGS_LIST_INPUT:
12474 {
12475 unsigned user;
12476 START_GROUP(list, list_info, &group_info,
12477 msg_hash_to_str(MENU_ENUM_LABEL_INPUT_SETTINGS_BEGIN),
12478 parent_group);
12479
12480 parent_group = msg_hash_to_str(MENU_ENUM_LABEL_SETTINGS);
12481
12482 START_SUB_GROUP(list, list_info, "State", &group_info, &subgroup_info, parent_group);
12483
12484 CONFIG_UINT(
12485 list, list_info,
12486 input_driver_get_uint(INPUT_ACTION_MAX_USERS),
12487 MENU_ENUM_LABEL_INPUT_MAX_USERS,
12488 MENU_ENUM_LABEL_VALUE_INPUT_MAX_USERS,
12489 input_max_users,
12490 &group_info,
12491 &subgroup_info,
12492 parent_group,
12493 general_write_handler,
12494 general_read_handler);
12495 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
12496 (*list)[list_info->index - 1].action_left = &setting_uint_action_left_with_refresh;
12497 (*list)[list_info->index - 1].action_right = &setting_uint_action_right_with_refresh;
12498 (*list)[list_info->index - 1].get_string_representation =
12499 &setting_get_string_representation_max_users;
12500 (*list)[list_info->index - 1].offset_by = 1;
12501 menu_settings_list_current_add_range(list, list_info, 1, MAX_USERS, 1, true, true);
12502 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED);
12503
12504 CONFIG_BOOL(
12505 list, list_info,
12506 &settings->bools.menu_unified_controls,
12507 MENU_ENUM_LABEL_INPUT_UNIFIED_MENU_CONTROLS,
12508 MENU_ENUM_LABEL_VALUE_INPUT_UNIFIED_MENU_CONTROLS,
12509 false,
12510 MENU_ENUM_LABEL_VALUE_OFF,
12511 MENU_ENUM_LABEL_VALUE_ON,
12512 &group_info,
12513 &subgroup_info,
12514 parent_group,
12515 general_write_handler,
12516 general_read_handler,
12517 SD_FLAG_NONE
12518 );
12519 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED);
12520
12521 CONFIG_BOOL(
12522 list, list_info,
12523 &settings->bools.quit_press_twice,
12524 MENU_ENUM_LABEL_QUIT_PRESS_TWICE,
12525 MENU_ENUM_LABEL_VALUE_QUIT_PRESS_TWICE,
12526 DEFAULT_QUIT_PRESS_TWICE,
12527 MENU_ENUM_LABEL_VALUE_OFF,
12528 MENU_ENUM_LABEL_VALUE_ON,
12529 &group_info,
12530 &subgroup_info,
12531 parent_group,
12532 general_write_handler,
12533 general_read_handler,
12534 SD_FLAG_NONE
12535 );
12536
12537 CONFIG_BOOL(
12538 list, list_info,
12539 &settings->bools.vibrate_on_keypress,
12540 MENU_ENUM_LABEL_VIBRATE_ON_KEYPRESS,
12541 MENU_ENUM_LABEL_VALUE_VIBRATE_ON_KEYPRESS,
12542 vibrate_on_keypress,
12543 MENU_ENUM_LABEL_VALUE_OFF,
12544 MENU_ENUM_LABEL_VALUE_ON,
12545 &group_info,
12546 &subgroup_info,
12547 parent_group,
12548 general_write_handler,
12549 general_read_handler,
12550 SD_FLAG_NONE
12551 );
12552
12553 CONFIG_BOOL(
12554 list, list_info,
12555 &settings->bools.enable_device_vibration,
12556 MENU_ENUM_LABEL_ENABLE_DEVICE_VIBRATION,
12557 MENU_ENUM_LABEL_VALUE_ENABLE_DEVICE_VIBRATION,
12558 enable_device_vibration,
12559 MENU_ENUM_LABEL_VALUE_OFF,
12560 MENU_ENUM_LABEL_VALUE_ON,
12561 &group_info,
12562 &subgroup_info,
12563 parent_group,
12564 general_write_handler,
12565 general_read_handler,
12566 SD_FLAG_NONE
12567 );
12568
12569 #if defined(DINGUX) && defined(HAVE_LIBSHAKE)
12570 CONFIG_UINT(
12571 list, list_info,
12572 &settings->uints.input_dingux_rumble_gain,
12573 MENU_ENUM_LABEL_INPUT_DINGUX_RUMBLE_GAIN,
12574 MENU_ENUM_LABEL_VALUE_INPUT_DINGUX_RUMBLE_GAIN,
12575 DEFAULT_DINGUX_RUMBLE_GAIN,
12576 &group_info,
12577 &subgroup_info,
12578 parent_group,
12579 general_write_handler,
12580 general_read_handler);
12581 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_COMBOBOX;
12582 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint_special;
12583 menu_settings_list_current_add_range(list, list_info, 0, 100, 5, true, true);
12584 #endif
12585 CONFIG_UINT(
12586 list, list_info,
12587 &settings->uints.input_poll_type_behavior,
12588 MENU_ENUM_LABEL_INPUT_POLL_TYPE_BEHAVIOR,
12589 MENU_ENUM_LABEL_VALUE_INPUT_POLL_TYPE_BEHAVIOR,
12590 input_poll_type_behavior,
12591 &group_info,
12592 &subgroup_info,
12593 parent_group,
12594 general_write_handler,
12595 general_read_handler);
12596 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_COMBOBOX;
12597 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
12598 (*list)[list_info->index - 1].get_string_representation =
12599 &setting_get_string_representation_poll_type_behavior;
12600 menu_settings_list_current_add_range(list, list_info, 0, 2, 1, true, true);
12601 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED);
12602
12603 #ifdef GEKKO
12604 CONFIG_UINT(
12605 list, list_info,
12606 &settings->uints.input_mouse_scale,
12607 MENU_ENUM_LABEL_INPUT_MOUSE_SCALE,
12608 MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_SCALE,
12609 DEFAULT_MOUSE_SCALE,
12610 &group_info,
12611 &subgroup_info,
12612 parent_group,
12613 general_write_handler,
12614 general_read_handler);
12615 menu_settings_list_current_add_range(list, list_info, 1, 4, 1, true, true);
12616 #endif
12617
12618 CONFIG_UINT(
12619 list, list_info,
12620 &settings->uints.input_touch_scale,
12621 MENU_ENUM_LABEL_INPUT_TOUCH_SCALE,
12622 MENU_ENUM_LABEL_VALUE_INPUT_TOUCH_SCALE,
12623 DEFAULT_TOUCH_SCALE,
12624 &group_info,
12625 &subgroup_info,
12626 parent_group,
12627 general_write_handler,
12628 general_read_handler);
12629 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
12630 (*list)[list_info->index - 1].get_string_representation =
12631 &setting_get_string_representation_input_touch_scale;
12632 (*list)[list_info->index - 1].offset_by = 1;
12633 menu_settings_list_current_add_range(list, list_info, 1, 4, 1, true, true);
12634
12635 #ifdef VITA
12636 CONFIG_BOOL(
12637 list, list_info,
12638 &settings->bools.input_backtouch_enable,
12639 MENU_ENUM_LABEL_INPUT_TOUCH_ENABLE,
12640 MENU_ENUM_LABEL_VALUE_INPUT_TOUCH_ENABLE,
12641 input_backtouch_enable,
12642 MENU_ENUM_LABEL_VALUE_OFF,
12643 MENU_ENUM_LABEL_VALUE_ON,
12644 &group_info,
12645 &subgroup_info,
12646 parent_group,
12647 general_write_handler,
12648 general_read_handler,
12649 SD_FLAG_NONE
12650 );
12651
12652 CONFIG_BOOL(
12653 list, list_info,
12654 &settings->bools.input_backtouch_toggle,
12655 MENU_ENUM_LABEL_INPUT_PREFER_FRONT_TOUCH,
12656 MENU_ENUM_LABEL_VALUE_INPUT_PREFER_FRONT_TOUCH,
12657 input_backtouch_toggle,
12658 MENU_ENUM_LABEL_VALUE_OFF,
12659 MENU_ENUM_LABEL_VALUE_ON,
12660 &group_info,
12661 &subgroup_info,
12662 parent_group,
12663 general_write_handler,
12664 general_read_handler,
12665 SD_FLAG_NONE
12666 );
12667 #endif
12668
12669 #if TARGET_OS_IPHONE
12670 CONFIG_BOOL(
12671 list, list_info,
12672 &settings->bools.input_keyboard_gamepad_enable,
12673 MENU_ENUM_LABEL_INPUT_ICADE_ENABLE,
12674 MENU_ENUM_LABEL_VALUE_INPUT_ICADE_ENABLE,
12675 false,
12676 MENU_ENUM_LABEL_VALUE_OFF,
12677 MENU_ENUM_LABEL_VALUE_ON,
12678 &group_info,
12679 &subgroup_info,
12680 parent_group,
12681 general_write_handler,
12682 general_read_handler,
12683 SD_FLAG_NONE
12684 );
12685
12686 CONFIG_UINT(
12687 list, list_info,
12688 &settings->uints.input_keyboard_gamepad_mapping_type,
12689 MENU_ENUM_LABEL_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE,
12690 MENU_ENUM_LABEL_VALUE_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE,
12691 1,
12692 &group_info,
12693 &subgroup_info,
12694 parent_group,
12695 general_write_handler,
12696 general_read_handler);
12697 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
12698 (*list)[list_info->index - 1].get_string_representation =
12699 &setting_get_string_representation_uint_keyboard_gamepad_mapping_type;
12700 menu_settings_list_current_add_range(list, list_info, 0, 3, 1, true, true);
12701
12702 CONFIG_BOOL(
12703 list, list_info,
12704 &settings->bools.input_small_keyboard_enable,
12705 MENU_ENUM_LABEL_INPUT_SMALL_KEYBOARD_ENABLE,
12706 MENU_ENUM_LABEL_VALUE_INPUT_SMALL_KEYBOARD_ENABLE,
12707 false,
12708 MENU_ENUM_LABEL_VALUE_OFF,
12709 MENU_ENUM_LABEL_VALUE_ON,
12710 &group_info,
12711 &subgroup_info,
12712 parent_group,
12713 general_write_handler,
12714 general_read_handler,
12715 SD_FLAG_NONE
12716 );
12717 #endif
12718
12719 CONFIG_UINT(
12720 list, list_info,
12721 &settings->uints.input_menu_toggle_gamepad_combo,
12722 MENU_ENUM_LABEL_INPUT_MENU_ENUM_TOGGLE_GAMEPAD_COMBO,
12723 MENU_ENUM_LABEL_VALUE_INPUT_MENU_ENUM_TOGGLE_GAMEPAD_COMBO,
12724 DEFAULT_MENU_TOGGLE_GAMEPAD_COMBO,
12725 &group_info,
12726 &subgroup_info,
12727 parent_group,
12728 general_write_handler,
12729 general_read_handler);
12730 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_COMBOBOX;
12731 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
12732 (*list)[list_info->index - 1].get_string_representation =
12733 &setting_get_string_representation_toggle_gamepad_combo;
12734 menu_settings_list_current_add_range(list, list_info, 0, (INPUT_TOGGLE_LAST-1), 1, true, true);
12735
12736 CONFIG_UINT(
12737 list, list_info,
12738 &settings->uints.input_hotkey_block_delay,
12739 MENU_ENUM_LABEL_INPUT_HOTKEY_BLOCK_DELAY,
12740 MENU_ENUM_LABEL_VALUE_INPUT_HOTKEY_BLOCK_DELAY,
12741 DEFAULT_INPUT_HOTKEY_BLOCK_DELAY,
12742 &group_info,
12743 &subgroup_info,
12744 parent_group,
12745 general_write_handler,
12746 general_read_handler);
12747 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_COMBOBOX;
12748 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
12749 menu_settings_list_current_add_range(list, list_info, 0, 600, 1, true, true);
12750 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ADVANCED);
12751
12752 CONFIG_BOOL(
12753 list, list_info,
12754 &settings->bools.input_menu_swap_ok_cancel_buttons,
12755 MENU_ENUM_LABEL_MENU_INPUT_SWAP_OK_CANCEL,
12756 MENU_ENUM_LABEL_VALUE_MENU_INPUT_SWAP_OK_CANCEL,
12757 DEFAULT_MENU_SWAP_OK_CANCEL_BUTTONS,
12758 MENU_ENUM_LABEL_VALUE_OFF,
12759 MENU_ENUM_LABEL_VALUE_ON,
12760 &group_info,
12761 &subgroup_info,
12762 parent_group,
12763 general_write_handler,
12764 general_read_handler,
12765 SD_FLAG_NONE
12766 );
12767
12768 CONFIG_BOOL(
12769 list, list_info,
12770 &settings->bools.input_remap_binds_enable,
12771 MENU_ENUM_LABEL_INPUT_REMAP_BINDS_ENABLE,
12772 MENU_ENUM_LABEL_VALUE_INPUT_REMAP_BINDS_ENABLE,
12773 true,
12774 MENU_ENUM_LABEL_VALUE_OFF,
12775 MENU_ENUM_LABEL_VALUE_ON,
12776 &group_info,
12777 &subgroup_info,
12778 parent_group,
12779 general_write_handler,
12780 general_read_handler,
12781 SD_FLAG_ADVANCED
12782 );
12783
12784 CONFIG_BOOL(
12785 list, list_info,
12786 &settings->bools.input_autodetect_enable,
12787 MENU_ENUM_LABEL_INPUT_AUTODETECT_ENABLE,
12788 MENU_ENUM_LABEL_VALUE_INPUT_AUTODETECT_ENABLE,
12789 input_autodetect_enable,
12790 MENU_ENUM_LABEL_VALUE_OFF,
12791 MENU_ENUM_LABEL_VALUE_ON,
12792 &group_info,
12793 &subgroup_info,
12794 parent_group,
12795 general_write_handler,
12796 general_read_handler,
12797 SD_FLAG_ADVANCED
12798 );
12799
12800 #if defined(HAVE_DINPUT) || defined(HAVE_WINRAWINPUT)
12801 CONFIG_BOOL(
12802 list, list_info,
12803 &settings->bools.input_nowinkey_enable,
12804 MENU_ENUM_LABEL_INPUT_NOWINKEY_ENABLE,
12805 MENU_ENUM_LABEL_VALUE_INPUT_NOWINKEY_ENABLE,
12806 false,
12807 MENU_ENUM_LABEL_VALUE_OFF,
12808 MENU_ENUM_LABEL_VALUE_ON,
12809 &group_info,
12810 &subgroup_info,
12811 parent_group,
12812 general_write_handler,
12813 general_read_handler,
12814 SD_FLAG_NONE
12815 );
12816 #endif
12817
12818 CONFIG_BOOL(
12819 list, list_info,
12820 &settings->bools.input_sensors_enable,
12821 MENU_ENUM_LABEL_INPUT_SENSORS_ENABLE,
12822 MENU_ENUM_LABEL_VALUE_INPUT_SENSORS_ENABLE,
12823 DEFAULT_INPUT_SENSORS_ENABLE,
12824 MENU_ENUM_LABEL_VALUE_OFF,
12825 MENU_ENUM_LABEL_VALUE_ON,
12826 &group_info,
12827 &subgroup_info,
12828 parent_group,
12829 general_write_handler,
12830 general_read_handler,
12831 SD_FLAG_NONE
12832 );
12833
12834 CONFIG_UINT(
12835 list, list_info,
12836 &settings->uints.input_auto_game_focus,
12837 MENU_ENUM_LABEL_INPUT_AUTO_GAME_FOCUS,
12838 MENU_ENUM_LABEL_VALUE_INPUT_AUTO_GAME_FOCUS,
12839 DEFAULT_INPUT_AUTO_GAME_FOCUS,
12840 &group_info,
12841 &subgroup_info,
12842 parent_group,
12843 general_write_handler,
12844 general_read_handler);
12845 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_COMBOBOX;
12846 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
12847 (*list)[list_info->index - 1].get_string_representation =
12848 &setting_get_string_representation_uint_input_auto_game_focus;
12849 menu_settings_list_current_add_range(list, list_info, 0, AUTO_GAME_FOCUS_LAST-1, 1, true, true);
12850 #if 0
12851 CONFIG_BOOL(
12852 list, list_info,
12853 &settings->bools.input_descriptor_label_show,
12854 MENU_ENUM_LABEL_INPUT_DESCRIPTOR_LABEL_SHOW,
12855 MENU_ENUM_LABEL_VALUE_INPUT_DESCRIPTOR_LABEL_SHOW,
12856 true,
12857 MENU_ENUM_LABEL_VALUE_OFF,
12858 MENU_ENUM_LABEL_VALUE_ON,
12859 &group_info,
12860 &subgroup_info,
12861 parent_group,
12862 general_write_handler,
12863 general_read_handler,
12864 SD_FLAG_ADVANCED
12865 );
12866
12867 CONFIG_BOOL(
12868 list, list_info,
12869 &settings->bools.input_descriptor_hide_unbound,
12870 MENU_ENUM_LABEL_INPUT_DESCRIPTOR_HIDE_UNBOUND,
12871 MENU_ENUM_LABEL_VALUE_INPUT_DESCRIPTOR_HIDE_UNBOUND,
12872 input_descriptor_hide_unbound,
12873 MENU_ENUM_LABEL_VALUE_OFF,
12874 MENU_ENUM_LABEL_VALUE_ON,
12875 &group_info,
12876 &subgroup_info,
12877 parent_group,
12878 general_write_handler,
12879 general_read_handler,
12880 SD_FLAG_ADVANCED
12881 );
12882 #endif
12883
12884 END_SUB_GROUP(list, list_info, parent_group);
12885
12886 START_SUB_GROUP(
12887 list,
12888 list_info,
12889 msg_hash_to_str(MENU_ENUM_LABEL_VALUE_TURBO_DEADZONE_LIST),
12890 &group_info,
12891 &subgroup_info,
12892 parent_group);
12893
12894 CONFIG_FLOAT(
12895 list, list_info,
12896 input_driver_get_float(INPUT_ACTION_AXIS_THRESHOLD),
12897 MENU_ENUM_LABEL_INPUT_BUTTON_AXIS_THRESHOLD,
12898 MENU_ENUM_LABEL_VALUE_INPUT_BUTTON_AXIS_THRESHOLD,
12899 DEFAULT_AXIS_THRESHOLD,
12900 "%.3f",
12901 &group_info,
12902 &subgroup_info,
12903 parent_group,
12904 general_write_handler,
12905 general_read_handler);
12906 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
12907 menu_settings_list_current_add_range(list, list_info, 0, 1.0, 0.01, true, true);
12908 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED);
12909
12910 CONFIG_FLOAT(
12911 list, list_info,
12912 &settings->floats.input_analog_deadzone,
12913 MENU_ENUM_LABEL_INPUT_ANALOG_DEADZONE,
12914 MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_DEADZONE,
12915 DEFAULT_ANALOG_DEADZONE,
12916 "%.1f",
12917 &group_info,
12918 &subgroup_info,
12919 parent_group,
12920 general_write_handler,
12921 general_read_handler);
12922 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
12923 menu_settings_list_current_add_range(list, list_info, 0, 1.0, 0.1, true, true);
12924
12925 CONFIG_FLOAT(
12926 list, list_info,
12927 &settings->floats.input_analog_sensitivity,
12928 MENU_ENUM_LABEL_INPUT_ANALOG_SENSITIVITY,
12929 MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_SENSITIVITY,
12930 DEFAULT_ANALOG_SENSITIVITY,
12931 "%.1f",
12932 &group_info,
12933 &subgroup_info,
12934 parent_group,
12935 general_write_handler,
12936 general_read_handler);
12937 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
12938 menu_settings_list_current_add_range(list, list_info, -5.0, 5.0, 0.1, true, true);
12939
12940 CONFIG_UINT(
12941 list, list_info,
12942 &settings->uints.input_bind_timeout,
12943 MENU_ENUM_LABEL_INPUT_BIND_TIMEOUT,
12944 MENU_ENUM_LABEL_VALUE_INPUT_BIND_TIMEOUT,
12945 input_bind_timeout,
12946 &group_info,
12947 &subgroup_info,
12948 parent_group,
12949 general_write_handler,
12950 general_read_handler);
12951 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
12952 (*list)[list_info->index - 1].offset_by = 1;
12953 menu_settings_list_current_add_range(list, list_info, 1, 10, 1, true, true);
12954 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ADVANCED);
12955
12956 CONFIG_UINT(
12957 list, list_info,
12958 &settings->uints.input_bind_hold,
12959 MENU_ENUM_LABEL_INPUT_BIND_HOLD,
12960 MENU_ENUM_LABEL_VALUE_INPUT_BIND_HOLD,
12961 input_bind_hold,
12962 &group_info,
12963 &subgroup_info,
12964 parent_group,
12965 general_write_handler,
12966 general_read_handler);
12967 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
12968 (*list)[list_info->index - 1].offset_by = 1;
12969 menu_settings_list_current_add_range(list, list_info, 1, 10, 1, true, true);
12970 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ADVANCED);
12971
12972 if (string_is_equal(settings->arrays.input_driver, "android") ||
12973 string_is_equal(settings->arrays.input_joypad_driver, "sdl_dingux"))
12974 {
12975 CONFIG_ACTION(
12976 list, list_info,
12977 MENU_ENUM_LABEL_INPUT_HAPTIC_FEEDBACK_SETTINGS,
12978 MENU_ENUM_LABEL_VALUE_INPUT_HAPTIC_FEEDBACK_SETTINGS,
12979 &group_info,
12980 &subgroup_info,
12981 parent_group);
12982 }
12983
12984 CONFIG_ACTION(
12985 list, list_info,
12986 MENU_ENUM_LABEL_INPUT_MENU_SETTINGS,
12987 MENU_ENUM_LABEL_VALUE_INPUT_MENU_SETTINGS,
12988 &group_info,
12989 &subgroup_info,
12990 parent_group);
12991
12992
12993 END_SUB_GROUP(list, list_info, parent_group);
12994
12995 START_SUB_GROUP(list, list_info, "Binds", &group_info, &subgroup_info, parent_group);
12996
12997 CONFIG_ACTION(
12998 list, list_info,
12999 MENU_ENUM_LABEL_INPUT_HOTKEY_BINDS,
13000 MENU_ENUM_LABEL_VALUE_INPUT_HOTKEY_BINDS,
13001 &group_info,
13002 &subgroup_info,
13003 parent_group);
13004
13005 CONFIG_ACTION(
13006 list, list_info,
13007 MENU_ENUM_LABEL_INPUT_TURBO_FIRE_SETTINGS,
13008 MENU_ENUM_LABEL_VALUE_INPUT_TURBO_FIRE_SETTINGS,
13009 &group_info,
13010 &subgroup_info,
13011 parent_group);
13012
13013 for (user = 0; user < MAX_USERS; user++)
13014 {
13015 static char binds_list[MAX_USERS][255];
13016 static char binds_label[MAX_USERS][255];
13017 unsigned user_value = user + 1;
13018
13019 snprintf(binds_list[user], sizeof(binds_list[user]), "%d_input_binds_list", user_value);
13020 snprintf(binds_label[user], sizeof(binds_label[user]), msg_hash_to_str(MENU_ENUM_LABEL_VALUE_INPUT_USER_BINDS), user_value);
13021
13022 CONFIG_ACTION_ALT(
13023 list, list_info,
13024 binds_list[user],
13025 binds_label[user],
13026 &group_info,
13027 &subgroup_info,
13028 parent_group);
13029 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_BIND_BUTTON;
13030 (*list)[list_info->index - 1].index = user_value;
13031 (*list)[list_info->index - 1].index_offset = user;
13032
13033 MENU_SETTINGS_LIST_CURRENT_ADD_ENUM_IDX_PTR(list, list_info, (enum msg_hash_enums)(MENU_ENUM_LABEL_INPUT_USER_1_BINDS + user));
13034 }
13035
13036 END_SUB_GROUP(list, list_info, parent_group);
13037
13038 END_GROUP(list, list_info, parent_group);
13039 }
13040 break;
13041 case SETTINGS_LIST_INPUT_TURBO_FIRE:
13042 START_GROUP(list, list_info, &group_info,
13043 msg_hash_to_str(MENU_ENUM_LABEL_VALUE_INPUT_TURBO_FIRE_SETTINGS),
13044 parent_group);
13045 parent_group = msg_hash_to_str(MENU_ENUM_LABEL_INPUT_TURBO_FIRE_SETTINGS);
13046
13047 START_SUB_GROUP(list, list_info, "State", &group_info, &subgroup_info, parent_group);
13048
13049 CONFIG_UINT(
13050 list, list_info,
13051 &settings->uints.input_turbo_period,
13052 MENU_ENUM_LABEL_INPUT_TURBO_PERIOD,
13053 MENU_ENUM_LABEL_VALUE_INPUT_TURBO_PERIOD,
13054 turbo_period,
13055 &group_info,
13056 &subgroup_info,
13057 parent_group,
13058 general_write_handler,
13059 general_read_handler);
13060 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
13061 (*list)[list_info->index - 1].offset_by = 1;
13062 menu_settings_list_current_add_range(list, list_info, 1, 100, 1, true, true);
13063 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ADVANCED);
13064
13065 CONFIG_UINT(
13066 list, list_info,
13067 &settings->uints.input_turbo_duty_cycle,
13068 MENU_ENUM_LABEL_INPUT_DUTY_CYCLE,
13069 MENU_ENUM_LABEL_VALUE_INPUT_DUTY_CYCLE,
13070 turbo_duty_cycle,
13071 &group_info,
13072 &subgroup_info,
13073 parent_group,
13074 general_write_handler,
13075 general_read_handler);
13076 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
13077 (*list)[list_info->index - 1].offset_by = 1;
13078 menu_settings_list_current_add_range(list, list_info, 1, 100, 1, true, true);
13079 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ADVANCED);
13080
13081 CONFIG_UINT(
13082 list, list_info,
13083 &settings->uints.input_turbo_mode,
13084 MENU_ENUM_LABEL_INPUT_TURBO_MODE,
13085 MENU_ENUM_LABEL_VALUE_INPUT_TURBO_MODE,
13086 turbo_mode,
13087 &group_info,
13088 &subgroup_info,
13089 parent_group,
13090 general_write_handler,
13091 general_read_handler);
13092 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_COMBOBOX;
13093 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
13094 (*list)[list_info->index - 1].get_string_representation =
13095 &setting_get_string_representation_turbo_mode;
13096 menu_settings_list_current_add_range(list, list_info, 0, (INPUT_TURBO_MODE_LAST-1), 1, true, true);
13097
13098 CONFIG_UINT(
13099 list, list_info,
13100 &settings->uints.input_turbo_default_button,
13101 MENU_ENUM_LABEL_INPUT_TURBO_DEFAULT_BUTTON,
13102 MENU_ENUM_LABEL_VALUE_INPUT_TURBO_DEFAULT_BUTTON,
13103 turbo_default_btn,
13104 &group_info,
13105 &subgroup_info,
13106 parent_group,
13107 general_write_handler,
13108 general_read_handler);
13109 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_COMBOBOX;
13110 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
13111 (*list)[list_info->index - 1].get_string_representation =
13112 &setting_get_string_representation_turbo_default_button;
13113 menu_settings_list_current_add_range(list, list_info, 0, (INPUT_TURBO_DEFAULT_BUTTON_LAST-1), 1, true, true);
13114
13115 END_SUB_GROUP(list, list_info, parent_group);
13116
13117 END_GROUP(list, list_info, parent_group);
13118 break;
13119 case SETTINGS_LIST_RECORDING:
13120 START_GROUP(list, list_info, &group_info,
13121 msg_hash_to_str(MENU_ENUM_LABEL_VALUE_RECORDING_SETTINGS),
13122 parent_group);
13123
13124 parent_group = msg_hash_to_str(MENU_ENUM_LABEL_RECORDING_SETTINGS);
13125
13126 START_SUB_GROUP(list, list_info, "State", &group_info, &subgroup_info, parent_group);
13127
13128 CONFIG_UINT(
13129 list, list_info,
13130 &settings->uints.video_record_quality,
13131 MENU_ENUM_LABEL_VIDEO_RECORD_QUALITY,
13132 MENU_ENUM_LABEL_VALUE_VIDEO_RECORD_QUALITY,
13133 RECORD_CONFIG_TYPE_RECORDING_MED_QUALITY,
13134 &group_info,
13135 &subgroup_info,
13136 parent_group,
13137 general_write_handler,
13138 general_read_handler);
13139 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
13140 (*list)[list_info->index - 1].get_string_representation =
13141 &setting_get_string_representation_video_record_quality;
13142 menu_settings_list_current_add_range(list, list_info, RECORD_CONFIG_TYPE_RECORDING_CUSTOM, RECORD_CONFIG_TYPE_RECORDING_APNG, 1, true, true);
13143 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_COMBOBOX;
13144
13145 CONFIG_PATH(
13146 list, list_info,
13147 settings->paths.path_record_config,
13148 sizeof(settings->paths.path_record_config),
13149 MENU_ENUM_LABEL_RECORD_CONFIG,
13150 MENU_ENUM_LABEL_VALUE_RECORD_CONFIG,
13151 "",
13152 &group_info,
13153 &subgroup_info,
13154 parent_group,
13155 general_write_handler,
13156 general_read_handler);
13157 MENU_SETTINGS_LIST_CURRENT_ADD_VALUES(list, list_info, "cfg");
13158
13159 CONFIG_STRING(
13160 list, list_info,
13161 settings->paths.streaming_title,
13162 sizeof(settings->paths.streaming_title),
13163 MENU_ENUM_LABEL_STREAMING_TITLE,
13164 MENU_ENUM_LABEL_VALUE_STREAMING_TITLE,
13165 "",
13166 &group_info,
13167 &subgroup_info,
13168 parent_group,
13169 general_write_handler,
13170 general_read_handler);
13171 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ALLOW_INPUT);
13172 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_STRING_LINE_EDIT;
13173 (*list)[list_info->index - 1].action_start = setting_generic_action_start_default;
13174
13175 CONFIG_UINT(
13176 list, list_info,
13177 &settings->uints.streaming_mode,
13178 MENU_ENUM_LABEL_STREAMING_MODE,
13179 MENU_ENUM_LABEL_VALUE_STREAMING_MODE,
13180 STREAMING_MODE_TWITCH,
13181 &group_info,
13182 &subgroup_info,
13183 parent_group,
13184 update_streaming_url_write_handler,
13185 general_read_handler);
13186 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
13187 (*list)[list_info->index - 1].get_string_representation =
13188 &setting_get_string_representation_streaming_mode;
13189 menu_settings_list_current_add_range(list, list_info, 0, STREAMING_MODE_CUSTOM, 1, true, true);
13190
13191 CONFIG_UINT(
13192 list, list_info,
13193 &settings->uints.video_stream_port,
13194 MENU_ENUM_LABEL_UDP_STREAM_PORT,
13195 MENU_ENUM_LABEL_VALUE_UDP_STREAM_PORT,
13196 RARCH_STREAM_DEFAULT_PORT,
13197 &group_info,
13198 &subgroup_info,
13199 parent_group,
13200 update_streaming_url_write_handler,
13201 general_read_handler);
13202 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
13203 (*list)[list_info->index - 1].offset_by = 1;
13204 menu_settings_list_current_add_range(list, list_info, 1, 65536, 1, true, true);
13205
13206 CONFIG_UINT(
13207 list, list_info,
13208 &settings->uints.video_stream_quality,
13209 MENU_ENUM_LABEL_VIDEO_STREAM_QUALITY,
13210 MENU_ENUM_LABEL_VALUE_VIDEO_STREAM_QUALITY,
13211 RECORD_CONFIG_TYPE_STREAMING_MED_QUALITY,
13212 &group_info,
13213 &subgroup_info,
13214 parent_group,
13215 general_write_handler,
13216 general_read_handler);
13217 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
13218 (*list)[list_info->index - 1].get_string_representation =
13219 &setting_get_string_representation_video_stream_quality;
13220 (*list)[list_info->index - 1].offset_by = RECORD_CONFIG_TYPE_STREAMING_CUSTOM;
13221 menu_settings_list_current_add_range(list, list_info, RECORD_CONFIG_TYPE_STREAMING_CUSTOM, RECORD_CONFIG_TYPE_STREAMING_HIGH_QUALITY, 1, true, true);
13222
13223 CONFIG_PATH(
13224 list, list_info,
13225 settings->paths.path_stream_config,
13226 sizeof(settings->paths.path_stream_config),
13227 MENU_ENUM_LABEL_STREAM_CONFIG,
13228 MENU_ENUM_LABEL_VALUE_STREAM_CONFIG,
13229 "",
13230 &group_info,
13231 &subgroup_info,
13232 parent_group,
13233 general_write_handler,
13234 general_read_handler);
13235 MENU_SETTINGS_LIST_CURRENT_ADD_VALUES(list, list_info, "cfg");
13236 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_FILE_SELECTOR;
13237
13238 CONFIG_STRING(
13239 list, list_info,
13240 settings->paths.path_stream_url,
13241 sizeof(settings->paths.path_stream_url),
13242 MENU_ENUM_LABEL_STREAMING_URL,
13243 MENU_ENUM_LABEL_VALUE_STREAMING_URL,
13244 "",
13245 &group_info,
13246 &subgroup_info,
13247 parent_group,
13248 general_write_handler,
13249 general_read_handler);
13250 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ALLOW_INPUT);
13251 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_STRING_LINE_EDIT;
13252 (*list)[list_info->index - 1].action_start = setting_generic_action_start_default;
13253
13254 CONFIG_UINT(
13255 list, list_info,
13256 &settings->uints.video_record_threads,
13257 MENU_ENUM_LABEL_VIDEO_RECORD_THREADS,
13258 MENU_ENUM_LABEL_VALUE_VIDEO_RECORD_THREADS,
13259 DEFAULT_VIDEO_RECORD_THREADS,
13260 &group_info,
13261 &subgroup_info,
13262 parent_group,
13263 general_write_handler,
13264 general_read_handler);
13265 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint_special;
13266 menu_settings_list_current_add_range(list, list_info, 1, 8, 1, true, true);
13267 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED);
13268 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_COMBOBOX;
13269
13270 CONFIG_DIR(
13271 list, list_info,
13272 global->record.output_dir,
13273 sizeof(global->record.output_dir),
13274 MENU_ENUM_LABEL_RECORDING_OUTPUT_DIRECTORY,
13275 MENU_ENUM_LABEL_VALUE_RECORDING_OUTPUT_DIRECTORY,
13276 g_defaults.dirs[DEFAULT_DIR_RECORD_OUTPUT],
13277 MENU_ENUM_LABEL_VALUE_DIRECTORY_DEFAULT,
13278 &group_info,
13279 &subgroup_info,
13280 parent_group,
13281 general_write_handler,
13282 general_read_handler);
13283 (*list)[list_info->index - 1].action_start = directory_action_start_generic;
13284
13285 END_SUB_GROUP(list, list_info, parent_group);
13286
13287 START_SUB_GROUP(list, list_info, "Miscellaneous", &group_info, &subgroup_info, parent_group);
13288
13289 CONFIG_BOOL(
13290 list, list_info,
13291 &settings->bools.video_post_filter_record,
13292 MENU_ENUM_LABEL_VIDEO_POST_FILTER_RECORD,
13293 MENU_ENUM_LABEL_VALUE_VIDEO_POST_FILTER_RECORD,
13294 DEFAULT_POST_FILTER_RECORD,
13295 MENU_ENUM_LABEL_VALUE_OFF,
13296 MENU_ENUM_LABEL_VALUE_ON,
13297 &group_info,
13298 &subgroup_info,
13299 parent_group,
13300 general_write_handler,
13301 general_read_handler,
13302 SD_FLAG_NONE
13303 );
13304
13305 CONFIG_BOOL(
13306 list, list_info,
13307 &settings->bools.video_gpu_record,
13308 MENU_ENUM_LABEL_VIDEO_GPU_RECORD,
13309 MENU_ENUM_LABEL_VALUE_VIDEO_GPU_RECORD,
13310 DEFAULT_GPU_RECORD,
13311 MENU_ENUM_LABEL_VALUE_OFF,
13312 MENU_ENUM_LABEL_VALUE_ON,
13313 &group_info,
13314 &subgroup_info,
13315 parent_group,
13316 general_write_handler,
13317 general_read_handler,
13318 SD_FLAG_NONE
13319 );
13320
13321 END_SUB_GROUP(list, list_info, parent_group);
13322 END_GROUP(list, list_info, parent_group);
13323 break;
13324 case SETTINGS_LIST_INPUT_HOTKEY:
13325 {
13326 unsigned i;
13327 START_GROUP(list, list_info, &group_info,
13328 msg_hash_to_str(MENU_ENUM_LABEL_INPUT_HOTKEY_BINDS_BEGIN),
13329 parent_group);
13330
13331 parent_group = msg_hash_to_str(MENU_ENUM_LABEL_SETTINGS);
13332
13333 START_SUB_GROUP(list, list_info, "State", &group_info, &subgroup_info,
13334 parent_group);
13335
13336 for (i = 0; i < RARCH_BIND_LIST_END; i ++)
13337 {
13338 if (!input_config_bind_map_get_meta(i))
13339 continue;
13340 #ifndef HAVE_QT
13341 if (i == RARCH_UI_COMPANION_TOGGLE)
13342 continue;
13343 #endif
13344 CONFIG_BIND_ALT(
13345 list, list_info,
13346 &input_config_binds[0][i],
13347 0, 0,
13348 strdup(input_config_bind_map_get_base(i)),
13349 strdup(input_config_bind_map_get_desc(i)),
13350 &retro_keybinds_1[i],
13351 &group_info, &subgroup_info, parent_group);
13352 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_BIND_BUTTON;
13353 (*list)[list_info->index - 1].bind_type = i + MENU_SETTINGS_BIND_BEGIN;
13354 MENU_SETTINGS_LIST_CURRENT_ADD_ENUM_IDX_PTR(list, list_info,
13355 (enum msg_hash_enums)(MENU_ENUM_LABEL_INPUT_HOTKEY_BIND_BEGIN + i));
13356 }
13357
13358 END_SUB_GROUP(list, list_info, parent_group);
13359 END_GROUP(list, list_info, parent_group);
13360 }
13361 break;
13362 case SETTINGS_LIST_FRAME_THROTTLING:
13363 START_GROUP(list, list_info, &group_info,
13364 msg_hash_to_str(MENU_ENUM_LABEL_VALUE_FRAME_THROTTLE_SETTINGS),
13365 parent_group);
13366
13367 parent_group = msg_hash_to_str(MENU_ENUM_LABEL_FRAME_THROTTLE_SETTINGS);
13368
13369 START_SUB_GROUP(list, list_info, "State", &group_info, &subgroup_info, parent_group);
13370
13371 CONFIG_FLOAT(
13372 list, list_info,
13373 &settings->floats.fastforward_ratio,
13374 MENU_ENUM_LABEL_FASTFORWARD_RATIO,
13375 MENU_ENUM_LABEL_VALUE_FASTFORWARD_RATIO,
13376 DEFAULT_FASTFORWARD_RATIO,
13377 "%.1fx",
13378 &group_info,
13379 &subgroup_info,
13380 parent_group,
13381 general_write_handler,
13382 general_read_handler);
13383 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
13384 MENU_SETTINGS_LIST_CURRENT_ADD_CMD(list, list_info, CMD_EVENT_SET_FRAME_LIMIT);
13385 menu_settings_list_current_add_range(list, list_info, 0, 10, 1.0, true, true);
13386
13387 CONFIG_BOOL(
13388 list, list_info,
13389 &settings->bools.vrr_runloop_enable,
13390 MENU_ENUM_LABEL_VRR_RUNLOOP_ENABLE,
13391 MENU_ENUM_LABEL_VALUE_VRR_RUNLOOP_ENABLE,
13392 false,
13393 MENU_ENUM_LABEL_VALUE_OFF,
13394 MENU_ENUM_LABEL_VALUE_ON,
13395 &group_info,
13396 &subgroup_info,
13397 parent_group,
13398 general_write_handler,
13399 general_read_handler,
13400 SD_FLAG_NONE
13401 );
13402
13403 CONFIG_FLOAT(
13404 list, list_info,
13405 &settings->floats.slowmotion_ratio,
13406 MENU_ENUM_LABEL_SLOWMOTION_RATIO,
13407 MENU_ENUM_LABEL_VALUE_SLOWMOTION_RATIO,
13408 DEFAULT_SLOWMOTION_RATIO,
13409 "%.1fx",
13410 &group_info,
13411 &subgroup_info,
13412 parent_group,
13413 general_write_handler,
13414 general_read_handler);
13415 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
13416 menu_settings_list_current_add_range(list, list_info, 1, 10, 0.1, true, true);
13417
13418 CONFIG_BOOL(
13419 list, list_info,
13420 &settings->bools.run_ahead_enabled,
13421 MENU_ENUM_LABEL_RUN_AHEAD_ENABLED,
13422 MENU_ENUM_LABEL_VALUE_RUN_AHEAD_ENABLED,
13423 false,
13424 MENU_ENUM_LABEL_VALUE_OFF,
13425 MENU_ENUM_LABEL_VALUE_ON,
13426 &group_info,
13427 &subgroup_info,
13428 parent_group,
13429 general_write_handler,
13430 general_read_handler,
13431 SD_FLAG_NONE
13432 );
13433 (*list)[list_info->index - 1].action_ok = setting_bool_action_left_with_refresh;
13434 (*list)[list_info->index - 1].action_left = setting_bool_action_left_with_refresh;
13435 (*list)[list_info->index - 1].action_right = setting_bool_action_right_with_refresh;
13436
13437 CONFIG_UINT(
13438 list, list_info,
13439 &settings->uints.run_ahead_frames,
13440 MENU_ENUM_LABEL_RUN_AHEAD_FRAMES,
13441 MENU_ENUM_LABEL_VALUE_RUN_AHEAD_FRAMES,
13442 1,
13443 &group_info,
13444 &subgroup_info,
13445 parent_group,
13446 general_write_handler,
13447 general_read_handler);
13448 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_COMBOBOX;
13449 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
13450 (*list)[list_info->index - 1].offset_by = 1;
13451 menu_settings_list_current_add_range(list, list_info, 1, 12, 1, true, true);
13452
13453 #if defined(HAVE_DYNAMIC) || defined(HAVE_DYLIB)
13454 CONFIG_BOOL(
13455 list, list_info,
13456 &settings->bools.run_ahead_secondary_instance,
13457 MENU_ENUM_LABEL_RUN_AHEAD_SECONDARY_INSTANCE,
13458 MENU_ENUM_LABEL_VALUE_RUN_AHEAD_SECONDARY_INSTANCE,
13459 DEFAULT_RUN_AHEAD_SECONDARY_INSTANCE,
13460 MENU_ENUM_LABEL_VALUE_OFF,
13461 MENU_ENUM_LABEL_VALUE_ON,
13462 &group_info,
13463 &subgroup_info,
13464 parent_group,
13465 general_write_handler,
13466 general_read_handler,
13467 SD_FLAG_NONE
13468 );
13469 #endif
13470
13471 CONFIG_BOOL(
13472 list, list_info,
13473 &settings->bools.run_ahead_hide_warnings,
13474 MENU_ENUM_LABEL_RUN_AHEAD_HIDE_WARNINGS,
13475 MENU_ENUM_LABEL_VALUE_RUN_AHEAD_HIDE_WARNINGS,
13476 DEFAULT_RUN_AHEAD_HIDE_WARNINGS,
13477 MENU_ENUM_LABEL_VALUE_OFF,
13478 MENU_ENUM_LABEL_VALUE_ON,
13479 &group_info,
13480 &subgroup_info,
13481 parent_group,
13482 general_write_handler,
13483 general_read_handler,
13484 SD_FLAG_ADVANCED
13485 );
13486
13487 #ifdef ANDROID
13488 CONFIG_UINT(
13489 list, list_info,
13490 &settings->uints.input_block_timeout,
13491 MENU_ENUM_LABEL_INPUT_BLOCK_TIMEOUT,
13492 MENU_ENUM_LABEL_VALUE_INPUT_BLOCK_TIMEOUT,
13493 1,
13494 &group_info,
13495 &subgroup_info,
13496 parent_group,
13497 general_write_handler,
13498 general_read_handler);
13499 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
13500 (*list)[list_info->index - 1].offset_by = 1;
13501 menu_settings_list_current_add_range(list, list_info, 0, 4, 1, true, true);
13502 #endif
13503
13504 CONFIG_BOOL(
13505 list, list_info,
13506 &settings->bools.menu_throttle_framerate,
13507 MENU_ENUM_LABEL_MENU_THROTTLE_FRAMERATE,
13508 MENU_ENUM_LABEL_VALUE_MENU_ENUM_THROTTLE_FRAMERATE,
13509 true,
13510 MENU_ENUM_LABEL_VALUE_OFF,
13511 MENU_ENUM_LABEL_VALUE_ON,
13512 &group_info,
13513 &subgroup_info,
13514 parent_group,
13515 general_write_handler,
13516 general_read_handler,
13517 SD_FLAG_ADVANCED
13518 );
13519
13520 END_SUB_GROUP(list, list_info, parent_group);
13521 END_GROUP(list, list_info, parent_group);
13522 break;
13523 case SETTINGS_LIST_ONSCREEN_NOTIFICATIONS:
13524 START_GROUP(list, list_info, &group_info,
13525 msg_hash_to_str(MENU_ENUM_LABEL_VALUE_ONSCREEN_DISPLAY_SETTINGS),
13526 parent_group);
13527
13528 parent_group = msg_hash_to_str(MENU_ENUM_LABEL_ONSCREEN_DISPLAY_SETTINGS);
13529
13530 START_SUB_GROUP(list, list_info, "Notifications",
13531 &group_info,
13532 &subgroup_info,
13533 parent_group);
13534
13535 #ifdef HAVE_GFX_WIDGETS
13536 CONFIG_BOOL(
13537 list, list_info,
13538 &settings->bools.menu_enable_widgets,
13539 MENU_ENUM_LABEL_MENU_WIDGETS_ENABLE,
13540 MENU_ENUM_LABEL_VALUE_MENU_WIDGETS_ENABLE,
13541 DEFAULT_MENU_ENABLE_WIDGETS,
13542 MENU_ENUM_LABEL_VALUE_OFF,
13543 MENU_ENUM_LABEL_VALUE_ON,
13544 &group_info,
13545 &subgroup_info,
13546 parent_group,
13547 general_write_handler,
13548 general_read_handler,
13549 SD_FLAG_NONE);
13550 (*list)[list_info->index - 1].action_ok = &setting_bool_action_left_with_refresh;
13551 (*list)[list_info->index - 1].action_left = &setting_bool_action_left_with_refresh;
13552 (*list)[list_info->index - 1].action_right = &setting_bool_action_right_with_refresh;
13553 MENU_SETTINGS_LIST_CURRENT_ADD_CMD(list, list_info, CMD_EVENT_REINIT);
13554
13555 CONFIG_BOOL(
13556 list, list_info,
13557 &settings->bools.menu_widget_scale_auto,
13558 MENU_ENUM_LABEL_MENU_WIDGET_SCALE_AUTO,
13559 MENU_ENUM_LABEL_VALUE_MENU_WIDGET_SCALE_AUTO,
13560 DEFAULT_MENU_WIDGET_SCALE_AUTO,
13561 MENU_ENUM_LABEL_VALUE_OFF,
13562 MENU_ENUM_LABEL_VALUE_ON,
13563 &group_info,
13564 &subgroup_info,
13565 parent_group,
13566 general_write_handler,
13567 general_read_handler,
13568 SD_FLAG_NONE
13569 );
13570 (*list)[list_info->index - 1].action_ok = &setting_bool_action_left_with_refresh;
13571 (*list)[list_info->index - 1].action_left = &setting_bool_action_left_with_refresh;
13572 (*list)[list_info->index - 1].action_right = &setting_bool_action_right_with_refresh;
13573
13574 #if (defined(RARCH_CONSOLE) || defined(RARCH_MOBILE))
13575 CONFIG_FLOAT(
13576 list, list_info,
13577 &settings->floats.menu_widget_scale_factor,
13578 MENU_ENUM_LABEL_MENU_WIDGET_SCALE_FACTOR,
13579 MENU_ENUM_LABEL_VALUE_MENU_WIDGET_SCALE_FACTOR,
13580 DEFAULT_MENU_WIDGET_SCALE_FACTOR,
13581 "%.2fx",
13582 &group_info,
13583 &subgroup_info,
13584 parent_group,
13585 general_write_handler,
13586 general_read_handler);
13587 #else
13588 CONFIG_FLOAT(
13589 list, list_info,
13590 &settings->floats.menu_widget_scale_factor,
13591 MENU_ENUM_LABEL_MENU_WIDGET_SCALE_FACTOR,
13592 MENU_ENUM_LABEL_VALUE_MENU_WIDGET_SCALE_FACTOR_FULLSCREEN,
13593 DEFAULT_MENU_WIDGET_SCALE_FACTOR,
13594 "%.2fx",
13595 &group_info,
13596 &subgroup_info,
13597 parent_group,
13598 general_write_handler,
13599 general_read_handler);
13600 #endif
13601 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
13602 menu_settings_list_current_add_range(list, list_info, 0.2, 5.0, 0.01, true, true);
13603
13604 #if !(defined(RARCH_CONSOLE) || defined(RARCH_MOBILE))
13605 CONFIG_FLOAT(
13606 list, list_info,
13607 &settings->floats.menu_widget_scale_factor_windowed,
13608 MENU_ENUM_LABEL_MENU_WIDGET_SCALE_FACTOR_WINDOWED,
13609 MENU_ENUM_LABEL_VALUE_MENU_WIDGET_SCALE_FACTOR_WINDOWED,
13610 DEFAULT_MENU_WIDGET_SCALE_FACTOR_WINDOWED,
13611 "%.2fx",
13612 &group_info,
13613 &subgroup_info,
13614 parent_group,
13615 general_write_handler,
13616 general_read_handler);
13617 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
13618 menu_settings_list_current_add_range(list, list_info, 0.2, 5.0, 0.01, true, true);
13619 #endif
13620 #endif
13621 CONFIG_BOOL(
13622 list, list_info,
13623 &settings->bools.video_font_enable,
13624 MENU_ENUM_LABEL_VIDEO_FONT_ENABLE,
13625 MENU_ENUM_LABEL_VALUE_VIDEO_FONT_ENABLE,
13626 DEFAULT_FONT_ENABLE,
13627 MENU_ENUM_LABEL_VALUE_OFF,
13628 MENU_ENUM_LABEL_VALUE_ON,
13629 &group_info,
13630 &subgroup_info,
13631 parent_group,
13632 general_write_handler,
13633 general_read_handler,
13634 SD_FLAG_NONE
13635 );
13636 (*list)[list_info->index - 1].action_ok = &setting_bool_action_left_with_refresh;
13637 (*list)[list_info->index - 1].action_left = &setting_bool_action_left_with_refresh;
13638 (*list)[list_info->index - 1].action_right = &setting_bool_action_right_with_refresh;
13639 MENU_SETTINGS_LIST_CURRENT_ADD_CMD(list, list_info, CMD_EVENT_REINIT);
13640
13641 CONFIG_PATH(
13642 list, list_info,
13643 settings->paths.path_font,
13644 sizeof(settings->paths.path_font),
13645 MENU_ENUM_LABEL_VIDEO_FONT_PATH,
13646 MENU_ENUM_LABEL_VALUE_VIDEO_FONT_PATH,
13647 "",
13648 &group_info,
13649 &subgroup_info,
13650 parent_group,
13651 general_write_handler,
13652 general_read_handler);
13653 MENU_SETTINGS_LIST_CURRENT_ADD_VALUES(list, list_info, "ttf");
13654 MENU_SETTINGS_LIST_CURRENT_ADD_CMD(list, list_info, CMD_EVENT_REINIT);
13655 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_FONT_SELECTOR;
13656
13657 CONFIG_FLOAT(
13658 list, list_info,
13659 &settings->floats.video_font_size,
13660 MENU_ENUM_LABEL_VIDEO_FONT_SIZE,
13661 MENU_ENUM_LABEL_VALUE_VIDEO_FONT_SIZE,
13662 DEFAULT_FONT_SIZE,
13663 "%.1f",
13664 &group_info,
13665 &subgroup_info,
13666 parent_group,
13667 general_write_handler,
13668 general_read_handler);
13669 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
13670 menu_settings_list_current_add_range(list, list_info, 1.00, 100.00, 1.0, true, true);
13671 MENU_SETTINGS_LIST_CURRENT_ADD_CMD(list, list_info, CMD_EVENT_REINIT);
13672
13673 CONFIG_FLOAT(
13674 list, list_info,
13675 &settings->floats.video_msg_pos_x,
13676 MENU_ENUM_LABEL_VIDEO_MESSAGE_POS_X,
13677 MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_POS_X,
13678 message_pos_offset_x,
13679 "%.3f",
13680 &group_info,
13681 &subgroup_info,
13682 parent_group,
13683 general_write_handler,
13684 general_read_handler);
13685 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
13686 menu_settings_list_current_add_range(list, list_info, 0, 1, 0.01, true, true);
13687
13688 CONFIG_FLOAT(
13689 list, list_info,
13690 &settings->floats.video_msg_pos_y,
13691 MENU_ENUM_LABEL_VIDEO_MESSAGE_POS_Y,
13692 MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_POS_Y,
13693 message_pos_offset_y,
13694 "%.3f",
13695 &group_info,
13696 &subgroup_info,
13697 parent_group,
13698 general_write_handler,
13699 general_read_handler);
13700 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
13701 menu_settings_list_current_add_range(list, list_info, 0, 1, 0.01, true, true);
13702
13703 CONFIG_FLOAT(
13704 list, list_info,
13705 &settings->floats.video_msg_color_r,
13706 MENU_ENUM_LABEL_VIDEO_MESSAGE_COLOR_RED,
13707 MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_COLOR_RED,
13708 ((message_color >> 16) & 0xff) / 255.0f,
13709 "%.3f",
13710 &group_info,
13711 &subgroup_info,
13712 parent_group,
13713 general_write_handler,
13714 general_read_handler);
13715 #if 0
13716 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
13717 #endif
13718 (*list)[list_info->index - 1].get_string_representation =
13719 &setting_get_string_representation_float_video_msg_color;
13720 menu_settings_list_current_add_range(list, list_info, 0, 1, 1.0f/255.0f, true, true);
13721
13722 CONFIG_FLOAT(
13723 list, list_info,
13724 &settings->floats.video_msg_color_g,
13725 MENU_ENUM_LABEL_VIDEO_MESSAGE_COLOR_GREEN,
13726 MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_COLOR_GREEN,
13727 ((message_color >> 8) & 0xff) / 255.0f,
13728 "%.3f",
13729 &group_info,
13730 &subgroup_info,
13731 parent_group,
13732 general_write_handler,
13733 general_read_handler);
13734 (*list)[list_info->index - 1].get_string_representation =
13735 &setting_get_string_representation_float_video_msg_color;
13736 menu_settings_list_current_add_range(list, list_info, 0, 1, 1.0f/255.0f, true, true);
13737
13738 CONFIG_FLOAT(
13739 list, list_info,
13740 &settings->floats.video_msg_color_b,
13741 MENU_ENUM_LABEL_VIDEO_MESSAGE_COLOR_BLUE,
13742 MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_COLOR_BLUE,
13743 ((message_color >> 0) & 0xff) / 255.0f,
13744 "%.3f",
13745 &group_info,
13746 &subgroup_info,
13747 parent_group,
13748 general_write_handler,
13749 general_read_handler);
13750 (*list)[list_info->index - 1].get_string_representation =
13751 &setting_get_string_representation_float_video_msg_color;
13752 menu_settings_list_current_add_range(list, list_info, 0, 1, 1.0f/255.0f, true, true);
13753
13754 CONFIG_BOOL(
13755 list, list_info,
13756 &settings->bools.video_msg_bgcolor_enable,
13757 MENU_ENUM_LABEL_VIDEO_MESSAGE_BGCOLOR_ENABLE,
13758 MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_BGCOLOR_ENABLE,
13759 message_bgcolor_enable,
13760 MENU_ENUM_LABEL_VALUE_OFF,
13761 MENU_ENUM_LABEL_VALUE_ON,
13762 &group_info,
13763 &subgroup_info,
13764 parent_group,
13765 general_write_handler,
13766 general_read_handler,
13767 SD_FLAG_NONE
13768 );
13769 (*list)[list_info->index - 1].action_ok = &setting_bool_action_left_with_refresh;
13770 (*list)[list_info->index - 1].action_left = &setting_bool_action_left_with_refresh;
13771 (*list)[list_info->index - 1].action_right = &setting_bool_action_right_with_refresh;
13772
13773 CONFIG_UINT(
13774 list, list_info,
13775 &settings->uints.video_msg_bgcolor_red,
13776 MENU_ENUM_LABEL_VIDEO_MESSAGE_BGCOLOR_RED,
13777 MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_BGCOLOR_RED,
13778 message_bgcolor_red,
13779 &group_info,
13780 &subgroup_info,
13781 parent_group,
13782 general_write_handler,
13783 general_read_handler);
13784 menu_settings_list_current_add_range(list, list_info, 0, 255, 1, true, true);
13785
13786 CONFIG_UINT(
13787 list, list_info,
13788 &settings->uints.video_msg_bgcolor_green,
13789 MENU_ENUM_LABEL_VIDEO_MESSAGE_BGCOLOR_GREEN,
13790 MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_BGCOLOR_GREEN,
13791 message_bgcolor_green,
13792 &group_info,
13793 &subgroup_info,
13794 parent_group,
13795 general_write_handler,
13796 general_read_handler);
13797 menu_settings_list_current_add_range(list, list_info, 0, 255, 1, true, true);
13798
13799 CONFIG_UINT(
13800 list, list_info,
13801 &settings->uints.video_msg_bgcolor_blue,
13802 MENU_ENUM_LABEL_VIDEO_MESSAGE_BGCOLOR_BLUE,
13803 MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_BGCOLOR_BLUE,
13804 message_bgcolor_blue,
13805 &group_info,
13806 &subgroup_info,
13807 parent_group,
13808 general_write_handler,
13809 general_read_handler);
13810 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
13811 menu_settings_list_current_add_range(list, list_info, 0, 255, 1, true, true);
13812
13813 CONFIG_FLOAT(
13814 list, list_info,
13815 &settings->floats.video_msg_bgcolor_opacity,
13816 MENU_ENUM_LABEL_VIDEO_MESSAGE_BGCOLOR_OPACITY,
13817 MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_BGCOLOR_OPACITY,
13818 message_bgcolor_opacity,
13819 "%.2f",
13820 &group_info,
13821 &subgroup_info,
13822 parent_group,
13823 general_write_handler,
13824 general_read_handler);
13825 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
13826 menu_settings_list_current_add_range(list, list_info, 0, 1, 0.01, true, true);
13827
13828 END_SUB_GROUP(list, list_info, parent_group);
13829 START_SUB_GROUP(list, list_info, "Notification Views", &group_info, &subgroup_info, parent_group);
13830
13831 CONFIG_BOOL(
13832 list, list_info,
13833 &settings->bools.video_fps_show,
13834 MENU_ENUM_LABEL_FPS_SHOW,
13835 MENU_ENUM_LABEL_VALUE_FPS_SHOW,
13836 DEFAULT_FPS_SHOW,
13837 MENU_ENUM_LABEL_VALUE_OFF,
13838 MENU_ENUM_LABEL_VALUE_ON,
13839 &group_info,
13840 &subgroup_info,
13841 parent_group,
13842 general_write_handler,
13843 general_read_handler,
13844 SD_FLAG_NONE);
13845 (*list)[list_info->index - 1].action_ok = &setting_bool_action_left_with_refresh;
13846 (*list)[list_info->index - 1].action_left = &setting_bool_action_left_with_refresh;
13847 (*list)[list_info->index - 1].action_right = &setting_bool_action_right_with_refresh;
13848
13849 CONFIG_UINT(
13850 list, list_info,
13851 &settings->uints.fps_update_interval,
13852 MENU_ENUM_LABEL_FPS_UPDATE_INTERVAL,
13853 MENU_ENUM_LABEL_VALUE_FPS_UPDATE_INTERVAL,
13854 DEFAULT_FPS_UPDATE_INTERVAL,
13855 &group_info,
13856 &subgroup_info,
13857 parent_group,
13858 general_write_handler,
13859 general_read_handler);
13860 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint_special;
13861 menu_settings_list_current_add_range(list, list_info, 1, 512, 1, true, true);
13862
13863 CONFIG_BOOL(
13864 list, list_info,
13865 &settings->bools.video_memory_show,
13866 MENU_ENUM_LABEL_MEMORY_SHOW,
13867 MENU_ENUM_LABEL_VALUE_MEMORY_SHOW,
13868 DEFAULT_MEMORY_SHOW,
13869 MENU_ENUM_LABEL_VALUE_OFF,
13870 MENU_ENUM_LABEL_VALUE_ON,
13871 &group_info,
13872 &subgroup_info,
13873 parent_group,
13874 general_write_handler,
13875 general_read_handler,
13876 SD_FLAG_NONE);
13877 (*list)[list_info->index - 1].action_ok = &setting_bool_action_left_with_refresh;
13878 (*list)[list_info->index - 1].action_left = &setting_bool_action_left_with_refresh;
13879 (*list)[list_info->index - 1].action_right = &setting_bool_action_right_with_refresh;
13880
13881 CONFIG_UINT(
13882 list, list_info,
13883 &settings->uints.memory_update_interval,
13884 MENU_ENUM_LABEL_MEMORY_UPDATE_INTERVAL,
13885 MENU_ENUM_LABEL_VALUE_MEMORY_UPDATE_INTERVAL,
13886 DEFAULT_MEMORY_UPDATE_INTERVAL,
13887 &group_info,
13888 &subgroup_info,
13889 parent_group,
13890 general_write_handler,
13891 general_read_handler);
13892 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint_special;
13893 menu_settings_list_current_add_range(list, list_info, 1, 512, 1, true, true);
13894
13895 CONFIG_BOOL(
13896 list, list_info,
13897 &settings->bools.video_statistics_show,
13898 MENU_ENUM_LABEL_STATISTICS_SHOW,
13899 MENU_ENUM_LABEL_VALUE_STATISTICS_SHOW,
13900 DEFAULT_STATISTICS_SHOW,
13901 MENU_ENUM_LABEL_VALUE_OFF,
13902 MENU_ENUM_LABEL_VALUE_ON,
13903 &group_info,
13904 &subgroup_info,
13905 parent_group,
13906 general_write_handler,
13907 general_read_handler,
13908 SD_FLAG_NONE);
13909
13910 CONFIG_BOOL(
13911 list, list_info,
13912 &settings->bools.video_framecount_show,
13913 MENU_ENUM_LABEL_FRAMECOUNT_SHOW,
13914 MENU_ENUM_LABEL_VALUE_FRAMECOUNT_SHOW,
13915 DEFAULT_FRAMECOUNT_SHOW,
13916 MENU_ENUM_LABEL_VALUE_OFF,
13917 MENU_ENUM_LABEL_VALUE_ON,
13918 &group_info,
13919 &subgroup_info,
13920 parent_group,
13921 general_write_handler,
13922 general_read_handler,
13923 SD_FLAG_NONE);
13924
13925 #ifdef HAVE_GFX_WIDGETS
13926 CONFIG_BOOL(
13927 list, list_info,
13928 &settings->bools.menu_show_load_content_animation,
13929 MENU_ENUM_LABEL_MENU_SHOW_LOAD_CONTENT_ANIMATION,
13930 MENU_ENUM_LABEL_VALUE_MENU_SHOW_LOAD_CONTENT_ANIMATION,
13931 DEFAULT_MENU_SHOW_LOAD_CONTENT_ANIMATION,
13932 MENU_ENUM_LABEL_VALUE_OFF,
13933 MENU_ENUM_LABEL_VALUE_ON,
13934 &group_info,
13935 &subgroup_info,
13936 parent_group,
13937 general_write_handler,
13938 general_read_handler,
13939 SD_FLAG_NONE);
13940 #endif
13941 CONFIG_BOOL(
13942 list, list_info,
13943 &settings->bools.notification_show_autoconfig,
13944 MENU_ENUM_LABEL_NOTIFICATION_SHOW_AUTOCONFIG,
13945 MENU_ENUM_LABEL_VALUE_NOTIFICATION_SHOW_AUTOCONFIG,
13946 DEFAULT_NOTIFICATION_SHOW_AUTOCONFIG,
13947 MENU_ENUM_LABEL_VALUE_OFF,
13948 MENU_ENUM_LABEL_VALUE_ON,
13949 &group_info,
13950 &subgroup_info,
13951 parent_group,
13952 general_write_handler,
13953 general_read_handler,
13954 SD_FLAG_NONE);
13955
13956 #ifdef HAVE_CHEATS
13957 CONFIG_BOOL(
13958 list, list_info,
13959 &settings->bools.notification_show_cheats_applied,
13960 MENU_ENUM_LABEL_NOTIFICATION_SHOW_CHEATS_APPLIED,
13961 MENU_ENUM_LABEL_VALUE_NOTIFICATION_SHOW_CHEATS_APPLIED,
13962 DEFAULT_NOTIFICATION_SHOW_CHEATS_APPLIED,
13963 MENU_ENUM_LABEL_VALUE_OFF,
13964 MENU_ENUM_LABEL_VALUE_ON,
13965 &group_info,
13966 &subgroup_info,
13967 parent_group,
13968 general_write_handler,
13969 general_read_handler,
13970 SD_FLAG_NONE);
13971 #endif
13972 #ifdef HAVE_PATCH
13973 CONFIG_BOOL(
13974 list, list_info,
13975 &settings->bools.notification_show_patch_applied,
13976 MENU_ENUM_LABEL_NOTIFICATION_SHOW_PATCH_APPLIED,
13977 MENU_ENUM_LABEL_VALUE_NOTIFICATION_SHOW_PATCH_APPLIED,
13978 DEFAULT_NOTIFICATION_SHOW_PATCH_APPLIED,
13979 MENU_ENUM_LABEL_VALUE_OFF,
13980 MENU_ENUM_LABEL_VALUE_ON,
13981 &group_info,
13982 &subgroup_info,
13983 parent_group,
13984 general_write_handler,
13985 general_read_handler,
13986 SD_FLAG_NONE);
13987 #endif
13988 CONFIG_BOOL(
13989 list, list_info,
13990 &settings->bools.notification_show_remap_load,
13991 MENU_ENUM_LABEL_NOTIFICATION_SHOW_REMAP_LOAD,
13992 MENU_ENUM_LABEL_VALUE_NOTIFICATION_SHOW_REMAP_LOAD,
13993 DEFAULT_NOTIFICATION_SHOW_REMAP_LOAD,
13994 MENU_ENUM_LABEL_VALUE_OFF,
13995 MENU_ENUM_LABEL_VALUE_ON,
13996 &group_info,
13997 &subgroup_info,
13998 parent_group,
13999 general_write_handler,
14000 general_read_handler,
14001 SD_FLAG_NONE);
14002
14003 CONFIG_BOOL(
14004 list, list_info,
14005 &settings->bools.notification_show_config_override_load,
14006 MENU_ENUM_LABEL_NOTIFICATION_SHOW_CONFIG_OVERRIDE_LOAD,
14007 MENU_ENUM_LABEL_VALUE_NOTIFICATION_SHOW_CONFIG_OVERRIDE_LOAD,
14008 DEFAULT_NOTIFICATION_SHOW_CONFIG_OVERRIDE_LOAD,
14009 MENU_ENUM_LABEL_VALUE_OFF,
14010 MENU_ENUM_LABEL_VALUE_ON,
14011 &group_info,
14012 &subgroup_info,
14013 parent_group,
14014 general_write_handler,
14015 general_read_handler,
14016 SD_FLAG_NONE);
14017
14018 CONFIG_BOOL(
14019 list, list_info,
14020 &settings->bools.notification_show_set_initial_disk,
14021 MENU_ENUM_LABEL_NOTIFICATION_SHOW_SET_INITIAL_DISK,
14022 MENU_ENUM_LABEL_VALUE_NOTIFICATION_SHOW_SET_INITIAL_DISK,
14023 DEFAULT_NOTIFICATION_SHOW_SET_INITIAL_DISK,
14024 MENU_ENUM_LABEL_VALUE_OFF,
14025 MENU_ENUM_LABEL_VALUE_ON,
14026 &group_info,
14027 &subgroup_info,
14028 parent_group,
14029 general_write_handler,
14030 general_read_handler,
14031 SD_FLAG_NONE);
14032
14033 CONFIG_BOOL(
14034 list, list_info,
14035 &settings->bools.notification_show_fast_forward,
14036 MENU_ENUM_LABEL_NOTIFICATION_SHOW_FAST_FORWARD,
14037 MENU_ENUM_LABEL_VALUE_NOTIFICATION_SHOW_FAST_FORWARD,
14038 DEFAULT_NOTIFICATION_SHOW_FAST_FORWARD,
14039 MENU_ENUM_LABEL_VALUE_OFF,
14040 MENU_ENUM_LABEL_VALUE_ON,
14041 &group_info,
14042 &subgroup_info,
14043 parent_group,
14044 general_write_handler,
14045 general_read_handler,
14046 SD_FLAG_NONE);
14047
14048 #ifdef HAVE_SCREENSHOTS
14049 CONFIG_BOOL(
14050 list, list_info,
14051 &settings->bools.notification_show_screenshot,
14052 MENU_ENUM_LABEL_NOTIFICATION_SHOW_SCREENSHOT,
14053 MENU_ENUM_LABEL_VALUE_NOTIFICATION_SHOW_SCREENSHOT,
14054 DEFAULT_NOTIFICATION_SHOW_SCREENSHOT,
14055 MENU_ENUM_LABEL_VALUE_OFF,
14056 MENU_ENUM_LABEL_VALUE_ON,
14057 &group_info,
14058 &subgroup_info,
14059 parent_group,
14060 general_write_handler,
14061 general_read_handler,
14062 SD_FLAG_NONE);
14063 (*list)[list_info->index - 1].action_ok = &setting_bool_action_left_with_refresh;
14064 (*list)[list_info->index - 1].action_left = &setting_bool_action_left_with_refresh;
14065 (*list)[list_info->index - 1].action_right = &setting_bool_action_right_with_refresh;
14066
14067 #ifdef HAVE_GFX_WIDGETS
14068 CONFIG_UINT(
14069 list, list_info,
14070 &settings->uints.notification_show_screenshot_duration,
14071 MENU_ENUM_LABEL_NOTIFICATION_SHOW_SCREENSHOT_DURATION,
14072 MENU_ENUM_LABEL_VALUE_NOTIFICATION_SHOW_SCREENSHOT_DURATION,
14073 DEFAULT_NOTIFICATION_SHOW_SCREENSHOT_DURATION,
14074 &group_info,
14075 &subgroup_info,
14076 parent_group,
14077 general_write_handler,
14078 general_read_handler);
14079 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
14080 (*list)[list_info->index - 1].get_string_representation =
14081 &setting_get_string_representation_uint_notification_show_screenshot_duration;
14082 menu_settings_list_current_add_range(list, list_info, 0, NOTIFICATION_SHOW_SCREENSHOT_DURATION_LAST-1, 1, true, true);
14083 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_COMBOBOX;
14084
14085 CONFIG_UINT(
14086 list, list_info,
14087 &settings->uints.notification_show_screenshot_flash,
14088 MENU_ENUM_LABEL_NOTIFICATION_SHOW_SCREENSHOT_FLASH,
14089 MENU_ENUM_LABEL_VALUE_NOTIFICATION_SHOW_SCREENSHOT_FLASH,
14090 DEFAULT_NOTIFICATION_SHOW_SCREENSHOT_FLASH,
14091 &group_info,
14092 &subgroup_info,
14093 parent_group,
14094 general_write_handler,
14095 general_read_handler);
14096 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
14097 (*list)[list_info->index - 1].get_string_representation =
14098 &setting_get_string_representation_uint_notification_show_screenshot_flash;
14099 menu_settings_list_current_add_range(list, list_info, 0, NOTIFICATION_SHOW_SCREENSHOT_FLASH_LAST-1, 1, true, true);
14100 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_COMBOBOX;
14101 #endif
14102 #endif
14103
14104 CONFIG_BOOL(
14105 list, list_info,
14106 &settings->bools.notification_show_refresh_rate,
14107 MENU_ENUM_LABEL_NOTIFICATION_SHOW_REFRESH_RATE,
14108 MENU_ENUM_LABEL_VALUE_NOTIFICATION_SHOW_REFRESH_RATE,
14109 DEFAULT_NOTIFICATION_SHOW_REFRESH_RATE,
14110 MENU_ENUM_LABEL_VALUE_OFF,
14111 MENU_ENUM_LABEL_VALUE_ON,
14112 &group_info,
14113 &subgroup_info,
14114 parent_group,
14115 general_write_handler,
14116 general_read_handler,
14117 SD_FLAG_NONE);
14118
14119 END_SUB_GROUP(list, list_info, parent_group);
14120 END_GROUP(list, list_info, parent_group);
14121 break;
14122 case SETTINGS_LIST_OVERLAY:
14123 #ifdef HAVE_OVERLAY
14124 START_GROUP(list, list_info, &group_info,
14125 msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OVERLAY_SETTINGS),
14126 parent_group);
14127
14128 parent_group = msg_hash_to_str(MENU_ENUM_LABEL_OVERLAY_SETTINGS);
14129
14130 START_SUB_GROUP(list, list_info, "State", &group_info, &subgroup_info, parent_group);
14131
14132 CONFIG_BOOL(
14133 list, list_info,
14134 &settings->bools.input_overlay_enable,
14135 MENU_ENUM_LABEL_INPUT_OVERLAY_ENABLE,
14136 MENU_ENUM_LABEL_VALUE_INPUT_OVERLAY_ENABLE,
14137 config_overlay_enable_default(),
14138 MENU_ENUM_LABEL_VALUE_OFF,
14139 MENU_ENUM_LABEL_VALUE_ON,
14140 &group_info,
14141 &subgroup_info,
14142 parent_group,
14143 general_write_handler,
14144 general_read_handler,
14145 SD_FLAG_NONE
14146 );
14147 (*list)[list_info->index - 1].action_ok = &setting_bool_action_left_with_refresh;
14148 (*list)[list_info->index - 1].action_left = &setting_bool_action_left_with_refresh;
14149 (*list)[list_info->index - 1].action_right = &setting_bool_action_right_with_refresh;
14150 (*list)[list_info->index - 1].change_handler = overlay_enable_toggle_change_handler;
14151
14152 CONFIG_BOOL(
14153 list, list_info,
14154 &settings->bools.input_overlay_enable_autopreferred,
14155 MENU_ENUM_LABEL_OVERLAY_AUTOLOAD_PREFERRED,
14156 MENU_ENUM_LABEL_VALUE_OVERLAY_AUTOLOAD_PREFERRED,
14157 DEFAULT_OVERLAY_ENABLE_AUTOPREFERRED,
14158 MENU_ENUM_LABEL_VALUE_OFF,
14159 MENU_ENUM_LABEL_VALUE_ON,
14160 &group_info,
14161 &subgroup_info,
14162 parent_group,
14163 general_write_handler,
14164 general_read_handler,
14165 SD_FLAG_NONE
14166 );
14167 (*list)[list_info->index - 1].change_handler = overlay_enable_toggle_change_handler;
14168
14169 CONFIG_BOOL(
14170 list, list_info,
14171 &settings->bools.input_overlay_hide_in_menu,
14172 MENU_ENUM_LABEL_INPUT_OVERLAY_HIDE_IN_MENU,
14173 MENU_ENUM_LABEL_VALUE_INPUT_OVERLAY_HIDE_IN_MENU,
14174 DEFAULT_OVERLAY_HIDE_IN_MENU,
14175 MENU_ENUM_LABEL_VALUE_OFF,
14176 MENU_ENUM_LABEL_VALUE_ON,
14177 &group_info,
14178 &subgroup_info,
14179 parent_group,
14180 general_write_handler,
14181 general_read_handler,
14182 SD_FLAG_NONE
14183 );
14184 (*list)[list_info->index - 1].change_handler = overlay_enable_toggle_change_handler;
14185
14186 CONFIG_BOOL(
14187 list, list_info,
14188 &settings->bools.input_overlay_hide_when_gamepad_connected,
14189 MENU_ENUM_LABEL_INPUT_OVERLAY_HIDE_WHEN_GAMEPAD_CONNECTED,
14190 MENU_ENUM_LABEL_VALUE_INPUT_OVERLAY_HIDE_WHEN_GAMEPAD_CONNECTED,
14191 DEFAULT_OVERLAY_HIDE_WHEN_GAMEPAD_CONNECTED,
14192 MENU_ENUM_LABEL_VALUE_OFF,
14193 MENU_ENUM_LABEL_VALUE_ON,
14194 &group_info,
14195 &subgroup_info,
14196 parent_group,
14197 general_write_handler,
14198 general_read_handler,
14199 SD_FLAG_NONE
14200 );
14201 (*list)[list_info->index - 1].change_handler = overlay_enable_toggle_change_handler;
14202
14203 CONFIG_UINT(
14204 list, list_info,
14205 &settings->uints.input_overlay_show_inputs,
14206 MENU_ENUM_LABEL_INPUT_OVERLAY_SHOW_INPUTS,
14207 MENU_ENUM_LABEL_VALUE_INPUT_OVERLAY_SHOW_INPUTS,
14208 DEFAULT_OVERLAY_SHOW_INPUTS,
14209 &group_info,
14210 &subgroup_info,
14211 parent_group,
14212 general_write_handler,
14213 general_read_handler
14214 );
14215 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_COMBOBOX;
14216 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
14217 (*list)[list_info->index - 1].action_left = &setting_uint_action_left_with_refresh;
14218 (*list)[list_info->index - 1].action_right = &setting_uint_action_right_with_refresh;
14219 (*list)[list_info->index - 1].get_string_representation =
14220 &setting_get_string_representation_uint_input_overlay_show_inputs;
14221 menu_settings_list_current_add_range(list, list_info, 0, OVERLAY_SHOW_INPUT_LAST-1, 1, true, true);
14222
14223 CONFIG_UINT(
14224 list, list_info,
14225 &settings->uints.input_overlay_show_inputs_port,
14226 MENU_ENUM_LABEL_INPUT_OVERLAY_SHOW_INPUTS_PORT,
14227 MENU_ENUM_LABEL_VALUE_INPUT_OVERLAY_SHOW_INPUTS_PORT,
14228 DEFAULT_OVERLAY_SHOW_INPUTS_PORT,
14229 &group_info,
14230 &subgroup_info,
14231 parent_group,
14232 general_write_handler,
14233 general_read_handler
14234 );
14235 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
14236 (*list)[list_info->index - 1].get_string_representation =
14237 &setting_get_string_representation_uint_input_overlay_show_inputs_port;
14238 menu_settings_list_current_add_range(list, list_info, 0, MAX_USERS - 1, 1, true, true);
14239
14240 CONFIG_BOOL(
14241 list, list_info,
14242 &settings->bools.input_overlay_show_mouse_cursor,
14243 MENU_ENUM_LABEL_INPUT_OVERLAY_SHOW_MOUSE_CURSOR,
14244 MENU_ENUM_LABEL_VALUE_INPUT_OVERLAY_SHOW_MOUSE_CURSOR,
14245 DEFAULT_OVERLAY_SHOW_MOUSE_CURSOR,
14246 MENU_ENUM_LABEL_VALUE_OFF,
14247 MENU_ENUM_LABEL_VALUE_ON,
14248 &group_info,
14249 &subgroup_info,
14250 parent_group,
14251 general_write_handler,
14252 general_read_handler,
14253 SD_FLAG_NONE
14254 );
14255
14256 CONFIG_BOOL(
14257 list, list_info,
14258 &settings->bools.input_overlay_auto_rotate,
14259 MENU_ENUM_LABEL_INPUT_OVERLAY_AUTO_ROTATE,
14260 MENU_ENUM_LABEL_VALUE_INPUT_OVERLAY_AUTO_ROTATE,
14261 DEFAULT_OVERLAY_AUTO_ROTATE,
14262 MENU_ENUM_LABEL_VALUE_OFF,
14263 MENU_ENUM_LABEL_VALUE_ON,
14264 &group_info,
14265 &subgroup_info,
14266 parent_group,
14267 general_write_handler,
14268 general_read_handler,
14269 SD_FLAG_NONE
14270 );
14271 (*list)[list_info->index - 1].change_handler = overlay_auto_rotate_toggle_change_handler;
14272
14273 CONFIG_BOOL(
14274 list, list_info,
14275 &settings->bools.input_overlay_auto_scale,
14276 MENU_ENUM_LABEL_INPUT_OVERLAY_AUTO_SCALE,
14277 MENU_ENUM_LABEL_VALUE_INPUT_OVERLAY_AUTO_SCALE,
14278 DEFAULT_INPUT_OVERLAY_AUTO_SCALE,
14279 MENU_ENUM_LABEL_VALUE_OFF,
14280 MENU_ENUM_LABEL_VALUE_ON,
14281 &group_info,
14282 &subgroup_info,
14283 parent_group,
14284 general_write_handler,
14285 general_read_handler,
14286 SD_FLAG_NONE
14287 );
14288 (*list)[list_info->index - 1].action_ok = &setting_bool_action_left_with_refresh;
14289 (*list)[list_info->index - 1].action_left = &setting_bool_action_left_with_refresh;
14290 (*list)[list_info->index - 1].action_right = &setting_bool_action_right_with_refresh;
14291 MENU_SETTINGS_LIST_CURRENT_ADD_CMD(list, list_info, CMD_EVENT_OVERLAY_SET_SCALE_FACTOR);
14292 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_CMD_APPLY_AUTO);
14293
14294 CONFIG_PATH(
14295 list, list_info,
14296 settings->paths.path_overlay,
14297 sizeof(settings->paths.path_overlay),
14298 MENU_ENUM_LABEL_OVERLAY_PRESET,
14299 MENU_ENUM_LABEL_VALUE_OVERLAY_PRESET,
14300 settings->paths.directory_overlay,
14301 &group_info,
14302 &subgroup_info,
14303 parent_group,
14304 general_write_handler,
14305 general_read_handler);
14306 MENU_SETTINGS_LIST_CURRENT_ADD_VALUES(list, list_info, "cfg");
14307 MENU_SETTINGS_LIST_CURRENT_ADD_CMD(list, list_info, CMD_EVENT_OVERLAY_INIT);
14308
14309 CONFIG_FLOAT(
14310 list, list_info,
14311 &settings->floats.input_overlay_opacity,
14312 MENU_ENUM_LABEL_OVERLAY_OPACITY,
14313 MENU_ENUM_LABEL_VALUE_OVERLAY_OPACITY,
14314 DEFAULT_INPUT_OVERLAY_OPACITY,
14315 "%.2f",
14316 &group_info,
14317 &subgroup_info,
14318 parent_group,
14319 general_write_handler,
14320 general_read_handler);
14321 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
14322 MENU_SETTINGS_LIST_CURRENT_ADD_CMD(list, list_info, CMD_EVENT_OVERLAY_SET_ALPHA_MOD);
14323 menu_settings_list_current_add_range(list, list_info, 0, 1, 0.01, true, true);
14324 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_CMD_APPLY_AUTO);
14325
14326 CONFIG_FLOAT(
14327 list, list_info,
14328 &settings->floats.input_overlay_scale_landscape,
14329 MENU_ENUM_LABEL_OVERLAY_SCALE_LANDSCAPE,
14330 MENU_ENUM_LABEL_VALUE_OVERLAY_SCALE_LANDSCAPE,
14331 DEFAULT_INPUT_OVERLAY_SCALE_LANDSCAPE,
14332 "%.3f",
14333 &group_info,
14334 &subgroup_info,
14335 parent_group,
14336 general_write_handler,
14337 general_read_handler);
14338 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
14339 MENU_SETTINGS_LIST_CURRENT_ADD_CMD(list, list_info, CMD_EVENT_OVERLAY_SET_SCALE_FACTOR);
14340 menu_settings_list_current_add_range(list, list_info, 0.0f, 2.0f, 0.005, true, true);
14341 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_CMD_APPLY_AUTO);
14342
14343 CONFIG_FLOAT(
14344 list, list_info,
14345 &settings->floats.input_overlay_aspect_adjust_landscape,
14346 MENU_ENUM_LABEL_OVERLAY_ASPECT_ADJUST_LANDSCAPE,
14347 MENU_ENUM_LABEL_VALUE_OVERLAY_ASPECT_ADJUST_LANDSCAPE,
14348 DEFAULT_INPUT_OVERLAY_ASPECT_ADJUST_LANDSCAPE,
14349 "%.3f",
14350 &group_info,
14351 &subgroup_info,
14352 parent_group,
14353 general_write_handler,
14354 general_read_handler);
14355 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
14356 MENU_SETTINGS_LIST_CURRENT_ADD_CMD(list, list_info, CMD_EVENT_OVERLAY_SET_SCALE_FACTOR);
14357 menu_settings_list_current_add_range(list, list_info, -2.0f, 2.0f, 0.005f, true, true);
14358 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_CMD_APPLY_AUTO);
14359
14360 CONFIG_FLOAT(
14361 list, list_info,
14362 &settings->floats.input_overlay_x_separation_landscape,
14363 MENU_ENUM_LABEL_OVERLAY_X_SEPARATION_LANDSCAPE,
14364 MENU_ENUM_LABEL_VALUE_OVERLAY_X_SEPARATION_LANDSCAPE,
14365 DEFAULT_INPUT_OVERLAY_X_SEPARATION_LANDSCAPE,
14366 "%.3f",
14367 &group_info,
14368 &subgroup_info,
14369 parent_group,
14370 general_write_handler,
14371 general_read_handler);
14372 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
14373 MENU_SETTINGS_LIST_CURRENT_ADD_CMD(list, list_info, CMD_EVENT_OVERLAY_SET_SCALE_FACTOR);
14374 menu_settings_list_current_add_range(list, list_info, -2.0f, 2.0f, 0.005f, true, true);
14375 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_CMD_APPLY_AUTO);
14376
14377 CONFIG_FLOAT(
14378 list, list_info,
14379 &settings->floats.input_overlay_y_separation_landscape,
14380 MENU_ENUM_LABEL_OVERLAY_Y_SEPARATION_LANDSCAPE,
14381 MENU_ENUM_LABEL_VALUE_OVERLAY_Y_SEPARATION_LANDSCAPE,
14382 DEFAULT_INPUT_OVERLAY_Y_SEPARATION_LANDSCAPE,
14383 "%.3f",
14384 &group_info,
14385 &subgroup_info,
14386 parent_group,
14387 general_write_handler,
14388 general_read_handler);
14389 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
14390 MENU_SETTINGS_LIST_CURRENT_ADD_CMD(list, list_info, CMD_EVENT_OVERLAY_SET_SCALE_FACTOR);
14391 menu_settings_list_current_add_range(list, list_info, -2.0f, 2.0f, 0.005f, true, true);
14392 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_CMD_APPLY_AUTO);
14393
14394 CONFIG_FLOAT(
14395 list, list_info,
14396 &settings->floats.input_overlay_x_offset_landscape,
14397 MENU_ENUM_LABEL_OVERLAY_X_OFFSET_LANDSCAPE,
14398 MENU_ENUM_LABEL_VALUE_OVERLAY_X_OFFSET_LANDSCAPE,
14399 DEFAULT_INPUT_OVERLAY_X_OFFSET_LANDSCAPE,
14400 "%.3f",
14401 &group_info,
14402 &subgroup_info,
14403 parent_group,
14404 general_write_handler,
14405 general_read_handler);
14406 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
14407 MENU_SETTINGS_LIST_CURRENT_ADD_CMD(list, list_info, CMD_EVENT_OVERLAY_SET_SCALE_FACTOR);
14408 menu_settings_list_current_add_range(list, list_info, -1.0f, 1.0f, 0.005f, true, true);
14409 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_CMD_APPLY_AUTO);
14410
14411 CONFIG_FLOAT(
14412 list, list_info,
14413 &settings->floats.input_overlay_y_offset_landscape,
14414 MENU_ENUM_LABEL_OVERLAY_Y_OFFSET_LANDSCAPE,
14415 MENU_ENUM_LABEL_VALUE_OVERLAY_Y_OFFSET_LANDSCAPE,
14416 DEFAULT_INPUT_OVERLAY_Y_OFFSET_LANDSCAPE,
14417 "%.3f",
14418 &group_info,
14419 &subgroup_info,
14420 parent_group,
14421 general_write_handler,
14422 general_read_handler);
14423 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
14424 MENU_SETTINGS_LIST_CURRENT_ADD_CMD(list, list_info, CMD_EVENT_OVERLAY_SET_SCALE_FACTOR);
14425 menu_settings_list_current_add_range(list, list_info, -1.0f, 1.0f, 0.005f, true, true);
14426 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_CMD_APPLY_AUTO);
14427
14428 CONFIG_FLOAT(
14429 list, list_info,
14430 &settings->floats.input_overlay_scale_portrait,
14431 MENU_ENUM_LABEL_OVERLAY_SCALE_PORTRAIT,
14432 MENU_ENUM_LABEL_VALUE_OVERLAY_SCALE_PORTRAIT,
14433 DEFAULT_INPUT_OVERLAY_SCALE_PORTRAIT,
14434 "%.3f",
14435 &group_info,
14436 &subgroup_info,
14437 parent_group,
14438 general_write_handler,
14439 general_read_handler);
14440 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
14441 MENU_SETTINGS_LIST_CURRENT_ADD_CMD(list, list_info, CMD_EVENT_OVERLAY_SET_SCALE_FACTOR);
14442 menu_settings_list_current_add_range(list, list_info, 0.0f, 2.0f, 0.005, true, true);
14443 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_CMD_APPLY_AUTO);
14444
14445 CONFIG_FLOAT(
14446 list, list_info,
14447 &settings->floats.input_overlay_aspect_adjust_portrait,
14448 MENU_ENUM_LABEL_OVERLAY_ASPECT_ADJUST_PORTRAIT,
14449 MENU_ENUM_LABEL_VALUE_OVERLAY_ASPECT_ADJUST_PORTRAIT,
14450 DEFAULT_INPUT_OVERLAY_ASPECT_ADJUST_PORTRAIT,
14451 "%.3f",
14452 &group_info,
14453 &subgroup_info,
14454 parent_group,
14455 general_write_handler,
14456 general_read_handler);
14457 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
14458 MENU_SETTINGS_LIST_CURRENT_ADD_CMD(list, list_info, CMD_EVENT_OVERLAY_SET_SCALE_FACTOR);
14459 menu_settings_list_current_add_range(list, list_info, -2.0f, 2.0f, 0.005f, true, true);
14460 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_CMD_APPLY_AUTO);
14461
14462 CONFIG_FLOAT(
14463 list, list_info,
14464 &settings->floats.input_overlay_x_separation_portrait,
14465 MENU_ENUM_LABEL_OVERLAY_X_SEPARATION_PORTRAIT,
14466 MENU_ENUM_LABEL_VALUE_OVERLAY_X_SEPARATION_PORTRAIT,
14467 DEFAULT_INPUT_OVERLAY_X_SEPARATION_PORTRAIT,
14468 "%.3f",
14469 &group_info,
14470 &subgroup_info,
14471 parent_group,
14472 general_write_handler,
14473 general_read_handler);
14474 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
14475 MENU_SETTINGS_LIST_CURRENT_ADD_CMD(list, list_info, CMD_EVENT_OVERLAY_SET_SCALE_FACTOR);
14476 menu_settings_list_current_add_range(list, list_info, -2.0f, 2.0f, 0.005f, true, true);
14477 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_CMD_APPLY_AUTO);
14478
14479 CONFIG_FLOAT(
14480 list, list_info,
14481 &settings->floats.input_overlay_y_separation_portrait,
14482 MENU_ENUM_LABEL_OVERLAY_Y_SEPARATION_PORTRAIT,
14483 MENU_ENUM_LABEL_VALUE_OVERLAY_Y_SEPARATION_PORTRAIT,
14484 DEFAULT_INPUT_OVERLAY_Y_SEPARATION_PORTRAIT,
14485 "%.3f",
14486 &group_info,
14487 &subgroup_info,
14488 parent_group,
14489 general_write_handler,
14490 general_read_handler);
14491 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
14492 MENU_SETTINGS_LIST_CURRENT_ADD_CMD(list, list_info, CMD_EVENT_OVERLAY_SET_SCALE_FACTOR);
14493 menu_settings_list_current_add_range(list, list_info, -2.0f, 2.0f, 0.005f, true, true);
14494 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_CMD_APPLY_AUTO);
14495
14496 CONFIG_FLOAT(
14497 list, list_info,
14498 &settings->floats.input_overlay_x_offset_portrait,
14499 MENU_ENUM_LABEL_OVERLAY_X_OFFSET_PORTRAIT,
14500 MENU_ENUM_LABEL_VALUE_OVERLAY_X_OFFSET_PORTRAIT,
14501 DEFAULT_INPUT_OVERLAY_X_OFFSET_PORTRAIT,
14502 "%.3f",
14503 &group_info,
14504 &subgroup_info,
14505 parent_group,
14506 general_write_handler,
14507 general_read_handler);
14508 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
14509 MENU_SETTINGS_LIST_CURRENT_ADD_CMD(list, list_info, CMD_EVENT_OVERLAY_SET_SCALE_FACTOR);
14510 menu_settings_list_current_add_range(list, list_info, -1.0f, 1.0f, 0.005f, true, true);
14511 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_CMD_APPLY_AUTO);
14512
14513 CONFIG_FLOAT(
14514 list, list_info,
14515 &settings->floats.input_overlay_y_offset_portrait,
14516 MENU_ENUM_LABEL_OVERLAY_Y_OFFSET_PORTRAIT,
14517 MENU_ENUM_LABEL_VALUE_OVERLAY_Y_OFFSET_PORTRAIT,
14518 DEFAULT_INPUT_OVERLAY_Y_OFFSET_PORTRAIT,
14519 "%.3f",
14520 &group_info,
14521 &subgroup_info,
14522 parent_group,
14523 general_write_handler,
14524 general_read_handler);
14525 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
14526 MENU_SETTINGS_LIST_CURRENT_ADD_CMD(list, list_info, CMD_EVENT_OVERLAY_SET_SCALE_FACTOR);
14527 menu_settings_list_current_add_range(list, list_info, -1.0f, 1.0f, 0.005f, true, true);
14528 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_CMD_APPLY_AUTO);
14529
14530 END_SUB_GROUP(list, list_info, parent_group);
14531
14532 START_SUB_GROUP(list, list_info, "Onscreen Keyboard Overlay", &group_info, &subgroup_info, parent_group);
14533
14534 END_SUB_GROUP(list, list_info, parent_group);
14535 END_GROUP(list, list_info, parent_group);
14536 #endif
14537 break;
14538 #ifdef HAVE_VIDEO_LAYOUT
14539 case SETTINGS_LIST_VIDEO_LAYOUT:
14540 START_GROUP(list, list_info, &group_info,
14541 msg_hash_to_str(MENU_ENUM_LABEL_ONSCREEN_VIDEO_LAYOUT_SETTINGS),
14542 parent_group);
14543
14544 parent_group = msg_hash_to_str(MENU_ENUM_LABEL_ONSCREEN_VIDEO_LAYOUT_SETTINGS);
14545
14546 START_SUB_GROUP(list, list_info, "State", &group_info, &subgroup_info, parent_group);
14547
14548 CONFIG_BOOL(
14549 list, list_info,
14550 &settings->bools.video_layout_enable,
14551 MENU_ENUM_LABEL_VIDEO_LAYOUT_ENABLE,
14552 MENU_ENUM_LABEL_VALUE_VIDEO_LAYOUT_ENABLE,
14553 true,
14554 MENU_ENUM_LABEL_VALUE_OFF,
14555 MENU_ENUM_LABEL_VALUE_ON,
14556 &group_info,
14557 &subgroup_info,
14558 parent_group,
14559 change_handler_video_layout_enable,
14560 general_read_handler,
14561 SD_FLAG_NONE);
14562 (*list)[list_info->index - 1].action_ok = setting_bool_action_left_with_refresh;
14563 (*list)[list_info->index - 1].action_left = setting_bool_action_left_with_refresh;
14564 (*list)[list_info->index - 1].action_right = setting_bool_action_right_with_refresh;
14565
14566 CONFIG_PATH(
14567 list, list_info,
14568 settings->paths.path_video_layout,
14569 sizeof(settings->paths.path_video_layout),
14570 MENU_ENUM_LABEL_VIDEO_LAYOUT_PATH,
14571 MENU_ENUM_LABEL_VALUE_VIDEO_LAYOUT_PATH,
14572 settings->paths.directory_video_layout,
14573 &group_info,
14574 &subgroup_info,
14575 parent_group,
14576 change_handler_video_layout_path,
14577 general_read_handler);
14578
14579 CONFIG_UINT(
14580 list, list_info,
14581 &settings->uints.video_layout_selected_view,
14582 MENU_ENUM_LABEL_VIDEO_LAYOUT_SELECTED_VIEW,
14583 MENU_ENUM_LABEL_VALUE_VIDEO_LAYOUT_SELECTED_VIEW,
14584 0,
14585 &group_info,
14586 &subgroup_info,
14587 parent_group,
14588 change_handler_video_layout_selected_view,
14589 general_read_handler);
14590 menu_settings_list_current_add_range(list, list_info, 0, 0, 1, false, false);
14591
14592 END_SUB_GROUP(list, list_info, parent_group);
14593 END_GROUP(list, list_info, parent_group);
14594 break;
14595 #endif
14596 case SETTINGS_LIST_MENU:
14597 START_GROUP(list, list_info, &group_info,
14598 msg_hash_to_str(MENU_ENUM_LABEL_VALUE_MENU_SETTINGS),
14599 parent_group);
14600 MENU_SETTINGS_LIST_CURRENT_ADD_ENUM_IDX_PTR(list, list_info, MENU_ENUM_LABEL_MENU_SETTINGS);
14601
14602 parent_group = msg_hash_to_str(MENU_ENUM_LABEL_MENU_SETTINGS);
14603
14604 START_SUB_GROUP(list, list_info, "State", &group_info, &subgroup_info, parent_group);
14605
14606 if (string_is_not_equal(settings->arrays.menu_driver, "rgui") &&
14607 string_is_not_equal(settings->arrays.menu_driver, "ozone"))
14608 {
14609 CONFIG_PATH(
14610 list, list_info,
14611 settings->paths.path_menu_wallpaper,
14612 sizeof(settings->paths.path_menu_wallpaper),
14613 MENU_ENUM_LABEL_MENU_WALLPAPER,
14614 MENU_ENUM_LABEL_VALUE_MENU_WALLPAPER,
14615 "",
14616 &group_info,
14617 &subgroup_info,
14618 parent_group,
14619 general_write_handler,
14620 general_read_handler);
14621 MENU_SETTINGS_LIST_CURRENT_ADD_VALUES(list, list_info, "png");
14622
14623 CONFIG_FLOAT(
14624 list, list_info,
14625 &settings->floats.menu_wallpaper_opacity,
14626 MENU_ENUM_LABEL_MENU_WALLPAPER_OPACITY,
14627 MENU_ENUM_LABEL_VALUE_MENU_WALLPAPER_OPACITY,
14628 menu_wallpaper_opacity,
14629 "%.3f",
14630 &group_info,
14631 &subgroup_info,
14632 parent_group,
14633 general_write_handler,
14634 general_read_handler);
14635 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
14636 menu_settings_list_current_add_range(list, list_info, 0.0, 1.0, 0.010, true, true);
14637 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED);
14638 }
14639
14640 if (string_is_not_equal(settings->arrays.menu_driver, "rgui"))
14641 {
14642 CONFIG_FLOAT(
14643 list, list_info,
14644 &settings->floats.menu_framebuffer_opacity,
14645 MENU_ENUM_LABEL_MENU_FRAMEBUFFER_OPACITY,
14646 MENU_ENUM_LABEL_VALUE_MENU_FRAMEBUFFER_OPACITY,
14647 menu_framebuffer_opacity,
14648 "%.3f",
14649 &group_info,
14650 &subgroup_info,
14651 parent_group,
14652 general_write_handler,
14653 general_read_handler);
14654 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
14655 menu_settings_list_current_add_range(list, list_info, 0.0, 1.0, 0.010, true, true);
14656 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED);
14657 }
14658
14659 if (string_is_equal(settings->arrays.menu_driver, "xmb"))
14660 {
14661 CONFIG_BOOL(
14662 list, list_info,
14663 &settings->bools.menu_dynamic_wallpaper_enable,
14664 MENU_ENUM_LABEL_DYNAMIC_WALLPAPER,
14665 MENU_ENUM_LABEL_VALUE_DYNAMIC_WALLPAPER,
14666 menu_dynamic_wallpaper_enable,
14667 MENU_ENUM_LABEL_VALUE_OFF,
14668 MENU_ENUM_LABEL_VALUE_ON,
14669 &group_info,
14670 &subgroup_info,
14671 parent_group,
14672 general_write_handler,
14673 general_read_handler,
14674 SD_FLAG_NONE
14675 );
14676 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED);
14677 }
14678
14679 CONFIG_BOOL(
14680 list, list_info,
14681 &settings->bools.menu_pause_libretro,
14682 MENU_ENUM_LABEL_PAUSE_LIBRETRO,
14683 MENU_ENUM_LABEL_VALUE_PAUSE_LIBRETRO,
14684 true,
14685 MENU_ENUM_LABEL_VALUE_OFF,
14686 MENU_ENUM_LABEL_VALUE_ON,
14687 &group_info,
14688 &subgroup_info,
14689 parent_group,
14690 general_write_handler,
14691 general_read_handler,
14692 SD_FLAG_CMD_APPLY_AUTO
14693 );
14694 MENU_SETTINGS_LIST_CURRENT_ADD_CMD(list, list_info, CMD_EVENT_MENU_PAUSE_LIBRETRO);
14695 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED);
14696
14697 CONFIG_BOOL(
14698 list, list_info,
14699 &settings->bools.menu_savestate_resume,
14700 MENU_ENUM_LABEL_MENU_SAVESTATE_RESUME,
14701 MENU_ENUM_LABEL_VALUE_MENU_SAVESTATE_RESUME,
14702 menu_savestate_resume,
14703 MENU_ENUM_LABEL_VALUE_OFF,
14704 MENU_ENUM_LABEL_VALUE_ON,
14705 &group_info,
14706 &subgroup_info,
14707 parent_group,
14708 general_write_handler,
14709 general_read_handler,
14710 SD_FLAG_ADVANCED
14711 );
14712
14713 CONFIG_BOOL(
14714 list, list_info,
14715 &settings->bools.menu_insert_disk_resume,
14716 MENU_ENUM_LABEL_MENU_INSERT_DISK_RESUME,
14717 MENU_ENUM_LABEL_VALUE_MENU_INSERT_DISK_RESUME,
14718 DEFAULT_MENU_INSERT_DISK_RESUME,
14719 MENU_ENUM_LABEL_VALUE_OFF,
14720 MENU_ENUM_LABEL_VALUE_ON,
14721 &group_info,
14722 &subgroup_info,
14723 parent_group,
14724 general_write_handler,
14725 general_read_handler,
14726 SD_FLAG_ADVANCED
14727 );
14728
14729 CONFIG_UINT(
14730 list, list_info,
14731 &settings->uints.quit_on_close_content,
14732 MENU_ENUM_LABEL_QUIT_ON_CLOSE_CONTENT,
14733 MENU_ENUM_LABEL_VALUE_QUIT_ON_CLOSE_CONTENT,
14734 DEFAULT_QUIT_ON_CLOSE_CONTENT,
14735 &group_info,
14736 &subgroup_info,
14737 parent_group,
14738 general_write_handler,
14739 general_read_handler);
14740 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
14741 (*list)[list_info->index - 1].get_string_representation =
14742 &setting_get_string_representation_uint_quit_on_close_content;
14743 menu_settings_list_current_add_range(list, list_info, 0, QUIT_ON_CLOSE_CONTENT_LAST-1, 1, true, true);
14744
14745 CONFIG_UINT(
14746 list, list_info,
14747 &settings->uints.menu_screensaver_timeout,
14748 MENU_ENUM_LABEL_MENU_SCREENSAVER_TIMEOUT,
14749 MENU_ENUM_LABEL_VALUE_MENU_SCREENSAVER_TIMEOUT,
14750 DEFAULT_MENU_SCREENSAVER_TIMEOUT,
14751 &group_info,
14752 &subgroup_info,
14753 parent_group,
14754 general_write_handler,
14755 general_read_handler);
14756 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint_special;
14757 (*list)[list_info->index - 1].get_string_representation =
14758 &setting_get_string_representation_uint_menu_screensaver_timeout;
14759 menu_settings_list_current_add_range(list, list_info, 0, 1800, 10, true, true);
14760
14761 #if (defined(HAVE_MATERIALUI) || defined(HAVE_XMB) || defined(HAVE_OZONE)) && !defined(_3DS)
14762 if (string_is_equal(settings->arrays.menu_driver, "glui") ||
14763 string_is_equal(settings->arrays.menu_driver, "xmb") ||
14764 string_is_equal(settings->arrays.menu_driver, "ozone"))
14765 {
14766 CONFIG_UINT(
14767 list, list_info,
14768 &settings->uints.menu_screensaver_animation,
14769 MENU_ENUM_LABEL_MENU_SCREENSAVER_ANIMATION,
14770 MENU_ENUM_LABEL_VALUE_MENU_SCREENSAVER_ANIMATION,
14771 DEFAULT_MENU_SCREENSAVER_ANIMATION,
14772 &group_info,
14773 &subgroup_info,
14774 parent_group,
14775 general_write_handler,
14776 general_read_handler);
14777 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
14778 (*list)[list_info->index - 1].action_left = &setting_uint_action_left_with_refresh;
14779 (*list)[list_info->index - 1].action_right = &setting_uint_action_right_with_refresh;
14780 (*list)[list_info->index - 1].get_string_representation =
14781 &setting_get_string_representation_uint_menu_screensaver_animation;
14782 menu_settings_list_current_add_range(list, list_info, 0, MENU_SCREENSAVER_LAST-1, 1, true, true);
14783 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_COMBOBOX;
14784
14785 CONFIG_FLOAT(
14786 list, list_info,
14787 &settings->floats.menu_screensaver_animation_speed,
14788 MENU_ENUM_LABEL_MENU_SCREENSAVER_ANIMATION_SPEED,
14789 MENU_ENUM_LABEL_VALUE_MENU_SCREENSAVER_ANIMATION_SPEED,
14790 DEFAULT_MENU_SCREENSAVER_ANIMATION_SPEED,
14791 "%.1fx",
14792 &group_info,
14793 &subgroup_info,
14794 parent_group,
14795 general_write_handler,
14796 general_read_handler);
14797 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
14798 menu_settings_list_current_add_range(list, list_info, 0.1, 10.0, 0.1, true, true);
14799 }
14800 #endif
14801 CONFIG_BOOL(
14802 list, list_info,
14803 &settings->bools.menu_mouse_enable,
14804 MENU_ENUM_LABEL_MOUSE_ENABLE,
14805 MENU_ENUM_LABEL_VALUE_MOUSE_ENABLE,
14806 DEFAULT_MOUSE_ENABLE,
14807 MENU_ENUM_LABEL_VALUE_OFF,
14808 MENU_ENUM_LABEL_VALUE_ON,
14809 &group_info,
14810 &subgroup_info,
14811 parent_group,
14812 general_write_handler,
14813 general_read_handler,
14814 SD_FLAG_ADVANCED
14815 );
14816
14817 CONFIG_BOOL(
14818 list, list_info,
14819 &settings->bools.menu_pointer_enable,
14820 MENU_ENUM_LABEL_POINTER_ENABLE,
14821 MENU_ENUM_LABEL_VALUE_POINTER_ENABLE,
14822 DEFAULT_POINTER_ENABLE,
14823 MENU_ENUM_LABEL_VALUE_OFF,
14824 MENU_ENUM_LABEL_VALUE_ON,
14825 &group_info,
14826 &subgroup_info,
14827 parent_group,
14828 general_write_handler,
14829 general_read_handler,
14830 SD_FLAG_ADVANCED
14831 );
14832
14833 if (string_is_equal(settings->arrays.menu_driver, "rgui"))
14834 {
14835 CONFIG_BOOL(
14836 list, list_info,
14837 &settings->bools.menu_rgui_border_filler_enable,
14838 MENU_ENUM_LABEL_MENU_RGUI_BORDER_FILLER_ENABLE,
14839 MENU_ENUM_LABEL_VALUE_MENU_RGUI_BORDER_FILLER_ENABLE,
14840 true,
14841 MENU_ENUM_LABEL_VALUE_OFF,
14842 MENU_ENUM_LABEL_VALUE_ON,
14843 &group_info,
14844 &subgroup_info,
14845 parent_group,
14846 general_write_handler,
14847 general_read_handler,
14848 SD_FLAG_NONE
14849 );
14850
14851 CONFIG_BOOL(
14852 list, list_info,
14853 &settings->bools.menu_rgui_background_filler_thickness_enable,
14854 MENU_ENUM_LABEL_MENU_RGUI_BACKGROUND_FILLER_THICKNESS_ENABLE,
14855 MENU_ENUM_LABEL_VALUE_MENU_RGUI_BACKGROUND_FILLER_THICKNESS_ENABLE,
14856 true,
14857 MENU_ENUM_LABEL_VALUE_OFF,
14858 MENU_ENUM_LABEL_VALUE_ON,
14859 &group_info,
14860 &subgroup_info,
14861 parent_group,
14862 general_write_handler,
14863 general_read_handler,
14864 SD_FLAG_NONE
14865 );
14866
14867 CONFIG_BOOL(
14868 list, list_info,
14869 &settings->bools.menu_rgui_border_filler_thickness_enable,
14870 MENU_ENUM_LABEL_MENU_RGUI_BORDER_FILLER_THICKNESS_ENABLE,
14871 MENU_ENUM_LABEL_VALUE_MENU_RGUI_BORDER_FILLER_THICKNESS_ENABLE,
14872 true,
14873 MENU_ENUM_LABEL_VALUE_OFF,
14874 MENU_ENUM_LABEL_VALUE_ON,
14875 &group_info,
14876 &subgroup_info,
14877 parent_group,
14878 general_write_handler,
14879 general_read_handler,
14880 SD_FLAG_NONE
14881 );
14882
14883 CONFIG_BOOL(
14884 list, list_info,
14885 &settings->bools.menu_rgui_full_width_layout,
14886 MENU_ENUM_LABEL_MENU_RGUI_FULL_WIDTH_LAYOUT,
14887 MENU_ENUM_LABEL_VALUE_MENU_RGUI_FULL_WIDTH_LAYOUT,
14888 rgui_full_width_layout,
14889 MENU_ENUM_LABEL_VALUE_OFF,
14890 MENU_ENUM_LABEL_VALUE_ON,
14891 &group_info,
14892 &subgroup_info,
14893 parent_group,
14894 general_write_handler,
14895 general_read_handler,
14896 SD_FLAG_NONE);
14897
14898 if (video_driver_test_all_flags(GFX_CTX_FLAGS_MENU_FRAME_FILTERING))
14899 {
14900 CONFIG_BOOL(
14901 list, list_info,
14902 &settings->bools.menu_linear_filter,
14903 MENU_ENUM_LABEL_MENU_LINEAR_FILTER,
14904 MENU_ENUM_LABEL_VALUE_MENU_LINEAR_FILTER,
14905 true,
14906 MENU_ENUM_LABEL_VALUE_OFF,
14907 MENU_ENUM_LABEL_VALUE_ON,
14908 &group_info,
14909 &subgroup_info,
14910 parent_group,
14911 general_write_handler,
14912 general_read_handler,
14913 SD_FLAG_NONE
14914 );
14915
14916 CONFIG_UINT(
14917 list, list_info,
14918 &settings->uints.menu_rgui_internal_upscale_level,
14919 MENU_ENUM_LABEL_MENU_RGUI_INTERNAL_UPSCALE_LEVEL,
14920 MENU_ENUM_LABEL_VALUE_MENU_RGUI_INTERNAL_UPSCALE_LEVEL,
14921 rgui_internal_upscale_level,
14922 &group_info,
14923 &subgroup_info,
14924 parent_group,
14925 general_write_handler,
14926 general_read_handler);
14927 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
14928 (*list)[list_info->index - 1].get_string_representation =
14929 &setting_get_string_representation_uint_rgui_internal_upscale_level;
14930 menu_settings_list_current_add_range(list, list_info, 0, RGUI_UPSCALE_LAST-1, 1, true, true);
14931 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ADVANCED);
14932 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_COMBOBOX;
14933 }
14934
14935 #if !defined(DINGUX)
14936 CONFIG_UINT(
14937 list, list_info,
14938 &settings->uints.menu_rgui_aspect_ratio,
14939 MENU_ENUM_LABEL_MENU_RGUI_ASPECT_RATIO,
14940 MENU_ENUM_LABEL_VALUE_MENU_RGUI_ASPECT_RATIO,
14941 rgui_aspect,
14942 &group_info,
14943 &subgroup_info,
14944 parent_group,
14945 general_write_handler,
14946 general_read_handler);
14947 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
14948 (*list)[list_info->index - 1].get_string_representation =
14949 &setting_get_string_representation_uint_rgui_aspect_ratio;
14950 menu_settings_list_current_add_range(list, list_info, 0, RGUI_ASPECT_RATIO_LAST-1, 1, true, true);
14951
14952 CONFIG_UINT(
14953 list, list_info,
14954 &settings->uints.menu_rgui_aspect_ratio_lock,
14955 MENU_ENUM_LABEL_MENU_RGUI_ASPECT_RATIO_LOCK,
14956 MENU_ENUM_LABEL_VALUE_MENU_RGUI_ASPECT_RATIO_LOCK,
14957 rgui_aspect_lock,
14958 &group_info,
14959 &subgroup_info,
14960 parent_group,
14961 general_write_handler,
14962 general_read_handler);
14963 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
14964 (*list)[list_info->index - 1].get_string_representation =
14965 &setting_get_string_representation_uint_rgui_aspect_ratio_lock;
14966 #if defined(GEKKO)
14967 menu_settings_list_current_add_range(list, list_info, 0, RGUI_ASPECT_RATIO_LOCK_LAST-3, 1, true, true);
14968 #else
14969 menu_settings_list_current_add_range(list, list_info, 0, RGUI_ASPECT_RATIO_LOCK_LAST-1, 1, true, true);
14970 #endif
14971 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_COMBOBOX;
14972 #endif
14973
14974 CONFIG_UINT(
14975 list, list_info,
14976 &settings->uints.menu_rgui_color_theme,
14977 MENU_ENUM_LABEL_RGUI_MENU_COLOR_THEME,
14978 MENU_ENUM_LABEL_VALUE_RGUI_MENU_COLOR_THEME,
14979 DEFAULT_RGUI_COLOR_THEME,
14980 &group_info,
14981 &subgroup_info,
14982 parent_group,
14983 general_write_handler,
14984 general_read_handler);
14985 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
14986 (*list)[list_info->index - 1].action_left = &setting_uint_action_left_with_refresh;
14987 (*list)[list_info->index - 1].action_right = &setting_uint_action_right_with_refresh;
14988 (*list)[list_info->index - 1].get_string_representation =
14989 &setting_get_string_representation_uint_rgui_menu_color_theme;
14990 menu_settings_list_current_add_range(list, list_info, 0, RGUI_THEME_LAST-1, 1, true, true);
14991 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_COMBOBOX;
14992
14993 CONFIG_PATH(
14994 list, list_info,
14995 settings->paths.path_rgui_theme_preset,
14996 sizeof(settings->paths.path_rgui_theme_preset),
14997 MENU_ENUM_LABEL_RGUI_MENU_THEME_PRESET,
14998 MENU_ENUM_LABEL_VALUE_RGUI_MENU_THEME_PRESET,
14999 settings->paths.directory_assets,
15000 &group_info,
15001 &subgroup_info,
15002 parent_group,
15003 general_write_handler,
15004 general_read_handler);
15005 MENU_SETTINGS_LIST_CURRENT_ADD_VALUES(list, list_info, "cfg");
15006
15007 /* ps2 and sdl_dingux/sdl_rs90 gfx drivers do
15008 * not support menu framebuffer transparency */
15009 if (!string_is_equal(settings->arrays.video_driver, "ps2") &&
15010 !string_is_equal(settings->arrays.video_driver, "sdl_dingux") &&
15011 !string_is_equal(settings->arrays.video_driver, "sdl_rs90"))
15012 {
15013 CONFIG_BOOL(
15014 list, list_info,
15015 &settings->bools.menu_rgui_transparency,
15016 MENU_ENUM_LABEL_MENU_RGUI_TRANSPARENCY,
15017 MENU_ENUM_LABEL_VALUE_MENU_RGUI_TRANSPARENCY,
15018 DEFAULT_RGUI_TRANSPARENCY,
15019 MENU_ENUM_LABEL_VALUE_OFF,
15020 MENU_ENUM_LABEL_VALUE_ON,
15021 &group_info,
15022 &subgroup_info,
15023 parent_group,
15024 general_write_handler,
15025 general_read_handler,
15026 SD_FLAG_NONE);
15027 }
15028
15029 CONFIG_BOOL(
15030 list, list_info,
15031 &settings->bools.menu_rgui_shadows,
15032 MENU_ENUM_LABEL_MENU_RGUI_SHADOWS,
15033 MENU_ENUM_LABEL_VALUE_MENU_RGUI_SHADOWS,
15034 rgui_shadows,
15035 MENU_ENUM_LABEL_VALUE_OFF,
15036 MENU_ENUM_LABEL_VALUE_ON,
15037 &group_info,
15038 &subgroup_info,
15039 parent_group,
15040 general_write_handler,
15041 general_read_handler,
15042 SD_FLAG_NONE);
15043
15044 CONFIG_UINT(
15045 list, list_info,
15046 &settings->uints.menu_rgui_particle_effect,
15047 MENU_ENUM_LABEL_MENU_RGUI_PARTICLE_EFFECT,
15048 MENU_ENUM_LABEL_VALUE_MENU_RGUI_PARTICLE_EFFECT,
15049 rgui_particle_effect,
15050 &group_info,
15051 &subgroup_info,
15052 parent_group,
15053 general_write_handler,
15054 general_read_handler);
15055 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
15056 (*list)[list_info->index - 1].action_left = &setting_uint_action_left_with_refresh;
15057 (*list)[list_info->index - 1].action_right = &setting_uint_action_right_with_refresh;
15058 (*list)[list_info->index - 1].get_string_representation =
15059 &setting_get_string_representation_uint_rgui_particle_effect;
15060 menu_settings_list_current_add_range(list, list_info, 0, RGUI_PARTICLE_EFFECT_LAST-1, 1, true, true);
15061 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_COMBOBOX;
15062
15063 CONFIG_FLOAT(
15064 list, list_info,
15065 &settings->floats.menu_rgui_particle_effect_speed,
15066 MENU_ENUM_LABEL_MENU_RGUI_PARTICLE_EFFECT_SPEED,
15067 MENU_ENUM_LABEL_VALUE_MENU_RGUI_PARTICLE_EFFECT_SPEED,
15068 DEFAULT_RGUI_PARTICLE_EFFECT_SPEED,
15069 "%.1fx",
15070 &group_info,
15071 &subgroup_info,
15072 parent_group,
15073 general_write_handler,
15074 general_read_handler);
15075 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
15076 menu_settings_list_current_add_range(list, list_info, 0.1, 10.0, 0.1, true, true);
15077
15078 CONFIG_BOOL(
15079 list, list_info,
15080 &settings->bools.menu_rgui_particle_effect_screensaver,
15081 MENU_ENUM_LABEL_MENU_RGUI_PARTICLE_EFFECT_SCREENSAVER,
15082 MENU_ENUM_LABEL_VALUE_MENU_RGUI_PARTICLE_EFFECT_SCREENSAVER,
15083 DEFAULT_RGUI_PARTICLE_EFFECT_SCREENSAVER,
15084 MENU_ENUM_LABEL_VALUE_OFF,
15085 MENU_ENUM_LABEL_VALUE_ON,
15086 &group_info,
15087 &subgroup_info,
15088 parent_group,
15089 general_write_handler,
15090 general_read_handler,
15091 SD_FLAG_NONE);
15092
15093 CONFIG_BOOL(
15094 list, list_info,
15095 &settings->bools.menu_rgui_extended_ascii,
15096 MENU_ENUM_LABEL_MENU_RGUI_EXTENDED_ASCII,
15097 MENU_ENUM_LABEL_VALUE_MENU_RGUI_EXTENDED_ASCII,
15098 rgui_extended_ascii,
15099 MENU_ENUM_LABEL_VALUE_OFF,
15100 MENU_ENUM_LABEL_VALUE_ON,
15101 &group_info,
15102 &subgroup_info,
15103 parent_group,
15104 general_write_handler,
15105 general_read_handler,
15106 SD_FLAG_NONE);
15107
15108 CONFIG_BOOL(
15109 list, list_info,
15110 &settings->bools.menu_rgui_switch_icons,
15111 MENU_ENUM_LABEL_MENU_RGUI_SWITCH_ICONS,
15112 MENU_ENUM_LABEL_VALUE_MENU_RGUI_SWITCH_ICONS,
15113 DEFAULT_RGUI_SWITCH_ICONS,
15114 MENU_ENUM_LABEL_VALUE_OFF,
15115 MENU_ENUM_LABEL_VALUE_ON,
15116 &group_info,
15117 &subgroup_info,
15118 parent_group,
15119 general_write_handler,
15120 general_read_handler,
15121 SD_FLAG_NONE);
15122 }
15123
15124 #ifdef HAVE_XMB
15125 if (string_is_equal(settings->arrays.menu_driver, "xmb"))
15126 {
15127 CONFIG_BOOL(
15128 list, list_info,
15129 &settings->bools.menu_horizontal_animation,
15130 MENU_ENUM_LABEL_MENU_HORIZONTAL_ANIMATION,
15131 MENU_ENUM_LABEL_VALUE_MENU_HORIZONTAL_ANIMATION,
15132 DEFAULT_MENU_HORIZONTAL_ANIMATION,
15133 MENU_ENUM_LABEL_VALUE_OFF,
15134 MENU_ENUM_LABEL_VALUE_ON,
15135 &group_info,
15136 &subgroup_info,
15137 parent_group,
15138 general_write_handler,
15139 general_read_handler,
15140 SD_FLAG_ADVANCED
15141 );
15142 #ifdef RARCH_MOBILE
15143 /* We don't want mobile users being able to switch this off. */
15144 (*list)[list_info->index - 1].action_left = NULL;
15145 (*list)[list_info->index - 1].action_right = NULL;
15146 (*list)[list_info->index - 1].action_start = NULL;
15147 #else
15148 (*list)[list_info->index - 1].action_ok = setting_bool_action_left_with_refresh;
15149 (*list)[list_info->index - 1].action_left = setting_bool_action_left_with_refresh;
15150 (*list)[list_info->index - 1].action_right = setting_bool_action_right_with_refresh;
15151 #endif
15152
15153 CONFIG_UINT(
15154 list, list_info,
15155 &settings->uints.menu_xmb_animation_horizontal_highlight,
15156 MENU_ENUM_LABEL_MENU_XMB_ANIMATION_HORIZONTAL_HIGHLIGHT,
15157 MENU_ENUM_LABEL_VALUE_MENU_XMB_ANIMATION_HORIZONTAL_HIGHLIGHT,
15158 DEFAULT_XMB_ANIMATION,
15159 &group_info,
15160 &subgroup_info,
15161 parent_group,
15162 general_write_handler,
15163 general_read_handler);
15164 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
15165 (*list)[list_info->index - 1].get_string_representation =
15166 &setting_get_string_representation_uint_menu_xmb_animation_horizontal_highlight;
15167 menu_settings_list_current_add_range(list, list_info, 0, 2, 1, true, true);
15168 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_RADIO_BUTTONS;
15169
15170 CONFIG_UINT(
15171 list, list_info,
15172 &settings->uints.menu_xmb_animation_move_up_down,
15173 MENU_ENUM_LABEL_MENU_XMB_ANIMATION_MOVE_UP_DOWN,
15174 MENU_ENUM_LABEL_VALUE_MENU_XMB_ANIMATION_MOVE_UP_DOWN,
15175 DEFAULT_XMB_ANIMATION,
15176 &group_info,
15177 &subgroup_info,
15178 parent_group,
15179 general_write_handler,
15180 general_read_handler);
15181 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
15182 (*list)[list_info->index - 1].get_string_representation =
15183 &setting_get_string_representation_uint_menu_xmb_animation_move_up_down;
15184 menu_settings_list_current_add_range(list, list_info, 0, 1, 1, true, true);
15185 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_RADIO_BUTTONS;
15186
15187 CONFIG_UINT(
15188 list, list_info,
15189 &settings->uints.menu_xmb_animation_opening_main_menu,
15190 MENU_ENUM_LABEL_MENU_XMB_ANIMATION_OPENING_MAIN_MENU,
15191 MENU_ENUM_LABEL_VALUE_MENU_XMB_ANIMATION_OPENING_MAIN_MENU,
15192 DEFAULT_XMB_ANIMATION,
15193 &group_info,
15194 &subgroup_info,
15195 parent_group,
15196 general_write_handler,
15197 general_read_handler);
15198 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
15199 (*list)[list_info->index - 1].get_string_representation =
15200 &setting_get_string_representation_uint_menu_xmb_animation_opening_main_menu;
15201 menu_settings_list_current_add_range(list, list_info, 0, 3, 1, true, true);
15202 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_RADIO_BUTTONS;
15203 }
15204 #endif
15205
15206 CONFIG_UINT(
15207 list, list_info,
15208 &settings->uints.menu_ticker_type,
15209 MENU_ENUM_LABEL_MENU_TICKER_TYPE,
15210 MENU_ENUM_LABEL_VALUE_MENU_TICKER_TYPE,
15211 DEFAULT_MENU_TICKER_TYPE,
15212 &group_info,
15213 &subgroup_info,
15214 parent_group,
15215 general_write_handler,
15216 general_read_handler);
15217 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
15218 (*list)[list_info->index - 1].get_string_representation =
15219 &setting_get_string_representation_uint_menu_ticker_type;
15220 menu_settings_list_current_add_range(list, list_info, 0, TICKER_TYPE_LAST-1, 1, true, true);
15221 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_RADIO_BUTTONS;
15222
15223 CONFIG_FLOAT(
15224 list, list_info,
15225 &settings->floats.menu_ticker_speed,
15226 MENU_ENUM_LABEL_MENU_TICKER_SPEED,
15227 MENU_ENUM_LABEL_VALUE_MENU_TICKER_SPEED,
15228 menu_ticker_speed,
15229 "%.1fx",
15230 &group_info,
15231 &subgroup_info,
15232 parent_group,
15233 general_write_handler,
15234 general_read_handler);
15235 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
15236 menu_settings_list_current_add_range(list, list_info, 0.1, 10.0, 0.1, true, true);
15237
15238 CONFIG_BOOL(
15239 list, list_info,
15240 &settings->bools.menu_ticker_smooth,
15241 MENU_ENUM_LABEL_MENU_TICKER_SMOOTH,
15242 MENU_ENUM_LABEL_VALUE_MENU_TICKER_SMOOTH,
15243 DEFAULT_MENU_TICKER_SMOOTH,
15244 MENU_ENUM_LABEL_VALUE_OFF,
15245 MENU_ENUM_LABEL_VALUE_ON,
15246 &group_info,
15247 &subgroup_info,
15248 parent_group,
15249 general_write_handler,
15250 general_read_handler,
15251 SD_FLAG_NONE);
15252
15253 END_SUB_GROUP(list, list_info, parent_group);
15254
15255 START_SUB_GROUP(list, list_info, "Navigation", &group_info, &subgroup_info, parent_group);
15256
15257 CONFIG_BOOL(
15258 list, list_info,
15259 &settings->bools.menu_navigation_wraparound_enable,
15260 MENU_ENUM_LABEL_NAVIGATION_WRAPAROUND,
15261 MENU_ENUM_LABEL_VALUE_NAVIGATION_WRAPAROUND,
15262 true,
15263 MENU_ENUM_LABEL_VALUE_OFF,
15264 MENU_ENUM_LABEL_VALUE_ON,
15265 &group_info,
15266 &subgroup_info,
15267 parent_group,
15268 general_write_handler,
15269 general_read_handler,
15270 SD_FLAG_ADVANCED
15271 );
15272
15273 END_SUB_GROUP(list, list_info, parent_group);
15274 START_SUB_GROUP(list, list_info, "Settings View", &group_info, &subgroup_info, parent_group);
15275
15276 CONFIG_BOOL(
15277 list, list_info,
15278 &settings->bools.menu_show_advanced_settings,
15279 MENU_ENUM_LABEL_SHOW_ADVANCED_SETTINGS,
15280 MENU_ENUM_LABEL_VALUE_SHOW_ADVANCED_SETTINGS,
15281 DEFAULT_SHOW_ADVANCED_SETTINGS,
15282 MENU_ENUM_LABEL_VALUE_OFF,
15283 MENU_ENUM_LABEL_VALUE_ON,
15284 &group_info,
15285 &subgroup_info,
15286 parent_group,
15287 general_write_handler,
15288 general_read_handler,
15289 SD_FLAG_NONE);
15290
15291 if (string_is_equal(settings->arrays.menu_driver, "xmb") || string_is_equal(settings->arrays.menu_driver, "ozone"))
15292 {
15293 CONFIG_BOOL(
15294 list, list_info,
15295 &settings->bools.kiosk_mode_enable,
15296 MENU_ENUM_LABEL_MENU_ENABLE_KIOSK_MODE,
15297 MENU_ENUM_LABEL_VALUE_MENU_ENABLE_KIOSK_MODE,
15298 DEFAULT_KIOSK_MODE_ENABLE,
15299 MENU_ENUM_LABEL_VALUE_OFF,
15300 MENU_ENUM_LABEL_VALUE_ON,
15301 &group_info,
15302 &subgroup_info,
15303 parent_group,
15304 general_write_handler,
15305 general_read_handler,
15306 SD_FLAG_NONE);
15307 (*list)[list_info->index - 1].action_ok = setting_bool_action_left_with_refresh;
15308 (*list)[list_info->index - 1].action_left = setting_bool_action_left_with_refresh;
15309 (*list)[list_info->index - 1].action_right = setting_bool_action_right_with_refresh;
15310
15311 CONFIG_STRING(
15312 list, list_info,
15313 settings->paths.kiosk_mode_password,
15314 sizeof(settings->paths.kiosk_mode_password),
15315 MENU_ENUM_LABEL_MENU_KIOSK_MODE_PASSWORD,
15316 MENU_ENUM_LABEL_VALUE_MENU_KIOSK_MODE_PASSWORD,
15317 "",
15318 &group_info,
15319 &subgroup_info,
15320 parent_group,
15321 general_write_handler,
15322 general_read_handler);
15323 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ALLOW_INPUT);
15324 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_PASSWORD_LINE_EDIT;
15325 (*list)[list_info->index - 1].action_start = setting_generic_action_start_default;
15326 }
15327
15328 #ifdef HAVE_THREADS
15329 CONFIG_BOOL(
15330 list, list_info,
15331 &settings->bools.threaded_data_runloop_enable,
15332 MENU_ENUM_LABEL_THREADED_DATA_RUNLOOP_ENABLE,
15333 MENU_ENUM_LABEL_VALUE_THREADED_DATA_RUNLOOP_ENABLE,
15334 DEFAULT_THREADED_DATA_RUNLOOP_ENABLE,
15335 MENU_ENUM_LABEL_VALUE_OFF,
15336 MENU_ENUM_LABEL_VALUE_ON,
15337 &group_info,
15338 &subgroup_info,
15339 parent_group,
15340 general_write_handler,
15341 general_read_handler,
15342 SD_FLAG_ADVANCED
15343 );
15344 #endif
15345
15346 END_SUB_GROUP(list, list_info, parent_group);
15347
15348 START_SUB_GROUP(list, list_info, "Display", &group_info, &subgroup_info, parent_group);
15349
15350 /* > MaterialUI, XMB and Ozone all support menu scaling */
15351 if (string_is_equal(settings->arrays.menu_driver, "glui") ||
15352 string_is_equal(settings->arrays.menu_driver, "xmb") ||
15353 string_is_equal(settings->arrays.menu_driver, "ozone"))
15354 {
15355 CONFIG_FLOAT(
15356 list, list_info,
15357 &settings->floats.menu_scale_factor,
15358 MENU_ENUM_LABEL_MENU_SCALE_FACTOR,
15359 MENU_ENUM_LABEL_VALUE_MENU_SCALE_FACTOR,
15360 DEFAULT_MENU_SCALE_FACTOR,
15361 "%.2fx",
15362 &group_info,
15363 &subgroup_info,
15364 parent_group,
15365 general_write_handler,
15366 general_read_handler);
15367 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
15368 menu_settings_list_current_add_range(list, list_info, 0.2, 5.0, 0.01, true, true);
15369 }
15370
15371 #ifdef HAVE_XMB
15372 if (string_is_equal(settings->arrays.menu_driver, "xmb"))
15373 {
15374 /* only XMB uses these values, don't show
15375 * them on other drivers. */
15376 CONFIG_UINT(
15377 list, list_info,
15378 &settings->uints.menu_xmb_alpha_factor,
15379 MENU_ENUM_LABEL_XMB_ALPHA_FACTOR,
15380 MENU_ENUM_LABEL_VALUE_XMB_ALPHA_FACTOR,
15381 xmb_alpha_factor,
15382 &group_info,
15383 &subgroup_info,
15384 parent_group,
15385 general_write_handler,
15386 general_read_handler);
15387 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
15388 menu_settings_list_current_add_range(list, list_info, 0, 100, 1, true, true);
15389 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED);
15390
15391 CONFIG_PATH(
15392 list, list_info,
15393 settings->paths.path_menu_xmb_font,
15394 sizeof(settings->paths.path_menu_xmb_font),
15395 MENU_ENUM_LABEL_XMB_FONT,
15396 MENU_ENUM_LABEL_VALUE_XMB_FONT,
15397 "",
15398 &group_info,
15399 &subgroup_info,
15400 parent_group,
15401 general_write_handler,
15402 general_read_handler);
15403 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED);
15404 MENU_SETTINGS_LIST_CURRENT_ADD_CMD(list, list_info, CMD_EVENT_REINIT);
15405 MENU_SETTINGS_LIST_CURRENT_ADD_VALUES(list, list_info, "ttf");
15406 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_FONT_SELECTOR;
15407
15408 CONFIG_UINT(
15409 list, list_info,
15410 &settings->uints.menu_font_color_red,
15411 MENU_ENUM_LABEL_MENU_FONT_COLOR_RED,
15412 MENU_ENUM_LABEL_VALUE_MENU_FONT_COLOR_RED,
15413 menu_font_color_red,
15414 &group_info,
15415 &subgroup_info,
15416 parent_group,
15417 general_write_handler,
15418 general_read_handler);
15419 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
15420 menu_settings_list_current_add_range(list, list_info, 0, 255, 1, true, true);
15421 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ADVANCED);
15422
15423 CONFIG_UINT(
15424 list, list_info,
15425 &settings->uints.menu_font_color_green,
15426 MENU_ENUM_LABEL_MENU_FONT_COLOR_GREEN,
15427 MENU_ENUM_LABEL_VALUE_MENU_FONT_COLOR_GREEN,
15428 menu_font_color_green,
15429 &group_info,
15430 &subgroup_info,
15431 parent_group,
15432 general_write_handler,
15433 general_read_handler);
15434 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
15435 menu_settings_list_current_add_range(list, list_info, 0, 255, 1, true, true);
15436 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ADVANCED);
15437
15438 CONFIG_UINT(
15439 list, list_info,
15440 &settings->uints.menu_font_color_blue,
15441 MENU_ENUM_LABEL_MENU_FONT_COLOR_BLUE,
15442 MENU_ENUM_LABEL_VALUE_MENU_FONT_COLOR_BLUE,
15443 menu_font_color_blue,
15444 &group_info,
15445 &subgroup_info,
15446 parent_group,
15447 general_write_handler,
15448 general_read_handler);
15449 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
15450 menu_settings_list_current_add_range(list, list_info, 0, 255, 1, true, true);
15451 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ADVANCED);
15452
15453 CONFIG_UINT(
15454 list, list_info,
15455 &settings->uints.menu_xmb_layout,
15456 MENU_ENUM_LABEL_XMB_LAYOUT,
15457 MENU_ENUM_LABEL_VALUE_XMB_LAYOUT,
15458 xmb_menu_layout,
15459 &group_info,
15460 &subgroup_info,
15461 parent_group,
15462 general_write_handler,
15463 general_read_handler);
15464 (*list)[list_info->index - 1].get_string_representation =
15465 &setting_get_string_representation_uint_xmb_layout;
15466 menu_settings_list_current_add_range(list, list_info, 0, 2, 1, true, true);
15467 MENU_SETTINGS_LIST_CURRENT_ADD_CMD(list, list_info, CMD_EVENT_REINIT);
15468 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_COMBOBOX;
15469
15470 CONFIG_UINT(
15471 list, list_info,
15472 &settings->uints.menu_xmb_theme,
15473 MENU_ENUM_LABEL_XMB_THEME,
15474 MENU_ENUM_LABEL_VALUE_XMB_THEME,
15475 xmb_icon_theme,
15476 &group_info,
15477 &subgroup_info,
15478 parent_group,
15479 general_write_handler,
15480 general_read_handler);
15481 (*list)[list_info->index - 1].get_string_representation =
15482 &setting_get_string_representation_uint_xmb_icon_theme;
15483 menu_settings_list_current_add_range(list, list_info, 0, XMB_ICON_THEME_LAST - 1, 1, true, true);
15484 MENU_SETTINGS_LIST_CURRENT_ADD_CMD(list, list_info, CMD_EVENT_REINIT);
15485 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_COMBOBOX;
15486
15487 CONFIG_BOOL(
15488 list, list_info,
15489 &settings->bools.menu_xmb_shadows_enable,
15490 MENU_ENUM_LABEL_XMB_SHADOWS_ENABLE,
15491 MENU_ENUM_LABEL_VALUE_XMB_SHADOWS_ENABLE,
15492 DEFAULT_XMB_SHADOWS_ENABLE,
15493 MENU_ENUM_LABEL_VALUE_OFF,
15494 MENU_ENUM_LABEL_VALUE_ON,
15495 &group_info,
15496 &subgroup_info,
15497 parent_group,
15498 general_write_handler,
15499 general_read_handler,
15500 SD_FLAG_NONE);
15501
15502 #if defined(HAVE_CG) || defined(HAVE_GLSL) || defined(HAVE_SLANG) || defined(HAVE_HLSL)
15503 #ifdef HAVE_SHADERPIPELINE
15504 if (video_shader_any_supported())
15505 {
15506 CONFIG_UINT(
15507 list, list_info,
15508 &settings->uints.menu_xmb_shader_pipeline,
15509 MENU_ENUM_LABEL_XMB_RIBBON_ENABLE,
15510 MENU_ENUM_LABEL_VALUE_XMB_RIBBON_ENABLE,
15511 DEFAULT_MENU_SHADER_PIPELINE,
15512 &group_info,
15513 &subgroup_info,
15514 parent_group,
15515 general_write_handler,
15516 general_read_handler);
15517 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
15518 (*list)[list_info->index - 1].get_string_representation =
15519 &setting_get_string_representation_uint_xmb_shader_pipeline;
15520 menu_settings_list_current_add_range(list, list_info, 0, XMB_SHADER_PIPELINE_LAST-1, 1, true, true);
15521 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_COMBOBOX;
15522 }
15523 #endif
15524 #endif
15525
15526 CONFIG_UINT(
15527 list, list_info,
15528 &settings->uints.menu_xmb_color_theme,
15529 MENU_ENUM_LABEL_XMB_MENU_COLOR_THEME,
15530 MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME,
15531 xmb_theme,
15532 &group_info,
15533 &subgroup_info,
15534 parent_group,
15535 general_write_handler,
15536 general_read_handler);
15537 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
15538 (*list)[list_info->index - 1].get_string_representation =
15539 &setting_get_string_representation_uint_xmb_menu_color_theme;
15540 menu_settings_list_current_add_range(list, list_info, 0, XMB_THEME_LAST-1, 1, true, true);
15541 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_COMBOBOX;
15542 }
15543 #endif
15544 if (string_is_equal(settings->arrays.menu_driver, "ozone"))
15545 {
15546 CONFIG_BOOL(
15547 list, list_info,
15548 &settings->bools.menu_use_preferred_system_color_theme,
15549 MENU_ENUM_LABEL_MENU_USE_PREFERRED_SYSTEM_COLOR_THEME,
15550 MENU_ENUM_LABEL_VALUE_MENU_USE_PREFERRED_SYSTEM_COLOR_THEME,
15551 DEFAULT_MENU_USE_PREFERRED_SYSTEM_COLOR_THEME,
15552 MENU_ENUM_LABEL_VALUE_OFF,
15553 MENU_ENUM_LABEL_VALUE_ON,
15554 &group_info,
15555 &subgroup_info,
15556 parent_group,
15557 general_write_handler,
15558 general_read_handler,
15559 SD_FLAG_NONE);
15560 (*list)[list_info->index - 1].action_ok = &setting_bool_action_left_with_refresh;
15561 (*list)[list_info->index - 1].action_left = &setting_bool_action_left_with_refresh;
15562 (*list)[list_info->index - 1].action_right = &setting_bool_action_right_with_refresh;
15563 }
15564
15565 CONFIG_BOOL(
15566 list, list_info,
15567 &settings->bools.menu_show_load_core,
15568 MENU_ENUM_LABEL_MENU_SHOW_LOAD_CORE,
15569 MENU_ENUM_LABEL_VALUE_MENU_SHOW_LOAD_CORE,
15570 menu_show_load_core,
15571 MENU_ENUM_LABEL_VALUE_OFF,
15572 MENU_ENUM_LABEL_VALUE_ON,
15573 &group_info,
15574 &subgroup_info,
15575 parent_group,
15576 general_write_handler,
15577 general_read_handler,
15578 SD_FLAG_NONE);
15579
15580 CONFIG_BOOL(
15581 list, list_info,
15582 &settings->bools.menu_show_load_content,
15583 MENU_ENUM_LABEL_MENU_SHOW_LOAD_CONTENT,
15584 MENU_ENUM_LABEL_VALUE_MENU_SHOW_LOAD_CONTENT,
15585 menu_show_load_content,
15586 MENU_ENUM_LABEL_VALUE_OFF,
15587 MENU_ENUM_LABEL_VALUE_ON,
15588 &group_info,
15589 &subgroup_info,
15590 parent_group,
15591 general_write_handler,
15592 general_read_handler,
15593 SD_FLAG_NONE);
15594
15595 #ifdef HAVE_CDROM
15596 CONFIG_BOOL(
15597 list, list_info,
15598 &settings->bools.menu_show_load_disc,
15599 MENU_ENUM_LABEL_MENU_SHOW_LOAD_DISC,
15600 MENU_ENUM_LABEL_VALUE_MENU_SHOW_LOAD_DISC,
15601 menu_show_load_disc,
15602 MENU_ENUM_LABEL_VALUE_OFF,
15603 MENU_ENUM_LABEL_VALUE_ON,
15604 &group_info,
15605 &subgroup_info,
15606 parent_group,
15607 general_write_handler,
15608 general_read_handler,
15609 SD_FLAG_NONE);
15610
15611 CONFIG_BOOL(
15612 list, list_info,
15613 &settings->bools.menu_show_dump_disc,
15614 MENU_ENUM_LABEL_MENU_SHOW_DUMP_DISC,
15615 MENU_ENUM_LABEL_VALUE_MENU_SHOW_DUMP_DISC,
15616 menu_show_dump_disc,
15617 MENU_ENUM_LABEL_VALUE_OFF,
15618 MENU_ENUM_LABEL_VALUE_ON,
15619 &group_info,
15620 &subgroup_info,
15621 parent_group,
15622 general_write_handler,
15623 general_read_handler,
15624 SD_FLAG_NONE);
15625 #endif
15626
15627 CONFIG_BOOL(
15628 list, list_info,
15629 &settings->bools.menu_show_information,
15630 MENU_ENUM_LABEL_MENU_SHOW_INFORMATION,
15631 MENU_ENUM_LABEL_VALUE_MENU_SHOW_INFORMATION,
15632 menu_show_information,
15633 MENU_ENUM_LABEL_VALUE_OFF,
15634 MENU_ENUM_LABEL_VALUE_ON,
15635 &group_info,
15636 &subgroup_info,
15637 parent_group,
15638 general_write_handler,
15639 general_read_handler,
15640 SD_FLAG_NONE);
15641
15642 CONFIG_BOOL(
15643 list, list_info,
15644 &settings->bools.menu_show_configurations,
15645 MENU_ENUM_LABEL_MENU_SHOW_CONFIGURATIONS,
15646 MENU_ENUM_LABEL_VALUE_MENU_SHOW_CONFIGURATIONS,
15647 menu_show_configurations,
15648 MENU_ENUM_LABEL_VALUE_OFF,
15649 MENU_ENUM_LABEL_VALUE_ON,
15650 &group_info,
15651 &subgroup_info,
15652 parent_group,
15653 general_write_handler,
15654 general_read_handler,
15655 SD_FLAG_LAKKA_ADVANCED);
15656
15657 CONFIG_BOOL(
15658 list, list_info,
15659 &settings->bools.menu_show_overlays,
15660 MENU_ENUM_LABEL_CONTENT_SHOW_OVERLAYS,
15661 MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_OVERLAYS,
15662 true,
15663 MENU_ENUM_LABEL_VALUE_OFF,
15664 MENU_ENUM_LABEL_VALUE_ON,
15665 &group_info,
15666 &subgroup_info,
15667 parent_group,
15668 general_write_handler,
15669 general_read_handler,
15670 SD_FLAG_LAKKA_ADVANCED);
15671
15672 #ifdef HAVE_VIDEO_LAYOUT
15673 CONFIG_BOOL(
15674 list, list_info,
15675 &settings->bools.menu_show_video_layout,
15676 MENU_ENUM_LABEL_CONTENT_SHOW_VIDEO_LAYOUT,
15677 MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_VIDEO_LAYOUT,
15678 true,
15679 MENU_ENUM_LABEL_VALUE_OFF,
15680 MENU_ENUM_LABEL_VALUE_ON,
15681 &group_info,
15682 &subgroup_info,
15683 parent_group,
15684 general_write_handler,
15685 general_read_handler,
15686 SD_FLAG_LAKKA_ADVANCED);
15687 #endif
15688
15689 CONFIG_BOOL(
15690 list, list_info,
15691 &settings->bools.menu_show_latency,
15692 MENU_ENUM_LABEL_CONTENT_SHOW_LATENCY,
15693 MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_LATENCY,
15694 true,
15695 MENU_ENUM_LABEL_VALUE_OFF,
15696 MENU_ENUM_LABEL_VALUE_ON,
15697 &group_info,
15698 &subgroup_info,
15699 parent_group,
15700 general_write_handler,
15701 general_read_handler,
15702 SD_FLAG_LAKKA_ADVANCED);
15703
15704 CONFIG_BOOL(
15705 list, list_info,
15706 &settings->bools.menu_show_rewind,
15707 MENU_ENUM_LABEL_CONTENT_SHOW_REWIND,
15708 MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_REWIND,
15709 true,
15710 MENU_ENUM_LABEL_VALUE_OFF,
15711 MENU_ENUM_LABEL_VALUE_ON,
15712 &group_info,
15713 &subgroup_info,
15714 parent_group,
15715 general_write_handler,
15716 general_read_handler,
15717 SD_FLAG_LAKKA_ADVANCED);
15718
15719 CONFIG_BOOL(
15720 list, list_info,
15721 &settings->bools.menu_show_help,
15722 MENU_ENUM_LABEL_MENU_SHOW_HELP,
15723 MENU_ENUM_LABEL_VALUE_MENU_SHOW_HELP,
15724 menu_show_help,
15725 MENU_ENUM_LABEL_VALUE_OFF,
15726 MENU_ENUM_LABEL_VALUE_ON,
15727 &group_info,
15728 &subgroup_info,
15729 parent_group,
15730 general_write_handler,
15731 general_read_handler,
15732 SD_FLAG_LAKKA_ADVANCED);
15733
15734 #ifdef HAVE_LAKKA
15735 CONFIG_BOOL(
15736 list, list_info,
15737 &settings->bools.menu_show_quit_retroarch,
15738 MENU_ENUM_LABEL_MENU_SHOW_QUIT_RETROARCH,
15739 MENU_ENUM_LABEL_VALUE_MENU_SHOW_RESTART_RETROARCH,
15740 menu_show_quit_retroarch,
15741 MENU_ENUM_LABEL_VALUE_OFF,
15742 MENU_ENUM_LABEL_VALUE_ON,
15743 &group_info,
15744 &subgroup_info,
15745 parent_group,
15746 general_write_handler,
15747 general_read_handler,
15748 SD_FLAG_NONE);
15749 #else
15750 CONFIG_BOOL(
15751 list, list_info,
15752 &settings->bools.menu_show_quit_retroarch,
15753 MENU_ENUM_LABEL_MENU_SHOW_QUIT_RETROARCH,
15754 MENU_ENUM_LABEL_VALUE_MENU_SHOW_QUIT_RETROARCH,
15755 menu_show_quit_retroarch,
15756 MENU_ENUM_LABEL_VALUE_OFF,
15757 MENU_ENUM_LABEL_VALUE_ON,
15758 &group_info,
15759 &subgroup_info,
15760 parent_group,
15761 general_write_handler,
15762 general_read_handler,
15763 SD_FLAG_NONE);
15764 #endif
15765
15766 #if defined(HAVE_LAKKA) || defined(HAVE_ODROIDGO2)
15767 CONFIG_BOOL(
15768 list, list_info,
15769 &settings->bools.menu_show_reboot,
15770 MENU_ENUM_LABEL_MENU_SHOW_REBOOT,
15771 MENU_ENUM_LABEL_VALUE_MENU_SHOW_REBOOT,
15772 menu_show_reboot,
15773 MENU_ENUM_LABEL_VALUE_OFF,
15774 MENU_ENUM_LABEL_VALUE_ON,
15775 &group_info,
15776 &subgroup_info,
15777 parent_group,
15778 general_write_handler,
15779 general_read_handler,
15780 SD_FLAG_NONE);
15781
15782 CONFIG_BOOL(
15783 list, list_info,
15784 &settings->bools.menu_show_shutdown,
15785 MENU_ENUM_LABEL_MENU_SHOW_SHUTDOWN,
15786 MENU_ENUM_LABEL_VALUE_MENU_SHOW_SHUTDOWN,
15787 menu_show_shutdown,
15788 MENU_ENUM_LABEL_VALUE_OFF,
15789 MENU_ENUM_LABEL_VALUE_ON,
15790 &group_info,
15791 &subgroup_info,
15792 parent_group,
15793 general_write_handler,
15794 general_read_handler,
15795 SD_FLAG_NONE);
15796 #else
15797 #if !defined(IOS)
15798 if (frontend_driver_has_fork())
15799 CONFIG_BOOL(
15800 list, list_info,
15801 &settings->bools.menu_show_restart_retroarch,
15802 MENU_ENUM_LABEL_MENU_SHOW_RESTART_RETROARCH,
15803 MENU_ENUM_LABEL_VALUE_MENU_SHOW_RESTART_RETROARCH,
15804 menu_show_restart_retroarch,
15805 MENU_ENUM_LABEL_VALUE_OFF,
15806 MENU_ENUM_LABEL_VALUE_ON,
15807 &group_info,
15808 &subgroup_info,
15809 parent_group,
15810 general_write_handler,
15811 general_read_handler,
15812 SD_FLAG_NONE);
15813 #endif
15814 #endif
15815
15816 #if defined(HAVE_XMB) || defined(HAVE_OZONE)
15817 if (string_is_equal(settings->arrays.menu_driver, "xmb") || string_is_equal(settings->arrays.menu_driver, "ozone"))
15818 {
15819 CONFIG_BOOL(
15820 list, list_info,
15821 &settings->bools.menu_content_show_settings,
15822 MENU_ENUM_LABEL_CONTENT_SHOW_SETTINGS,
15823 MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_SETTINGS,
15824 content_show_settings,
15825 MENU_ENUM_LABEL_VALUE_OFF,
15826 MENU_ENUM_LABEL_VALUE_ON,
15827 &group_info,
15828 &subgroup_info,
15829 parent_group,
15830 general_write_handler,
15831 general_read_handler,
15832 SD_FLAG_NONE);
15833 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED);
15834
15835 CONFIG_STRING(
15836 list, list_info,
15837 settings->paths.menu_content_show_settings_password,
15838 sizeof(settings->paths.menu_content_show_settings_password),
15839 MENU_ENUM_LABEL_CONTENT_SHOW_SETTINGS_PASSWORD,
15840 MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_SETTINGS_PASSWORD,
15841 "",
15842 &group_info,
15843 &subgroup_info,
15844 parent_group,
15845 general_write_handler,
15846 general_read_handler);
15847 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ALLOW_INPUT | SD_FLAG_LAKKA_ADVANCED);
15848 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_PASSWORD_LINE_EDIT;
15849 (*list)[list_info->index - 1].action_start = setting_generic_action_start_default;
15850 }
15851 #endif
15852
15853 CONFIG_BOOL(
15854 list, list_info,
15855 &settings->bools.menu_content_show_favorites,
15856 MENU_ENUM_LABEL_CONTENT_SHOW_FAVORITES,
15857 MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_FAVORITES,
15858 content_show_favorites,
15859 MENU_ENUM_LABEL_VALUE_OFF,
15860 MENU_ENUM_LABEL_VALUE_ON,
15861 &group_info,
15862 &subgroup_info,
15863 parent_group,
15864 general_write_handler,
15865 general_read_handler,
15866 SD_FLAG_NONE);
15867
15868 #ifdef HAVE_IMAGEVIEWER
15869 CONFIG_BOOL(
15870 list, list_info,
15871 &settings->bools.menu_content_show_images,
15872 MENU_ENUM_LABEL_CONTENT_SHOW_IMAGES,
15873 MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_IMAGES,
15874 content_show_images,
15875 MENU_ENUM_LABEL_VALUE_OFF,
15876 MENU_ENUM_LABEL_VALUE_ON,
15877 &group_info,
15878 &subgroup_info,
15879 parent_group,
15880 general_write_handler,
15881 general_read_handler,
15882 SD_FLAG_NONE);
15883 #endif
15884
15885 CONFIG_BOOL(
15886 list, list_info,
15887 &settings->bools.menu_content_show_music,
15888 MENU_ENUM_LABEL_CONTENT_SHOW_MUSIC,
15889 MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_MUSIC,
15890 content_show_music,
15891 MENU_ENUM_LABEL_VALUE_OFF,
15892 MENU_ENUM_LABEL_VALUE_ON,
15893 &group_info,
15894 &subgroup_info,
15895 parent_group,
15896 general_write_handler,
15897 general_read_handler,
15898 SD_FLAG_NONE);
15899
15900 #if defined(HAVE_FFMPEG) || defined(HAVE_MPV)
15901 CONFIG_BOOL(
15902 list, list_info,
15903 &settings->bools.menu_content_show_video,
15904 MENU_ENUM_LABEL_CONTENT_SHOW_VIDEO,
15905 MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_VIDEO,
15906 content_show_video,
15907 MENU_ENUM_LABEL_VALUE_OFF,
15908 MENU_ENUM_LABEL_VALUE_ON,
15909 &group_info,
15910 &subgroup_info,
15911 parent_group,
15912 general_write_handler,
15913 general_read_handler,
15914 SD_FLAG_NONE);
15915 #endif
15916
15917 CONFIG_BOOL(
15918 list, list_info,
15919 &settings->bools.menu_content_show_history,
15920 MENU_ENUM_LABEL_CONTENT_SHOW_HISTORY,
15921 MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_HISTORY,
15922 content_show_history,
15923 MENU_ENUM_LABEL_VALUE_OFF,
15924 MENU_ENUM_LABEL_VALUE_ON,
15925 &group_info,
15926 &subgroup_info,
15927 parent_group,
15928 general_write_handler,
15929 general_read_handler,
15930 SD_FLAG_NONE);
15931
15932 #ifdef HAVE_NETWORKING
15933 CONFIG_BOOL(
15934 list, list_info,
15935 &settings->bools.menu_content_show_netplay,
15936 MENU_ENUM_LABEL_CONTENT_SHOW_NETPLAY,
15937 MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_NETPLAY,
15938 content_show_netplay,
15939 MENU_ENUM_LABEL_VALUE_OFF,
15940 MENU_ENUM_LABEL_VALUE_ON,
15941 &group_info,
15942 &subgroup_info,
15943 parent_group,
15944 general_write_handler,
15945 general_read_handler,
15946 SD_FLAG_NONE);
15947 #endif
15948
15949 #if defined(HAVE_XMB) || defined(HAVE_OZONE)
15950 if (string_is_equal(settings->arrays.menu_driver, "xmb") ||
15951 string_is_equal(settings->arrays.menu_driver, "ozone"))
15952 {
15953 CONFIG_BOOL(
15954 list, list_info,
15955 &settings->bools.menu_content_show_add,
15956 MENU_ENUM_LABEL_CONTENT_SHOW_ADD,
15957 MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD,
15958 DEFAULT_MENU_CONTENT_SHOW_ADD,
15959 MENU_ENUM_LABEL_VALUE_OFF,
15960 MENU_ENUM_LABEL_VALUE_ON,
15961 &group_info,
15962 &subgroup_info,
15963 parent_group,
15964 general_write_handler,
15965 general_read_handler,
15966 SD_FLAG_NONE);
15967 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED);
15968 }
15969 else
15970 #endif
15971 {
15972 CONFIG_UINT(
15973 list, list_info,
15974 &settings->uints.menu_content_show_add_entry,
15975 MENU_ENUM_LABEL_CONTENT_SHOW_ADD_ENTRY,
15976 MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD_ENTRY,
15977 DEFAULT_MENU_CONTENT_SHOW_ADD_ENTRY,
15978 &group_info,
15979 &subgroup_info,
15980 parent_group,
15981 general_write_handler,
15982 general_read_handler);
15983 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
15984 (*list)[list_info->index - 1].get_string_representation =
15985 &setting_get_string_representation_uint_menu_add_content_entry_display_type;
15986 menu_settings_list_current_add_range(list, list_info, 0, MENU_ADD_CONTENT_ENTRY_DISPLAY_LAST-1, 1, true, true);
15987 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_COMBOBOX;
15988 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED);
15989 }
15990
15991 CONFIG_BOOL(
15992 list, list_info,
15993 &settings->bools.menu_content_show_playlists,
15994 MENU_ENUM_LABEL_CONTENT_SHOW_PLAYLISTS,
15995 MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_PLAYLISTS,
15996 content_show_playlists,
15997 MENU_ENUM_LABEL_VALUE_OFF,
15998 MENU_ENUM_LABEL_VALUE_ON,
15999 &group_info,
16000 &subgroup_info,
16001 parent_group,
16002 general_write_handler,
16003 general_read_handler,
16004 SD_FLAG_NONE);
16005
16006 #if defined(HAVE_LIBRETRODB)
16007 CONFIG_BOOL(
16008 list, list_info,
16009 &settings->bools.menu_content_show_explore,
16010 MENU_ENUM_LABEL_CONTENT_SHOW_EXPLORE,
16011 MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_EXPLORE,
16012 DEFAULT_MENU_CONTENT_SHOW_EXPLORE,
16013 MENU_ENUM_LABEL_VALUE_OFF,
16014 MENU_ENUM_LABEL_VALUE_ON,
16015 &group_info,
16016 &subgroup_info,
16017 parent_group,
16018 general_write_handler,
16019 general_read_handler,
16020 SD_FLAG_NONE);
16021 #endif
16022
16023 #ifdef HAVE_MATERIALUI
16024 if (string_is_equal(settings->arrays.menu_driver, "glui"))
16025 {
16026 /* only MaterialUI uses these values, don't show
16027 * them on other drivers. */
16028 CONFIG_BOOL(
16029 list, list_info,
16030 &settings->bools.menu_materialui_icons_enable,
16031 MENU_ENUM_LABEL_MATERIALUI_ICONS_ENABLE,
16032 MENU_ENUM_LABEL_VALUE_MATERIALUI_ICONS_ENABLE,
16033 DEFAULT_MATERIALUI_ICONS_ENABLE,
16034 MENU_ENUM_LABEL_VALUE_OFF,
16035 MENU_ENUM_LABEL_VALUE_ON,
16036 &group_info,
16037 &subgroup_info,
16038 parent_group,
16039 general_write_handler,
16040 general_read_handler,
16041 SD_FLAG_ADVANCED);
16042 (*list)[list_info->index - 1].action_ok = &setting_bool_action_left_with_refresh;
16043 (*list)[list_info->index - 1].action_left = &setting_bool_action_left_with_refresh;
16044 (*list)[list_info->index - 1].action_right = &setting_bool_action_right_with_refresh;
16045
16046 CONFIG_BOOL(
16047 list, list_info,
16048 &settings->bools.menu_materialui_playlist_icons_enable,
16049 MENU_ENUM_LABEL_MATERIALUI_PLAYLIST_ICONS_ENABLE,
16050 MENU_ENUM_LABEL_VALUE_MATERIALUI_PLAYLIST_ICONS_ENABLE,
16051 DEFAULT_MATERIALUI_PLAYLIST_ICONS_ENABLE,
16052 MENU_ENUM_LABEL_VALUE_OFF,
16053 MENU_ENUM_LABEL_VALUE_ON,
16054 &group_info,
16055 &subgroup_info,
16056 parent_group,
16057 general_write_handler,
16058 general_read_handler,
16059 SD_FLAG_NONE);
16060
16061 CONFIG_UINT(
16062 list, list_info,
16063 &settings->uints.menu_materialui_color_theme,
16064 MENU_ENUM_LABEL_MATERIALUI_MENU_COLOR_THEME,
16065 MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_COLOR_THEME,
16066 DEFAULT_MATERIALUI_THEME,
16067 &group_info,
16068 &subgroup_info,
16069 parent_group,
16070 general_write_handler,
16071 general_read_handler);
16072 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
16073 (*list)[list_info->index - 1].get_string_representation =
16074 &setting_get_string_representation_uint_materialui_menu_color_theme;
16075 menu_settings_list_current_add_range(list, list_info, 0, MATERIALUI_THEME_LAST-1, 1, true, true);
16076 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_COMBOBOX;
16077
16078 CONFIG_UINT(
16079 list, list_info,
16080 &settings->uints.menu_materialui_transition_animation,
16081 MENU_ENUM_LABEL_MATERIALUI_MENU_TRANSITION_ANIMATION,
16082 MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_TRANSITION_ANIMATION,
16083 DEFAULT_MATERIALUI_TRANSITION_ANIM,
16084 &group_info,
16085 &subgroup_info,
16086 parent_group,
16087 general_write_handler,
16088 general_read_handler);
16089 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
16090 (*list)[list_info->index - 1].get_string_representation =
16091 &setting_get_string_representation_uint_materialui_menu_transition_animation;
16092 menu_settings_list_current_add_range(list, list_info, 0, MATERIALUI_TRANSITION_ANIM_LAST-1, 1, true, true);
16093 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_COMBOBOX;
16094
16095 CONFIG_UINT(
16096 list, list_info,
16097 &settings->uints.menu_materialui_landscape_layout_optimization,
16098 MENU_ENUM_LABEL_MATERIALUI_LANDSCAPE_LAYOUT_OPTIMIZATION,
16099 MENU_ENUM_LABEL_VALUE_MATERIALUI_LANDSCAPE_LAYOUT_OPTIMIZATION,
16100 DEFAULT_MATERIALUI_LANDSCAPE_LAYOUT_OPTIMIZATION,
16101 &group_info,
16102 &subgroup_info,
16103 parent_group,
16104 general_write_handler,
16105 general_read_handler);
16106 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
16107 (*list)[list_info->index - 1].get_string_representation =
16108 &setting_get_string_representation_uint_materialui_landscape_layout_optimization;
16109 menu_settings_list_current_add_range(list, list_info, 0, MATERIALUI_LANDSCAPE_LAYOUT_OPTIMIZATION_LAST-1, 1, true, true);
16110 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_COMBOBOX;
16111
16112 CONFIG_BOOL(
16113 list, list_info,
16114 &settings->bools.menu_materialui_show_nav_bar,
16115 MENU_ENUM_LABEL_MATERIALUI_SHOW_NAV_BAR,
16116 MENU_ENUM_LABEL_VALUE_MATERIALUI_SHOW_NAV_BAR,
16117 DEFAULT_MATERIALUI_SHOW_NAV_BAR,
16118 MENU_ENUM_LABEL_VALUE_OFF,
16119 MENU_ENUM_LABEL_VALUE_ON,
16120 &group_info,
16121 &subgroup_info,
16122 parent_group,
16123 general_write_handler,
16124 general_read_handler,
16125 SD_FLAG_NONE);
16126 (*list)[list_info->index - 1].action_ok = &setting_bool_action_left_with_refresh;
16127 (*list)[list_info->index - 1].action_left = &setting_bool_action_left_with_refresh;
16128 (*list)[list_info->index - 1].action_right = &setting_bool_action_right_with_refresh;
16129
16130 CONFIG_BOOL(
16131 list, list_info,
16132 &settings->bools.menu_materialui_auto_rotate_nav_bar,
16133 MENU_ENUM_LABEL_MATERIALUI_AUTO_ROTATE_NAV_BAR,
16134 MENU_ENUM_LABEL_VALUE_MATERIALUI_AUTO_ROTATE_NAV_BAR,
16135 DEFAULT_MATERIALUI_AUTO_ROTATE_NAV_BAR,
16136 MENU_ENUM_LABEL_VALUE_OFF,
16137 MENU_ENUM_LABEL_VALUE_ON,
16138 &group_info,
16139 &subgroup_info,
16140 parent_group,
16141 general_write_handler,
16142 general_read_handler,
16143 SD_FLAG_NONE);
16144
16145 CONFIG_UINT(
16146 list, list_info,
16147 &settings->uints.menu_materialui_thumbnail_view_portrait,
16148 MENU_ENUM_LABEL_MATERIALUI_MENU_THUMBNAIL_VIEW_PORTRAIT,
16149 MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_THUMBNAIL_VIEW_PORTRAIT,
16150 DEFAULT_MATERIALUI_THUMBNAIL_VIEW_PORTRAIT,
16151 &group_info,
16152 &subgroup_info,
16153 parent_group,
16154 general_write_handler,
16155 general_read_handler);
16156 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
16157 (*list)[list_info->index - 1].get_string_representation =
16158 &setting_get_string_representation_uint_materialui_menu_thumbnail_view_portrait;
16159 menu_settings_list_current_add_range(list, list_info, 0, MATERIALUI_THUMBNAIL_VIEW_PORTRAIT_LAST-1, 1, true, true);
16160 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_COMBOBOX;
16161
16162 CONFIG_UINT(
16163 list, list_info,
16164 &settings->uints.menu_materialui_thumbnail_view_landscape,
16165 MENU_ENUM_LABEL_MATERIALUI_MENU_THUMBNAIL_VIEW_LANDSCAPE,
16166 MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_THUMBNAIL_VIEW_LANDSCAPE,
16167 DEFAULT_MATERIALUI_THUMBNAIL_VIEW_LANDSCAPE,
16168 &group_info,
16169 &subgroup_info,
16170 parent_group,
16171 general_write_handler,
16172 general_read_handler);
16173 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
16174 (*list)[list_info->index - 1].get_string_representation =
16175 &setting_get_string_representation_uint_materialui_menu_thumbnail_view_landscape;
16176 menu_settings_list_current_add_range(list, list_info, 0, MATERIALUI_THUMBNAIL_VIEW_LANDSCAPE_LAST-1, 1, true, true);
16177 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_COMBOBOX;
16178
16179 CONFIG_BOOL(
16180 list, list_info,
16181 &settings->bools.menu_materialui_dual_thumbnail_list_view_enable,
16182 MENU_ENUM_LABEL_MATERIALUI_DUAL_THUMBNAIL_LIST_VIEW_ENABLE,
16183 MENU_ENUM_LABEL_VALUE_MATERIALUI_DUAL_THUMBNAIL_LIST_VIEW_ENABLE,
16184 DEFAULT_MATERIALUI_DUAL_THUMBNAIL_LIST_VIEW_ENABLE,
16185 MENU_ENUM_LABEL_VALUE_OFF,
16186 MENU_ENUM_LABEL_VALUE_ON,
16187 &group_info,
16188 &subgroup_info,
16189 parent_group,
16190 general_write_handler,
16191 general_read_handler,
16192 SD_FLAG_NONE);
16193
16194 CONFIG_BOOL(
16195 list, list_info,
16196 &settings->bools.menu_materialui_thumbnail_background_enable,
16197 MENU_ENUM_LABEL_MATERIALUI_THUMBNAIL_BACKGROUND_ENABLE,
16198 MENU_ENUM_LABEL_VALUE_MATERIALUI_THUMBNAIL_BACKGROUND_ENABLE,
16199 DEFAULT_MATERIALUI_THUMBNAIL_BACKGROUND_ENABLE,
16200 MENU_ENUM_LABEL_VALUE_OFF,
16201 MENU_ENUM_LABEL_VALUE_ON,
16202 &group_info,
16203 &subgroup_info,
16204 parent_group,
16205 general_write_handler,
16206 general_read_handler,
16207 SD_FLAG_NONE);
16208
16209 /* TODO: These should be removed entirely, but just
16210 * comment out for now in case users complain...
16211 CONFIG_FLOAT(
16212 list, list_info,
16213 &settings->floats.menu_header_opacity,
16214 MENU_ENUM_LABEL_MATERIALUI_MENU_HEADER_OPACITY,
16215 MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_HEADER_OPACITY,
16216 menu_header_opacity,
16217 "%.3f",
16218 &group_info,
16219 &subgroup_info,
16220 parent_group,
16221 general_write_handler,
16222 general_read_handler);
16223 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
16224 menu_settings_list_current_add_range(list, list_info, 0.0, 1.0, 0.010, true, true);
16225
16226 CONFIG_FLOAT(
16227 list, list_info,
16228 &settings->floats.menu_footer_opacity,
16229 MENU_ENUM_LABEL_MATERIALUI_MENU_FOOTER_OPACITY,
16230 MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_FOOTER_OPACITY,
16231 menu_footer_opacity,
16232 "%.3f",
16233 &group_info,
16234 &subgroup_info,
16235 parent_group,
16236 general_write_handler,
16237 general_read_handler);
16238 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
16239 menu_settings_list_current_add_range(list, list_info, 0.0, 1.0, 0.010, true, true);
16240 (*list)[list_info->index - 1].ui_type
16241 = ST_UI_TYPE_FLOAT_SLIDER_AND_SPINBOX;
16242 */
16243 }
16244 #endif
16245
16246 #ifdef HAVE_OZONE
16247 if (string_is_equal(settings->arrays.menu_driver, "ozone"))
16248 {
16249 CONFIG_UINT(
16250 list, list_info,
16251 &settings->uints.menu_ozone_color_theme,
16252 MENU_ENUM_LABEL_OZONE_MENU_COLOR_THEME,
16253 MENU_ENUM_LABEL_VALUE_OZONE_MENU_COLOR_THEME,
16254 DEFAULT_OZONE_COLOR_THEME,
16255 &group_info,
16256 &subgroup_info,
16257 parent_group,
16258 general_write_handler,
16259 general_read_handler);
16260 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
16261 (*list)[list_info->index - 1].get_string_representation =
16262 &setting_get_string_representation_uint_ozone_menu_color_theme;
16263 menu_settings_list_current_add_range(list, list_info, 0, OZONE_COLOR_THEME_LAST-1, 1, true, true);
16264 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_COMBOBOX;
16265
16266 CONFIG_BOOL(
16267 list, list_info,
16268 &settings->bools.ozone_collapse_sidebar,
16269 MENU_ENUM_LABEL_OZONE_COLLAPSE_SIDEBAR,
16270 MENU_ENUM_LABEL_VALUE_OZONE_COLLAPSE_SIDEBAR,
16271 DEFAULT_OZONE_COLLAPSE_SIDEBAR,
16272 MENU_ENUM_LABEL_VALUE_OFF,
16273 MENU_ENUM_LABEL_VALUE_ON,
16274 &group_info,
16275 &subgroup_info,
16276 parent_group,
16277 general_write_handler,
16278 general_read_handler,
16279 SD_FLAG_NONE);
16280
16281 CONFIG_BOOL(
16282 list, list_info,
16283 &settings->bools.ozone_scroll_content_metadata,
16284 MENU_ENUM_LABEL_OZONE_SCROLL_CONTENT_METADATA,
16285 MENU_ENUM_LABEL_VALUE_OZONE_SCROLL_CONTENT_METADATA,
16286 DEFAULT_OZONE_SCROLL_CONTENT_METADATA,
16287 MENU_ENUM_LABEL_VALUE_OFF,
16288 MENU_ENUM_LABEL_VALUE_ON,
16289 &group_info,
16290 &subgroup_info,
16291 parent_group,
16292 general_write_handler,
16293 general_read_handler,
16294 SD_FLAG_NONE);
16295 }
16296 #endif
16297
16298 CONFIG_BOOL(
16299 list, list_info,
16300 &settings->bools.menu_show_start_screen,
16301 MENU_ENUM_LABEL_RGUI_SHOW_START_SCREEN,
16302 MENU_ENUM_LABEL_VALUE_RGUI_SHOW_START_SCREEN,
16303 DEFAULT_MENU_SHOW_START_SCREEN,
16304 MENU_ENUM_LABEL_VALUE_OFF,
16305 MENU_ENUM_LABEL_VALUE_ON,
16306 &group_info,
16307 &subgroup_info,
16308 parent_group,
16309 general_write_handler,
16310 general_read_handler,
16311 SD_FLAG_ADVANCED);
16312
16313 if (string_is_equal(settings->arrays.menu_driver, "rgui"))
16314 {
16315 CONFIG_BOOL(
16316 list, list_info,
16317 &settings->bools.menu_rgui_inline_thumbnails,
16318 MENU_ENUM_LABEL_MENU_RGUI_INLINE_THUMBNAILS,
16319 MENU_ENUM_LABEL_VALUE_MENU_RGUI_INLINE_THUMBNAILS,
16320 rgui_inline_thumbnails,
16321 MENU_ENUM_LABEL_VALUE_OFF,
16322 MENU_ENUM_LABEL_VALUE_ON,
16323 &group_info,
16324 &subgroup_info,
16325 parent_group,
16326 general_write_handler,
16327 general_read_handler,
16328 SD_FLAG_NONE);
16329
16330 CONFIG_BOOL(
16331 list, list_info,
16332 &settings->bools.menu_rgui_swap_thumbnails,
16333 MENU_ENUM_LABEL_MENU_RGUI_SWAP_THUMBNAILS,
16334 MENU_ENUM_LABEL_VALUE_MENU_RGUI_SWAP_THUMBNAILS,
16335 rgui_swap_thumbnails,
16336 MENU_ENUM_LABEL_VALUE_OFF,
16337 MENU_ENUM_LABEL_VALUE_ON,
16338 &group_info,
16339 &subgroup_info,
16340 parent_group,
16341 general_write_handler,
16342 general_read_handler,
16343 SD_FLAG_NONE);
16344 }
16345
16346 if (string_is_equal(settings->arrays.menu_driver, "xmb") ||
16347 string_is_equal(settings->arrays.menu_driver, "ozone") ||
16348 string_is_equal(settings->arrays.menu_driver, "rgui") ||
16349 string_is_equal(settings->arrays.menu_driver, "glui"))
16350 {
16351 enum msg_hash_enums thumbnails_label_value;
16352 enum msg_hash_enums left_thumbnails_label_value;
16353
16354 if (string_is_equal(settings->arrays.menu_driver, "rgui"))
16355 {
16356 thumbnails_label_value = MENU_ENUM_LABEL_VALUE_THUMBNAILS_RGUI;
16357 left_thumbnails_label_value = MENU_ENUM_LABEL_VALUE_LEFT_THUMBNAILS_RGUI;
16358 }
16359 else if (string_is_equal(settings->arrays.menu_driver, "ozone"))
16360 {
16361 thumbnails_label_value = MENU_ENUM_LABEL_VALUE_THUMBNAILS;
16362 left_thumbnails_label_value = MENU_ENUM_LABEL_VALUE_LEFT_THUMBNAILS_OZONE;
16363 }
16364 else if (string_is_equal(settings->arrays.menu_driver, "glui"))
16365 {
16366 thumbnails_label_value = MENU_ENUM_LABEL_VALUE_THUMBNAILS_MATERIALUI;
16367 left_thumbnails_label_value = MENU_ENUM_LABEL_VALUE_LEFT_THUMBNAILS_MATERIALUI;
16368 }
16369 else
16370 {
16371 thumbnails_label_value = MENU_ENUM_LABEL_VALUE_THUMBNAILS;
16372 left_thumbnails_label_value = MENU_ENUM_LABEL_VALUE_LEFT_THUMBNAILS;
16373 }
16374
16375 CONFIG_UINT(
16376 list, list_info,
16377 &settings->uints.gfx_thumbnails,
16378 MENU_ENUM_LABEL_THUMBNAILS,
16379 thumbnails_label_value,
16380 gfx_thumbnails_default,
16381 &group_info,
16382 &subgroup_info,
16383 parent_group,
16384 general_write_handler,
16385 general_read_handler);
16386 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
16387 (*list)[list_info->index - 1].get_string_representation =
16388 &setting_get_string_representation_uint_menu_thumbnails;
16389 menu_settings_list_current_add_range(list, list_info, 0, 3, 1, true, true);
16390 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_RADIO_BUTTONS;
16391
16392 CONFIG_UINT(
16393 list, list_info,
16394 &settings->uints.menu_left_thumbnails,
16395 MENU_ENUM_LABEL_LEFT_THUMBNAILS,
16396 left_thumbnails_label_value,
16397 menu_left_thumbnails_default,
16398 &group_info,
16399 &subgroup_info,
16400 parent_group,
16401 general_write_handler,
16402 general_read_handler);
16403 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
16404 (*list)[list_info->index - 1].get_string_representation =
16405 &setting_get_string_representation_uint_menu_left_thumbnails;
16406 menu_settings_list_current_add_range(list, list_info, 0, 3, 1, true, true);
16407 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_RADIO_BUTTONS;
16408 }
16409
16410 if (string_is_equal(settings->arrays.menu_driver, "xmb"))
16411 {
16412 CONFIG_BOOL(
16413 list, list_info,
16414 &settings->bools.menu_xmb_vertical_thumbnails,
16415 MENU_ENUM_LABEL_XMB_VERTICAL_THUMBNAILS,
16416 MENU_ENUM_LABEL_VALUE_XMB_VERTICAL_THUMBNAILS,
16417 xmb_vertical_thumbnails,
16418 MENU_ENUM_LABEL_VALUE_OFF,
16419 MENU_ENUM_LABEL_VALUE_ON,
16420 &group_info,
16421 &subgroup_info,
16422 parent_group,
16423 general_write_handler,
16424 general_read_handler,
16425 SD_FLAG_NONE);
16426
16427 CONFIG_UINT(
16428 list, list_info,
16429 &settings->uints.menu_xmb_thumbnail_scale_factor,
16430 MENU_ENUM_LABEL_MENU_XMB_THUMBNAIL_SCALE_FACTOR,
16431 MENU_ENUM_LABEL_VALUE_MENU_XMB_THUMBNAIL_SCALE_FACTOR,
16432 xmb_thumbnail_scale_factor,
16433 &group_info,
16434 &subgroup_info,
16435 parent_group,
16436 general_write_handler,
16437 general_read_handler);
16438 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
16439 (*list)[list_info->index - 1].offset_by = 30;
16440 menu_settings_list_current_add_range(list, list_info, (*list)[list_info->index - 1].offset_by, 100, 1, true, true);
16441 }
16442
16443 if (string_is_equal(settings->arrays.menu_driver, "xmb") ||
16444 string_is_equal(settings->arrays.menu_driver, "ozone") ||
16445 string_is_equal(settings->arrays.menu_driver, "glui"))
16446 {
16447 CONFIG_UINT(
16448 list, list_info,
16449 &settings->uints.gfx_thumbnail_upscale_threshold,
16450 MENU_ENUM_LABEL_MENU_THUMBNAIL_UPSCALE_THRESHOLD,
16451 MENU_ENUM_LABEL_VALUE_MENU_THUMBNAIL_UPSCALE_THRESHOLD,
16452 gfx_thumbnail_upscale_threshold,
16453 &group_info,
16454 &subgroup_info,
16455 parent_group,
16456 general_write_handler,
16457 general_read_handler);
16458 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint_special;
16459 menu_settings_list_current_add_range(list, list_info, 0, 1024, 256, true, true);
16460 }
16461
16462 if (string_is_equal(settings->arrays.menu_driver, "rgui"))
16463 {
16464 CONFIG_UINT(
16465 list, list_info,
16466 &settings->uints.menu_rgui_thumbnail_downscaler,
16467 MENU_ENUM_LABEL_MENU_RGUI_THUMBNAIL_DOWNSCALER,
16468 MENU_ENUM_LABEL_VALUE_MENU_RGUI_THUMBNAIL_DOWNSCALER,
16469 rgui_thumbnail_downscaler,
16470 &group_info,
16471 &subgroup_info,
16472 parent_group,
16473 general_write_handler,
16474 general_read_handler);
16475 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
16476 (*list)[list_info->index - 1].get_string_representation =
16477 &setting_get_string_representation_uint_rgui_thumbnail_scaler;
16478 menu_settings_list_current_add_range(list, list_info, 0, RGUI_THUMB_SCALE_LAST-1, 1, true, true);
16479 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_RADIO_BUTTONS;
16480
16481 CONFIG_UINT(
16482 list, list_info,
16483 &settings->uints.menu_rgui_thumbnail_delay,
16484 MENU_ENUM_LABEL_MENU_RGUI_THUMBNAIL_DELAY,
16485 MENU_ENUM_LABEL_VALUE_MENU_RGUI_THUMBNAIL_DELAY,
16486 rgui_thumbnail_delay,
16487 &group_info,
16488 &subgroup_info,
16489 parent_group,
16490 general_write_handler,
16491 general_read_handler);
16492 menu_settings_list_current_add_range(list, list_info, 0.0f, 1024.0f, 64.0f, true, true);
16493 }
16494
16495 CONFIG_BOOL(
16496 list, list_info,
16497 &settings->bools.menu_timedate_enable,
16498 MENU_ENUM_LABEL_TIMEDATE_ENABLE,
16499 MENU_ENUM_LABEL_VALUE_TIMEDATE_ENABLE,
16500 DEFAULT_MENU_TIMEDATE_ENABLE,
16501 MENU_ENUM_LABEL_VALUE_OFF,
16502 MENU_ENUM_LABEL_VALUE_ON,
16503 &group_info,
16504 &subgroup_info,
16505 parent_group,
16506 general_write_handler,
16507 general_read_handler,
16508 SD_FLAG_ADVANCED);
16509
16510 CONFIG_UINT(list, list_info,
16511 &settings->uints.menu_timedate_style,
16512 MENU_ENUM_LABEL_TIMEDATE_STYLE,
16513 MENU_ENUM_LABEL_VALUE_TIMEDATE_STYLE,
16514 DEFAULT_MENU_TIMEDATE_STYLE,
16515 &group_info,
16516 &subgroup_info,
16517 parent_group,
16518 general_write_handler,
16519 general_read_handler);
16520 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
16521 (*list)[list_info->index - 1].get_string_representation =
16522 &setting_get_string_representation_uint_menu_timedate_style;
16523 menu_settings_list_current_add_range(list, list_info, 0, MENU_TIMEDATE_STYLE_LAST - 1, 1, true, true);
16524 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_COMBOBOX;
16525
16526 CONFIG_UINT(list, list_info,
16527 &settings->uints.menu_timedate_date_separator,
16528 MENU_ENUM_LABEL_TIMEDATE_DATE_SEPARATOR,
16529 MENU_ENUM_LABEL_VALUE_TIMEDATE_DATE_SEPARATOR,
16530 DEFAULT_MENU_TIMEDATE_DATE_SEPARATOR,
16531 &group_info,
16532 &subgroup_info,
16533 parent_group,
16534 general_write_handler,
16535 general_read_handler);
16536 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
16537 (*list)[list_info->index - 1].get_string_representation =
16538 &setting_get_string_representation_uint_menu_timedate_date_separator;
16539 menu_settings_list_current_add_range(list, list_info, 0, MENU_TIMEDATE_DATE_SEPARATOR_LAST - 1, 1, true, true);
16540 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_COMBOBOX;
16541
16542 CONFIG_BOOL(
16543 list, list_info,
16544 &settings->bools.menu_battery_level_enable,
16545 MENU_ENUM_LABEL_BATTERY_LEVEL_ENABLE,
16546 MENU_ENUM_LABEL_VALUE_BATTERY_LEVEL_ENABLE,
16547 true,
16548 MENU_ENUM_LABEL_VALUE_OFF,
16549 MENU_ENUM_LABEL_VALUE_ON,
16550 &group_info,
16551 &subgroup_info,
16552 parent_group,
16553 general_write_handler,
16554 general_read_handler,
16555 SD_FLAG_ADVANCED);
16556
16557 CONFIG_BOOL(
16558 list, list_info,
16559 &settings->bools.menu_core_enable,
16560 MENU_ENUM_LABEL_CORE_ENABLE,
16561 MENU_ENUM_LABEL_VALUE_CORE_ENABLE,
16562 true,
16563 MENU_ENUM_LABEL_VALUE_OFF,
16564 MENU_ENUM_LABEL_VALUE_ON,
16565 &group_info,
16566 &subgroup_info,
16567 parent_group,
16568 general_write_handler,
16569 general_read_handler,
16570 SD_FLAG_ADVANCED);
16571
16572 CONFIG_BOOL(
16573 list, list_info,
16574 &settings->bools.menu_show_sublabels,
16575 MENU_ENUM_LABEL_MENU_SHOW_SUBLABELS,
16576 MENU_ENUM_LABEL_VALUE_MENU_SHOW_SUBLABELS,
16577 menu_show_sublabels,
16578 MENU_ENUM_LABEL_VALUE_OFF,
16579 MENU_ENUM_LABEL_VALUE_ON,
16580 &group_info,
16581 &subgroup_info,
16582 parent_group,
16583 general_write_handler,
16584 general_read_handler,
16585 SD_FLAG_NONE);
16586
16587 CONFIG_BOOL(
16588 list, list_info,
16589 &settings->bools.use_last_start_directory,
16590 MENU_ENUM_LABEL_USE_LAST_START_DIRECTORY,
16591 MENU_ENUM_LABEL_VALUE_USE_LAST_START_DIRECTORY,
16592 false,
16593 MENU_ENUM_LABEL_VALUE_OFF,
16594 MENU_ENUM_LABEL_VALUE_ON,
16595 &group_info,
16596 &subgroup_info,
16597 parent_group,
16598 general_write_handler,
16599 general_read_handler,
16600 SD_FLAG_NONE);
16601
16602 END_SUB_GROUP(list, list_info, parent_group);
16603 END_GROUP(list, list_info, parent_group);
16604 break;
16605 case SETTINGS_LIST_MENU_FILE_BROWSER:
16606 START_GROUP(list, list_info, &group_info,
16607 msg_hash_to_str(MENU_ENUM_LABEL_VALUE_MENU_FILE_BROWSER_SETTINGS),
16608 parent_group);
16609
16610 parent_group = msg_hash_to_str(MENU_ENUM_LABEL_MENU_FILE_BROWSER_SETTINGS);
16611
16612 START_SUB_GROUP(list, list_info, "State", &group_info, &subgroup_info, parent_group);
16613
16614 CONFIG_BOOL(
16615 list, list_info,
16616 &settings->bools.menu_navigation_browser_filter_supported_extensions_enable,
16617 MENU_ENUM_LABEL_NAVIGATION_BROWSER_FILTER_SUPPORTED_EXTENSIONS_ENABLE,
16618 MENU_ENUM_LABEL_VALUE_NAVIGATION_BROWSER_FILTER_SUPPORTED_EXTENSIONS_ENABLE,
16619 true,
16620 MENU_ENUM_LABEL_VALUE_OFF,
16621 MENU_ENUM_LABEL_VALUE_ON,
16622 &group_info,
16623 &subgroup_info,
16624 parent_group,
16625 general_write_handler,
16626 general_read_handler,
16627 SD_FLAG_NONE);
16628
16629 END_SUB_GROUP(list, list_info, parent_group);
16630 END_GROUP(list, list_info, parent_group);
16631 break;
16632 case SETTINGS_LIST_MULTIMEDIA:
16633 START_GROUP(list, list_info, &group_info,
16634 msg_hash_to_str(MENU_ENUM_LABEL_VALUE_MULTIMEDIA_SETTINGS),
16635 parent_group);
16636
16637 parent_group = msg_hash_to_str(MENU_ENUM_LABEL_SETTINGS);
16638
16639 START_SUB_GROUP(list, list_info, "State", &group_info, &subgroup_info, parent_group);
16640
16641 CONFIG_BOOL(
16642 list, list_info,
16643 &settings->bools.multimedia_builtin_mediaplayer_enable,
16644 MENU_ENUM_LABEL_USE_BUILTIN_PLAYER,
16645 MENU_ENUM_LABEL_VALUE_USE_BUILTIN_PLAYER,
16646 DEFAULT_BUILTIN_MEDIAPLAYER_ENABLE,
16647 MENU_ENUM_LABEL_VALUE_OFF,
16648 MENU_ENUM_LABEL_VALUE_ON,
16649 &group_info,
16650 &subgroup_info,
16651 parent_group,
16652 general_write_handler,
16653 general_read_handler,
16654 SD_FLAG_NONE);
16655
16656 #ifdef HAVE_IMAGEVIEWER
16657 CONFIG_BOOL(
16658 list, list_info,
16659 &settings->bools.multimedia_builtin_imageviewer_enable,
16660 MENU_ENUM_LABEL_USE_BUILTIN_IMAGE_VIEWER,
16661 MENU_ENUM_LABEL_VALUE_USE_BUILTIN_IMAGE_VIEWER,
16662 DEFAULT_BUILTIN_IMAGEVIEWER_ENABLE,
16663 MENU_ENUM_LABEL_VALUE_OFF,
16664 MENU_ENUM_LABEL_VALUE_ON,
16665 &group_info,
16666 &subgroup_info,
16667 parent_group,
16668 general_write_handler,
16669 general_read_handler,
16670 SD_FLAG_NONE);
16671 #endif
16672
16673 CONFIG_BOOL(
16674 list, list_info,
16675 &settings->bools.filter_by_current_core,
16676 MENU_ENUM_LABEL_FILTER_BY_CURRENT_CORE,
16677 MENU_ENUM_LABEL_VALUE_FILTER_BY_CURRENT_CORE,
16678 DEFAULT_FILTER_BY_CURRENT_CORE,
16679 MENU_ENUM_LABEL_VALUE_OFF,
16680 MENU_ENUM_LABEL_VALUE_ON,
16681 &group_info,
16682 &subgroup_info,
16683 parent_group,
16684 general_write_handler,
16685 general_read_handler,
16686 SD_FLAG_NONE);
16687
16688 END_SUB_GROUP(list, list_info, parent_group);
16689 END_GROUP(list, list_info, parent_group);
16690 break;
16691 case SETTINGS_LIST_POWER_MANAGEMENT:
16692 START_GROUP(list, list_info, &group_info,
16693 msg_hash_to_str(MENU_ENUM_LABEL_VALUE_POWER_MANAGEMENT_SETTINGS),
16694 parent_group);
16695 parent_group = msg_hash_to_str(MENU_ENUM_LABEL_POWER_MANAGEMENT_SETTINGS);
16696
16697 START_SUB_GROUP(list, list_info, "State", &group_info, &subgroup_info, parent_group);
16698
16699 #ifdef ANDROID
16700 CONFIG_BOOL(
16701 list, list_info,
16702 &settings->bools.sustained_performance_mode,
16703 MENU_ENUM_LABEL_SUSTAINED_PERFORMANCE_MODE,
16704 MENU_ENUM_LABEL_VALUE_SUSTAINED_PERFORMANCE_MODE,
16705 sustained_performance_mode,
16706 MENU_ENUM_LABEL_VALUE_OFF,
16707 MENU_ENUM_LABEL_VALUE_ON,
16708 &group_info,
16709 &subgroup_info,
16710 parent_group,
16711 general_write_handler,
16712 general_read_handler,
16713 SD_FLAG_CMD_APPLY_AUTO);
16714 #endif
16715
16716 #ifdef HAVE_LAKKA
16717 #ifndef HAVE_LAKKA_SWITCH
16718 CONFIG_ACTION(
16719 list, list_info,
16720 MENU_ENUM_LABEL_CPU_PERFPOWER,
16721 MENU_ENUM_LABEL_VALUE_CPU_PERFPOWER,
16722 &group_info,
16723 &subgroup_info,
16724 parent_group);
16725 #endif
16726 #endif
16727
16728 END_SUB_GROUP(list, list_info, parent_group);
16729 END_GROUP(list, list_info, parent_group);
16730 break;
16731 case SETTINGS_LIST_WIFI_MANAGEMENT:
16732 START_GROUP(list, list_info, &group_info,
16733 msg_hash_to_str(MENU_ENUM_LABEL_VALUE_WIFI_SETTINGS),
16734 parent_group);
16735 parent_group = msg_hash_to_str(MENU_ENUM_LABEL_WIFI_SETTINGS);
16736
16737 START_SUB_GROUP(list, list_info, "State", &group_info, &subgroup_info, parent_group);
16738
16739 CONFIG_BOOL(
16740 list, list_info,
16741 &settings->bools.wifi_enabled,
16742 MENU_ENUM_LABEL_WIFI_ENABLED,
16743 MENU_ENUM_LABEL_VALUE_WIFI_ENABLED,
16744 DEFAULT_WIFI_ENABLE,
16745 MENU_ENUM_LABEL_VALUE_OFF,
16746 MENU_ENUM_LABEL_VALUE_ON,
16747 &group_info,
16748 &subgroup_info,
16749 parent_group,
16750 general_write_handler,
16751 general_read_handler,
16752 SD_FLAG_NONE);
16753 (*list)[list_info->index - 1].action_ok = &setting_bool_action_left_with_refresh;
16754 (*list)[list_info->index - 1].action_left = &setting_bool_action_left_with_refresh;
16755 (*list)[list_info->index - 1].action_right = &setting_bool_action_right_with_refresh;
16756
16757 CONFIG_ACTION(
16758 list, list_info,
16759 MENU_ENUM_LABEL_WIFI_NETWORK_SCAN,
16760 MENU_ENUM_LABEL_VALUE_WIFI_NETWORK_SCAN,
16761 &group_info,
16762 &subgroup_info,
16763 parent_group);
16764
16765 CONFIG_ACTION(
16766 list, list_info,
16767 MENU_ENUM_LABEL_WIFI_DISCONNECT,
16768 MENU_ENUM_LABEL_VALUE_WIFI_DISCONNECT,
16769 &group_info,
16770 &subgroup_info,
16771 parent_group);
16772
16773 END_SUB_GROUP(list, list_info, parent_group);
16774 END_GROUP(list, list_info, parent_group);
16775 break;
16776 case SETTINGS_LIST_ACCESSIBILITY:
16777 START_GROUP(list, list_info, &group_info,
16778 msg_hash_to_str(MENU_ENUM_LABEL_VALUE_ACCESSIBILITY_SETTINGS),
16779 parent_group);
16780
16781 parent_group = msg_hash_to_str(MENU_ENUM_LABEL_ACCESSIBILITY_SETTINGS);
16782
16783 START_SUB_GROUP(list, list_info, "State", &group_info, &subgroup_info, parent_group);
16784
16785 CONFIG_BOOL(
16786 list, list_info,
16787 &settings->bools.accessibility_enable,
16788 MENU_ENUM_LABEL_ACCESSIBILITY_ENABLED,
16789 MENU_ENUM_LABEL_VALUE_ACCESSIBILITY_ENABLED,
16790 DEFAULT_ACCESSIBILITY_ENABLE,
16791 MENU_ENUM_LABEL_VALUE_OFF,
16792 MENU_ENUM_LABEL_VALUE_ON,
16793 &group_info,
16794 &subgroup_info,
16795 parent_group,
16796 general_write_handler,
16797 general_read_handler,
16798 SD_FLAG_NONE);
16799 (*list)[list_info->index - 1].action_ok = setting_bool_action_left_with_refresh;
16800 (*list)[list_info->index - 1].action_left = setting_bool_action_left_with_refresh;
16801 (*list)[list_info->index - 1].action_right = setting_bool_action_right_with_refresh;
16802
16803 CONFIG_UINT(
16804 list, list_info,
16805 &settings->uints.accessibility_narrator_speech_speed,
16806 MENU_ENUM_LABEL_ACCESSIBILITY_NARRATOR_SPEECH_SPEED,
16807 MENU_ENUM_LABEL_VALUE_ACCESSIBILITY_NARRATOR_SPEECH_SPEED,
16808 DEFAULT_ACCESSIBILITY_NARRATOR_SPEECH_SPEED,
16809 &group_info,
16810 &subgroup_info,
16811 parent_group,
16812 general_write_handler,
16813 general_read_handler);
16814 menu_settings_list_current_add_range(list, list_info, 1, 10, 1, true, true);
16815
16816 END_SUB_GROUP(list, list_info, parent_group);
16817 END_GROUP(list, list_info, parent_group);
16818 break;
16819 case SETTINGS_LIST_AI_SERVICE:
16820 #ifdef HAVE_TRANSLATE
16821 START_GROUP(list, list_info, &group_info,
16822 msg_hash_to_str(MENU_ENUM_LABEL_VALUE_AI_SERVICE_SETTINGS),
16823 parent_group);
16824
16825 parent_group = msg_hash_to_str(MENU_ENUM_LABEL_AI_SERVICE_SETTINGS);
16826
16827 START_SUB_GROUP(list, list_info, "State", &group_info, &subgroup_info, parent_group);
16828
16829 CONFIG_UINT(
16830 list, list_info,
16831 &settings->uints.ai_service_mode,
16832 MENU_ENUM_LABEL_AI_SERVICE_MODE,
16833 MENU_ENUM_LABEL_VALUE_AI_SERVICE_MODE,
16834 DEFAULT_AI_SERVICE_MODE,
16835 &group_info,
16836 &subgroup_info,
16837 parent_group,
16838 general_write_handler,
16839 general_read_handler);
16840 (*list)[list_info->index - 1].get_string_representation =
16841 &setting_get_string_representation_uint_ai_service_mode;
16842 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
16843 menu_settings_list_current_add_range(list, list_info, 0, 2, 1, true, true);
16844
16845 CONFIG_STRING(
16846 list, list_info,
16847 settings->arrays.ai_service_url,
16848 sizeof(settings->arrays.ai_service_url),
16849 MENU_ENUM_LABEL_AI_SERVICE_URL,
16850 MENU_ENUM_LABEL_VALUE_AI_SERVICE_URL,
16851 DEFAULT_AI_SERVICE_URL,
16852 &group_info,
16853 &subgroup_info,
16854 parent_group,
16855 general_write_handler,
16856 general_read_handler);
16857 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ALLOW_INPUT);
16858 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_STRING_LINE_EDIT;
16859 (*list)[list_info->index - 1].action_start = setting_generic_action_start_default;
16860
16861 CONFIG_BOOL(
16862 list, list_info,
16863 &settings->bools.ai_service_enable,
16864 MENU_ENUM_LABEL_AI_SERVICE_ENABLE,
16865 MENU_ENUM_LABEL_VALUE_AI_SERVICE_ENABLE,
16866 DEFAULT_AI_SERVICE_ENABLE,
16867 MENU_ENUM_LABEL_VALUE_OFF,
16868 MENU_ENUM_LABEL_VALUE_ON,
16869 &group_info,
16870 &subgroup_info,
16871 parent_group,
16872 general_write_handler,
16873 general_read_handler,
16874 SD_FLAG_NONE);
16875 (*list)[list_info->index - 1].action_ok = setting_bool_action_left_with_refresh;
16876 (*list)[list_info->index - 1].action_left = setting_bool_action_left_with_refresh;
16877 (*list)[list_info->index - 1].action_right = setting_bool_action_right_with_refresh;
16878
16879 CONFIG_BOOL(
16880 list, list_info,
16881 &settings->bools.ai_service_pause,
16882 MENU_ENUM_LABEL_AI_SERVICE_PAUSE,
16883 MENU_ENUM_LABEL_VALUE_AI_SERVICE_PAUSE,
16884 DEFAULT_AI_SERVICE_PAUSE,
16885 MENU_ENUM_LABEL_VALUE_OFF,
16886 MENU_ENUM_LABEL_VALUE_ON,
16887 &group_info,
16888 &subgroup_info,
16889 parent_group,
16890 general_write_handler,
16891 general_read_handler,
16892 SD_FLAG_NONE);
16893
16894 CONFIG_UINT(
16895 list, list_info,
16896 &settings->uints.ai_service_source_lang,
16897 MENU_ENUM_LABEL_AI_SERVICE_SOURCE_LANG,
16898 MENU_ENUM_LABEL_VALUE_AI_SERVICE_SOURCE_LANG,
16899 DEFAULT_AI_SERVICE_SOURCE_LANG,
16900 &group_info,
16901 &subgroup_info,
16902 parent_group,
16903 general_write_handler,
16904 general_read_handler);
16905 (*list)[list_info->index - 1].get_string_representation =
16906 &setting_get_string_representation_uint_ai_service_lang;
16907 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
16908 menu_settings_list_current_add_range(list, list_info, TRANSLATION_LANG_DONT_CARE, (TRANSLATION_LANG_LAST-1), 1, true, true);
16909
16910 CONFIG_UINT(
16911 list, list_info,
16912 &settings->uints.ai_service_target_lang,
16913 MENU_ENUM_LABEL_AI_SERVICE_TARGET_LANG,
16914 MENU_ENUM_LABEL_VALUE_AI_SERVICE_TARGET_LANG,
16915 DEFAULT_AI_SERVICE_TARGET_LANG,
16916 &group_info,
16917 &subgroup_info,
16918 parent_group,
16919 general_write_handler,
16920 general_read_handler);
16921 (*list)[list_info->index - 1].get_string_representation =
16922 &setting_get_string_representation_uint_ai_service_lang;
16923 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
16924 menu_settings_list_current_add_range(list, list_info, TRANSLATION_LANG_DONT_CARE, (TRANSLATION_LANG_LAST-1), 1, true, true);
16925
16926 END_SUB_GROUP(list, list_info, parent_group);
16927 END_GROUP(list, list_info, parent_group);
16928 #endif
16929 break;
16930 case SETTINGS_LIST_USER_INTERFACE:
16931 START_GROUP(list, list_info, &group_info,
16932 msg_hash_to_str(MENU_ENUM_LABEL_VALUE_USER_INTERFACE_SETTINGS),
16933 parent_group);
16934
16935 parent_group = msg_hash_to_str(MENU_ENUM_LABEL_USER_INTERFACE_SETTINGS);
16936
16937 START_SUB_GROUP(list, list_info, "State", &group_info, &subgroup_info, parent_group);
16938
16939 CONFIG_BOOL(
16940 list, list_info,
16941 &settings->bools.pause_nonactive,
16942 MENU_ENUM_LABEL_PAUSE_NONACTIVE,
16943 MENU_ENUM_LABEL_VALUE_PAUSE_NONACTIVE,
16944 DEFAULT_PAUSE_NONACTIVE,
16945 MENU_ENUM_LABEL_VALUE_OFF,
16946 MENU_ENUM_LABEL_VALUE_ON,
16947 &group_info,
16948 &subgroup_info,
16949 parent_group,
16950 general_write_handler,
16951 general_read_handler,
16952 SD_FLAG_NONE);
16953 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED);
16954
16955 #if !defined(RARCH_MOBILE)
16956 CONFIG_BOOL(
16957 list, list_info,
16958 &settings->bools.video_disable_composition,
16959 MENU_ENUM_LABEL_VIDEO_DISABLE_COMPOSITION,
16960 MENU_ENUM_LABEL_VALUE_VIDEO_DISABLE_COMPOSITION,
16961 DEFAULT_DISABLE_COMPOSITION,
16962 MENU_ENUM_LABEL_VALUE_OFF,
16963 MENU_ENUM_LABEL_VALUE_ON,
16964 &group_info,
16965 &subgroup_info,
16966 parent_group,
16967 general_write_handler,
16968 general_read_handler,
16969 SD_FLAG_CMD_APPLY_AUTO);
16970 MENU_SETTINGS_LIST_CURRENT_ADD_CMD(list, list_info, CMD_EVENT_REINIT);
16971 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED);
16972 #endif
16973
16974 #if defined(_3DS)
16975 {
16976 u8 device_model = 0xFF;
16977
16978 /* Only O3DS and O3DSXL support running in 'dual-framebuffer'
16979 * mode with the parallax barrier disabled
16980 * (i.e. these are the only platforms that can use
16981 * CTR_VIDEO_MODE_2D_400X240 and CTR_VIDEO_MODE_2D_800X240) */
16982 CFGU_GetSystemModel(&device_model); /* (0 = O3DS, 1 = O3DSXL, 2 = N3DS, 3 = 2DS, 4 = N3DSXL, 5 = N2DSXL) */
16983
16984 CONFIG_UINT(
16985 list, list_info,
16986 &settings->uints.video_3ds_display_mode,
16987 MENU_ENUM_LABEL_VIDEO_3DS_DISPLAY_MODE,
16988 MENU_ENUM_LABEL_VALUE_VIDEO_3DS_DISPLAY_MODE,
16989 video_3ds_display_mode,
16990 &group_info,
16991 &subgroup_info,
16992 parent_group,
16993 general_write_handler,
16994 general_read_handler);
16995 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
16996 (*list)[list_info->index - 1].get_string_representation =
16997 &setting_get_string_representation_uint_video_3ds_display_mode;
16998 menu_settings_list_current_add_range(list, list_info, 0,
16999 CTR_VIDEO_MODE_LAST - (((device_model == 0) || (device_model == 1)) ? 1 : 3),
17000 1, true, true);
17001 }
17002
17003 CONFIG_BOOL(
17004 list, list_info,
17005 &settings->bools.video_3ds_lcd_bottom,
17006 MENU_ENUM_LABEL_VIDEO_3DS_LCD_BOTTOM,
17007 MENU_ENUM_LABEL_VALUE_VIDEO_3DS_LCD_BOTTOM,
17008 video_3ds_lcd_bottom,
17009 MENU_ENUM_LABEL_VALUE_OFF,
17010 MENU_ENUM_LABEL_VALUE_ON,
17011 &group_info,
17012 &subgroup_info,
17013 parent_group,
17014 general_write_handler,
17015 general_read_handler,
17016 SD_FLAG_CMD_APPLY_AUTO);
17017 MENU_SETTINGS_LIST_CURRENT_ADD_CMD(list, list_info, CMD_EVENT_REINIT_FROM_TOGGLE);
17018 #endif
17019
17020 #ifdef HAVE_NETWORKING
17021 CONFIG_BOOL(
17022 list, list_info,
17023 &settings->bools.menu_show_online_updater,
17024 MENU_ENUM_LABEL_MENU_SHOW_ONLINE_UPDATER,
17025 MENU_ENUM_LABEL_VALUE_MENU_SHOW_ONLINE_UPDATER,
17026 menu_show_online_updater,
17027 MENU_ENUM_LABEL_VALUE_OFF,
17028 MENU_ENUM_LABEL_VALUE_ON,
17029 &group_info,
17030 &subgroup_info,
17031 parent_group,
17032 general_write_handler,
17033 general_read_handler,
17034 SD_FLAG_NONE);
17035
17036 #if !defined(HAVE_LAKKA)
17037 CONFIG_BOOL(
17038 list, list_info,
17039 &settings->bools.menu_show_core_updater,
17040 MENU_ENUM_LABEL_MENU_SHOW_CORE_UPDATER,
17041 MENU_ENUM_LABEL_VALUE_MENU_SHOW_CORE_UPDATER,
17042 menu_show_online_updater,
17043 MENU_ENUM_LABEL_VALUE_OFF,
17044 MENU_ENUM_LABEL_VALUE_ON,
17045 &group_info,
17046 &subgroup_info,
17047 parent_group,
17048 general_write_handler,
17049 general_read_handler,
17050 SD_FLAG_NONE);
17051 #endif
17052 CONFIG_BOOL(
17053 list, list_info,
17054 &settings->bools.menu_show_legacy_thumbnail_updater,
17055 MENU_ENUM_LABEL_MENU_SHOW_LEGACY_THUMBNAIL_UPDATER,
17056 MENU_ENUM_LABEL_VALUE_MENU_SHOW_LEGACY_THUMBNAIL_UPDATER,
17057 menu_show_legacy_thumbnail_updater,
17058 MENU_ENUM_LABEL_VALUE_OFF,
17059 MENU_ENUM_LABEL_VALUE_ON,
17060 &group_info,
17061 &subgroup_info,
17062 parent_group,
17063 general_write_handler,
17064 general_read_handler,
17065 SD_FLAG_NONE);
17066 #endif
17067
17068 CONFIG_BOOL(
17069 list, list_info,
17070 &settings->bools.settings_show_drivers,
17071 MENU_ENUM_LABEL_SETTINGS_SHOW_DRIVERS,
17072 MENU_ENUM_LABEL_VALUE_SETTINGS_SHOW_DRIVERS,
17073 DEFAULT_SETTINGS_SHOW_DRIVERS,
17074 MENU_ENUM_LABEL_VALUE_OFF,
17075 MENU_ENUM_LABEL_VALUE_ON,
17076 &group_info,
17077 &subgroup_info,
17078 parent_group,
17079 general_write_handler,
17080 general_read_handler,
17081 SD_FLAG_NONE);
17082
17083 CONFIG_BOOL(
17084 list, list_info,
17085 &settings->bools.settings_show_video,
17086 MENU_ENUM_LABEL_SETTINGS_SHOW_VIDEO,
17087 MENU_ENUM_LABEL_VALUE_SETTINGS_SHOW_VIDEO,
17088 DEFAULT_SETTINGS_SHOW_VIDEO,
17089 MENU_ENUM_LABEL_VALUE_OFF,
17090 MENU_ENUM_LABEL_VALUE_ON,
17091 &group_info,
17092 &subgroup_info,
17093 parent_group,
17094 general_write_handler,
17095 general_read_handler,
17096 SD_FLAG_NONE);
17097
17098 CONFIG_BOOL(
17099 list, list_info,
17100 &settings->bools.settings_show_audio,
17101 MENU_ENUM_LABEL_SETTINGS_SHOW_AUDIO,
17102 MENU_ENUM_LABEL_VALUE_SETTINGS_SHOW_AUDIO,
17103 DEFAULT_SETTINGS_SHOW_AUDIO,
17104 MENU_ENUM_LABEL_VALUE_OFF,
17105 MENU_ENUM_LABEL_VALUE_ON,
17106 &group_info,
17107 &subgroup_info,
17108 parent_group,
17109 general_write_handler,
17110 general_read_handler,
17111 SD_FLAG_NONE);
17112
17113 CONFIG_BOOL(
17114 list, list_info,
17115 &settings->bools.settings_show_input,
17116 MENU_ENUM_LABEL_SETTINGS_SHOW_INPUT,
17117 MENU_ENUM_LABEL_VALUE_SETTINGS_SHOW_INPUT,
17118 DEFAULT_SETTINGS_SHOW_INPUT,
17119 MENU_ENUM_LABEL_VALUE_OFF,
17120 MENU_ENUM_LABEL_VALUE_ON,
17121 &group_info,
17122 &subgroup_info,
17123 parent_group,
17124 general_write_handler,
17125 general_read_handler,
17126 SD_FLAG_NONE);
17127
17128 CONFIG_BOOL(
17129 list, list_info,
17130 &settings->bools.settings_show_latency,
17131 MENU_ENUM_LABEL_SETTINGS_SHOW_LATENCY,
17132 MENU_ENUM_LABEL_VALUE_SETTINGS_SHOW_LATENCY,
17133 DEFAULT_SETTINGS_SHOW_LATENCY,
17134 MENU_ENUM_LABEL_VALUE_OFF,
17135 MENU_ENUM_LABEL_VALUE_ON,
17136 &group_info,
17137 &subgroup_info,
17138 parent_group,
17139 general_write_handler,
17140 general_read_handler,
17141 SD_FLAG_NONE);
17142
17143 CONFIG_BOOL(
17144 list, list_info,
17145 &settings->bools.settings_show_core,
17146 MENU_ENUM_LABEL_SETTINGS_SHOW_CORE,
17147 MENU_ENUM_LABEL_VALUE_SETTINGS_SHOW_CORE,
17148 DEFAULT_SETTINGS_SHOW_CORE,
17149 MENU_ENUM_LABEL_VALUE_OFF,
17150 MENU_ENUM_LABEL_VALUE_ON,
17151 &group_info,
17152 &subgroup_info,
17153 parent_group,
17154 general_write_handler,
17155 general_read_handler,
17156 SD_FLAG_NONE);
17157
17158 CONFIG_BOOL(
17159 list, list_info,
17160 &settings->bools.settings_show_configuration,
17161 MENU_ENUM_LABEL_SETTINGS_SHOW_CONFIGURATION,
17162 MENU_ENUM_LABEL_VALUE_SETTINGS_SHOW_CONFIGURATION,
17163 DEFAULT_SETTINGS_SHOW_CONFIGURATION,
17164 MENU_ENUM_LABEL_VALUE_OFF,
17165 MENU_ENUM_LABEL_VALUE_ON,
17166 &group_info,
17167 &subgroup_info,
17168 parent_group,
17169 general_write_handler,
17170 general_read_handler,
17171 SD_FLAG_NONE);
17172
17173 CONFIG_BOOL(
17174 list, list_info,
17175 &settings->bools.settings_show_saving,
17176 MENU_ENUM_LABEL_SETTINGS_SHOW_SAVING,
17177 MENU_ENUM_LABEL_VALUE_SETTINGS_SHOW_SAVING,
17178 DEFAULT_SETTINGS_SHOW_SAVING,
17179 MENU_ENUM_LABEL_VALUE_OFF,
17180 MENU_ENUM_LABEL_VALUE_ON,
17181 &group_info,
17182 &subgroup_info,
17183 parent_group,
17184 general_write_handler,
17185 general_read_handler,
17186 SD_FLAG_NONE);
17187
17188 CONFIG_BOOL(
17189 list, list_info,
17190 &settings->bools.settings_show_logging,
17191 MENU_ENUM_LABEL_SETTINGS_SHOW_LOGGING,
17192 MENU_ENUM_LABEL_VALUE_SETTINGS_SHOW_LOGGING,
17193 DEFAULT_SETTINGS_SHOW_LOGGING,
17194 MENU_ENUM_LABEL_VALUE_OFF,
17195 MENU_ENUM_LABEL_VALUE_ON,
17196 &group_info,
17197 &subgroup_info,
17198 parent_group,
17199 general_write_handler,
17200 general_read_handler,
17201 SD_FLAG_NONE);
17202
17203 CONFIG_BOOL(
17204 list, list_info,
17205 &settings->bools.settings_show_file_browser,
17206 MENU_ENUM_LABEL_SETTINGS_SHOW_FILE_BROWSER,
17207 MENU_ENUM_LABEL_VALUE_SETTINGS_SHOW_FILE_BROWSER,
17208 DEFAULT_SETTINGS_SHOW_FILE_BROWSER,
17209 MENU_ENUM_LABEL_VALUE_OFF,
17210 MENU_ENUM_LABEL_VALUE_ON,
17211 &group_info,
17212 &subgroup_info,
17213 parent_group,
17214 general_write_handler,
17215 general_read_handler,
17216 SD_FLAG_NONE);
17217
17218 CONFIG_BOOL(
17219 list, list_info,
17220 &settings->bools.settings_show_frame_throttle,
17221 MENU_ENUM_LABEL_SETTINGS_SHOW_FRAME_THROTTLE,
17222 MENU_ENUM_LABEL_VALUE_SETTINGS_SHOW_FRAME_THROTTLE,
17223 DEFAULT_SETTINGS_SHOW_FRAME_THROTTLE,
17224 MENU_ENUM_LABEL_VALUE_OFF,
17225 MENU_ENUM_LABEL_VALUE_ON,
17226 &group_info,
17227 &subgroup_info,
17228 parent_group,
17229 general_write_handler,
17230 general_read_handler,
17231 SD_FLAG_NONE);
17232
17233 CONFIG_BOOL(
17234 list, list_info,
17235 &settings->bools.settings_show_recording,
17236 MENU_ENUM_LABEL_SETTINGS_SHOW_RECORDING,
17237 MENU_ENUM_LABEL_VALUE_SETTINGS_SHOW_RECORDING,
17238 DEFAULT_SETTINGS_SHOW_RECORDING,
17239 MENU_ENUM_LABEL_VALUE_OFF,
17240 MENU_ENUM_LABEL_VALUE_ON,
17241 &group_info,
17242 &subgroup_info,
17243 parent_group,
17244 general_write_handler,
17245 general_read_handler,
17246 SD_FLAG_NONE);
17247
17248 CONFIG_BOOL(
17249 list, list_info,
17250 &settings->bools.settings_show_onscreen_display,
17251 MENU_ENUM_LABEL_SETTINGS_SHOW_ONSCREEN_DISPLAY,
17252 MENU_ENUM_LABEL_VALUE_SETTINGS_SHOW_ONSCREEN_DISPLAY,
17253 DEFAULT_SETTINGS_SHOW_ONSCREEN_DISPLAY,
17254 MENU_ENUM_LABEL_VALUE_OFF,
17255 MENU_ENUM_LABEL_VALUE_ON,
17256 &group_info,
17257 &subgroup_info,
17258 parent_group,
17259 general_write_handler,
17260 general_read_handler,
17261 SD_FLAG_NONE);
17262
17263 CONFIG_BOOL(
17264 list, list_info,
17265 &settings->bools.settings_show_user_interface,
17266 MENU_ENUM_LABEL_SETTINGS_SHOW_USER_INTERFACE,
17267 MENU_ENUM_LABEL_VALUE_SETTINGS_SHOW_USER_INTERFACE,
17268 DEFAULT_SETTINGS_SHOW_USER_INTERFACE,
17269 MENU_ENUM_LABEL_VALUE_OFF,
17270 MENU_ENUM_LABEL_VALUE_ON,
17271 &group_info,
17272 &subgroup_info,
17273 parent_group,
17274 general_write_handler,
17275 general_read_handler,
17276 SD_FLAG_NONE);
17277
17278 CONFIG_BOOL(
17279 list, list_info,
17280 &settings->bools.settings_show_ai_service,
17281 MENU_ENUM_LABEL_SETTINGS_SHOW_AI_SERVICE,
17282 MENU_ENUM_LABEL_VALUE_SETTINGS_SHOW_AI_SERVICE,
17283 DEFAULT_SETTINGS_SHOW_AI_SERVICE,
17284 MENU_ENUM_LABEL_VALUE_OFF,
17285 MENU_ENUM_LABEL_VALUE_ON,
17286 &group_info,
17287 &subgroup_info,
17288 parent_group,
17289 general_write_handler,
17290 general_read_handler,
17291 SD_FLAG_NONE);
17292
17293 CONFIG_BOOL(
17294 list, list_info,
17295 &settings->bools.settings_show_accessibility,
17296 MENU_ENUM_LABEL_SETTINGS_SHOW_ACCESSIBILITY,
17297 MENU_ENUM_LABEL_VALUE_SETTINGS_SHOW_ACCESSIBILITY,
17298 DEFAULT_SETTINGS_SHOW_ACCESSIBILITY,
17299 MENU_ENUM_LABEL_VALUE_OFF,
17300 MENU_ENUM_LABEL_VALUE_ON,
17301 &group_info,
17302 &subgroup_info,
17303 parent_group,
17304 general_write_handler,
17305 general_read_handler,
17306 SD_FLAG_NONE);
17307
17308 CONFIG_BOOL(
17309 list, list_info,
17310 &settings->bools.settings_show_power_management,
17311 MENU_ENUM_LABEL_SETTINGS_SHOW_POWER_MANAGEMENT,
17312 MENU_ENUM_LABEL_VALUE_SETTINGS_SHOW_POWER_MANAGEMENT,
17313 DEFAULT_SETTINGS_SHOW_POWER_MANAGEMENT,
17314 MENU_ENUM_LABEL_VALUE_OFF,
17315 MENU_ENUM_LABEL_VALUE_ON,
17316 &group_info,
17317 &subgroup_info,
17318 parent_group,
17319 general_write_handler,
17320 general_read_handler,
17321 SD_FLAG_NONE);
17322
17323 CONFIG_BOOL(
17324 list, list_info,
17325 &settings->bools.settings_show_achievements,
17326 MENU_ENUM_LABEL_SETTINGS_SHOW_ACHIEVEMENTS,
17327 MENU_ENUM_LABEL_VALUE_SETTINGS_SHOW_ACHIEVEMENTS,
17328 DEFAULT_SETTINGS_SHOW_ACHIEVEMENTS,
17329 MENU_ENUM_LABEL_VALUE_OFF,
17330 MENU_ENUM_LABEL_VALUE_ON,
17331 &group_info,
17332 &subgroup_info,
17333 parent_group,
17334 general_write_handler,
17335 general_read_handler,
17336 SD_FLAG_NONE);
17337
17338 CONFIG_BOOL(
17339 list, list_info,
17340 &settings->bools.settings_show_network,
17341 MENU_ENUM_LABEL_SETTINGS_SHOW_NETWORK,
17342 MENU_ENUM_LABEL_VALUE_SETTINGS_SHOW_NETWORK,
17343 DEFAULT_SETTINGS_SHOW_NETWORK,
17344 MENU_ENUM_LABEL_VALUE_OFF,
17345 MENU_ENUM_LABEL_VALUE_ON,
17346 &group_info,
17347 &subgroup_info,
17348 parent_group,
17349 general_write_handler,
17350 general_read_handler,
17351 SD_FLAG_NONE);
17352
17353 CONFIG_BOOL(
17354 list, list_info,
17355 &settings->bools.settings_show_playlists,
17356 MENU_ENUM_LABEL_SETTINGS_SHOW_PLAYLISTS,
17357 MENU_ENUM_LABEL_VALUE_SETTINGS_SHOW_PLAYLISTS,
17358 DEFAULT_SETTINGS_SHOW_PLAYLISTS,
17359 MENU_ENUM_LABEL_VALUE_OFF,
17360 MENU_ENUM_LABEL_VALUE_ON,
17361 &group_info,
17362 &subgroup_info,
17363 parent_group,
17364 general_write_handler,
17365 general_read_handler,
17366 SD_FLAG_NONE);
17367
17368 CONFIG_BOOL(
17369 list, list_info,
17370 &settings->bools.settings_show_user,
17371 MENU_ENUM_LABEL_SETTINGS_SHOW_USER,
17372 MENU_ENUM_LABEL_VALUE_SETTINGS_SHOW_USER,
17373 DEFAULT_SETTINGS_SHOW_USER,
17374 MENU_ENUM_LABEL_VALUE_OFF,
17375 MENU_ENUM_LABEL_VALUE_ON,
17376 &group_info,
17377 &subgroup_info,
17378 parent_group,
17379 general_write_handler,
17380 general_read_handler,
17381 SD_FLAG_NONE);
17382
17383 CONFIG_BOOL(
17384 list, list_info,
17385 &settings->bools.settings_show_directory,
17386 MENU_ENUM_LABEL_SETTINGS_SHOW_DIRECTORY,
17387 MENU_ENUM_LABEL_VALUE_SETTINGS_SHOW_DIRECTORY,
17388 DEFAULT_SETTINGS_SHOW_DIRECTORY,
17389 MENU_ENUM_LABEL_VALUE_OFF,
17390 MENU_ENUM_LABEL_VALUE_ON,
17391 &group_info,
17392 &subgroup_info,
17393 parent_group,
17394 general_write_handler,
17395 general_read_handler,
17396 SD_FLAG_NONE);
17397
17398 CONFIG_BOOL(
17399 list, list_info,
17400 &settings->bools.quick_menu_show_take_screenshot,
17401 MENU_ENUM_LABEL_QUICK_MENU_SHOW_TAKE_SCREENSHOT,
17402 MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_TAKE_SCREENSHOT,
17403 DEFAULT_QUICK_MENU_SHOW_TAKE_SCREENSHOT,
17404 MENU_ENUM_LABEL_VALUE_OFF,
17405 MENU_ENUM_LABEL_VALUE_ON,
17406 &group_info,
17407 &subgroup_info,
17408 parent_group,
17409 general_write_handler,
17410 general_read_handler,
17411 SD_FLAG_NONE);
17412
17413 CONFIG_BOOL(
17414 list, list_info,
17415 &settings->bools.quick_menu_show_save_load_state,
17416 MENU_ENUM_LABEL_QUICK_MENU_SHOW_SAVE_LOAD_STATE,
17417 MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_SAVE_LOAD_STATE,
17418 DEFAULT_QUICK_MENU_SHOW_SAVE_LOAD_STATE,
17419 MENU_ENUM_LABEL_VALUE_OFF,
17420 MENU_ENUM_LABEL_VALUE_ON,
17421 &group_info,
17422 &subgroup_info,
17423 parent_group,
17424 general_write_handler,
17425 general_read_handler,
17426 SD_FLAG_NONE);
17427
17428 CONFIG_BOOL(
17429 list, list_info,
17430 &settings->bools.quick_menu_show_undo_save_load_state,
17431 MENU_ENUM_LABEL_QUICK_MENU_SHOW_UNDO_SAVE_LOAD_STATE,
17432 MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_UNDO_SAVE_LOAD_STATE,
17433 DEFAULT_QUICK_MENU_SHOW_UNDO_SAVE_LOAD_STATE,
17434 MENU_ENUM_LABEL_VALUE_OFF,
17435 MENU_ENUM_LABEL_VALUE_ON,
17436 &group_info,
17437 &subgroup_info,
17438 parent_group,
17439 general_write_handler,
17440 general_read_handler,
17441 SD_FLAG_NONE);
17442
17443 CONFIG_BOOL(
17444 list, list_info,
17445 &settings->bools.quick_menu_show_add_to_favorites,
17446 MENU_ENUM_LABEL_QUICK_MENU_SHOW_ADD_TO_FAVORITES,
17447 MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_ADD_TO_FAVORITES,
17448 quick_menu_show_add_to_favorites,
17449 MENU_ENUM_LABEL_VALUE_OFF,
17450 MENU_ENUM_LABEL_VALUE_ON,
17451 &group_info,
17452 &subgroup_info,
17453 parent_group,
17454 general_write_handler,
17455 general_read_handler,
17456 SD_FLAG_NONE);
17457
17458 CONFIG_BOOL(
17459 list, list_info,
17460 &settings->bools.quick_menu_show_start_recording,
17461 MENU_ENUM_LABEL_QUICK_MENU_SHOW_START_RECORDING,
17462 MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_START_RECORDING,
17463 quick_menu_show_start_recording,
17464 MENU_ENUM_LABEL_VALUE_OFF,
17465 MENU_ENUM_LABEL_VALUE_ON,
17466 &group_info,
17467 &subgroup_info,
17468 parent_group,
17469 general_write_handler,
17470 general_read_handler,
17471 SD_FLAG_NONE);
17472
17473 CONFIG_BOOL(
17474 list, list_info,
17475 &settings->bools.quick_menu_show_start_streaming,
17476 MENU_ENUM_LABEL_QUICK_MENU_SHOW_START_STREAMING,
17477 MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_START_STREAMING,
17478 quick_menu_show_start_streaming,
17479 MENU_ENUM_LABEL_VALUE_OFF,
17480 MENU_ENUM_LABEL_VALUE_ON,
17481 &group_info,
17482 &subgroup_info,
17483 parent_group,
17484 general_write_handler,
17485 general_read_handler,
17486 SD_FLAG_NONE);
17487
17488 CONFIG_BOOL(
17489 list, list_info,
17490 &settings->bools.quick_menu_show_set_core_association,
17491 MENU_ENUM_LABEL_QUICK_MENU_SHOW_SET_CORE_ASSOCIATION,
17492 MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_SET_CORE_ASSOCIATION,
17493 quick_menu_show_set_core_association,
17494 MENU_ENUM_LABEL_VALUE_OFF,
17495 MENU_ENUM_LABEL_VALUE_ON,
17496 &group_info,
17497 &subgroup_info,
17498 parent_group,
17499 general_write_handler,
17500 general_read_handler,
17501 SD_FLAG_NONE);
17502
17503 CONFIG_BOOL(
17504 list, list_info,
17505 &settings->bools.quick_menu_show_reset_core_association,
17506 MENU_ENUM_LABEL_QUICK_MENU_SHOW_RESET_CORE_ASSOCIATION,
17507 MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_RESET_CORE_ASSOCIATION,
17508 quick_menu_show_reset_core_association,
17509 MENU_ENUM_LABEL_VALUE_OFF,
17510 MENU_ENUM_LABEL_VALUE_ON,
17511 &group_info,
17512 &subgroup_info,
17513 parent_group,
17514 general_write_handler,
17515 general_read_handler,
17516 SD_FLAG_NONE);
17517
17518 #if 0
17519 CONFIG_BOOL(
17520 list, list_info,
17521 &settings->bools.quick_menu_show_recording,
17522 MENU_ENUM_LABEL_QUICK_MENU_START_RECORDING,
17523 MENU_ENUM_LABEL_VALUE_QUICK_MENU_START_RECORDING,
17524 quick_menu_show_recording,
17525 MENU_ENUM_LABEL_VALUE_OFF,
17526 MENU_ENUM_LABEL_VALUE_ON,
17527 &group_info,
17528 &subgroup_info,
17529 parent_group,
17530 general_write_handler,
17531 general_read_handler,
17532 SD_FLAG_NONE);
17533
17534 CONFIG_BOOL(
17535 list, list_info,
17536 &settings->bools.quick_menu_show_streaming,
17537 MENU_ENUM_LABEL_QUICK_MENU_START_STREAMING,
17538 MENU_ENUM_LABEL_VALUE_QUICK_MENU_START_STREAMING,
17539 quick_menu_show_streaming,
17540 MENU_ENUM_LABEL_VALUE_OFF,
17541 MENU_ENUM_LABEL_VALUE_ON,
17542 &group_info,
17543 &subgroup_info,
17544 parent_group,
17545 general_write_handler,
17546 general_read_handler,
17547 SD_FLAG_NONE);
17548 #endif
17549
17550 CONFIG_BOOL(
17551 list, list_info,
17552 &settings->bools.quick_menu_show_resume_content,
17553 MENU_ENUM_LABEL_QUICK_MENU_SHOW_RESUME_CONTENT,
17554 MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_RESUME_CONTENT,
17555 DEFAULT_QUICK_MENU_SHOW_RESUME_CONTENT,
17556 MENU_ENUM_LABEL_VALUE_OFF,
17557 MENU_ENUM_LABEL_VALUE_ON,
17558 &group_info,
17559 &subgroup_info,
17560 parent_group,
17561 general_write_handler,
17562 general_read_handler,
17563 SD_FLAG_NONE);
17564
17565 CONFIG_BOOL(
17566 list, list_info,
17567 &settings->bools.quick_menu_show_restart_content,
17568 MENU_ENUM_LABEL_QUICK_MENU_SHOW_RESTART_CONTENT,
17569 MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_RESTART_CONTENT,
17570 DEFAULT_QUICK_MENU_SHOW_RESTART_CONTENT,
17571 MENU_ENUM_LABEL_VALUE_OFF,
17572 MENU_ENUM_LABEL_VALUE_ON,
17573 &group_info,
17574 &subgroup_info,
17575 parent_group,
17576 general_write_handler,
17577 general_read_handler,
17578 SD_FLAG_NONE);
17579
17580 CONFIG_BOOL(
17581 list, list_info,
17582 &settings->bools.quick_menu_show_close_content,
17583 MENU_ENUM_LABEL_QUICK_MENU_SHOW_CLOSE_CONTENT,
17584 MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_CLOSE_CONTENT,
17585 DEFAULT_QUICK_MENU_SHOW_CLOSE_CONTENT,
17586 MENU_ENUM_LABEL_VALUE_OFF,
17587 MENU_ENUM_LABEL_VALUE_ON,
17588 &group_info,
17589 &subgroup_info,
17590 parent_group,
17591 general_write_handler,
17592 general_read_handler,
17593 SD_FLAG_NONE);
17594
17595 CONFIG_BOOL(
17596 list, list_info,
17597 &settings->bools.quick_menu_show_options,
17598 MENU_ENUM_LABEL_QUICK_MENU_SHOW_OPTIONS,
17599 MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_OPTIONS,
17600 quick_menu_show_options,
17601 MENU_ENUM_LABEL_VALUE_OFF,
17602 MENU_ENUM_LABEL_VALUE_ON,
17603 &group_info,
17604 &subgroup_info,
17605 parent_group,
17606 general_write_handler,
17607 general_read_handler,
17608 SD_FLAG_NONE);
17609
17610 CONFIG_BOOL(
17611 list, list_info,
17612 &settings->bools.quick_menu_show_controls,
17613 MENU_ENUM_LABEL_QUICK_MENU_SHOW_CONTROLS,
17614 MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_CONTROLS,
17615 quick_menu_show_controls,
17616 MENU_ENUM_LABEL_VALUE_OFF,
17617 MENU_ENUM_LABEL_VALUE_ON,
17618 &group_info,
17619 &subgroup_info,
17620 parent_group,
17621 general_write_handler,
17622 general_read_handler,
17623 SD_FLAG_NONE);
17624
17625 CONFIG_BOOL(
17626 list, list_info,
17627 &settings->bools.quick_menu_show_cheats,
17628 MENU_ENUM_LABEL_QUICK_MENU_SHOW_CHEATS,
17629 MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_CHEATS,
17630 quick_menu_show_cheats,
17631 MENU_ENUM_LABEL_VALUE_OFF,
17632 MENU_ENUM_LABEL_VALUE_ON,
17633 &group_info,
17634 &subgroup_info,
17635 parent_group,
17636 general_write_handler,
17637 general_read_handler,
17638 SD_FLAG_NONE);
17639
17640 #if defined(HAVE_CG) || defined(HAVE_GLSL) || defined(HAVE_SLANG) || defined(HAVE_HLSL)
17641 if (video_shader_any_supported())
17642 {
17643 CONFIG_BOOL(
17644 list, list_info,
17645 &settings->bools.quick_menu_show_shaders,
17646 MENU_ENUM_LABEL_QUICK_MENU_SHOW_SHADERS,
17647 MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_SHADERS,
17648 quick_menu_show_shaders,
17649 MENU_ENUM_LABEL_VALUE_OFF,
17650 MENU_ENUM_LABEL_VALUE_ON,
17651 &group_info,
17652 &subgroup_info,
17653 parent_group,
17654 general_write_handler,
17655 general_read_handler,
17656 SD_FLAG_NONE);
17657 }
17658 #endif
17659
17660 CONFIG_BOOL(
17661 list, list_info,
17662 &settings->bools.quick_menu_show_save_core_overrides,
17663 MENU_ENUM_LABEL_QUICK_MENU_SHOW_SAVE_CORE_OVERRIDES,
17664 MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_SAVE_CORE_OVERRIDES,
17665 quick_menu_show_save_core_overrides,
17666 MENU_ENUM_LABEL_VALUE_OFF,
17667 MENU_ENUM_LABEL_VALUE_ON,
17668 &group_info,
17669 &subgroup_info,
17670 parent_group,
17671 general_write_handler,
17672 general_read_handler,
17673 SD_FLAG_NONE);
17674
17675 CONFIG_BOOL(
17676 list, list_info,
17677 &settings->bools.quick_menu_show_save_game_overrides,
17678 MENU_ENUM_LABEL_QUICK_MENU_SHOW_SAVE_GAME_OVERRIDES,
17679 MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_SAVE_GAME_OVERRIDES,
17680 quick_menu_show_save_game_overrides,
17681 MENU_ENUM_LABEL_VALUE_OFF,
17682 MENU_ENUM_LABEL_VALUE_ON,
17683 &group_info,
17684 &subgroup_info,
17685 parent_group,
17686 general_write_handler,
17687 general_read_handler,
17688 SD_FLAG_NONE);
17689
17690 CONFIG_BOOL(
17691 list, list_info,
17692 &settings->bools.quick_menu_show_information,
17693 MENU_ENUM_LABEL_QUICK_MENU_SHOW_INFORMATION,
17694 MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_INFORMATION,
17695 quick_menu_show_information,
17696 MENU_ENUM_LABEL_VALUE_OFF,
17697 MENU_ENUM_LABEL_VALUE_ON,
17698 &group_info,
17699 &subgroup_info,
17700 parent_group,
17701 general_write_handler,
17702 general_read_handler,
17703 SD_FLAG_NONE);
17704
17705 #ifdef HAVE_NETWORKING
17706 CONFIG_BOOL(
17707 list, list_info,
17708 &settings->bools.quick_menu_show_download_thumbnails,
17709 MENU_ENUM_LABEL_QUICK_MENU_SHOW_DOWNLOAD_THUMBNAILS,
17710 MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_DOWNLOAD_THUMBNAILS,
17711 quick_menu_show_download_thumbnails,
17712 MENU_ENUM_LABEL_VALUE_OFF,
17713 MENU_ENUM_LABEL_VALUE_ON,
17714 &group_info,
17715 &subgroup_info,
17716 parent_group,
17717 general_write_handler,
17718 general_read_handler,
17719 SD_FLAG_NONE);
17720 #endif
17721
17722 CONFIG_BOOL(
17723 list, list_info,
17724 &settings->bools.menu_scroll_fast,
17725 MENU_ENUM_LABEL_MENU_SCROLL_FAST,
17726 MENU_ENUM_LABEL_VALUE_MENU_SCROLL_FAST,
17727 menu_scroll_fast,
17728 MENU_ENUM_LABEL_VALUE_SCROLL_NORMAL,
17729 MENU_ENUM_LABEL_VALUE_SCROLL_FAST,
17730 &group_info,
17731 &subgroup_info,
17732 parent_group,
17733 general_write_handler,
17734 general_read_handler,
17735 SD_FLAG_NONE);
17736
17737 CONFIG_UINT(
17738 list, list_info,
17739 &settings->uints.menu_scroll_delay,
17740 MENU_ENUM_LABEL_MENU_SCROLL_DELAY,
17741 MENU_ENUM_LABEL_VALUE_MENU_SCROLL_DELAY,
17742 DEFAULT_MENU_SCROLL_DELAY,
17743 &group_info,
17744 &subgroup_info,
17745 parent_group,
17746 general_write_handler,
17747 general_read_handler);
17748 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
17749 (*list)[list_info->index - 1].offset_by = 1;
17750 menu_settings_list_current_add_range(list, list_info, 1, 999, 1, true, true);
17751
17752 CONFIG_BOOL(
17753 list, list_info,
17754 &settings->bools.ui_companion_enable,
17755 MENU_ENUM_LABEL_UI_COMPANION_ENABLE,
17756 MENU_ENUM_LABEL_VALUE_UI_COMPANION_ENABLE,
17757 ui_companion_enable,
17758 MENU_ENUM_LABEL_VALUE_OFF,
17759 MENU_ENUM_LABEL_VALUE_ON,
17760 &group_info,
17761 &subgroup_info,
17762 parent_group,
17763 general_write_handler,
17764 general_read_handler,
17765 SD_FLAG_ADVANCED);
17766
17767 CONFIG_BOOL(
17768 list, list_info,
17769 &settings->bools.ui_companion_start_on_boot,
17770 MENU_ENUM_LABEL_UI_COMPANION_START_ON_BOOT,
17771 MENU_ENUM_LABEL_VALUE_UI_COMPANION_START_ON_BOOT,
17772 ui_companion_start_on_boot,
17773 MENU_ENUM_LABEL_VALUE_OFF,
17774 MENU_ENUM_LABEL_VALUE_ON,
17775 &group_info,
17776 &subgroup_info,
17777 parent_group,
17778 general_write_handler,
17779 general_read_handler,
17780 SD_FLAG_ADVANCED);
17781
17782 CONFIG_BOOL(
17783 list, list_info,
17784 &settings->bools.ui_menubar_enable,
17785 MENU_ENUM_LABEL_UI_MENUBAR_ENABLE,
17786 MENU_ENUM_LABEL_VALUE_UI_MENUBAR_ENABLE,
17787 DEFAULT_UI_MENUBAR_ENABLE,
17788 MENU_ENUM_LABEL_VALUE_OFF,
17789 MENU_ENUM_LABEL_VALUE_ON,
17790 &group_info,
17791 &subgroup_info,
17792 parent_group,
17793 general_write_handler,
17794 general_read_handler,
17795 SD_FLAG_NONE);
17796 MENU_SETTINGS_LIST_CURRENT_ADD_CMD(list, list_info, CMD_EVENT_REINIT);
17797
17798 #ifdef HAVE_QT
17799 CONFIG_BOOL(
17800 list, list_info,
17801 &settings->bools.desktop_menu_enable,
17802 MENU_ENUM_LABEL_DESKTOP_MENU_ENABLE,
17803 MENU_ENUM_LABEL_VALUE_DESKTOP_MENU_ENABLE,
17804 DEFAULT_DESKTOP_MENU_ENABLE,
17805 MENU_ENUM_LABEL_VALUE_OFF,
17806 MENU_ENUM_LABEL_VALUE_ON,
17807 &group_info,
17808 &subgroup_info,
17809 parent_group,
17810 general_write_handler,
17811 general_read_handler,
17812 SD_FLAG_NONE);
17813 (*list)[list_info->index - 1].action_ok = setting_bool_action_left_with_refresh;
17814 (*list)[list_info->index - 1].action_left = setting_bool_action_left_with_refresh;
17815 (*list)[list_info->index - 1].action_right = setting_bool_action_right_with_refresh;
17816
17817 CONFIG_BOOL(
17818 list, list_info,
17819 &settings->bools.ui_companion_toggle,
17820 MENU_ENUM_LABEL_UI_COMPANION_TOGGLE,
17821 MENU_ENUM_LABEL_VALUE_UI_COMPANION_TOGGLE,
17822 ui_companion_toggle,
17823 MENU_ENUM_LABEL_VALUE_OFF,
17824 MENU_ENUM_LABEL_VALUE_ON,
17825 &group_info,
17826 &subgroup_info,
17827 parent_group,
17828 general_write_handler,
17829 general_read_handler,
17830 SD_FLAG_NONE);
17831 #endif
17832
17833 END_SUB_GROUP(list, list_info, parent_group);
17834 END_GROUP(list, list_info, parent_group);
17835 break;
17836 case SETTINGS_LIST_PLAYLIST:
17837 START_GROUP(list, list_info, &group_info,
17838 msg_hash_to_str(MENU_ENUM_LABEL_PLAYLIST_SETTINGS_BEGIN),
17839 parent_group);
17840 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ADVANCED);
17841
17842 parent_group = msg_hash_to_str(MENU_ENUM_LABEL_SETTINGS);
17843
17844 START_SUB_GROUP(list, list_info, "History", &group_info, &subgroup_info, parent_group);
17845
17846 CONFIG_BOOL(
17847 list, list_info,
17848 &settings->bools.history_list_enable,
17849 MENU_ENUM_LABEL_HISTORY_LIST_ENABLE,
17850 MENU_ENUM_LABEL_VALUE_HISTORY_LIST_ENABLE,
17851 DEFAULT_HISTORY_LIST_ENABLE,
17852 MENU_ENUM_LABEL_VALUE_OFF,
17853 MENU_ENUM_LABEL_VALUE_ON,
17854 &group_info,
17855 &subgroup_info,
17856 parent_group,
17857 general_write_handler,
17858 general_read_handler,
17859 SD_FLAG_ADVANCED
17860 );
17861 (*list)[list_info->index - 1].action_ok = setting_bool_action_left_with_refresh;
17862 (*list)[list_info->index - 1].action_left = setting_bool_action_left_with_refresh;
17863 (*list)[list_info->index - 1].action_right = setting_bool_action_right_with_refresh;
17864
17865 CONFIG_UINT(
17866 list, list_info,
17867 &settings->uints.content_history_size,
17868 MENU_ENUM_LABEL_CONTENT_HISTORY_SIZE,
17869 MENU_ENUM_LABEL_VALUE_CONTENT_HISTORY_SIZE,
17870 default_content_history_size,
17871 &group_info,
17872 &subgroup_info,
17873 parent_group,
17874 general_write_handler,
17875 general_read_handler);
17876 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
17877 (*list)[list_info->index - 1].offset_by = 1;
17878 menu_settings_list_current_add_range(list, list_info, 1.0f, 9999.0f, 1.0f, true, true);
17879
17880 END_SUB_GROUP(list, list_info, parent_group);
17881
17882 START_SUB_GROUP(list, list_info, "Playlist", &group_info, &subgroup_info, parent_group);
17883
17884 /* Favourites size is traditionally associtated with
17885 * history size, but they are in fact unrelated. We
17886 * therefore place this entry outside the "History"
17887 * sub group. */
17888 CONFIG_INT(
17889 list, list_info,
17890 &settings->ints.content_favorites_size,
17891 MENU_ENUM_LABEL_CONTENT_FAVORITES_SIZE,
17892 MENU_ENUM_LABEL_VALUE_CONTENT_FAVORITES_SIZE,
17893 default_content_favorites_size,
17894 &group_info,
17895 &subgroup_info,
17896 parent_group,
17897 general_write_handler,
17898 general_read_handler);
17899 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
17900 (*list)[list_info->index - 1].offset_by = -1;
17901 menu_settings_list_current_add_range(list, list_info, -1.0f, 9999.0f, 1.0f, true, true);
17902
17903 CONFIG_BOOL(
17904 list, list_info,
17905 &settings->bools.playlist_entry_rename,
17906 MENU_ENUM_LABEL_PLAYLIST_ENTRY_RENAME,
17907 MENU_ENUM_LABEL_VALUE_PLAYLIST_ENTRY_RENAME,
17908 DEFAULT_PLAYLIST_ENTRY_RENAME,
17909 MENU_ENUM_LABEL_VALUE_OFF,
17910 MENU_ENUM_LABEL_VALUE_ON,
17911 &group_info,
17912 &subgroup_info,
17913 parent_group,
17914 general_write_handler,
17915 general_read_handler,
17916 SD_FLAG_NONE);
17917
17918 CONFIG_UINT(
17919 list, list_info,
17920 &settings->uints.playlist_entry_remove_enable,
17921 MENU_ENUM_LABEL_PLAYLIST_ENTRY_REMOVE,
17922 MENU_ENUM_LABEL_VALUE_PLAYLIST_ENTRY_REMOVE,
17923 DEFAULT_PLAYLIST_ENTRY_REMOVE_ENABLE,
17924 &group_info,
17925 &subgroup_info,
17926 parent_group,
17927 general_write_handler,
17928 general_read_handler);
17929 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
17930 (*list)[list_info->index - 1].get_string_representation =
17931 &setting_get_string_representation_uint_playlist_entry_remove_enable;
17932 menu_settings_list_current_add_range(list, list_info, 0, PLAYLIST_ENTRY_REMOVE_ENABLE_LAST-1, 1, true, true);
17933
17934 CONFIG_BOOL(
17935 list, list_info,
17936 &settings->bools.playlist_sort_alphabetical,
17937 MENU_ENUM_LABEL_PLAYLIST_SORT_ALPHABETICAL,
17938 MENU_ENUM_LABEL_VALUE_PLAYLIST_SORT_ALPHABETICAL,
17939 DEFAULT_PLAYLIST_SORT_ALPHABETICAL,
17940 MENU_ENUM_LABEL_VALUE_OFF,
17941 MENU_ENUM_LABEL_VALUE_ON,
17942 &group_info,
17943 &subgroup_info,
17944 parent_group,
17945 general_write_handler,
17946 general_read_handler,
17947 SD_FLAG_NONE
17948 );
17949
17950 CONFIG_BOOL(
17951 list, list_info,
17952 &settings->bools.playlist_use_old_format,
17953 MENU_ENUM_LABEL_PLAYLIST_USE_OLD_FORMAT,
17954 MENU_ENUM_LABEL_VALUE_PLAYLIST_USE_OLD_FORMAT,
17955 DEFAULT_PLAYLIST_USE_OLD_FORMAT,
17956 MENU_ENUM_LABEL_VALUE_OFF,
17957 MENU_ENUM_LABEL_VALUE_ON,
17958 &group_info,
17959 &subgroup_info,
17960 parent_group,
17961 general_write_handler,
17962 general_read_handler,
17963 SD_FLAG_NONE
17964 );
17965
17966 #if defined(HAVE_ZLIB)
17967 CONFIG_BOOL(
17968 list, list_info,
17969 &settings->bools.playlist_compression,
17970 MENU_ENUM_LABEL_PLAYLIST_COMPRESSION,
17971 MENU_ENUM_LABEL_VALUE_PLAYLIST_COMPRESSION,
17972 DEFAULT_PLAYLIST_COMPRESSION,
17973 MENU_ENUM_LABEL_VALUE_OFF,
17974 MENU_ENUM_LABEL_VALUE_ON,
17975 &group_info,
17976 &subgroup_info,
17977 parent_group,
17978 general_write_handler,
17979 general_read_handler,
17980 SD_FLAG_NONE
17981 );
17982 #endif
17983
17984 CONFIG_BOOL(
17985 list, list_info,
17986 &settings->bools.playlist_show_sublabels,
17987 MENU_ENUM_LABEL_PLAYLIST_SHOW_SUBLABELS,
17988 MENU_ENUM_LABEL_VALUE_PLAYLIST_SHOW_SUBLABELS,
17989 DEFAULT_PLAYLIST_SHOW_SUBLABELS,
17990 MENU_ENUM_LABEL_VALUE_OFF,
17991 MENU_ENUM_LABEL_VALUE_ON,
17992 &group_info,
17993 &subgroup_info,
17994 parent_group,
17995 general_write_handler,
17996 general_read_handler,
17997 SD_FLAG_NONE
17998 );
17999 (*list)[list_info->index - 1].action_ok = setting_bool_action_left_with_refresh;
18000 (*list)[list_info->index - 1].action_left = setting_bool_action_left_with_refresh;
18001 (*list)[list_info->index - 1].action_right = setting_bool_action_right_with_refresh;
18002
18003 /* Playlist entry index display is currently
18004 * supported only by Ozone & XMB */
18005 if (string_is_equal(settings->arrays.menu_driver, "xmb") ||
18006 string_is_equal(settings->arrays.menu_driver, "ozone"))
18007 {
18008 CONFIG_BOOL(
18009 list, list_info,
18010 &settings->bools.playlist_show_entry_idx,
18011 MENU_ENUM_LABEL_PLAYLIST_SHOW_ENTRY_IDX,
18012 MENU_ENUM_LABEL_VALUE_PLAYLIST_SHOW_ENTRY_IDX,
18013 DEFAULT_PLAYLIST_SHOW_ENTRY_IDX,
18014 MENU_ENUM_LABEL_VALUE_OFF,
18015 MENU_ENUM_LABEL_VALUE_ON,
18016 &group_info,
18017 &subgroup_info,
18018 parent_group,
18019 general_write_handler,
18020 general_read_handler,
18021 SD_FLAG_NONE
18022 );
18023 }
18024
18025 CONFIG_UINT(
18026 list, list_info,
18027 &settings->uints.playlist_sublabel_runtime_type,
18028 MENU_ENUM_LABEL_PLAYLIST_SUBLABEL_RUNTIME_TYPE,
18029 MENU_ENUM_LABEL_VALUE_PLAYLIST_SUBLABEL_RUNTIME_TYPE,
18030 DEFAULT_PLAYLIST_SUBLABEL_RUNTIME_TYPE,
18031 &group_info,
18032 &subgroup_info,
18033 parent_group,
18034 general_write_handler,
18035 general_read_handler);
18036 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
18037 (*list)[list_info->index - 1].get_string_representation =
18038 &setting_get_string_representation_uint_playlist_sublabel_runtime_type;
18039 menu_settings_list_current_add_range(list, list_info, 0, PLAYLIST_RUNTIME_LAST-1, 1, true, true);
18040
18041 CONFIG_UINT(
18042 list, list_info,
18043 &settings->uints.playlist_sublabel_last_played_style,
18044 MENU_ENUM_LABEL_PLAYLIST_SUBLABEL_LAST_PLAYED_STYLE,
18045 MENU_ENUM_LABEL_VALUE_PLAYLIST_SUBLABEL_LAST_PLAYED_STYLE,
18046 DEFAULT_PLAYLIST_SUBLABEL_LAST_PLAYED_STYLE,
18047 &group_info,
18048 &subgroup_info,
18049 parent_group,
18050 general_write_handler,
18051 general_read_handler);
18052 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
18053 (*list)[list_info->index - 1].get_string_representation =
18054 &setting_get_string_representation_uint_playlist_sublabel_last_played_style;
18055 menu_settings_list_current_add_range(list, list_info, 0, PLAYLIST_LAST_PLAYED_STYLE_LAST-1, 1, true, true);
18056
18057 CONFIG_UINT(
18058 list, list_info,
18059 &settings->uints.playlist_show_inline_core_name,
18060 MENU_ENUM_LABEL_PLAYLIST_SHOW_INLINE_CORE_NAME,
18061 MENU_ENUM_LABEL_VALUE_PLAYLIST_SHOW_INLINE_CORE_NAME,
18062 DEFAULT_PLAYLIST_SHOW_INLINE_CORE_NAME,
18063 &group_info,
18064 &subgroup_info,
18065 parent_group,
18066 general_write_handler,
18067 general_read_handler);
18068 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
18069 (*list)[list_info->index - 1].get_string_representation =
18070 &setting_get_string_representation_uint_playlist_inline_core_display_type;
18071 menu_settings_list_current_add_range(list, list_info, 0, PLAYLIST_INLINE_CORE_DISPLAY_LAST-1, 1, true, true);
18072
18073 CONFIG_BOOL(
18074 list, list_info,
18075 &settings->bools.playlist_fuzzy_archive_match,
18076 MENU_ENUM_LABEL_PLAYLIST_FUZZY_ARCHIVE_MATCH,
18077 MENU_ENUM_LABEL_VALUE_PLAYLIST_FUZZY_ARCHIVE_MATCH,
18078 DEFAULT_PLAYLIST_FUZZY_ARCHIVE_MATCH,
18079 MENU_ENUM_LABEL_VALUE_OFF,
18080 MENU_ENUM_LABEL_VALUE_ON,
18081 &group_info,
18082 &subgroup_info,
18083 parent_group,
18084 general_write_handler,
18085 general_read_handler,
18086 SD_FLAG_NONE
18087 );
18088
18089 CONFIG_BOOL(
18090 list, list_info,
18091 &settings->bools.playlist_portable_paths,
18092 MENU_ENUM_LABEL_PLAYLIST_PORTABLE_PATHS,
18093 MENU_ENUM_LABEL_VALUE_PLAYLIST_PORTABLE_PATHS,
18094 DEFAULT_PLAYLIST_PORTABLE_PATHS,
18095 MENU_ENUM_LABEL_VALUE_OFF,
18096 MENU_ENUM_LABEL_VALUE_ON,
18097 &group_info,
18098 &subgroup_info,
18099 parent_group,
18100 general_write_handler,
18101 general_read_handler,
18102 SD_FLAG_NONE
18103 );
18104
18105 #ifdef HAVE_OZONE
18106 if (string_is_equal(settings->arrays.menu_driver, "ozone"))
18107 {
18108 CONFIG_BOOL(
18109 list, list_info,
18110 &settings->bools.ozone_truncate_playlist_name,
18111 MENU_ENUM_LABEL_OZONE_TRUNCATE_PLAYLIST_NAME,
18112 MENU_ENUM_LABEL_VALUE_OZONE_TRUNCATE_PLAYLIST_NAME,
18113 DEFAULT_OZONE_TRUNCATE_PLAYLIST_NAME,
18114 MENU_ENUM_LABEL_VALUE_OFF,
18115 MENU_ENUM_LABEL_VALUE_ON,
18116 &group_info,
18117 &subgroup_info,
18118 parent_group,
18119 general_write_handler,
18120 general_read_handler,
18121 SD_FLAG_NONE);
18122
18123 CONFIG_BOOL(
18124 list, list_info,
18125 &settings->bools.ozone_sort_after_truncate_playlist_name,
18126 MENU_ENUM_LABEL_OZONE_SORT_AFTER_TRUNCATE_PLAYLIST_NAME,
18127 MENU_ENUM_LABEL_VALUE_OZONE_SORT_AFTER_TRUNCATE_PLAYLIST_NAME,
18128 DEFAULT_OZONE_SORT_AFTER_TRUNCATE_PLAYLIST_NAME,
18129 MENU_ENUM_LABEL_VALUE_OFF,
18130 MENU_ENUM_LABEL_VALUE_ON,
18131 &group_info,
18132 &subgroup_info,
18133 parent_group,
18134 general_write_handler,
18135 general_read_handler,
18136 SD_FLAG_NONE);
18137 }
18138 #endif
18139
18140 END_SUB_GROUP(list, list_info, parent_group);
18141
18142 END_GROUP(list, list_info, parent_group);
18143 break;
18144 case SETTINGS_LIST_CHEEVOS:
18145 #ifdef HAVE_CHEEVOS
18146 START_GROUP(list, list_info, &group_info,
18147 msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CHEEVOS_SETTINGS),
18148 parent_group);
18149 parent_group = msg_hash_to_str(MENU_ENUM_LABEL_RETRO_ACHIEVEMENTS_SETTINGS);
18150 START_SUB_GROUP(list, list_info, "State", &group_info, &subgroup_info, parent_group);
18151
18152 CONFIG_BOOL(
18153 list, list_info,
18154 &settings->bools.cheevos_enable,
18155 MENU_ENUM_LABEL_CHEEVOS_ENABLE,
18156 MENU_ENUM_LABEL_VALUE_CHEEVOS_ENABLE,
18157 DEFAULT_CHEEVOS_ENABLE,
18158 MENU_ENUM_LABEL_VALUE_OFF,
18159 MENU_ENUM_LABEL_VALUE_ON,
18160 &group_info,
18161 &subgroup_info,
18162 parent_group,
18163 achievement_hardcore_mode_write_handler,
18164 general_read_handler,
18165 SD_FLAG_NONE
18166 );
18167 (*list)[list_info->index - 1].action_ok = setting_bool_action_left_with_refresh;
18168 (*list)[list_info->index - 1].action_left = setting_bool_action_left_with_refresh;
18169 (*list)[list_info->index - 1].action_right = setting_bool_action_right_with_refresh;
18170
18171 CONFIG_BOOL(
18172 list, list_info,
18173 &settings->bools.cheevos_test_unofficial,
18174 MENU_ENUM_LABEL_CHEEVOS_TEST_UNOFFICIAL,
18175 MENU_ENUM_LABEL_VALUE_CHEEVOS_TEST_UNOFFICIAL,
18176 false,
18177 MENU_ENUM_LABEL_VALUE_OFF,
18178 MENU_ENUM_LABEL_VALUE_ON,
18179 &group_info,
18180 &subgroup_info,
18181 parent_group,
18182 general_write_handler,
18183 general_read_handler,
18184 SD_FLAG_ADVANCED
18185 );
18186
18187 CONFIG_STRING_OPTIONS(
18188 list, list_info,
18189 settings->arrays.cheevos_leaderboards_enable,
18190 sizeof(settings->arrays.cheevos_leaderboards_enable),
18191 MENU_ENUM_LABEL_CHEEVOS_LEADERBOARDS_ENABLE,
18192 MENU_ENUM_LABEL_VALUE_CHEEVOS_LEADERBOARDS_ENABLE,
18193 "false",
18194 "false|true",
18195 &group_info,
18196 &subgroup_info,
18197 parent_group,
18198 achievement_leaderboards_enabled_write_handler,
18199 general_read_handler);
18200 #if defined(HAVE_GFX_WIDGETS)
18201 (*list)[list_info->index - 1].values = "false|true|trackers|notifications";
18202 (*list)[list_info->index - 1].action_ok = setting_action_ok_mapped_string;
18203 #else
18204 (*list)[list_info->index - 1].action_ok = setting_string_action_left_string_options;
18205 #endif
18206 (*list)[list_info->index - 1].action_left = setting_string_action_left_string_options;
18207 (*list)[list_info->index - 1].action_right = setting_string_action_right_string_options;
18208 (*list)[list_info->index - 1].get_string_representation = achievement_leaderboards_get_string_representation;
18209 (*list)[list_info->index - 1].free_flags &= ~SD_FREE_FLAG_VALUES;
18210
18211 CONFIG_BOOL(
18212 list, list_info,
18213 &settings->bools.cheevos_challenge_indicators,
18214 MENU_ENUM_LABEL_CHEEVOS_CHALLENGE_INDICATORS,
18215 MENU_ENUM_LABEL_VALUE_CHEEVOS_CHALLENGE_INDICATORS,
18216 true,
18217 MENU_ENUM_LABEL_VALUE_OFF,
18218 MENU_ENUM_LABEL_VALUE_ON,
18219 &group_info,
18220 &subgroup_info,
18221 parent_group,
18222 general_write_handler,
18223 general_read_handler,
18224 SD_FLAG_NONE
18225 );
18226
18227 CONFIG_BOOL(
18228 list, list_info,
18229 &settings->bools.cheevos_richpresence_enable,
18230 MENU_ENUM_LABEL_CHEEVOS_RICHPRESENCE_ENABLE,
18231 MENU_ENUM_LABEL_VALUE_CHEEVOS_RICHPRESENCE_ENABLE,
18232 true,
18233 MENU_ENUM_LABEL_VALUE_OFF,
18234 MENU_ENUM_LABEL_VALUE_ON,
18235 &group_info,
18236 &subgroup_info,
18237 parent_group,
18238 general_write_handler,
18239 general_read_handler,
18240 SD_FLAG_NONE
18241 );
18242
18243 if (string_is_equal(settings->arrays.menu_driver, "xmb") || string_is_equal(settings->arrays.menu_driver, "ozone"))
18244 CONFIG_BOOL(
18245 list, list_info,
18246 &settings->bools.cheevos_badges_enable,
18247 MENU_ENUM_LABEL_CHEEVOS_BADGES_ENABLE,
18248 MENU_ENUM_LABEL_VALUE_CHEEVOS_BADGES_ENABLE,
18249 false,
18250 MENU_ENUM_LABEL_VALUE_OFF,
18251 MENU_ENUM_LABEL_VALUE_ON,
18252 &group_info,
18253 &subgroup_info,
18254 parent_group,
18255 general_write_handler,
18256 general_read_handler,
18257 SD_FLAG_NONE
18258 );
18259
18260 #ifdef HAVE_AUDIOMIXER
18261 CONFIG_BOOL(
18262 list, list_info,
18263 &settings->bools.cheevos_unlock_sound_enable,
18264 MENU_ENUM_LABEL_CHEEVOS_UNLOCK_SOUND_ENABLE,
18265 MENU_ENUM_LABEL_VALUE_CHEEVOS_UNLOCK_SOUND_ENABLE,
18266 false,
18267 MENU_ENUM_LABEL_VALUE_OFF,
18268 MENU_ENUM_LABEL_VALUE_ON,
18269 &group_info,
18270 &subgroup_info,
18271 parent_group,
18272 general_write_handler,
18273 general_read_handler,
18274 SD_FLAG_NONE
18275 );
18276 #endif
18277
18278 CONFIG_BOOL(
18279 list, list_info,
18280 &settings->bools.cheevos_verbose_enable,
18281 MENU_ENUM_LABEL_CHEEVOS_VERBOSE_ENABLE,
18282 MENU_ENUM_LABEL_VALUE_CHEEVOS_VERBOSE_ENABLE,
18283 false,
18284 MENU_ENUM_LABEL_VALUE_OFF,
18285 MENU_ENUM_LABEL_VALUE_ON,
18286 &group_info,
18287 &subgroup_info,
18288 parent_group,
18289 general_write_handler,
18290 general_read_handler,
18291 SD_FLAG_NONE
18292 );
18293
18294 CONFIG_BOOL(
18295 list, list_info,
18296 &settings->bools.cheevos_auto_screenshot,
18297 MENU_ENUM_LABEL_CHEEVOS_AUTO_SCREENSHOT,
18298 MENU_ENUM_LABEL_VALUE_CHEEVOS_AUTO_SCREENSHOT,
18299 false,
18300 MENU_ENUM_LABEL_VALUE_OFF,
18301 MENU_ENUM_LABEL_VALUE_ON,
18302 &group_info,
18303 &subgroup_info,
18304 parent_group,
18305 general_write_handler,
18306 general_read_handler,
18307 SD_FLAG_NONE
18308 );
18309
18310 CONFIG_BOOL(
18311 list, list_info,
18312 &settings->bools.cheevos_start_active,
18313 MENU_ENUM_LABEL_CHEEVOS_START_ACTIVE,
18314 MENU_ENUM_LABEL_VALUE_CHEEVOS_START_ACTIVE,
18315 false,
18316 MENU_ENUM_LABEL_VALUE_OFF,
18317 MENU_ENUM_LABEL_VALUE_ON,
18318 &group_info,
18319 &subgroup_info,
18320 parent_group,
18321 general_write_handler,
18322 general_read_handler,
18323 SD_FLAG_NONE
18324 );
18325
18326 CONFIG_BOOL(
18327 list, list_info,
18328 &settings->bools.cheevos_hardcore_mode_enable,
18329 MENU_ENUM_LABEL_CHEEVOS_HARDCORE_MODE_ENABLE,
18330 MENU_ENUM_LABEL_VALUE_CHEEVOS_HARDCORE_MODE_ENABLE,
18331 false,
18332 MENU_ENUM_LABEL_VALUE_OFF,
18333 MENU_ENUM_LABEL_VALUE_ON,
18334 &group_info,
18335 &subgroup_info,
18336 parent_group,
18337 achievement_hardcore_mode_write_handler,
18338 general_read_handler,
18339 SD_FLAG_NONE
18340 );
18341 MENU_SETTINGS_LIST_CURRENT_ADD_CMD(list, list_info, CMD_EVENT_CHEEVOS_HARDCORE_MODE_TOGGLE);
18342
18343 END_SUB_GROUP(list, list_info, parent_group);
18344 END_GROUP(list, list_info, parent_group);
18345 #endif
18346 break;
18347 case SETTINGS_LIST_CORE_UPDATER:
18348 START_GROUP(list, list_info, &group_info,
18349 msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CORE_UPDATER_SETTINGS),
18350 parent_group);
18351 parent_group = msg_hash_to_str(MENU_ENUM_LABEL_UPDATER_SETTINGS);
18352 START_SUB_GROUP(list, list_info, "State", &group_info, &subgroup_info, parent_group);
18353 #ifdef HAVE_NETWORKING
18354
18355 #if defined(ANDROID)
18356 /* Play Store builds do not fetch cores
18357 * from the buildbot */
18358 if (!play_feature_delivery_enabled())
18359 #endif
18360 {
18361
18362 CONFIG_STRING(
18363 list, list_info,
18364 settings->paths.network_buildbot_url,
18365 sizeof(settings->paths.network_buildbot_url),
18366 MENU_ENUM_LABEL_CORE_UPDATER_BUILDBOT_URL,
18367 MENU_ENUM_LABEL_VALUE_CORE_UPDATER_BUILDBOT_URL,
18368 DEFAULT_BUILDBOT_SERVER_URL,
18369 &group_info,
18370 &subgroup_info,
18371 parent_group,
18372 general_write_handler,
18373 general_read_handler);
18374
18375 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ALLOW_INPUT);
18376 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_STRING_LINE_EDIT;
18377 (*list)[list_info->index - 1].action_start = setting_generic_action_start_default;
18378 }
18379
18380 CONFIG_STRING(
18381 list, list_info,
18382 settings->paths.network_buildbot_assets_url,
18383 sizeof(settings->paths.network_buildbot_assets_url),
18384 MENU_ENUM_LABEL_BUILDBOT_ASSETS_URL,
18385 MENU_ENUM_LABEL_VALUE_BUILDBOT_ASSETS_URL,
18386 DEFAULT_BUILDBOT_ASSETS_SERVER_URL,
18387 &group_info,
18388 &subgroup_info,
18389 parent_group,
18390 general_write_handler,
18391 general_read_handler);
18392 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ALLOW_INPUT);
18393 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_STRING_LINE_EDIT;
18394 (*list)[list_info->index - 1].action_start = setting_generic_action_start_default;
18395
18396 CONFIG_BOOL(
18397 list, list_info,
18398 &settings->bools.network_buildbot_auto_extract_archive,
18399 MENU_ENUM_LABEL_CORE_UPDATER_AUTO_EXTRACT_ARCHIVE,
18400 MENU_ENUM_LABEL_VALUE_CORE_UPDATER_AUTO_EXTRACT_ARCHIVE,
18401 DEFAULT_NETWORK_BUILDBOT_AUTO_EXTRACT_ARCHIVE,
18402 MENU_ENUM_LABEL_VALUE_OFF,
18403 MENU_ENUM_LABEL_VALUE_ON,
18404 &group_info,
18405 &subgroup_info,
18406 parent_group,
18407 general_write_handler,
18408 general_read_handler,
18409 SD_FLAG_NONE
18410 );
18411
18412 CONFIG_BOOL(
18413 list, list_info,
18414 &settings->bools.network_buildbot_show_experimental_cores,
18415 MENU_ENUM_LABEL_CORE_UPDATER_SHOW_EXPERIMENTAL_CORES,
18416 MENU_ENUM_LABEL_VALUE_CORE_UPDATER_SHOW_EXPERIMENTAL_CORES,
18417 DEFAULT_NETWORK_BUILDBOT_SHOW_EXPERIMENTAL_CORES,
18418 MENU_ENUM_LABEL_VALUE_OFF,
18419 MENU_ENUM_LABEL_VALUE_ON,
18420 &group_info,
18421 &subgroup_info,
18422 parent_group,
18423 general_write_handler,
18424 general_read_handler,
18425 SD_FLAG_NONE
18426 );
18427
18428 #if defined(ANDROID)
18429 /* Play Store builds do not support automatic
18430 * core backups */
18431 if (!play_feature_delivery_enabled())
18432 #endif
18433 {
18434 CONFIG_BOOL(
18435 list, list_info,
18436 &settings->bools.core_updater_auto_backup,
18437 MENU_ENUM_LABEL_CORE_UPDATER_AUTO_BACKUP,
18438 MENU_ENUM_LABEL_VALUE_CORE_UPDATER_AUTO_BACKUP,
18439 DEFAULT_CORE_UPDATER_AUTO_BACKUP,
18440 MENU_ENUM_LABEL_VALUE_OFF,
18441 MENU_ENUM_LABEL_VALUE_ON,
18442 &group_info,
18443 &subgroup_info,
18444 parent_group,
18445 general_write_handler,
18446 general_read_handler,
18447 SD_FLAG_NONE
18448 );
18449
18450 CONFIG_UINT(
18451 list, list_info,
18452 &settings->uints.core_updater_auto_backup_history_size,
18453 MENU_ENUM_LABEL_CORE_UPDATER_AUTO_BACKUP_HISTORY_SIZE,
18454 MENU_ENUM_LABEL_VALUE_CORE_UPDATER_AUTO_BACKUP_HISTORY_SIZE,
18455 DEFAULT_CORE_UPDATER_AUTO_BACKUP_HISTORY_SIZE,
18456 &group_info,
18457 &subgroup_info,
18458 parent_group,
18459 general_write_handler,
18460 general_read_handler);
18461 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_COMBOBOX;
18462 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
18463 (*list)[list_info->index - 1].offset_by = 1;
18464 menu_settings_list_current_add_range(list, list_info, (*list)[list_info->index - 1].offset_by, 500, 1, true, true);
18465 }
18466 #endif
18467 END_SUB_GROUP(list, list_info, parent_group);
18468 END_GROUP(list, list_info, parent_group);
18469 break;
18470 case SETTINGS_LIST_NETPLAY:
18471 START_GROUP(list, list_info, &group_info,
18472 msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NETWORK_SETTINGS),
18473 parent_group);
18474
18475 parent_group = msg_hash_to_str(MENU_ENUM_LABEL_NETWORK_SETTINGS);
18476
18477 START_SUB_GROUP(list, list_info, "Netplay", &group_info, &subgroup_info, parent_group);
18478
18479 {
18480 #if defined(HAVE_NETWORKING)
18481 unsigned user;
18482 char dev_req_label[64];
18483 char dev_req_value[64];
18484
18485 CONFIG_BOOL(
18486 list, list_info,
18487 &settings->bools.netplay_public_announce,
18488 MENU_ENUM_LABEL_NETPLAY_PUBLIC_ANNOUNCE,
18489 MENU_ENUM_LABEL_VALUE_NETPLAY_PUBLIC_ANNOUNCE,
18490 true,
18491 MENU_ENUM_LABEL_VALUE_OFF,
18492 MENU_ENUM_LABEL_VALUE_ON,
18493 &group_info,
18494 &subgroup_info,
18495 parent_group,
18496 general_write_handler,
18497 general_read_handler,
18498 SD_FLAG_NONE);
18499
18500 CONFIG_BOOL(
18501 list, list_info,
18502 &settings->bools.netplay_use_mitm_server,
18503 MENU_ENUM_LABEL_NETPLAY_USE_MITM_SERVER,
18504 MENU_ENUM_LABEL_VALUE_NETPLAY_USE_MITM_SERVER,
18505 netplay_use_mitm_server,
18506 MENU_ENUM_LABEL_VALUE_OFF,
18507 MENU_ENUM_LABEL_VALUE_ON,
18508 &group_info,
18509 &subgroup_info,
18510 parent_group,
18511 general_write_handler,
18512 general_read_handler,
18513 SD_FLAG_NONE);
18514 (*list)[list_info->index - 1].action_ok = &setting_bool_action_left_with_refresh;
18515 (*list)[list_info->index - 1].action_left = &setting_bool_action_left_with_refresh;
18516 (*list)[list_info->index - 1].action_right = &setting_bool_action_right_with_refresh;
18517
18518 CONFIG_STRING(
18519 list, list_info,
18520 settings->arrays.netplay_mitm_server,
18521 sizeof(settings->arrays.netplay_mitm_server),
18522 MENU_ENUM_LABEL_NETPLAY_MITM_SERVER,
18523 MENU_ENUM_LABEL_VALUE_NETPLAY_MITM_SERVER,
18524 DEFAULT_NETPLAY_MITM_SERVER,
18525 &group_info,
18526 &subgroup_info,
18527 parent_group,
18528 general_write_handler,
18529 general_read_handler);
18530 (*list)[list_info->index - 1].action_start = setting_generic_action_start_default;
18531 (*list)[list_info->index - 1].action_left = setting_string_action_left_netplay_mitm_server;
18532 (*list)[list_info->index - 1].action_right = setting_string_action_right_netplay_mitm_server;
18533 (*list)[list_info->index - 1].get_string_representation =
18534 &setting_get_string_representation_netplay_mitm_server;
18535
18536 CONFIG_STRING(
18537 list, list_info,
18538 settings->paths.netplay_server,
18539 sizeof(settings->paths.netplay_server),
18540 MENU_ENUM_LABEL_NETPLAY_IP_ADDRESS,
18541 MENU_ENUM_LABEL_VALUE_NETPLAY_IP_ADDRESS,
18542 "",
18543 &group_info,
18544 &subgroup_info,
18545 parent_group,
18546 general_write_handler,
18547 general_read_handler);
18548 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ALLOW_INPUT);
18549 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ADVANCED);
18550 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_STRING_LINE_EDIT;
18551 (*list)[list_info->index - 1].action_start = setting_generic_action_start_default;
18552
18553 CONFIG_UINT(
18554 list, list_info,
18555 &settings->uints.netplay_port,
18556 MENU_ENUM_LABEL_NETPLAY_TCP_UDP_PORT,
18557 MENU_ENUM_LABEL_VALUE_NETPLAY_TCP_UDP_PORT,
18558 RARCH_DEFAULT_PORT,
18559 &group_info,
18560 &subgroup_info,
18561 parent_group,
18562 general_write_handler,
18563 general_read_handler);
18564 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
18565 menu_settings_list_current_add_range(list, list_info, 0, 65535, 1, true, true);
18566 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ALLOW_INPUT);
18567 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ADVANCED);
18568
18569 CONFIG_STRING(
18570 list, list_info,
18571 settings->paths.netplay_password,
18572 sizeof(settings->paths.netplay_password),
18573 MENU_ENUM_LABEL_NETPLAY_PASSWORD,
18574 MENU_ENUM_LABEL_VALUE_NETPLAY_PASSWORD,
18575 "",
18576 &group_info,
18577 &subgroup_info,
18578 parent_group,
18579 general_write_handler,
18580 general_read_handler);
18581 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ALLOW_INPUT);
18582 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_PASSWORD_LINE_EDIT;
18583 (*list)[list_info->index - 1].action_start = setting_generic_action_start_default;
18584
18585 CONFIG_STRING(
18586 list, list_info,
18587 settings->paths.netplay_spectate_password,
18588 sizeof(settings->paths.netplay_spectate_password),
18589 MENU_ENUM_LABEL_NETPLAY_SPECTATE_PASSWORD,
18590 MENU_ENUM_LABEL_VALUE_NETPLAY_SPECTATE_PASSWORD,
18591 "",
18592 &group_info,
18593 &subgroup_info,
18594 parent_group,
18595 general_write_handler,
18596 general_read_handler);
18597 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ALLOW_INPUT);
18598 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_PASSWORD_LINE_EDIT;
18599 (*list)[list_info->index - 1].action_start = setting_generic_action_start_default;
18600
18601 CONFIG_BOOL(
18602 list, list_info,
18603 &settings->bools.netplay_start_as_spectator,
18604 MENU_ENUM_LABEL_NETPLAY_START_AS_SPECTATOR,
18605 MENU_ENUM_LABEL_VALUE_NETPLAY_START_AS_SPECTATOR,
18606 false,
18607 MENU_ENUM_LABEL_VALUE_OFF,
18608 MENU_ENUM_LABEL_VALUE_ON,
18609 &group_info,
18610 &subgroup_info,
18611 parent_group,
18612 general_write_handler,
18613 general_read_handler,
18614 SD_FLAG_NONE);
18615
18616 CONFIG_BOOL(
18617 list, list_info,
18618 &settings->bools.netplay_allow_slaves,
18619 MENU_ENUM_LABEL_NETPLAY_ALLOW_SLAVES,
18620 MENU_ENUM_LABEL_VALUE_NETPLAY_ALLOW_SLAVES,
18621 true,
18622 MENU_ENUM_LABEL_VALUE_OFF,
18623 MENU_ENUM_LABEL_VALUE_ON,
18624 &group_info,
18625 &subgroup_info,
18626 parent_group,
18627 general_write_handler,
18628 general_read_handler,
18629 SD_FLAG_NONE);
18630 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ADVANCED);
18631 (*list)[list_info->index - 1].action_ok = &setting_bool_action_left_with_refresh;
18632 (*list)[list_info->index - 1].action_left = &setting_bool_action_left_with_refresh;
18633 (*list)[list_info->index - 1].action_right = &setting_bool_action_right_with_refresh;
18634
18635 CONFIG_BOOL(
18636 list, list_info,
18637 &settings->bools.netplay_require_slaves,
18638 MENU_ENUM_LABEL_NETPLAY_REQUIRE_SLAVES,
18639 MENU_ENUM_LABEL_VALUE_NETPLAY_REQUIRE_SLAVES,
18640 false,
18641 MENU_ENUM_LABEL_VALUE_OFF,
18642 MENU_ENUM_LABEL_VALUE_ON,
18643 &group_info,
18644 &subgroup_info,
18645 parent_group,
18646 general_write_handler,
18647 general_read_handler,
18648 SD_FLAG_NONE);
18649 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ADVANCED);
18650
18651 CONFIG_BOOL(
18652 list, list_info,
18653 &settings->bools.netplay_stateless_mode,
18654 MENU_ENUM_LABEL_NETPLAY_STATELESS_MODE,
18655 MENU_ENUM_LABEL_VALUE_NETPLAY_STATELESS_MODE,
18656 false,
18657 MENU_ENUM_LABEL_VALUE_OFF,
18658 MENU_ENUM_LABEL_VALUE_ON,
18659 &group_info,
18660 &subgroup_info,
18661 parent_group,
18662 general_write_handler,
18663 general_read_handler,
18664 SD_FLAG_NONE);
18665 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ADVANCED);
18666
18667 CONFIG_INT(
18668 list, list_info,
18669 &settings->ints.netplay_check_frames,
18670 MENU_ENUM_LABEL_NETPLAY_CHECK_FRAMES,
18671 MENU_ENUM_LABEL_VALUE_NETPLAY_CHECK_FRAMES,
18672 netplay_check_frames,
18673 &group_info,
18674 &subgroup_info,
18675 parent_group,
18676 general_write_handler,
18677 general_read_handler);
18678 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_SPINBOX;
18679 menu_settings_list_current_add_range(list, list_info, -600, 600, 1, false, false);
18680 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ADVANCED);
18681
18682 CONFIG_INT(
18683 list, list_info,
18684 (int *) &settings->uints.netplay_input_latency_frames_min,
18685 MENU_ENUM_LABEL_NETPLAY_INPUT_LATENCY_FRAMES_MIN,
18686 MENU_ENUM_LABEL_VALUE_NETPLAY_INPUT_LATENCY_FRAMES_MIN,
18687 0,
18688 &group_info,
18689 &subgroup_info,
18690 parent_group,
18691 general_write_handler,
18692 general_read_handler);
18693 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_SPINBOX;
18694 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
18695 menu_settings_list_current_add_range(list, list_info, 0, 15, 1, true, true);
18696
18697 CONFIG_INT(
18698 list, list_info,
18699 (int *) &settings->uints.netplay_input_latency_frames_range,
18700 MENU_ENUM_LABEL_NETPLAY_INPUT_LATENCY_FRAMES_RANGE,
18701 MENU_ENUM_LABEL_VALUE_NETPLAY_INPUT_LATENCY_FRAMES_RANGE,
18702 0,
18703 &group_info,
18704 &subgroup_info,
18705 parent_group,
18706 general_write_handler,
18707 general_read_handler);
18708 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_SPINBOX;
18709 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
18710 menu_settings_list_current_add_range(list, list_info, 0, 15, 1, true, true);
18711
18712 CONFIG_BOOL(
18713 list, list_info,
18714 &settings->bools.netplay_nat_traversal,
18715 MENU_ENUM_LABEL_NETPLAY_NAT_TRAVERSAL,
18716 MENU_ENUM_LABEL_VALUE_NETPLAY_NAT_TRAVERSAL,
18717 true,
18718 MENU_ENUM_LABEL_VALUE_OFF,
18719 MENU_ENUM_LABEL_VALUE_ON,
18720 &group_info,
18721 &subgroup_info,
18722 parent_group,
18723 general_write_handler,
18724 general_read_handler,
18725 SD_FLAG_NONE);
18726 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ADVANCED);
18727
18728 CONFIG_UINT(
18729 list, list_info,
18730 &settings->uints.netplay_share_digital,
18731 MENU_ENUM_LABEL_NETPLAY_SHARE_DIGITAL,
18732 MENU_ENUM_LABEL_VALUE_NETPLAY_SHARE_DIGITAL,
18733 netplay_share_digital,
18734 &group_info,
18735 &subgroup_info,
18736 parent_group,
18737 general_write_handler,
18738 general_read_handler);
18739 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
18740 (*list)[list_info->index - 1].get_string_representation =
18741 &setting_get_string_representation_netplay_share_digital;
18742 menu_settings_list_current_add_range(list, list_info, 0, RARCH_NETPLAY_SHARE_DIGITAL_LAST-1, 1, true, true);
18743 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_COMBOBOX;
18744
18745 CONFIG_UINT(
18746 list, list_info,
18747 &settings->uints.netplay_share_analog,
18748 MENU_ENUM_LABEL_NETPLAY_SHARE_ANALOG,
18749 MENU_ENUM_LABEL_VALUE_NETPLAY_SHARE_ANALOG,
18750 netplay_share_analog,
18751 &group_info,
18752 &subgroup_info,
18753 parent_group,
18754 general_write_handler,
18755 general_read_handler);
18756 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
18757 (*list)[list_info->index - 1].get_string_representation =
18758 &setting_get_string_representation_netplay_share_analog;
18759 menu_settings_list_current_add_range(list, list_info, 0, RARCH_NETPLAY_SHARE_ANALOG_LAST-1, 1, true, true);
18760 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_COMBOBOX;
18761
18762 for (user = 0; user < MAX_USERS; user++)
18763 {
18764 snprintf(dev_req_label, sizeof(dev_req_label),
18765 msg_hash_to_str(MENU_ENUM_LABEL_NETPLAY_REQUEST_DEVICE_I), user + 1);
18766 snprintf(dev_req_value, sizeof(dev_req_value),
18767 msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NETPLAY_REQUEST_DEVICE_I), user + 1);
18768 CONFIG_BOOL_ALT(
18769 list, list_info,
18770 &settings->bools.netplay_request_devices[user],
18771 strdup(dev_req_label),
18772 strdup(dev_req_value),
18773 false,
18774 MENU_ENUM_LABEL_VALUE_NO,
18775 MENU_ENUM_LABEL_VALUE_YES,
18776 &group_info,
18777 &subgroup_info,
18778 parent_group,
18779 general_write_handler,
18780 general_read_handler,
18781 SD_FLAG_ADVANCED);
18782 SETTINGS_DATA_LIST_CURRENT_ADD_FREE_FLAGS(list, list_info, SD_FREE_FLAG_NAME | SD_FREE_FLAG_SHORT);
18783 MENU_SETTINGS_LIST_CURRENT_ADD_ENUM_IDX_PTR(list, list_info, (enum msg_hash_enums)(MENU_ENUM_LABEL_NETPLAY_REQUEST_DEVICE_1 + user));
18784 }
18785
18786 END_SUB_GROUP(list, list_info, parent_group);
18787
18788 START_SUB_GROUP(
18789 list,
18790 list_info,
18791 "Miscellaneous",
18792 &group_info,
18793 &subgroup_info,
18794 parent_group);
18795
18796 #if defined(HAVE_NETWORK_CMD)
18797 CONFIG_BOOL(
18798 list, list_info,
18799 &settings->bools.network_cmd_enable,
18800 MENU_ENUM_LABEL_NETWORK_CMD_ENABLE,
18801 MENU_ENUM_LABEL_VALUE_NETWORK_CMD_ENABLE,
18802 network_cmd_enable,
18803 MENU_ENUM_LABEL_VALUE_OFF,
18804 MENU_ENUM_LABEL_VALUE_ON,
18805 &group_info,
18806 &subgroup_info,
18807 parent_group,
18808 general_write_handler,
18809 general_read_handler,
18810 SD_FLAG_ADVANCED);
18811 (*list)[list_info->index - 1].action_ok = &setting_bool_action_left_with_refresh;
18812 (*list)[list_info->index - 1].action_left = &setting_bool_action_left_with_refresh;
18813 (*list)[list_info->index - 1].action_right = &setting_bool_action_right_with_refresh;
18814
18815 CONFIG_UINT(
18816 list, list_info,
18817 &settings->uints.network_cmd_port,
18818 MENU_ENUM_LABEL_NETWORK_CMD_PORT,
18819 MENU_ENUM_LABEL_VALUE_NETWORK_CMD_PORT,
18820 network_cmd_port,
18821 &group_info,
18822 &subgroup_info,
18823 parent_group,
18824 NULL,
18825 NULL);
18826 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
18827 (*list)[list_info->index - 1].offset_by = 1;
18828 menu_settings_list_current_add_range(list, list_info, 1, 99999, 1, true, true);
18829 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ADVANCED);
18830
18831 CONFIG_BOOL(
18832 list, list_info,
18833 &settings->bools.network_remote_enable,
18834 MENU_ENUM_LABEL_NETWORK_REMOTE_ENABLE,
18835 MENU_ENUM_LABEL_VALUE_NETWORK_REMOTE_ENABLE,
18836 false,
18837 MENU_ENUM_LABEL_VALUE_OFF,
18838 MENU_ENUM_LABEL_VALUE_ON,
18839 &group_info,
18840 &subgroup_info,
18841 parent_group,
18842 general_write_handler,
18843 general_read_handler,
18844 SD_FLAG_ADVANCED);
18845
18846 CONFIG_UINT(
18847 list, list_info,
18848 &settings->uints.network_remote_base_port,
18849 MENU_ENUM_LABEL_NETWORK_REMOTE_PORT,
18850 MENU_ENUM_LABEL_VALUE_NETWORK_REMOTE_PORT,
18851 network_remote_base_port,
18852 &group_info,
18853 &subgroup_info,
18854 parent_group,
18855 NULL,
18856 NULL);
18857 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
18858 (*list)[list_info->index - 1].offset_by = 1;
18859 menu_settings_list_current_add_range(list, list_info, 1, 99999, 1, true, true);
18860 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ADVANCED);
18861 /* TODO/FIXME - add enum_idx */
18862
18863 {
18864 unsigned max_users = *(input_driver_get_uint(INPUT_ACTION_MAX_USERS));
18865 for (user = 0; user < max_users; user++)
18866 {
18867 char s1[64], s2[64];
18868
18869 snprintf(s1, sizeof(s1), "%s_user_p%d", msg_hash_to_str(MENU_ENUM_LABEL_NETWORK_REMOTE_ENABLE), user + 1);
18870 snprintf(s2, sizeof(s2), msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NETWORK_USER_REMOTE_ENABLE), user + 1);
18871
18872 CONFIG_BOOL_ALT(
18873 list, list_info,
18874 &settings->bools.network_remote_enable_user[user],
18875 /* todo: figure out this value, it's working fine but I don't think this is correct */
18876 strdup(s1),
18877 strdup(s2),
18878 false,
18879 MENU_ENUM_LABEL_VALUE_OFF,
18880 MENU_ENUM_LABEL_VALUE_ON,
18881 &group_info,
18882 &subgroup_info,
18883 parent_group,
18884 general_write_handler,
18885 general_read_handler,
18886 SD_FLAG_ADVANCED);
18887 SETTINGS_DATA_LIST_CURRENT_ADD_FREE_FLAGS(list, list_info, SD_FREE_FLAG_NAME | SD_FREE_FLAG_SHORT);
18888 MENU_SETTINGS_LIST_CURRENT_ADD_ENUM_IDX_PTR(list, list_info, (enum msg_hash_enums)(MENU_ENUM_LABEL_NETWORK_REMOTE_USER_1_ENABLE + user));
18889 }
18890 }
18891
18892 CONFIG_BOOL(
18893 list, list_info,
18894 &settings->bools.stdin_cmd_enable,
18895 MENU_ENUM_LABEL_STDIN_CMD_ENABLE,
18896 MENU_ENUM_LABEL_VALUE_STDIN_CMD_ENABLE,
18897 stdin_cmd_enable,
18898 MENU_ENUM_LABEL_VALUE_OFF,
18899 MENU_ENUM_LABEL_VALUE_ON,
18900 &group_info,
18901 &subgroup_info,
18902 parent_group,
18903 general_write_handler,
18904 general_read_handler,
18905 SD_FLAG_ADVANCED);
18906 #endif
18907 CONFIG_BOOL(
18908 list, list_info,
18909 &settings->bools.network_on_demand_thumbnails,
18910 MENU_ENUM_LABEL_NETWORK_ON_DEMAND_THUMBNAILS,
18911 MENU_ENUM_LABEL_VALUE_NETWORK_ON_DEMAND_THUMBNAILS,
18912 DEFAULT_NETWORK_ON_DEMAND_THUMBNAILS,
18913 MENU_ENUM_LABEL_VALUE_OFF,
18914 MENU_ENUM_LABEL_VALUE_ON,
18915 &group_info,
18916 &subgroup_info,
18917 parent_group,
18918 general_write_handler,
18919 general_read_handler,
18920 SD_FLAG_NONE);
18921 #endif
18922 }
18923 END_SUB_GROUP(list, list_info, parent_group);
18924 END_GROUP(list, list_info, parent_group);
18925 break;
18926 case SETTINGS_LIST_LAKKA_SERVICES:
18927 {
18928 #if defined(HAVE_LAKKA)
18929 START_GROUP(list, list_info, &group_info,
18930 msg_hash_to_str(MENU_ENUM_LABEL_VALUE_LAKKA_SERVICES),
18931 parent_group);
18932
18933 parent_group = msg_hash_to_str(MENU_ENUM_LABEL_SETTINGS);
18934
18935 START_SUB_GROUP(list, list_info,
18936 msg_hash_to_str(MENU_ENUM_LABEL_VALUE_LAKKA_SERVICES),
18937 &group_info, &subgroup_info, parent_group);
18938
18939 CONFIG_BOOL(
18940 list, list_info,
18941 &settings->bools.ssh_enable,
18942 MENU_ENUM_LABEL_SSH_ENABLE,
18943 MENU_ENUM_LABEL_VALUE_SSH_ENABLE,
18944 true,
18945 MENU_ENUM_LABEL_VALUE_OFF,
18946 MENU_ENUM_LABEL_VALUE_ON,
18947 &group_info,
18948 &subgroup_info,
18949 parent_group,
18950 general_write_handler,
18951 general_read_handler,
18952 SD_FLAG_NONE);
18953 (*list)[list_info->index - 1].change_handler = ssh_enable_toggle_change_handler;
18954
18955 CONFIG_BOOL(
18956 list, list_info,
18957 &settings->bools.samba_enable,
18958 MENU_ENUM_LABEL_SAMBA_ENABLE,
18959 MENU_ENUM_LABEL_VALUE_SAMBA_ENABLE,
18960 true,
18961 MENU_ENUM_LABEL_VALUE_OFF,
18962 MENU_ENUM_LABEL_VALUE_ON,
18963 &group_info,
18964 &subgroup_info,
18965 parent_group,
18966 general_write_handler,
18967 general_read_handler,
18968 SD_FLAG_NONE);
18969 (*list)[list_info->index - 1].change_handler = samba_enable_toggle_change_handler;
18970
18971 CONFIG_BOOL(
18972 list, list_info,
18973 &settings->bools.bluetooth_enable,
18974 MENU_ENUM_LABEL_BLUETOOTH_ENABLE,
18975 MENU_ENUM_LABEL_VALUE_BLUETOOTH_ENABLE,
18976 true,
18977 MENU_ENUM_LABEL_VALUE_OFF,
18978 MENU_ENUM_LABEL_VALUE_ON,
18979 &group_info,
18980 &subgroup_info,
18981 parent_group,
18982 general_write_handler,
18983 general_read_handler,
18984 SD_FLAG_NONE);
18985 (*list)[list_info->index - 1].change_handler = bluetooth_enable_toggle_change_handler;
18986
18987 CONFIG_BOOL(
18988 list, list_info,
18989 &settings->bools.localap_enable,
18990 MENU_ENUM_LABEL_LOCALAP_ENABLE,
18991 MENU_ENUM_LABEL_VALUE_LOCALAP_ENABLE,
18992 true,
18993 MENU_ENUM_LABEL_VALUE_OFF,
18994 MENU_ENUM_LABEL_VALUE_ON,
18995 &group_info,
18996 &subgroup_info,
18997 parent_group,
18998 general_write_handler,
18999 general_read_handler,
19000 SD_FLAG_NONE);
19001 (*list)[list_info->index - 1].change_handler = localap_enable_toggle_change_handler;
19002
19003 CONFIG_STRING_OPTIONS(
19004 list, list_info,
19005 settings->arrays.timezone,
19006 sizeof(settings->arrays.timezone),
19007 MENU_ENUM_LABEL_TIMEZONE,
19008 MENU_ENUM_LABEL_VALUE_TIMEZONE,
19009 DEFAULT_TIMEZONE,
19010 config_get_all_timezones(),
19011 &group_info,
19012 &subgroup_info,
19013 parent_group,
19014 general_read_handler,
19015 general_write_handler);
19016 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_IS_DRIVER);
19017 (*list)[list_info->index - 1].action_ok = setting_action_ok_mapped_string;
19018 (*list)[list_info->index - 1].change_handler = timezone_change_handler;
19019
19020 END_SUB_GROUP(list, list_info, parent_group);
19021 END_GROUP(list, list_info, parent_group);
19022 #endif
19023 }
19024 break;
19025 case SETTINGS_LIST_USER:
19026 START_GROUP(list, list_info, &group_info,
19027 msg_hash_to_str(MENU_ENUM_LABEL_VALUE_USER_SETTINGS),
19028 parent_group);
19029
19030 parent_group = msg_hash_to_str(MENU_ENUM_LABEL_USER_SETTINGS);
19031
19032 START_SUB_GROUP(list, list_info, "State", &group_info, &subgroup_info, parent_group);
19033
19034 CONFIG_ACTION(
19035 list, list_info,
19036 MENU_ENUM_LABEL_ACCOUNTS_LIST,
19037 MENU_ENUM_LABEL_VALUE_ACCOUNTS_LIST,
19038 &group_info,
19039 &subgroup_info,
19040 parent_group);
19041 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED);
19042
19043 CONFIG_STRING(
19044 list, list_info,
19045 settings->paths.username,
19046 sizeof(settings->paths.username),
19047 MENU_ENUM_LABEL_NETPLAY_NICKNAME,
19048 MENU_ENUM_LABEL_VALUE_NETPLAY_NICKNAME,
19049 "",
19050 &group_info,
19051 &subgroup_info,
19052 parent_group,
19053 general_write_handler,
19054 general_read_handler);
19055 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ALLOW_INPUT);
19056 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_STRING_LINE_EDIT;
19057 (*list)[list_info->index - 1].action_start = setting_generic_action_start_default;
19058
19059 CONFIG_STRING(
19060 list, list_info,
19061 settings->paths.browse_url,
19062 sizeof(settings->paths.browse_url),
19063 MENU_ENUM_LABEL_BROWSE_URL,
19064 MENU_ENUM_LABEL_VALUE_BROWSE_URL,
19065 "",
19066 &group_info,
19067 &subgroup_info,
19068 parent_group,
19069 general_write_handler,
19070 general_read_handler);
19071 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ALLOW_INPUT);
19072 (*list)[list_info->index - 1].action_start = setting_generic_action_start_default;
19073
19074 #ifdef HAVE_LANGEXTRA
19075 CONFIG_UINT(
19076 list, list_info,
19077 msg_hash_get_uint(MSG_HASH_USER_LANGUAGE),
19078 MENU_ENUM_LABEL_USER_LANGUAGE,
19079 MENU_ENUM_LABEL_VALUE_USER_LANGUAGE,
19080 DEFAULT_USER_LANGUAGE,
19081 &group_info,
19082 &subgroup_info,
19083 parent_group,
19084 general_write_handler,
19085 general_read_handler);
19086 menu_settings_list_current_add_range(
19087 list,
19088 list_info,
19089 0,
19090 RETRO_LANGUAGE_LAST-1,
19091 1,
19092 true,
19093 true);
19094 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
19095 (*list)[list_info->index - 1].action_left = &setting_uint_action_left_with_refresh;
19096 (*list)[list_info->index - 1].action_right = &setting_uint_action_right_with_refresh;
19097 (*list)[list_info->index - 1].get_string_representation =
19098 &setting_get_string_representation_uint_user_language;
19099 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_COMBOBOX;
19100 #endif
19101
19102 END_SUB_GROUP(list, list_info, parent_group);
19103 END_GROUP(list, list_info, parent_group);
19104 break;
19105 case SETTINGS_LIST_USER_ACCOUNTS:
19106 START_GROUP(list, list_info, &group_info,
19107 msg_hash_to_str(MENU_ENUM_LABEL_VALUE_ACCOUNTS_LIST_END),
19108 parent_group);
19109
19110 parent_group = msg_hash_to_str(MENU_ENUM_LABEL_SETTINGS);
19111
19112 START_SUB_GROUP(list, list_info, "State", &group_info, &subgroup_info, parent_group);
19113
19114 #ifdef HAVE_CHEEVOS
19115 CONFIG_ACTION(
19116 list, list_info,
19117 MENU_ENUM_LABEL_ACCOUNTS_RETRO_ACHIEVEMENTS,
19118 MENU_ENUM_LABEL_VALUE_ACCOUNTS_RETRO_ACHIEVEMENTS,
19119 &group_info,
19120 &subgroup_info,
19121 parent_group);
19122 #endif
19123
19124 #ifdef HAVE_NETWORKING
19125 CONFIG_ACTION(
19126 list, list_info,
19127 MENU_ENUM_LABEL_ACCOUNTS_YOUTUBE,
19128 MENU_ENUM_LABEL_VALUE_ACCOUNTS_YOUTUBE,
19129 &group_info,
19130 &subgroup_info,
19131 parent_group);
19132
19133 CONFIG_ACTION(
19134 list, list_info,
19135 MENU_ENUM_LABEL_ACCOUNTS_TWITCH,
19136 MENU_ENUM_LABEL_VALUE_ACCOUNTS_TWITCH,
19137 &group_info,
19138 &subgroup_info,
19139 parent_group);
19140
19141 CONFIG_ACTION(
19142 list, list_info,
19143 MENU_ENUM_LABEL_ACCOUNTS_FACEBOOK,
19144 MENU_ENUM_LABEL_VALUE_ACCOUNTS_FACEBOOK,
19145 &group_info,
19146 &subgroup_info,
19147 parent_group);
19148 #endif
19149
19150 END_SUB_GROUP(list, list_info, parent_group);
19151 END_GROUP(list, list_info, parent_group);
19152 break;
19153 case SETTINGS_LIST_USER_ACCOUNTS_YOUTUBE:
19154 START_GROUP(list, list_info, &group_info,
19155 msg_hash_to_str(MENU_ENUM_LABEL_VALUE_ACCOUNTS_YOUTUBE),
19156 parent_group);
19157
19158 parent_group = msg_hash_to_str(MENU_ENUM_LABEL_SETTINGS);
19159
19160 START_SUB_GROUP(list, list_info, "State", &group_info, &subgroup_info, parent_group);
19161
19162 CONFIG_STRING(
19163 list, list_info,
19164 settings->arrays.youtube_stream_key,
19165 sizeof(settings->arrays.youtube_stream_key),
19166 MENU_ENUM_LABEL_YOUTUBE_STREAM_KEY,
19167 MENU_ENUM_LABEL_VALUE_YOUTUBE_STREAM_KEY,
19168 "",
19169 &group_info,
19170 &subgroup_info,
19171 parent_group,
19172 update_streaming_url_write_handler,
19173 general_read_handler);
19174 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ALLOW_INPUT);
19175 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_STRING_LINE_EDIT;
19176 (*list)[list_info->index - 1].action_start = setting_generic_action_start_default;
19177
19178 END_SUB_GROUP(list, list_info, parent_group);
19179 END_GROUP(list, list_info, parent_group);
19180 break;
19181 case SETTINGS_LIST_USER_ACCOUNTS_TWITCH:
19182 START_GROUP(list, list_info, &group_info,
19183 msg_hash_to_str(MENU_ENUM_LABEL_VALUE_ACCOUNTS_TWITCH),
19184 parent_group);
19185
19186 parent_group = msg_hash_to_str(MENU_ENUM_LABEL_SETTINGS);
19187
19188 START_SUB_GROUP(list, list_info, "State", &group_info, &subgroup_info, parent_group);
19189
19190 CONFIG_STRING(
19191 list, list_info,
19192 settings->arrays.twitch_stream_key,
19193 sizeof(settings->arrays.twitch_stream_key),
19194 MENU_ENUM_LABEL_TWITCH_STREAM_KEY,
19195 MENU_ENUM_LABEL_VALUE_TWITCH_STREAM_KEY,
19196 "",
19197 &group_info,
19198 &subgroup_info,
19199 parent_group,
19200 update_streaming_url_write_handler,
19201 general_read_handler);
19202 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ALLOW_INPUT);
19203 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_STRING_LINE_EDIT;
19204 (*list)[list_info->index - 1].action_start = setting_generic_action_start_default;
19205
19206 END_SUB_GROUP(list, list_info, parent_group);
19207 END_GROUP(list, list_info, parent_group);
19208 break;
19209 case SETTINGS_LIST_USER_ACCOUNTS_FACEBOOK:
19210 START_GROUP(list, list_info, &group_info,
19211 msg_hash_to_str(MENU_ENUM_LABEL_VALUE_ACCOUNTS_FACEBOOK),
19212 parent_group);
19213
19214 parent_group = msg_hash_to_str(MENU_ENUM_LABEL_SETTINGS);
19215
19216 START_SUB_GROUP(list, list_info, "State", &group_info, &subgroup_info, parent_group);
19217
19218 CONFIG_STRING(
19219 list, list_info,
19220 settings->arrays.facebook_stream_key,
19221 sizeof(settings->arrays.facebook_stream_key),
19222 MENU_ENUM_LABEL_FACEBOOK_STREAM_KEY,
19223 MENU_ENUM_LABEL_VALUE_FACEBOOK_STREAM_KEY,
19224 "",
19225 &group_info,
19226 &subgroup_info,
19227 parent_group,
19228 update_streaming_url_write_handler,
19229 general_read_handler);
19230 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ALLOW_INPUT);
19231 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_STRING_LINE_EDIT;
19232 (*list)[list_info->index - 1].action_start = setting_generic_action_start_default;
19233
19234 END_SUB_GROUP(list, list_info, parent_group);
19235 END_GROUP(list, list_info, parent_group);
19236 break;
19237 case SETTINGS_LIST_USER_ACCOUNTS_CHEEVOS:
19238 START_GROUP(list, list_info, &group_info,
19239 msg_hash_to_str(MENU_ENUM_LABEL_VALUE_ACCOUNTS_CHEEVOS_SETTINGS),
19240 parent_group);
19241
19242 parent_group = msg_hash_to_str(MENU_ENUM_LABEL_SETTINGS);
19243
19244 START_SUB_GROUP(list, list_info, "State", &group_info, &subgroup_info, parent_group);
19245
19246 #ifdef HAVE_CHEEVOS
19247 CONFIG_STRING(
19248 list, list_info,
19249 settings->arrays.cheevos_username,
19250 sizeof(settings->arrays.cheevos_username),
19251 MENU_ENUM_LABEL_CHEEVOS_USERNAME,
19252 MENU_ENUM_LABEL_VALUE_ACCOUNTS_CHEEVOS_USERNAME,
19253 "",
19254 &group_info,
19255 &subgroup_info,
19256 parent_group,
19257 general_write_handler,
19258 general_read_handler);
19259 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ALLOW_INPUT);
19260 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_STRING_LINE_EDIT;
19261 (*list)[list_info->index - 1].action_start = setting_generic_action_start_default;
19262
19263 CONFIG_STRING(
19264 list, list_info,
19265 settings->arrays.cheevos_password,
19266 sizeof(settings->arrays.cheevos_password),
19267 MENU_ENUM_LABEL_CHEEVOS_PASSWORD,
19268 MENU_ENUM_LABEL_VALUE_ACCOUNTS_CHEEVOS_PASSWORD,
19269 "",
19270 &group_info,
19271 &subgroup_info,
19272 parent_group,
19273 general_write_handler,
19274 general_read_handler);
19275 (*list)[list_info->index - 1].get_string_representation =
19276 &setting_get_string_representation_cheevos_password;
19277 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ALLOW_INPUT);
19278 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_PASSWORD_LINE_EDIT;
19279 (*list)[list_info->index - 1].action_start = setting_generic_action_start_default;
19280 #endif
19281
19282 END_SUB_GROUP(list, list_info, parent_group);
19283 END_GROUP(list, list_info, parent_group);
19284 break;
19285 case SETTINGS_LIST_DIRECTORY:
19286 START_GROUP(list, list_info, &group_info,
19287 msg_hash_to_str(MENU_ENUM_LABEL_VALUE_DIRECTORY_SETTINGS),
19288 parent_group);
19289 MENU_SETTINGS_LIST_CURRENT_ADD_ENUM_IDX_PTR(list, list_info, MENU_ENUM_LABEL_DIRECTORY_SETTINGS);
19290
19291 parent_group = msg_hash_to_str(MENU_ENUM_LABEL_DIRECTORY_SETTINGS);
19292
19293 START_SUB_GROUP(list, list_info, "State", &group_info, &subgroup_info, parent_group);
19294
19295 CONFIG_DIR(
19296 list, list_info,
19297 settings->paths.directory_system,
19298 sizeof(settings->paths.directory_system),
19299 MENU_ENUM_LABEL_SYSTEM_DIRECTORY,
19300 MENU_ENUM_LABEL_VALUE_SYSTEM_DIRECTORY,
19301 g_defaults.dirs[DEFAULT_DIR_SYSTEM],
19302 MENU_ENUM_LABEL_VALUE_DIRECTORY_CONTENT,
19303 &group_info,
19304 &subgroup_info,
19305 parent_group,
19306 general_write_handler,
19307 general_read_handler);
19308 (*list)[list_info->index - 1].action_start = directory_action_start_generic;
19309
19310 CONFIG_DIR(
19311 list, list_info,
19312 settings->paths.directory_core_assets,
19313 sizeof(settings->paths.directory_core_assets),
19314 MENU_ENUM_LABEL_CORE_ASSETS_DIRECTORY,
19315 MENU_ENUM_LABEL_VALUE_CORE_ASSETS_DIRECTORY,
19316 g_defaults.dirs[DEFAULT_DIR_CORE_ASSETS],
19317 MENU_ENUM_LABEL_VALUE_DIRECTORY_DEFAULT,
19318 &group_info,
19319 &subgroup_info,
19320 parent_group,
19321 general_write_handler,
19322 general_read_handler);
19323 (*list)[list_info->index - 1].action_start = directory_action_start_generic;
19324
19325 CONFIG_DIR(
19326 list, list_info,
19327 settings->paths.directory_assets,
19328 sizeof(settings->paths.directory_assets),
19329 MENU_ENUM_LABEL_ASSETS_DIRECTORY,
19330 MENU_ENUM_LABEL_VALUE_ASSETS_DIRECTORY,
19331 g_defaults.dirs[DEFAULT_DIR_ASSETS],
19332 MENU_ENUM_LABEL_VALUE_DIRECTORY_DEFAULT,
19333 &group_info,
19334 &subgroup_info,
19335 parent_group,
19336 general_write_handler,
19337 general_read_handler);
19338 (*list)[list_info->index - 1].action_start = directory_action_start_generic;
19339
19340 CONFIG_DIR(
19341 list, list_info,
19342 settings->paths.directory_dynamic_wallpapers,
19343 sizeof(settings->paths.directory_dynamic_wallpapers),
19344 MENU_ENUM_LABEL_DYNAMIC_WALLPAPERS_DIRECTORY,
19345 MENU_ENUM_LABEL_VALUE_DYNAMIC_WALLPAPERS_DIRECTORY,
19346 g_defaults.dirs[DEFAULT_DIR_WALLPAPERS],
19347 MENU_ENUM_LABEL_VALUE_DIRECTORY_DEFAULT,
19348 &group_info,
19349 &subgroup_info,
19350 parent_group,
19351 general_write_handler,
19352 general_read_handler);
19353 (*list)[list_info->index - 1].action_start = directory_action_start_generic;
19354
19355 CONFIG_DIR(
19356 list, list_info,
19357 settings->paths.directory_thumbnails,
19358 sizeof(settings->paths.directory_thumbnails),
19359 MENU_ENUM_LABEL_THUMBNAILS_DIRECTORY,
19360 MENU_ENUM_LABEL_VALUE_THUMBNAILS_DIRECTORY,
19361 g_defaults.dirs[DEFAULT_DIR_THUMBNAILS],
19362 MENU_ENUM_LABEL_VALUE_DIRECTORY_DEFAULT,
19363 &group_info,
19364 &subgroup_info,
19365 parent_group,
19366 general_write_handler,
19367 general_read_handler);
19368 (*list)[list_info->index - 1].action_start = directory_action_start_generic;
19369
19370 CONFIG_DIR(
19371 list, list_info,
19372 settings->paths.directory_menu_content,
19373 sizeof(settings->paths.directory_menu_content),
19374 MENU_ENUM_LABEL_RGUI_BROWSER_DIRECTORY,
19375 MENU_ENUM_LABEL_VALUE_RGUI_BROWSER_DIRECTORY,
19376 g_defaults.dirs[DEFAULT_DIR_MENU_CONTENT],
19377 MENU_ENUM_LABEL_VALUE_DIRECTORY_DEFAULT,
19378 &group_info,
19379 &subgroup_info,
19380 parent_group,
19381 general_write_handler,
19382 general_read_handler);
19383 (*list)[list_info->index - 1].action_start = directory_action_start_generic;
19384
19385 CONFIG_DIR(
19386 list, list_info,
19387 settings->paths.directory_menu_config,
19388 sizeof(settings->paths.directory_menu_config),
19389 MENU_ENUM_LABEL_RGUI_CONFIG_DIRECTORY,
19390 MENU_ENUM_LABEL_VALUE_RGUI_CONFIG_DIRECTORY,
19391 g_defaults.dirs[DEFAULT_DIR_MENU_CONFIG],
19392 MENU_ENUM_LABEL_VALUE_DIRECTORY_DEFAULT,
19393 &group_info,
19394 &subgroup_info,
19395 parent_group,
19396 general_write_handler,
19397 general_read_handler);
19398 (*list)[list_info->index - 1].action_start = directory_action_start_generic;
19399
19400 CONFIG_DIR(
19401 list, list_info,
19402 settings->paths.directory_libretro,
19403 sizeof(settings->paths.directory_libretro),
19404 MENU_ENUM_LABEL_LIBRETRO_DIR_PATH,
19405 MENU_ENUM_LABEL_VALUE_LIBRETRO_DIR_PATH,
19406 g_defaults.dirs[DEFAULT_DIR_CORE],
19407 MENU_ENUM_LABEL_VALUE_DIRECTORY_NONE,
19408 &group_info,
19409 &subgroup_info,
19410 parent_group,
19411 general_write_handler,
19412 general_read_handler);
19413 MENU_SETTINGS_LIST_CURRENT_ADD_CMD(list, list_info, CMD_EVENT_CORE_INFO_INIT);
19414 (*list)[list_info->index - 1].action_start = directory_action_start_generic;
19415
19416 CONFIG_DIR(
19417 list, list_info,
19418 settings->paths.path_libretro_info,
19419 sizeof(settings->paths.path_libretro_info),
19420 MENU_ENUM_LABEL_LIBRETRO_INFO_PATH,
19421 MENU_ENUM_LABEL_VALUE_LIBRETRO_INFO_PATH,
19422 g_defaults.dirs[DEFAULT_DIR_CORE_INFO],
19423 MENU_ENUM_LABEL_VALUE_DIRECTORY_NONE,
19424 &group_info,
19425 &subgroup_info,
19426 parent_group,
19427 general_write_handler,
19428 general_read_handler);
19429 MENU_SETTINGS_LIST_CURRENT_ADD_CMD(list, list_info, CMD_EVENT_CORE_INFO_INIT);
19430 (*list)[list_info->index - 1].action_start = directory_action_start_generic;
19431
19432 #ifdef HAVE_LIBRETRODB
19433 CONFIG_DIR(
19434 list, list_info,
19435 settings->paths.path_content_database,
19436 sizeof(settings->paths.path_content_database),
19437 MENU_ENUM_LABEL_CONTENT_DATABASE_DIRECTORY,
19438 MENU_ENUM_LABEL_VALUE_CONTENT_DATABASE_DIRECTORY,
19439 g_defaults.dirs[DEFAULT_DIR_DATABASE],
19440 MENU_ENUM_LABEL_VALUE_DIRECTORY_NONE,
19441 &group_info,
19442 &subgroup_info,
19443 parent_group,
19444 general_write_handler,
19445 general_read_handler);
19446 (*list)[list_info->index - 1].action_start = directory_action_start_generic;
19447
19448 CONFIG_DIR(
19449 list, list_info,
19450 settings->paths.directory_cursor,
19451 sizeof(settings->paths.directory_cursor),
19452 MENU_ENUM_LABEL_CURSOR_DIRECTORY,
19453 MENU_ENUM_LABEL_VALUE_CURSOR_DIRECTORY,
19454 g_defaults.dirs[DEFAULT_DIR_CURSOR],
19455 MENU_ENUM_LABEL_VALUE_DIRECTORY_NONE,
19456 &group_info,
19457 &subgroup_info,
19458 parent_group,
19459 general_write_handler,
19460 general_read_handler);
19461 (*list)[list_info->index - 1].action_start = directory_action_start_generic;
19462 #endif
19463
19464 CONFIG_DIR(
19465 list, list_info,
19466 settings->paths.path_cheat_database,
19467 sizeof(settings->paths.path_cheat_database),
19468 MENU_ENUM_LABEL_CHEAT_DATABASE_PATH,
19469 MENU_ENUM_LABEL_VALUE_CHEAT_DATABASE_PATH,
19470 g_defaults.dirs[DEFAULT_DIR_CHEATS],
19471 MENU_ENUM_LABEL_VALUE_DIRECTORY_NONE,
19472 &group_info,
19473 &subgroup_info,
19474 parent_group,
19475 general_write_handler,
19476 general_read_handler);
19477 (*list)[list_info->index - 1].action_start = directory_action_start_generic;
19478
19479 CONFIG_DIR(
19480 list, list_info,
19481 settings->paths.directory_video_filter,
19482 sizeof(settings->paths.directory_video_filter),
19483 MENU_ENUM_LABEL_VIDEO_FILTER_DIR,
19484 MENU_ENUM_LABEL_VALUE_VIDEO_FILTER_DIR,
19485 g_defaults.dirs[DEFAULT_DIR_VIDEO_FILTER],
19486 MENU_ENUM_LABEL_VALUE_DIRECTORY_DEFAULT,
19487 &group_info,
19488 &subgroup_info,
19489 parent_group,
19490 general_write_handler,
19491 general_read_handler);
19492 (*list)[list_info->index - 1].action_start = directory_action_start_generic;
19493
19494 CONFIG_DIR(
19495 list, list_info,
19496 settings->paths.directory_audio_filter,
19497 sizeof(settings->paths.directory_audio_filter),
19498 MENU_ENUM_LABEL_AUDIO_FILTER_DIR,
19499 MENU_ENUM_LABEL_VALUE_AUDIO_FILTER_DIR,
19500 g_defaults.dirs[DEFAULT_DIR_AUDIO_FILTER],
19501 MENU_ENUM_LABEL_VALUE_DIRECTORY_DEFAULT,
19502 &group_info,
19503 &subgroup_info,
19504 parent_group,
19505 general_write_handler,
19506 general_read_handler);
19507 (*list)[list_info->index - 1].action_start = directory_action_start_generic;
19508
19509 #if defined(HAVE_CG) || defined(HAVE_GLSL) || defined(HAVE_SLANG) || defined(HAVE_HLSL)
19510 CONFIG_DIR(
19511 list, list_info,
19512 settings->paths.directory_video_shader,
19513 sizeof(settings->paths.directory_video_shader),
19514 MENU_ENUM_LABEL_VIDEO_SHADER_DIR,
19515 MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_DIR,
19516 g_defaults.dirs[DEFAULT_DIR_SHADER],
19517 MENU_ENUM_LABEL_VALUE_DIRECTORY_DEFAULT,
19518 &group_info,
19519 &subgroup_info,
19520 parent_group,
19521 general_write_handler,
19522 general_read_handler);
19523 (*list)[list_info->index - 1].action_start = directory_action_start_generic;
19524 #endif
19525
19526 if (string_is_not_equal(settings->arrays.record_driver, "null"))
19527 {
19528 CONFIG_DIR(
19529 list, list_info,
19530 global->record.output_dir,
19531 sizeof(global->record.output_dir),
19532 MENU_ENUM_LABEL_RECORDING_OUTPUT_DIRECTORY,
19533 MENU_ENUM_LABEL_VALUE_RECORDING_OUTPUT_DIRECTORY,
19534 g_defaults.dirs[DEFAULT_DIR_RECORD_OUTPUT],
19535 MENU_ENUM_LABEL_VALUE_DIRECTORY_DEFAULT,
19536 &group_info,
19537 &subgroup_info,
19538 parent_group,
19539 general_write_handler,
19540 general_read_handler);
19541 (*list)[list_info->index - 1].action_start = directory_action_start_generic;
19542
19543 CONFIG_DIR(
19544 list, list_info,
19545 global->record.config_dir,
19546 sizeof(global->record.config_dir),
19547 MENU_ENUM_LABEL_RECORDING_CONFIG_DIRECTORY,
19548 MENU_ENUM_LABEL_VALUE_RECORDING_CONFIG_DIRECTORY,
19549 g_defaults.dirs[DEFAULT_DIR_RECORD_CONFIG],
19550 MENU_ENUM_LABEL_VALUE_DIRECTORY_DEFAULT,
19551 &group_info,
19552 &subgroup_info,
19553 parent_group,
19554 general_write_handler,
19555 general_read_handler);
19556 (*list)[list_info->index - 1].action_start = directory_action_start_generic;
19557 }
19558 #ifdef HAVE_OVERLAY
19559 CONFIG_DIR(
19560 list, list_info,
19561 settings->paths.directory_overlay,
19562 sizeof(settings->paths.directory_overlay),
19563 MENU_ENUM_LABEL_OVERLAY_DIRECTORY,
19564 MENU_ENUM_LABEL_VALUE_OVERLAY_DIRECTORY,
19565 g_defaults.dirs[DEFAULT_DIR_OVERLAY],
19566 MENU_ENUM_LABEL_VALUE_DIRECTORY_DEFAULT,
19567 &group_info,
19568 &subgroup_info,
19569 parent_group,
19570 general_write_handler,
19571 general_read_handler);
19572 (*list)[list_info->index - 1].action_start = directory_action_start_generic;
19573 #endif
19574
19575 #ifdef HAVE_VIDEO_LAYOUT
19576 CONFIG_DIR(
19577 list, list_info,
19578 settings->paths.directory_video_layout,
19579 sizeof(settings->paths.directory_video_layout),
19580 MENU_ENUM_LABEL_VIDEO_LAYOUT_DIRECTORY,
19581 MENU_ENUM_LABEL_VALUE_VIDEO_LAYOUT_DIRECTORY,
19582 g_defaults.dirs[DEFAULT_DIR_VIDEO_LAYOUT],
19583 MENU_ENUM_LABEL_VALUE_DIRECTORY_DEFAULT,
19584 &group_info,
19585 &subgroup_info,
19586 parent_group,
19587 general_write_handler,
19588 general_read_handler);
19589 (*list)[list_info->index - 1].action_start = directory_action_start_generic;
19590 #endif
19591
19592 CONFIG_DIR(
19593 list, list_info,
19594 settings->paths.directory_screenshot,
19595 sizeof(settings->paths.directory_screenshot),
19596 MENU_ENUM_LABEL_SCREENSHOT_DIRECTORY,
19597 MENU_ENUM_LABEL_VALUE_SCREENSHOT_DIRECTORY,
19598 g_defaults.dirs[DEFAULT_DIR_SCREENSHOT],
19599 MENU_ENUM_LABEL_VALUE_DIRECTORY_CONTENT,
19600 &group_info,
19601 &subgroup_info,
19602 parent_group,
19603 general_write_handler,
19604 general_read_handler);
19605 (*list)[list_info->index - 1].action_start = directory_action_start_generic;
19606
19607 CONFIG_DIR(
19608 list, list_info,
19609 settings->paths.directory_autoconfig,
19610 sizeof(settings->paths.directory_autoconfig),
19611 MENU_ENUM_LABEL_JOYPAD_AUTOCONFIG_DIR,
19612 MENU_ENUM_LABEL_VALUE_JOYPAD_AUTOCONFIG_DIR,
19613 g_defaults.dirs[DEFAULT_DIR_AUTOCONFIG],
19614 MENU_ENUM_LABEL_VALUE_DIRECTORY_DEFAULT,
19615 &group_info,
19616 &subgroup_info,
19617 parent_group,
19618 general_write_handler,
19619 general_read_handler);
19620 (*list)[list_info->index - 1].action_start = directory_action_start_generic;
19621
19622 CONFIG_DIR(
19623 list, list_info,
19624 settings->paths.directory_input_remapping,
19625 sizeof(settings->paths.directory_input_remapping),
19626 MENU_ENUM_LABEL_INPUT_REMAPPING_DIRECTORY,
19627 MENU_ENUM_LABEL_VALUE_INPUT_REMAPPING_DIRECTORY,
19628 g_defaults.dirs[DEFAULT_DIR_REMAP],
19629 MENU_ENUM_LABEL_VALUE_DIRECTORY_NONE,
19630 &group_info,
19631 &subgroup_info,
19632 parent_group,
19633 general_write_handler,
19634 general_read_handler);
19635 (*list)[list_info->index - 1].action_start = directory_action_start_generic;
19636
19637 CONFIG_DIR(
19638 list, list_info,
19639 settings->paths.directory_playlist,
19640 sizeof(settings->paths.directory_playlist),
19641 MENU_ENUM_LABEL_PLAYLIST_DIRECTORY,
19642 MENU_ENUM_LABEL_VALUE_PLAYLIST_DIRECTORY,
19643 g_defaults.dirs[DEFAULT_DIR_PLAYLIST],
19644 MENU_ENUM_LABEL_VALUE_DIRECTORY_DEFAULT,
19645 &group_info,
19646 &subgroup_info,
19647 parent_group,
19648 general_write_handler,
19649 general_read_handler);
19650 (*list)[list_info->index - 1].action_start = directory_action_start_generic;
19651
19652 CONFIG_DIR(
19653 list, list_info,
19654 settings->paths.directory_content_favorites,
19655 sizeof(settings->paths.directory_content_favorites),
19656 MENU_ENUM_LABEL_CONTENT_FAVORITES_DIRECTORY,
19657 MENU_ENUM_LABEL_VALUE_CONTENT_FAVORITES_DIRECTORY,
19658 g_defaults.dirs[DEFAULT_DIR_CONTENT_FAVORITES],
19659 MENU_ENUM_LABEL_VALUE_DIRECTORY_DEFAULT,
19660 &group_info,
19661 &subgroup_info,
19662 parent_group,
19663 general_write_handler,
19664 general_read_handler);
19665 (*list)[list_info->index - 1].action_start = directory_action_start_generic;
19666
19667 CONFIG_DIR(
19668 list, list_info,
19669 settings->paths.directory_content_history,
19670 sizeof(settings->paths.directory_content_history),
19671 MENU_ENUM_LABEL_CONTENT_HISTORY_DIRECTORY,
19672 MENU_ENUM_LABEL_VALUE_CONTENT_HISTORY_DIRECTORY,
19673 g_defaults.dirs[DEFAULT_DIR_CONTENT_HISTORY],
19674 MENU_ENUM_LABEL_VALUE_DIRECTORY_DEFAULT,
19675 &group_info,
19676 &subgroup_info,
19677 parent_group,
19678 general_write_handler,
19679 general_read_handler);
19680 (*list)[list_info->index - 1].action_start = directory_action_start_generic;
19681
19682 CONFIG_DIR(
19683 list, list_info,
19684 settings->paths.directory_content_image_history,
19685 sizeof(settings->paths.directory_content_image_history),
19686 MENU_ENUM_LABEL_CONTENT_IMAGE_HISTORY_DIRECTORY,
19687 MENU_ENUM_LABEL_VALUE_CONTENT_IMAGE_HISTORY_DIRECTORY,
19688 g_defaults.dirs[DEFAULT_DIR_CONTENT_IMAGE_HISTORY],
19689 MENU_ENUM_LABEL_VALUE_DIRECTORY_DEFAULT,
19690 &group_info,
19691 &subgroup_info,
19692 parent_group,
19693 general_write_handler,
19694 general_read_handler);
19695 (*list)[list_info->index - 1].action_start = directory_action_start_generic;
19696
19697 CONFIG_DIR(
19698 list, list_info,
19699 settings->paths.directory_content_music_history,
19700 sizeof(settings->paths.directory_content_music_history),
19701 MENU_ENUM_LABEL_CONTENT_MUSIC_HISTORY_DIRECTORY,
19702 MENU_ENUM_LABEL_VALUE_CONTENT_MUSIC_HISTORY_DIRECTORY,
19703 g_defaults.dirs[DEFAULT_DIR_CONTENT_MUSIC_HISTORY],
19704 MENU_ENUM_LABEL_VALUE_DIRECTORY_DEFAULT,
19705 &group_info,
19706 &subgroup_info,
19707 parent_group,
19708 general_write_handler,
19709 general_read_handler);
19710 (*list)[list_info->index - 1].action_start = directory_action_start_generic;
19711
19712 CONFIG_DIR(
19713 list, list_info,
19714 settings->paths.directory_content_video_history,
19715 sizeof(settings->paths.directory_content_video_history),
19716 MENU_ENUM_LABEL_CONTENT_VIDEO_HISTORY_DIRECTORY,
19717 MENU_ENUM_LABEL_VALUE_CONTENT_VIDEO_HISTORY_DIRECTORY,
19718 g_defaults.dirs[DEFAULT_DIR_CONTENT_VIDEO_HISTORY],
19719 MENU_ENUM_LABEL_VALUE_DIRECTORY_DEFAULT,
19720 &group_info,
19721 &subgroup_info,
19722 parent_group,
19723 general_write_handler,
19724 general_read_handler);
19725 (*list)[list_info->index - 1].action_start = directory_action_start_generic;
19726
19727 CONFIG_DIR(
19728 list, list_info,
19729 settings->paths.directory_runtime_log,
19730 sizeof(settings->paths.directory_runtime_log),
19731 MENU_ENUM_LABEL_RUNTIME_LOG_DIRECTORY,
19732 MENU_ENUM_LABEL_VALUE_RUNTIME_LOG_DIRECTORY,
19733 "",
19734 MENU_ENUM_LABEL_VALUE_DIRECTORY_DEFAULT,
19735 &group_info,
19736 &subgroup_info,
19737 parent_group,
19738 general_write_handler,
19739 general_read_handler);
19740 (*list)[list_info->index - 1].action_start = directory_action_start_generic;
19741
19742 CONFIG_DIR(
19743 list, list_info,
19744 dir_get_ptr(RARCH_DIR_SAVEFILE),
19745 dir_get_size(RARCH_DIR_SAVEFILE),
19746 MENU_ENUM_LABEL_SAVEFILE_DIRECTORY,
19747 MENU_ENUM_LABEL_VALUE_SAVEFILE_DIRECTORY,
19748 g_defaults.dirs[DEFAULT_DIR_SRAM],
19749 MENU_ENUM_LABEL_VALUE_DIRECTORY_CONTENT,
19750 &group_info,
19751 &subgroup_info,
19752 parent_group,
19753 general_write_handler,
19754 general_read_handler);
19755 (*list)[list_info->index - 1].action_start = directory_action_start_generic;
19756
19757 CONFIG_DIR(
19758 list, list_info,
19759 dir_get_ptr(RARCH_DIR_SAVESTATE),
19760 dir_get_size(RARCH_DIR_SAVESTATE),
19761 MENU_ENUM_LABEL_SAVESTATE_DIRECTORY,
19762 MENU_ENUM_LABEL_VALUE_SAVESTATE_DIRECTORY,
19763 g_defaults.dirs[DEFAULT_DIR_SAVESTATE],
19764 MENU_ENUM_LABEL_VALUE_DIRECTORY_CONTENT,
19765 &group_info,
19766 &subgroup_info,
19767 parent_group,
19768 general_write_handler,
19769 general_read_handler);
19770 (*list)[list_info->index - 1].action_start = directory_action_start_generic;
19771
19772 CONFIG_DIR(
19773 list, list_info,
19774 settings->paths.directory_cache,
19775 sizeof(settings->paths.directory_cache),
19776 MENU_ENUM_LABEL_CACHE_DIRECTORY,
19777 MENU_ENUM_LABEL_VALUE_CACHE_DIRECTORY,
19778 g_defaults.dirs[DEFAULT_DIR_CACHE],
19779 MENU_ENUM_LABEL_VALUE_DIRECTORY_NONE,
19780 &group_info,
19781 &subgroup_info,
19782 parent_group,
19783 general_write_handler,
19784 general_read_handler);
19785 (*list)[list_info->index - 1].action_start = directory_action_start_generic;
19786
19787 CONFIG_DIR(
19788 list, list_info,
19789 settings->paths.log_dir,
19790 sizeof(settings->paths.log_dir),
19791 MENU_ENUM_LABEL_LOG_DIR,
19792 MENU_ENUM_LABEL_VALUE_LOG_DIR,
19793 g_defaults.dirs[DEFAULT_DIR_LOGS],
19794 MENU_ENUM_LABEL_VALUE_DIRECTORY_DEFAULT,
19795 &group_info,
19796 &subgroup_info,
19797 parent_group,
19798 general_write_handler,
19799 general_read_handler);
19800 (*list)[list_info->index - 1].action_start = directory_action_start_generic;
19801
19802 END_SUB_GROUP(list, list_info, parent_group);
19803 END_GROUP(list, list_info, parent_group);
19804 break;
19805 case SETTINGS_LIST_PRIVACY:
19806 START_GROUP(list, list_info, &group_info,
19807 msg_hash_to_str(MENU_ENUM_LABEL_VALUE_PRIVACY_SETTINGS), parent_group);
19808
19809 parent_group = msg_hash_to_str(MENU_ENUM_LABEL_PRIVACY_SETTINGS);
19810
19811 START_SUB_GROUP(list, list_info, "State",
19812 &group_info, &subgroup_info, parent_group);
19813
19814 if (string_is_not_equal(settings->arrays.camera_driver, "null"))
19815 {
19816 CONFIG_BOOL(
19817 list, list_info,
19818 &settings->bools.camera_allow,
19819 MENU_ENUM_LABEL_CAMERA_ALLOW,
19820 MENU_ENUM_LABEL_VALUE_CAMERA_ALLOW,
19821 false,
19822 MENU_ENUM_LABEL_VALUE_OFF,
19823 MENU_ENUM_LABEL_VALUE_ON,
19824 &group_info,
19825 &subgroup_info,
19826 parent_group,
19827 general_write_handler,
19828 general_read_handler,
19829 SD_FLAG_NONE);
19830 }
19831
19832 #ifdef HAVE_DISCORD
19833 CONFIG_BOOL(
19834 list, list_info,
19835 &settings->bools.discord_enable,
19836 MENU_ENUM_LABEL_DISCORD_ALLOW,
19837 MENU_ENUM_LABEL_VALUE_DISCORD_ALLOW,
19838 false,
19839 MENU_ENUM_LABEL_VALUE_OFF,
19840 MENU_ENUM_LABEL_VALUE_ON,
19841 &group_info,
19842 &subgroup_info,
19843 parent_group,
19844 general_write_handler,
19845 general_read_handler,
19846 SD_FLAG_NONE);
19847 #endif
19848
19849 if (string_is_not_equal(settings->arrays.location_driver, "null"))
19850 {
19851 CONFIG_BOOL(
19852 list, list_info,
19853 &settings->bools.location_allow,
19854 MENU_ENUM_LABEL_LOCATION_ALLOW,
19855 MENU_ENUM_LABEL_VALUE_LOCATION_ALLOW,
19856 false,
19857 MENU_ENUM_LABEL_VALUE_OFF,
19858 MENU_ENUM_LABEL_VALUE_ON,
19859 &group_info,
19860 &subgroup_info,
19861 parent_group,
19862 general_write_handler,
19863 general_read_handler,
19864 SD_FLAG_NONE);
19865 }
19866
19867 END_SUB_GROUP(list, list_info, parent_group);
19868 END_GROUP(list, list_info, parent_group);
19869 break;
19870 case SETTINGS_LIST_MIDI:
19871 START_GROUP(list, list_info, &group_info,
19872 msg_hash_to_str(MENU_ENUM_LABEL_VALUE_MIDI_SETTINGS), parent_group);
19873
19874 parent_group = msg_hash_to_str(MENU_ENUM_LABEL_MIDI_SETTINGS);
19875
19876 START_SUB_GROUP(list, list_info, "State",
19877 &group_info, &subgroup_info, parent_group);
19878
19879 CONFIG_STRING(
19880 list, list_info,
19881 settings->arrays.midi_input,
19882 sizeof(settings->arrays.midi_input),
19883 MENU_ENUM_LABEL_MIDI_INPUT,
19884 MENU_ENUM_LABEL_VALUE_MIDI_INPUT,
19885 DEFAULT_MIDI_INPUT,
19886 &group_info,
19887 &subgroup_info,
19888 parent_group,
19889 general_write_handler,
19890 general_read_handler);
19891 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ALLOW_INPUT);
19892 (*list)[list_info->index - 1].action_start = setting_generic_action_start_default;
19893 (*list)[list_info->index - 1].action_left = setting_string_action_left_midi_input;
19894 (*list)[list_info->index - 1].action_right = setting_string_action_right_midi_input;
19895
19896 CONFIG_STRING(
19897 list, list_info,
19898 settings->arrays.midi_output,
19899 sizeof(settings->arrays.midi_output),
19900 MENU_ENUM_LABEL_MIDI_OUTPUT,
19901 MENU_ENUM_LABEL_VALUE_MIDI_OUTPUT,
19902 DEFAULT_MIDI_OUTPUT,
19903 &group_info,
19904 &subgroup_info,
19905 parent_group,
19906 general_write_handler,
19907 general_read_handler);
19908 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ALLOW_INPUT);
19909 (*list)[list_info->index - 1].action_start = setting_generic_action_start_default;
19910 (*list)[list_info->index - 1].action_left = setting_string_action_left_midi_output;
19911 (*list)[list_info->index - 1].action_right = setting_string_action_right_midi_output;
19912
19913 CONFIG_UINT(
19914 list, list_info,
19915 &settings->uints.midi_volume,
19916 MENU_ENUM_LABEL_MIDI_VOLUME,
19917 MENU_ENUM_LABEL_VALUE_MIDI_VOLUME,
19918 midi_volume,
19919 &group_info,
19920 &subgroup_info,
19921 parent_group,
19922 general_write_handler,
19923 general_read_handler);
19924 (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
19925 menu_settings_list_current_add_range(list, list_info, 0.0f, 100.0f, 1.0f, true, true);
19926
19927 END_SUB_GROUP(list, list_info, parent_group);
19928 END_GROUP(list, list_info, parent_group);
19929 break;
19930 case SETTINGS_LIST_MANUAL_CONTENT_SCAN:
19931 START_GROUP(list, list_info, &group_info,
19932 msg_hash_to_str(MENU_ENUM_LABEL_VALUE_MANUAL_CONTENT_SCAN_LIST), parent_group);
19933
19934 parent_group = msg_hash_to_str(MENU_ENUM_LABEL_MANUAL_CONTENT_SCAN_LIST);
19935
19936 START_SUB_GROUP(list, list_info, "State",
19937 &group_info, &subgroup_info, parent_group);
19938
19939 CONFIG_STRING(
19940 list, list_info,
19941 manual_content_scan_get_system_name_custom_ptr(),
19942 manual_content_scan_get_system_name_custom_size(),
19943 MENU_ENUM_LABEL_MANUAL_CONTENT_SCAN_SYSTEM_NAME_CUSTOM,
19944 MENU_ENUM_LABEL_VALUE_MANUAL_CONTENT_SCAN_SYSTEM_NAME_CUSTOM,
19945 "",
19946 &group_info,
19947 &subgroup_info,
19948 parent_group,
19949 general_write_handler,
19950 general_read_handler);
19951 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ALLOW_INPUT);
19952 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_STRING_LINE_EDIT;
19953 (*list)[list_info->index - 1].action_start = setting_generic_action_start_default;
19954
19955 CONFIG_STRING(
19956 list, list_info,
19957 manual_content_scan_get_file_exts_custom_ptr(),
19958 manual_content_scan_get_file_exts_custom_size(),
19959 MENU_ENUM_LABEL_MANUAL_CONTENT_SCAN_FILE_EXTS,
19960 MENU_ENUM_LABEL_VALUE_MANUAL_CONTENT_SCAN_FILE_EXTS,
19961 "",
19962 &group_info,
19963 &subgroup_info,
19964 parent_group,
19965 general_write_handler,
19966 general_read_handler);
19967 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ALLOW_INPUT);
19968 (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_STRING_LINE_EDIT;
19969 (*list)[list_info->index - 1].action_start = setting_generic_action_start_default;
19970
19971 CONFIG_BOOL(
19972 list, list_info,
19973 manual_content_scan_get_search_recursively_ptr(),
19974 MENU_ENUM_LABEL_MANUAL_CONTENT_SCAN_SEARCH_RECURSIVELY,
19975 MENU_ENUM_LABEL_VALUE_MANUAL_CONTENT_SCAN_SEARCH_RECURSIVELY,
19976 true,
19977 MENU_ENUM_LABEL_VALUE_OFF,
19978 MENU_ENUM_LABEL_VALUE_ON,
19979 &group_info,
19980 &subgroup_info,
19981 parent_group,
19982 general_write_handler,
19983 general_read_handler,
19984 SD_FLAG_NONE);
19985
19986 CONFIG_BOOL(
19987 list, list_info,
19988 manual_content_scan_get_search_archives_ptr(),
19989 MENU_ENUM_LABEL_MANUAL_CONTENT_SCAN_SEARCH_ARCHIVES,
19990 MENU_ENUM_LABEL_VALUE_MANUAL_CONTENT_SCAN_SEARCH_ARCHIVES,
19991 false,
19992 MENU_ENUM_LABEL_VALUE_OFF,
19993 MENU_ENUM_LABEL_VALUE_ON,
19994 &group_info,
19995 &subgroup_info,
19996 parent_group,
19997 general_write_handler,
19998 general_read_handler,
19999 SD_FLAG_NONE);
20000
20001 CONFIG_PATH(
20002 list, list_info,
20003 manual_content_scan_get_dat_file_path_ptr(),
20004 manual_content_scan_get_dat_file_path_size(),
20005 MENU_ENUM_LABEL_MANUAL_CONTENT_SCAN_DAT_FILE,
20006 MENU_ENUM_LABEL_VALUE_MANUAL_CONTENT_SCAN_DAT_FILE,
20007 "",
20008 &group_info,
20009 &subgroup_info,
20010 parent_group,
20011 general_write_handler,
20012 general_read_handler);
20013 MENU_SETTINGS_LIST_CURRENT_ADD_VALUES(list, list_info, "dat|xml");
20014
20015 CONFIG_BOOL(
20016 list, list_info,
20017 manual_content_scan_get_filter_dat_content_ptr(),
20018 MENU_ENUM_LABEL_MANUAL_CONTENT_SCAN_DAT_FILE_FILTER,
20019 MENU_ENUM_LABEL_VALUE_MANUAL_CONTENT_SCAN_DAT_FILE_FILTER,
20020 false,
20021 MENU_ENUM_LABEL_VALUE_OFF,
20022 MENU_ENUM_LABEL_VALUE_ON,
20023 &group_info,
20024 &subgroup_info,
20025 parent_group,
20026 general_write_handler,
20027 general_read_handler,
20028 SD_FLAG_NONE);
20029
20030 CONFIG_BOOL(
20031 list, list_info,
20032 manual_content_scan_get_overwrite_playlist_ptr(),
20033 MENU_ENUM_LABEL_MANUAL_CONTENT_SCAN_OVERWRITE,
20034 MENU_ENUM_LABEL_VALUE_MANUAL_CONTENT_SCAN_OVERWRITE,
20035 false,
20036 MENU_ENUM_LABEL_VALUE_OFF,
20037 MENU_ENUM_LABEL_VALUE_ON,
20038 &group_info,
20039 &subgroup_info,
20040 parent_group,
20041 general_write_handler,
20042 general_read_handler,
20043 SD_FLAG_NONE);
20044
20045 END_SUB_GROUP(list, list_info, parent_group);
20046 END_GROUP(list, list_info, parent_group);
20047 break;
20048 case SETTINGS_LIST_NONE:
20049 default:
20050 break;
20051 }
20052
20053 return true;
20054 }
20055
menu_setting_free(rarch_setting_t * setting)20056 void menu_setting_free(rarch_setting_t *setting)
20057 {
20058 unsigned values, n;
20059 rarch_setting_t **list = NULL;
20060
20061 if (!setting)
20062 return;
20063
20064 list = (rarch_setting_t**)&setting;
20065
20066 /* Free data which was previously tagged */
20067 for (; setting->type != ST_NONE; (*list = *list + 1))
20068 for (values = (unsigned)setting->free_flags, n = 0; values != 0; values >>= 1, n++)
20069 if (values & 1)
20070 switch (1 << n)
20071 {
20072 case SD_FREE_FLAG_VALUES:
20073 if (setting->values)
20074 free((void*)setting->values);
20075 setting->values = NULL;
20076 break;
20077 case SD_FREE_FLAG_NAME:
20078 if (setting->name)
20079 free((void*)setting->name);
20080 setting->name = NULL;
20081 break;
20082 case SD_FREE_FLAG_SHORT:
20083 if (setting->short_description)
20084 free((void*)setting->short_description);
20085 setting->short_description = NULL;
20086 break;
20087 default:
20088 break;
20089 }
20090 }
20091
20092 #define MENU_SETTING_INITIALIZE(list, _pos) \
20093 { \
20094 unsigned pos = _pos; \
20095 (*&list)[pos].ui_type = ST_UI_TYPE_NONE; \
20096 (*&list)[pos].browser_selection_type = ST_NONE; \
20097 (*&list)[pos].enum_idx = MSG_UNKNOWN; \
20098 (*&list)[pos].enum_value_idx = MSG_UNKNOWN; \
20099 (*&list)[pos].type = ST_NONE; \
20100 (*&list)[pos].dont_use_enum_idx_representation = false; \
20101 (*&list)[pos].enforce_minrange = false; \
20102 (*&list)[pos].enforce_maxrange = false; \
20103 (*&list)[pos].index = 0; \
20104 (*&list)[pos].index_offset = 0; \
20105 (*&list)[pos].offset_by = 0; \
20106 (*&list)[pos].bind_type = 0; \
20107 (*&list)[pos].size = 0; \
20108 (*&list)[pos].step = 0.0f; \
20109 (*&list)[pos].flags = 0; \
20110 (*&list)[pos].free_flags = 0; \
20111 (*&list)[pos].min = 0.0; \
20112 (*&list)[pos].max = 0.0; \
20113 (*&list)[pos].rounding_fraction = NULL; \
20114 (*&list)[pos].name = NULL; \
20115 (*&list)[pos].short_description = NULL; \
20116 (*&list)[pos].group = NULL; \
20117 (*&list)[pos].subgroup = NULL; \
20118 (*&list)[pos].parent_group = NULL; \
20119 (*&list)[pos].values = NULL; \
20120 (*&list)[pos].change_handler = NULL; \
20121 (*&list)[pos].read_handler = NULL; \
20122 (*&list)[pos].action_start = NULL; \
20123 (*&list)[pos].action_left = NULL; \
20124 (*&list)[pos].action_right = NULL; \
20125 (*&list)[pos].action_up = NULL; \
20126 (*&list)[pos].action_down = NULL; \
20127 (*&list)[pos].action_cancel = NULL; \
20128 (*&list)[pos].action_ok = NULL; \
20129 (*&list)[pos].action_select = NULL; \
20130 (*&list)[pos].get_string_representation = NULL; \
20131 (*&list)[pos].default_value.fraction = 0.0f; \
20132 (*&list)[pos].value.target.fraction = NULL; \
20133 (*&list)[pos].original_value.fraction = 0.0f; \
20134 (*&list)[pos].dir.empty_path = NULL; \
20135 (*&list)[pos].cmd_trigger_idx = CMD_EVENT_NONE; \
20136 (*&list)[pos].cmd_trigger_event_triggered = false; \
20137 (*&list)[pos].boolean.off_label = NULL; \
20138 (*&list)[pos].boolean.on_label = NULL; \
20139 }
20140
menu_setting_new_internal(rarch_setting_info_t * list_info)20141 static rarch_setting_t *menu_setting_new_internal(rarch_setting_info_t *list_info)
20142 {
20143 unsigned i;
20144 rarch_setting_t* resized_list = NULL;
20145 enum settings_list_type list_types[] =
20146 {
20147 SETTINGS_LIST_MAIN_MENU,
20148 SETTINGS_LIST_DRIVERS,
20149 SETTINGS_LIST_CORE,
20150 SETTINGS_LIST_CONFIGURATION,
20151 SETTINGS_LIST_LOGGING,
20152 SETTINGS_LIST_SAVING,
20153 SETTINGS_LIST_REWIND,
20154 SETTINGS_LIST_CHEAT_DETAILS,
20155 SETTINGS_LIST_CHEAT_SEARCH,
20156 SETTINGS_LIST_CHEATS,
20157 SETTINGS_LIST_VIDEO,
20158 SETTINGS_LIST_CRT_SWITCHRES,
20159 SETTINGS_LIST_AUDIO,
20160 SETTINGS_LIST_INPUT,
20161 SETTINGS_LIST_INPUT_TURBO_FIRE,
20162 SETTINGS_LIST_INPUT_HOTKEY,
20163 SETTINGS_LIST_RECORDING,
20164 SETTINGS_LIST_FRAME_THROTTLING,
20165 SETTINGS_LIST_FRAME_TIME_COUNTER,
20166 SETTINGS_LIST_ONSCREEN_NOTIFICATIONS,
20167 SETTINGS_LIST_OVERLAY,
20168 #ifdef HAVE_VIDEO_LAYOUT
20169 SETTINGS_LIST_VIDEO_LAYOUT,
20170 #endif
20171 SETTINGS_LIST_MENU,
20172 SETTINGS_LIST_MENU_FILE_BROWSER,
20173 SETTINGS_LIST_MULTIMEDIA,
20174 #ifdef HAVE_TRANSLATE
20175 SETTINGS_LIST_AI_SERVICE,
20176 #endif
20177 SETTINGS_LIST_ACCESSIBILITY,
20178 SETTINGS_LIST_USER_INTERFACE,
20179 SETTINGS_LIST_POWER_MANAGEMENT,
20180 SETTINGS_LIST_WIFI_MANAGEMENT,
20181 SETTINGS_LIST_MENU_SOUNDS,
20182 SETTINGS_LIST_PLAYLIST,
20183 SETTINGS_LIST_CHEEVOS,
20184 SETTINGS_LIST_CORE_UPDATER,
20185 SETTINGS_LIST_NETPLAY,
20186 SETTINGS_LIST_LAKKA_SERVICES,
20187 SETTINGS_LIST_USER,
20188 SETTINGS_LIST_USER_ACCOUNTS,
20189 SETTINGS_LIST_USER_ACCOUNTS_CHEEVOS,
20190 SETTINGS_LIST_USER_ACCOUNTS_YOUTUBE,
20191 SETTINGS_LIST_USER_ACCOUNTS_TWITCH,
20192 SETTINGS_LIST_USER_ACCOUNTS_FACEBOOK,
20193 SETTINGS_LIST_DIRECTORY,
20194 SETTINGS_LIST_PRIVACY,
20195 SETTINGS_LIST_MIDI,
20196 SETTINGS_LIST_MANUAL_CONTENT_SCAN
20197 };
20198 settings_t *settings = config_get_ptr();
20199 global_t *global = global_get_ptr();
20200 const char *root = NULL;
20201 rarch_setting_t **list_ptr = NULL;
20202 rarch_setting_t *list = (rarch_setting_t*)
20203 malloc(list_info->size * sizeof(*list));
20204
20205 if (!list)
20206 return NULL;
20207
20208 root =
20209 msg_hash_to_str(MENU_ENUM_LABEL_MAIN_MENU);
20210
20211 for (i = 0; i < (unsigned)list_info->size; i++)
20212 {
20213 MENU_SETTING_INITIALIZE(list, i);
20214 }
20215
20216 for (i = 0; i < ARRAY_SIZE(list_types); i++)
20217 {
20218 if (!setting_append_list(
20219 settings, global,
20220 list_types[i], &list, list_info, root))
20221 {
20222 free(list);
20223 return NULL;
20224 }
20225 }
20226
20227 list_ptr = &list;
20228
20229 if (!SETTINGS_LIST_APPEND(list_ptr, list_info))
20230 {
20231 free(list);
20232 return NULL;
20233 }
20234
20235 MENU_SETTING_INITIALIZE(list, list_info->index);
20236 list_info->index++;
20237
20238 /* flatten this array to save ourselves some kilobytes. */
20239 resized_list = (rarch_setting_t*)realloc(list,
20240 list_info->index * sizeof(rarch_setting_t));
20241 if (!resized_list)
20242 {
20243 free(list);
20244 return NULL;
20245 }
20246
20247 list = resized_list;
20248
20249 return list;
20250 }
20251
20252 /**
20253 * menu_setting_new:
20254 * @mask : Bitmask of settings to include.
20255 *
20256 * Request a list of settings based on @mask.
20257 *
20258 * Returns: settings list composed of all requested
20259 * settings on success, otherwise NULL.
20260 **/
menu_setting_new(void)20261 rarch_setting_t *menu_setting_new(void)
20262 {
20263 rarch_setting_t* list = NULL;
20264 rarch_setting_info_t *list_info = (rarch_setting_info_t*)
20265 malloc(sizeof(*list_info));
20266
20267 if (!list_info)
20268 return NULL;
20269
20270 list_info->index = 0;
20271 list_info->size = 32;
20272
20273 list = menu_setting_new_internal(list_info);
20274
20275 if (list_info)
20276 free(list_info);
20277
20278 list_info = NULL;
20279
20280 return list;
20281 }
20282
video_driver_menu_settings(void ** list_data,void * list_info_data,void * group_data,void * subgroup_data,const char * parent_group)20283 void video_driver_menu_settings(void **list_data, void *list_info_data,
20284 void *group_data, void *subgroup_data, const char *parent_group)
20285 {
20286 #ifdef HAVE_MENU
20287 rarch_setting_t **list = (rarch_setting_t**)list_data;
20288 rarch_setting_info_t *list_info = (rarch_setting_info_t*)list_info_data;
20289 rarch_setting_group_info_t *group_info = (rarch_setting_group_info_t*)group_data;
20290 rarch_setting_group_info_t *subgroup_info = (rarch_setting_group_info_t*)subgroup_data;
20291 global_t *global = global_get_ptr();
20292
20293 (void)list;
20294 (void)list_info;
20295 (void)group_info;
20296 (void)subgroup_info;
20297 (void)global;
20298
20299 #if defined(GEKKO) || defined(_XBOX360)
20300 CONFIG_UINT(
20301 list, list_info,
20302 &global->console.screen.gamma_correction,
20303 MENU_ENUM_LABEL_VIDEO_GAMMA,
20304 MENU_ENUM_LABEL_VALUE_VIDEO_GAMMA,
20305 0,
20306 group_info,
20307 subgroup_info,
20308 parent_group,
20309 general_write_handler,
20310 general_read_handler);
20311 MENU_SETTINGS_LIST_CURRENT_ADD_CMD(
20312 list,
20313 list_info,
20314 CMD_EVENT_VIDEO_APPLY_STATE_CHANGES);
20315 menu_settings_list_current_add_range(
20316 list,
20317 list_info,
20318 0,
20319 MAX_GAMMA_SETTING,
20320 1,
20321 true,
20322 true);
20323 SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info,
20324 SD_FLAG_CMD_APPLY_AUTO|SD_FLAG_ADVANCED);
20325 #endif
20326 #if defined(_XBOX1) || defined(HW_RVL)
20327 CONFIG_BOOL(
20328 list, list_info,
20329 &global->console.softfilter_enable,
20330 MENU_ENUM_LABEL_VIDEO_SOFT_FILTER,
20331 MENU_ENUM_LABEL_VALUE_VIDEO_SOFT_FILTER,
20332 false,
20333 MENU_ENUM_LABEL_VALUE_OFF,
20334 MENU_ENUM_LABEL_VALUE_ON,
20335 group_info,
20336 subgroup_info,
20337 parent_group,
20338 general_write_handler,
20339 general_read_handler,
20340 SD_FLAG_NONE);
20341 MENU_SETTINGS_LIST_CURRENT_ADD_CMD(
20342 list,
20343 list_info,
20344 CMD_EVENT_VIDEO_APPLY_STATE_CHANGES);
20345 #endif
20346 #ifdef _XBOX1
20347 CONFIG_UINT(
20348 list, list_info,
20349 &global->console.screen.flicker_filter_index,
20350 MENU_ENUM_LABEL_VIDEO_FILTER_FLICKER,
20351 MENU_ENUM_LABEL_VALUE_VIDEO_FILTER_FLICKER,
20352 0,
20353 group_info,
20354 subgroup_info,
20355 parent_group,
20356 general_write_handler,
20357 general_read_handler);
20358 menu_settings_list_current_add_range(list, list_info,
20359 0, 5, 1, true, true);
20360 #endif
20361 #endif
20362 }
20363