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(&current_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