2012-05-06 04:04:33 +02:00
/* RetroArch - A frontend for libretro.
2013-01-01 01:37:37 +01:00
* Copyright ( C ) 2010 - 2013 - Hans - Kristian Arntzen
2013-03-11 07:13:11 +01:00
* Copyright ( C ) 2011 - 2013 - Daniel De Matteis
* Copyright ( C ) 2012 - 2013 - Michael Lelli
2012-05-06 04:04:33 +02:00
*
* RetroArch is free software : you can redistribute it and / or modify it under the terms
* of the GNU General Public License as published by the Free Software Found -
* ation , either version 3 of the License , or ( at your option ) any later version .
*
* RetroArch is distributed in the hope that it will be useful , but WITHOUT ANY WARRANTY ;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE . See the GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License along with RetroArch .
* If not , see < http : //www.gnu.org/licenses/>.
*/
# include <stdlib.h>
# include <stddef.h>
# include <stdio.h>
# include <string.h>
# include <limits.h>
2013-01-09 17:49:43 +01:00
# include "rgui.h"
2013-09-19 14:49:07 +02:00
# include "menu_context.h"
2013-01-09 17:49:43 +01:00
# include "utils/file_list.h"
2013-03-09 15:33:44 +01:00
# include "../../general.h"
2013-07-15 14:54:40 +02:00
# include "../../file_ext.h"
2013-03-09 03:20:33 +01:00
# include "../../gfx/gfx_common.h"
2013-03-16 09:55:08 +01:00
# include "../../config.def.h"
# include "../../file.h"
2013-03-17 21:18:56 +01:00
# include "../../dynamic.h"
2013-04-04 20:21:51 +02:00
# include "../../compat/posix_string.h"
2013-04-07 16:45:05 +02:00
# include "../../gfx/shader_parse.h"
2013-07-06 20:39:19 +02:00
# include "../../performance.h"
2013-09-29 20:40:04 +02:00
# include "../../input/input_common.h"
2013-03-09 15:33:44 +01:00
# ifdef HAVE_OPENGL
# include "../../gfx/gl_common.h"
# endif
2013-01-09 17:49:43 +01:00
# include "../../screenshot.h"
2012-09-11 21:19:22 -04:00
# ifdef GEKKO
enum
{
2013-03-30 05:38:22 +01:00
GX_RESOLUTIONS_512_192 = 0 ,
GX_RESOLUTIONS_598_200 ,
GX_RESOLUTIONS_640_200 ,
2013-01-06 18:09:56 +01:00
GX_RESOLUTIONS_384_224 ,
2013-03-30 05:38:22 +01:00
GX_RESOLUTIONS_448_224 ,
GX_RESOLUTIONS_480_224 ,
2012-09-12 09:36:18 -04:00
GX_RESOLUTIONS_512_224 ,
2013-03-30 05:38:22 +01:00
GX_RESOLUTIONS_340_232 ,
GX_RESOLUTIONS_512_232 ,
GX_RESOLUTIONS_512_236 ,
GX_RESOLUTIONS_336_240 ,
GX_RESOLUTIONS_384_240 ,
2012-09-12 09:36:18 -04:00
GX_RESOLUTIONS_512_240 ,
2013-02-02 08:12:42 +01:00
GX_RESOLUTIONS_576_224 ,
GX_RESOLUTIONS_608_224 ,
2013-01-06 18:09:56 +01:00
GX_RESOLUTIONS_640_224 ,
2013-03-30 05:38:22 +01:00
GX_RESOLUTIONS_530_240 ,
2012-09-12 09:36:18 -04:00
GX_RESOLUTIONS_640_240 ,
2013-03-30 05:38:22 +01:00
GX_RESOLUTIONS_512_448 ,
GX_RESOLUTIONS_640_448 ,
2013-01-06 18:09:56 +01:00
GX_RESOLUTIONS_640_480 ,
2012-09-11 21:19:22 -04:00
GX_RESOLUTIONS_LAST ,
} ;
2012-09-12 09:36:18 -04:00
unsigned rgui_gx_resolutions [ GX_RESOLUTIONS_LAST ] [ 2 ] = {
2013-03-30 05:38:22 +01:00
{ 512 , 192 } ,
{ 598 , 200 } ,
{ 640 , 200 } ,
2012-09-12 09:36:18 -04:00
{ 384 , 224 } ,
2013-03-30 05:38:22 +01:00
{ 448 , 224 } ,
{ 480 , 224 } ,
2012-09-12 09:36:18 -04:00
{ 512 , 224 } ,
2013-03-30 05:38:22 +01:00
{ 340 , 232 } ,
{ 512 , 232 } ,
{ 512 , 236 } ,
{ 336 , 240 } ,
{ 384 , 240 } ,
2012-09-12 09:36:18 -04:00
{ 512 , 240 } ,
2013-02-02 08:12:42 +01:00
{ 576 , 224 } ,
{ 608 , 224 } ,
2013-01-06 18:09:56 +01:00
{ 640 , 224 } ,
2013-03-30 05:38:22 +01:00
{ 530 , 240 } ,
2012-09-12 09:36:18 -04:00
{ 640 , 240 } ,
2013-03-30 05:38:22 +01:00
{ 512 , 448 } ,
2012-09-12 09:36:18 -04:00
{ 640 , 448 } ,
2013-01-06 18:09:56 +01:00
{ 640 , 480 } ,
2012-09-11 21:19:22 -04:00
} ;
2013-02-06 09:54:22 +01:00
unsigned rgui_current_gx_resolution = GX_RESOLUTIONS_640_480 ;
2012-09-11 21:19:22 -04:00
# endif
2013-04-09 19:43:24 +02:00
# if defined(HAVE_CG) || defined(HAVE_GLSL) || defined(HAVE_HLSL)
# define HAVE_SHADER_MANAGER
# endif
2012-09-11 23:33:44 -04:00
unsigned RGUI_WIDTH = 320 ;
2012-09-11 21:19:22 -04:00
unsigned RGUI_HEIGHT = 240 ;
2013-03-09 15:33:44 +01:00
uint16_t menu_framebuf [ 400 * 240 ] ;
2013-04-07 16:45:05 +02:00
2013-05-08 19:12:18 -04:00
# ifdef HAVE_SHADER_MANAGER
2013-04-14 22:59:36 +02:00
static int shader_manager_toggle_setting ( rgui_handle_t * rgui , unsigned setting , rgui_action_t action ) ;
2013-05-08 19:12:18 -04:00
# endif
2013-05-08 18:17:30 +02:00
static int video_option_toggle_setting ( rgui_handle_t * rgui , unsigned setting , rgui_action_t action ) ;
2013-04-14 22:59:36 +02:00
2013-05-17 23:57:06 +02:00
static void rgui_flush_menu_stack_type ( rgui_handle_t * rgui , unsigned final_type )
2013-05-04 16:56:02 +02:00
{
rgui - > need_refresh = true ;
unsigned type = 0 ;
rgui_list_get_last ( rgui - > menu_stack , NULL , & type ) ;
2013-05-17 23:57:06 +02:00
while ( type ! = final_type )
2013-05-04 16:56:02 +02:00
{
rgui_list_pop ( rgui - > menu_stack , & rgui - > selection_ptr ) ;
rgui_list_get_last ( rgui - > menu_stack , NULL , & type ) ;
}
}
2013-04-07 15:46:36 +02:00
static bool menu_type_is_settings ( unsigned type )
{
return type = = RGUI_SETTINGS | |
type = = RGUI_SETTINGS_CORE_OPTIONS | |
2013-04-28 00:32:25 +02:00
type = = RGUI_SETTINGS_VIDEO_OPTIONS | |
2013-05-06 00:53:53 +02:00
# ifdef HAVE_SHADER_MANAGER
2013-05-04 23:35:39 +02:00
type = = RGUI_SETTINGS_SHADER_OPTIONS | |
2013-05-06 00:53:53 +02:00
# endif
2013-05-04 19:00:57 +02:00
type = = RGUI_SETTINGS_AUDIO_OPTIONS | |
2013-05-04 19:26:34 +02:00
type = = RGUI_SETTINGS_DISK_OPTIONS | |
2013-05-04 21:17:47 +02:00
type = = RGUI_SETTINGS_PATH_OPTIONS | |
2013-05-05 22:02:30 +02:00
type = = RGUI_SETTINGS_OPTIONS | |
2013-05-04 19:00:57 +02:00
( type = = RGUI_SETTINGS_INPUT_OPTIONS ) ;
2013-04-07 15:46:36 +02:00
}
2013-04-28 01:04:34 +02:00
# ifdef HAVE_SHADER_MANAGER
2013-04-09 21:01:12 +02:00
static bool menu_type_is_shader_browser ( unsigned type )
{
2013-04-14 01:27:13 +02:00
return ( type > = RGUI_SETTINGS_SHADER_0 & &
2013-04-09 21:01:12 +02:00
type < = RGUI_SETTINGS_SHADER_LAST & &
2013-04-14 01:27:13 +02:00
( ( type - RGUI_SETTINGS_SHADER_0 ) % 3 ) = = 0 ) | |
type = = RGUI_SETTINGS_SHADER_PRESET ;
2013-04-09 21:01:12 +02:00
}
2013-04-28 01:04:34 +02:00
# endif
2013-04-09 21:01:12 +02:00
2013-05-20 22:17:26 -04:00
static bool menu_type_is_directory_browser ( unsigned type )
{
return type = = RGUI_BROWSER_DIR_PATH | |
# ifdef HAVE_SHADER_MANAGER
type = = RGUI_SHADER_DIR_PATH | |
# endif
type = = RGUI_SAVESTATE_DIR_PATH | |
2013-09-15 17:09:23 -04:00
# ifdef HAVE_DYNAMIC
2013-09-12 22:00:59 +02:00
type = = RGUI_LIBRETRO_DIR_PATH | |
2013-09-15 17:09:23 -04:00
# endif
2013-09-15 16:15:38 +02:00
type = = RGUI_CONFIG_DIR_PATH | |
2013-05-20 22:17:26 -04:00
type = = RGUI_SAVEFILE_DIR_PATH | |
2013-05-22 22:31:16 +02:00
# ifdef HAVE_OVERLAY
type = = RGUI_OVERLAY_DIR_PATH | |
2013-09-16 23:30:42 +02:00
# endif
# ifdef HAVE_SCREENSHOTS
type = = RGUI_SCREENSHOT_DIR_PATH | |
2013-05-22 22:31:16 +02:00
# endif
2013-05-20 22:17:26 -04:00
type = = RGUI_SYSTEM_DIR_PATH ;
}
2013-04-18 23:00:27 +02:00
static void rgui_settings_populate_entries ( rgui_handle_t * rgui ) ;
2013-09-28 04:45:44 +02:00
# include "rguidisp_bitmap.c"
2013-09-19 15:01:17 +02:00
static void * rgui_init ( void )
2012-05-06 04:04:33 +02:00
{
2013-04-18 14:57:28 +02:00
uint16_t * framebuf = menu_framebuf ;
size_t framebuf_pitch = RGUI_WIDTH * sizeof ( uint16_t ) ;
2012-05-06 04:04:33 +02:00
rgui_handle_t * rgui = ( rgui_handle_t * ) calloc ( 1 , sizeof ( * rgui ) ) ;
2012-08-26 20:33:22 -04:00
rgui - > frame_buf = framebuf ;
rgui - > frame_buf_pitch = framebuf_pitch ;
2012-05-06 04:04:33 +02:00
2013-09-28 04:45:44 +02:00
bool ret = rguidisp_init_font ( rgui ) ;
if ( ! ret )
2012-08-26 20:33:22 -04:00
{
2013-09-28 04:45:44 +02:00
RARCH_ERR ( " No font bitmap or binary, abort " ) ;
2013-04-18 18:33:03 +02:00
/* TODO - should be refactored - perhaps don't do rarch_fail but instead
* exit program */
2013-05-05 15:20:45 +02:00
g_extern . lifecycle_mode_state & = ~ ( ( 1ULL < < MODE_MENU ) | ( 1ULL < < MODE_GAME ) ) ;
2013-04-18 22:22:25 +02:00
return NULL ;
2012-08-26 20:33:22 -04:00
}
2012-05-06 04:04:33 +02:00
2013-04-18 22:22:25 +02:00
strlcpy ( rgui - > base_path , g_settings . rgui_browser_directory , sizeof ( rgui - > base_path ) ) ;
rgui - > menu_stack = ( rgui_list_t * ) calloc ( 1 , sizeof ( rgui_list_t ) ) ;
rgui - > selection_buf = ( rgui_list_t * ) calloc ( 1 , sizeof ( rgui_list_t ) ) ;
rgui_list_push ( rgui - > menu_stack , " " , RGUI_SETTINGS , 0 ) ;
2013-04-18 23:00:27 +02:00
rgui - > selection_ptr = 0 ;
rgui_settings_populate_entries ( rgui ) ;
2013-04-18 22:22:25 +02:00
2013-04-20 10:56:04 +02:00
// Make sure that custom viewport is something sane incase we use it
// before it's configured.
rarch_viewport_t * custom = & g_extern . console . screen . viewports . custom_vp ;
if ( driver . video_data & & ( ! custom - > width | | ! custom - > height ) )
2013-04-20 12:48:33 +02:00
{
2013-04-20 10:56:04 +02:00
driver . video - > viewport_info ( driver . video_data , custom ) ;
2013-04-20 12:48:33 +02:00
aspectratio_lut [ ASPECT_RATIO_CUSTOM ] . value =
( float ) custom - > width / custom - > height ;
}
2013-08-19 22:59:54 +02:00
else if ( DEFAULT_ASPECT_RATIO > 0.0f )
aspectratio_lut [ ASPECT_RATIO_CUSTOM ] . value = DEFAULT_ASPECT_RATIO ;
else
aspectratio_lut [ ASPECT_RATIO_CUSTOM ] . value = 4.0f / 3.0f ; // Something arbitrary
2013-04-20 10:56:04 +02:00
2012-05-06 04:04:33 +02:00
return rgui ;
}
2013-09-19 15:01:17 +02:00
static void rgui_free ( void * data )
2012-05-06 04:04:33 +02:00
{
2013-09-19 14:49:07 +02:00
rgui_handle_t * rgui = ( rgui_handle_t * ) data ;
2012-08-27 14:48:00 -04:00
if ( rgui - > alloc_font )
2013-04-28 00:35:20 +02:00
free ( ( uint8_t * ) rgui - > font ) ;
2013-03-17 21:18:56 +01:00
# ifdef HAVE_DYNAMIC
libretro_free_system_info ( & rgui - > info ) ;
# endif
2013-04-18 22:22:25 +02:00
rgui_list_free ( rgui - > menu_stack ) ;
rgui_list_free ( rgui - > selection_buf ) ;
2012-05-06 04:04:33 +02:00
}
2012-08-08 19:55:38 +02:00
# ifdef GEKKO
# define MAX_GAMMA_SETTING 2
# else
# define MAX_GAMMA_SETTING 1
# endif
2013-04-04 22:08:23 +02:00
static int rgui_core_setting_toggle ( unsigned setting , rgui_action_t action )
{
unsigned index = setting - RGUI_SETTINGS_CORE_OPTION_START ;
switch ( action )
{
case RGUI_ACTION_LEFT :
core_option_prev ( g_extern . system . core_options , index ) ;
break ;
case RGUI_ACTION_RIGHT :
case RGUI_ACTION_OK :
core_option_next ( g_extern . system . core_options , index ) ;
break ;
case RGUI_ACTION_START :
core_option_set_default ( g_extern . system . core_options , index ) ;
break ;
default :
break ;
}
return 0 ;
}
2013-04-07 16:45:05 +02:00
static int rgui_settings_toggle_setting ( rgui_handle_t * rgui , unsigned setting , rgui_action_t action , unsigned menu_type )
2012-07-16 17:57:43 -04:00
{
2013-05-04 16:48:53 +02:00
unsigned port = rgui - > current_pad ;
2013-04-07 16:45:05 +02:00
2013-05-08 18:17:30 +02:00
if ( setting > = RGUI_SETTINGS_VIDEO_OPTIONS_FIRST & & setting < = RGUI_SETTINGS_VIDEO_OPTIONS_LAST )
return video_option_toggle_setting ( rgui , setting , action ) ;
# ifdef HAVE_SHADER_MANAGER
else if ( setting > = RGUI_SETTINGS_SHADER_FILTER & & setting < = RGUI_SETTINGS_SHADER_LAST )
2013-04-07 16:45:05 +02:00
return shader_manager_toggle_setting ( rgui , setting , action ) ;
2013-05-08 18:17:30 +02:00
# endif
2013-04-04 22:08:23 +02:00
if ( setting > = RGUI_SETTINGS_CORE_OPTION_START )
return rgui_core_setting_toggle ( setting , action ) ;
2012-07-16 17:57:43 -04:00
switch ( setting )
{
2013-01-18 15:22:03 +01:00
case RGUI_SETTINGS_REWIND_ENABLE :
2013-03-16 14:28:10 +01:00
if ( action = = RGUI_ACTION_OK | |
action = = RGUI_ACTION_LEFT | |
action = = RGUI_ACTION_RIGHT )
2013-01-18 15:22:03 +01:00
{
2013-04-07 15:15:16 +02:00
settings_set ( 1ULL < < S_REWIND ) ;
2013-03-16 14:28:10 +01:00
if ( g_settings . rewind_enable )
rarch_init_rewind ( ) ;
2013-04-07 15:15:16 +02:00
else
rarch_deinit_rewind ( ) ;
2013-01-18 15:22:03 +01:00
}
else if ( action = = RGUI_ACTION_START )
2013-03-16 14:28:10 +01:00
{
2013-01-18 15:22:03 +01:00
g_settings . rewind_enable = false ;
2013-03-16 14:28:10 +01:00
rarch_deinit_rewind ( ) ;
}
2013-01-18 15:22:03 +01:00
break ;
2013-09-16 23:10:15 +02:00
# ifdef HAVE_SCREENSHOTS
case RGUI_SETTINGS_GPU_SCREENSHOT :
if ( action = = RGUI_ACTION_OK | |
action = = RGUI_ACTION_LEFT | |
action = = RGUI_ACTION_RIGHT )
g_settings . video . gpu_screenshot = ! g_settings . video . gpu_screenshot ;
else if ( action = = RGUI_ACTION_START )
g_settings . video . gpu_screenshot = true ;
break ;
# endif
2013-01-18 15:22:03 +01:00
case RGUI_SETTINGS_REWIND_GRANULARITY :
if ( action = = RGUI_ACTION_OK | | action = = RGUI_ACTION_RIGHT )
2013-09-19 12:24:12 +02:00
settings_set ( 1ULL < < S_REWIND_GRANULARITY_INCREMENT ) ;
2013-01-18 15:22:03 +01:00
else if ( action = = RGUI_ACTION_LEFT )
2013-09-19 12:24:12 +02:00
settings_set ( 1ULL < < S_REWIND_GRANULARITY_DECREMENT ) ;
2013-01-18 15:22:03 +01:00
else if ( action = = RGUI_ACTION_START )
2013-09-19 12:24:12 +02:00
settings_set ( 1ULL < < S_DEF_REWIND_GRANULARITY ) ;
2013-01-18 15:22:03 +01:00
break ;
2013-05-22 15:35:28 +02:00
case RGUI_SETTINGS_CONFIG_SAVE_ON_EXIT :
if ( action = = RGUI_ACTION_OK | | action = = RGUI_ACTION_RIGHT
| | action = = RGUI_ACTION_LEFT )
{
g_extern . config_save_on_exit = ! g_extern . config_save_on_exit ;
}
else if ( action = = RGUI_ACTION_START )
g_extern . config_save_on_exit = true ;
break ;
2013-04-29 15:56:49 +02:00
# if defined(HAVE_THREADS) && !defined(RARCH_CONSOLE)
case RGUI_SETTINGS_SRAM_AUTOSAVE :
if ( action = = RGUI_ACTION_OK | | action = = RGUI_ACTION_RIGHT | | action = = RGUI_ACTION_LEFT )
{
rarch_deinit_autosave ( ) ;
g_settings . autosave_interval = ( ! g_settings . autosave_interval ) * 10 ;
if ( g_settings . autosave_interval )
rarch_init_autosave ( ) ;
}
else if ( action = = RGUI_ACTION_START )
{
rarch_deinit_autosave ( ) ;
g_settings . autosave_interval = 0 ;
}
break ;
# endif
2012-08-12 03:38:23 -04:00
case RGUI_SETTINGS_SAVESTATE_SAVE :
case RGUI_SETTINGS_SAVESTATE_LOAD :
if ( action = = RGUI_ACTION_OK )
{
if ( setting = = RGUI_SETTINGS_SAVESTATE_SAVE )
rarch_save_state ( ) ;
else
rarch_load_state ( ) ;
2013-01-13 03:34:55 +01:00
g_extern . lifecycle_mode_state | = ( 1ULL < < MODE_GAME ) ;
2013-01-11 04:36:40 +01:00
return - 1 ;
2012-08-12 03:38:23 -04:00
}
2012-08-21 14:36:27 +02:00
else if ( action = = RGUI_ACTION_START )
2013-03-23 17:21:42 +01:00
settings_set ( 1ULL < < S_DEF_SAVE_STATE ) ;
2012-08-21 14:36:27 +02:00
else if ( action = = RGUI_ACTION_LEFT )
2013-03-23 17:21:42 +01:00
settings_set ( 1ULL < < S_SAVESTATE_DECREMENT ) ;
2012-08-21 14:36:27 +02:00
else if ( action = = RGUI_ACTION_RIGHT )
2013-03-23 17:21:42 +01:00
settings_set ( 1ULL < < S_SAVESTATE_INCREMENT ) ;
2012-08-12 03:38:23 -04:00
break ;
2013-03-10 17:54:46 -04:00
# ifdef HAVE_SCREENSHOTS
2012-08-19 15:28:05 -04:00
case RGUI_SETTINGS_SCREENSHOT :
if ( action = = RGUI_ACTION_OK )
2013-06-16 13:44:07 +02:00
rarch_take_screenshot ( ) ;
2012-08-19 15:28:05 -04:00
break ;
2013-03-10 17:54:46 -04:00
# endif
2012-08-19 17:22:37 -04:00
case RGUI_SETTINGS_RESTART_GAME :
if ( action = = RGUI_ACTION_OK )
{
rarch_game_reset ( ) ;
2013-01-13 03:34:55 +01:00
g_extern . lifecycle_mode_state | = ( 1ULL < < MODE_GAME ) ;
2013-01-11 04:36:40 +01:00
return - 1 ;
2012-08-19 17:22:37 -04:00
}
break ;
2012-07-17 01:06:13 +02:00
case RGUI_SETTINGS_AUDIO_MUTE :
2012-07-18 20:38:09 -04:00
if ( action = = RGUI_ACTION_START )
2013-03-23 17:21:42 +01:00
settings_set ( 1ULL < < S_DEF_AUDIO_MUTE ) ;
2012-07-18 20:38:09 -04:00
else
2013-03-23 17:21:42 +01:00
settings_set ( 1ULL < < S_AUDIO_MUTE ) ;
2012-07-18 20:38:09 -04:00
break ;
2013-05-04 22:47:14 +02:00
case RGUI_SETTINGS_AUDIO_CONTROL_RATE_DELTA :
2012-07-18 20:38:09 -04:00
if ( action = = RGUI_ACTION_START )
2013-03-23 17:21:42 +01:00
settings_set ( 1ULL < < S_DEF_AUDIO_CONTROL_RATE ) ;
2012-07-18 20:38:09 -04:00
else if ( action = = RGUI_ACTION_LEFT )
2013-03-23 17:21:42 +01:00
settings_set ( 1ULL < < S_AUDIO_CONTROL_RATE_DECREMENT ) ;
2012-07-18 20:38:09 -04:00
else if ( action = = RGUI_ACTION_RIGHT )
2013-03-23 17:21:42 +01:00
settings_set ( 1ULL < < S_AUDIO_CONTROL_RATE_INCREMENT ) ;
2012-07-16 17:57:43 -04:00
break ;
2012-08-27 16:09:53 -04:00
case RGUI_SETTINGS_DEBUG_TEXT :
if ( action = = RGUI_ACTION_START | | action = = RGUI_ACTION_LEFT )
2013-01-12 03:13:03 +01:00
g_extern . lifecycle_mode_state & = ~ ( 1ULL < < MODE_FPS_DRAW ) ;
2012-08-27 16:09:53 -04:00
else if ( action = = RGUI_ACTION_RIGHT )
2013-01-12 03:13:03 +01:00
g_extern . lifecycle_mode_state | = ( 1ULL < < MODE_FPS_DRAW ) ;
2012-08-27 16:09:53 -04:00
break ;
2013-04-27 13:29:01 +02:00
case RGUI_SETTINGS_DISK_INDEX :
{
const struct retro_disk_control_callback * control = & g_extern . system . disk_control ;
unsigned num_disks = control - > get_num_images ( ) ;
unsigned current = control - > get_image_index ( ) ;
int step = 0 ;
if ( action = = RGUI_ACTION_RIGHT | | action = = RGUI_ACTION_OK )
step = 1 ;
else if ( action = = RGUI_ACTION_LEFT )
step = - 1 ;
if ( step )
{
unsigned next_index = ( current + num_disks + 1 + step ) % ( num_disks + 1 ) ;
rarch_disk_control_set_eject ( true , false ) ;
rarch_disk_control_set_index ( next_index ) ;
rarch_disk_control_set_eject ( false , false ) ;
}
break ;
}
2012-08-19 17:22:37 -04:00
case RGUI_SETTINGS_RESTART_EMULATOR :
2012-08-09 19:01:08 -04:00
if ( action = = RGUI_ACTION_OK )
{
2013-05-22 00:29:48 +02:00
# if defined(GEKKO) && defined(HW_RVL)
2013-03-11 06:48:58 +01:00
fill_pathname_join ( g_extern . fullpath , default_paths . core_dir , SALAMANDER_FILE ,
sizeof ( g_extern . fullpath ) ) ;
2012-08-09 19:01:08 -04:00
# endif
2013-01-13 03:34:55 +01:00
g_extern . lifecycle_mode_state & = ~ ( 1ULL < < MODE_GAME ) ;
2013-01-12 03:13:03 +01:00
g_extern . lifecycle_mode_state | = ( 1ULL < < MODE_EXITSPAWN ) ;
2013-01-11 04:36:40 +01:00
return - 1 ;
2012-08-09 19:01:08 -04:00
}
2012-07-30 23:00:20 -04:00
break ;
2013-03-24 06:32:22 +01:00
case RGUI_SETTINGS_RESUME_GAME :
if ( action = = RGUI_ACTION_OK & & ( g_extern . main_is_init ) )
{
g_extern . lifecycle_mode_state | = ( 1ULL < < MODE_GAME ) ;
return - 1 ;
}
break ;
case RGUI_SETTINGS_QUIT_RARCH :
2012-08-21 21:15:42 -04:00
if ( action = = RGUI_ACTION_OK )
2013-01-10 22:42:12 +01:00
{
2013-01-13 03:34:55 +01:00
g_extern . lifecycle_mode_state & = ~ ( 1ULL < < MODE_GAME ) ;
2013-01-11 04:36:40 +01:00
return - 1 ;
2013-01-10 22:42:12 +01:00
}
2012-08-21 21:15:42 -04:00
break ;
2013-09-22 12:48:33 +02:00
case RGUI_SETTINGS_SAVE_CONFIG :
if ( action = = RGUI_ACTION_OK )
menu_save_new_config ( ) ;
break ;
2013-05-17 23:13:09 +02:00
# ifdef HAVE_OVERLAY
case RGUI_SETTINGS_OVERLAY_PRESET :
switch ( action )
{
case RGUI_ACTION_OK :
2013-05-22 22:31:16 +02:00
rgui_list_push ( rgui - > menu_stack , g_extern . overlay_dir , setting , rgui - > selection_ptr ) ;
2013-05-17 23:13:09 +02:00
rgui - > selection_ptr = 0 ;
rgui - > need_refresh = true ;
break ;
2013-05-17 23:57:06 +02:00
# ifndef __QNX__ // FIXME: Why ifndef QNX?
2013-05-17 23:13:09 +02:00
case RGUI_ACTION_START :
2013-05-17 23:57:06 +02:00
if ( driver . overlay )
input_overlay_free ( driver . overlay ) ;
driver . overlay = NULL ;
* g_settings . input . overlay = ' \0 ' ;
2013-05-17 23:13:09 +02:00
break ;
2013-05-17 23:57:06 +02:00
# endif
2013-05-17 23:13:09 +02:00
default :
break ;
}
break ;
2013-05-17 23:57:06 +02:00
2013-05-17 23:26:11 +02:00
case RGUI_SETTINGS_OVERLAY_OPACITY :
2013-05-17 23:57:06 +02:00
{
bool changed = true ;
switch ( action )
2013-05-17 23:26:11 +02:00
{
2013-05-17 23:57:06 +02:00
case RGUI_ACTION_LEFT :
2013-09-19 11:38:12 +02:00
settings_set ( 1ULL < < S_INPUT_OVERLAY_OPACITY_DECREMENT ) ;
2013-05-17 23:57:06 +02:00
break ;
2013-05-17 23:26:11 +02:00
2013-05-17 23:57:06 +02:00
case RGUI_ACTION_RIGHT :
case RGUI_ACTION_OK :
2013-09-19 11:38:12 +02:00
settings_set ( 1ULL < < S_INPUT_OVERLAY_OPACITY_INCREMENT ) ;
2013-05-17 23:57:06 +02:00
break ;
case RGUI_ACTION_START :
2013-09-19 11:38:12 +02:00
settings_set ( 1ULL < < S_DEF_INPUT_OVERLAY_OPACITY ) ;
2013-05-17 23:57:06 +02:00
break ;
2013-05-17 23:26:11 +02:00
2013-05-17 23:57:06 +02:00
default :
changed = false ;
break ;
2013-05-17 23:26:11 +02:00
}
2013-05-17 23:57:06 +02:00
if ( changed & & driver . overlay )
input_overlay_set_alpha_mod ( driver . overlay ,
g_settings . input . overlay_opacity ) ;
2013-05-17 23:26:11 +02:00
break ;
2013-05-17 23:57:06 +02:00
}
2013-05-17 23:37:48 +02:00
case RGUI_SETTINGS_OVERLAY_SCALE :
2013-05-17 23:57:06 +02:00
{
2013-05-18 00:07:34 +02:00
bool changed = true ;
2013-05-17 23:57:06 +02:00
switch ( action )
2013-05-17 23:37:48 +02:00
{
2013-05-17 23:57:06 +02:00
case RGUI_ACTION_LEFT :
2013-09-19 11:38:12 +02:00
settings_set ( 1ULL < < S_INPUT_OVERLAY_SCALE_DECREMENT ) ;
2013-05-17 23:57:06 +02:00
break ;
2013-05-18 00:07:34 +02:00
2013-05-17 23:57:06 +02:00
case RGUI_ACTION_RIGHT :
case RGUI_ACTION_OK :
2013-09-19 11:38:12 +02:00
settings_set ( 1ULL < < S_INPUT_OVERLAY_SCALE_INCREMENT ) ;
2013-05-17 23:57:06 +02:00
break ;
2013-05-18 00:07:34 +02:00
2013-05-17 23:57:06 +02:00
case RGUI_ACTION_START :
2013-09-19 11:38:12 +02:00
settings_set ( 1ULL < < S_DEF_INPUT_OVERLAY_SCALE ) ;
2013-05-17 23:57:06 +02:00
break ;
2013-05-17 23:37:48 +02:00
2013-05-17 23:57:06 +02:00
default :
2013-05-18 00:07:34 +02:00
changed = false ;
2013-05-17 23:57:06 +02:00
break ;
2013-05-17 23:37:48 +02:00
}
2013-05-17 23:57:06 +02:00
if ( changed & & driver . overlay )
input_overlay_set_scale_factor ( driver . overlay ,
g_settings . input . overlay_scale ) ;
2013-05-17 23:37:48 +02:00
break ;
2013-05-17 23:57:06 +02:00
}
2013-05-17 23:13:09 +02:00
# endif
2012-07-27 23:15:52 -04:00
// controllers
2013-05-04 17:01:10 +02:00
case RGUI_SETTINGS_BIND_PLAYER :
2013-05-04 16:48:53 +02:00
if ( action = = RGUI_ACTION_START )
rgui - > current_pad = 0 ;
else if ( action = = RGUI_ACTION_LEFT )
{
if ( rgui - > current_pad ! = 0 )
rgui - > current_pad - - ;
}
else if ( action = = RGUI_ACTION_RIGHT )
{
2013-05-04 17:01:10 +02:00
if ( rgui - > current_pad < MAX_PLAYERS - 1 )
2013-05-04 16:48:53 +02:00
rgui - > current_pad + + ;
}
port = rgui - > current_pad ;
break ;
2012-07-27 23:15:52 -04:00
case RGUI_SETTINGS_BIND_DEVICE :
2013-04-27 00:37:20 +02:00
// If set_keybinds is supported, we do it more fancy, and scroll through
// a list of supported devices directly.
2013-03-14 02:24:57 +01:00
if ( driver . input - > set_keybinds )
{
2013-04-27 00:37:20 +02:00
g_settings . input . device [ port ] + = DEVICE_LAST ;
if ( action = = RGUI_ACTION_START )
g_settings . input . device [ port ] = 0 ;
else if ( action = = RGUI_ACTION_LEFT )
g_settings . input . device [ port ] - - ;
else if ( action = = RGUI_ACTION_RIGHT )
g_settings . input . device [ port ] + + ;
// DEVICE_LAST can be 0, avoid modulo.
if ( g_settings . input . device [ port ] > = DEVICE_LAST )
g_settings . input . device [ port ] - = DEVICE_LAST ;
2013-03-14 02:24:57 +01:00
unsigned keybind_action = ( 1ULL < < KEYBINDS_ACTION_SET_DEFAULT_BINDS ) ;
switch ( g_settings . input . dpad_emulation [ port ] )
{
case ANALOG_DPAD_LSTICK :
keybind_action | = ( 1ULL < < KEYBINDS_ACTION_SET_ANALOG_DPAD_LSTICK ) ;
break ;
case ANALOG_DPAD_RSTICK :
keybind_action | = ( 1ULL < < KEYBINDS_ACTION_SET_ANALOG_DPAD_RSTICK ) ;
break ;
case ANALOG_DPAD_NONE :
keybind_action | = ( 1ULL < < KEYBINDS_ACTION_SET_ANALOG_DPAD_NONE ) ;
break ;
default :
break ;
}
driver . input - > set_keybinds ( driver . input_data , g_settings . input . device [ port ] , port , 0 ,
keybind_action ) ;
}
2013-04-27 00:37:20 +02:00
else
{
// When only straight g_settings.input.joypad_map[] style
// mapping is supported.
int * p = & g_settings . input . joypad_map [ port ] ;
if ( action = = RGUI_ACTION_START )
* p = port ;
else if ( action = = RGUI_ACTION_LEFT )
( * p ) - - ;
else if ( action = = RGUI_ACTION_RIGHT )
( * p ) + + ;
if ( * p < - 1 )
* p = - 1 ;
else if ( * p > = MAX_PLAYERS )
* p = MAX_PLAYERS - 1 ;
}
2012-07-27 23:15:52 -04:00
break ;
2013-04-27 12:57:34 +02:00
case RGUI_SETTINGS_BIND_DEVICE_TYPE :
{
static const unsigned device_types [ ] = {
RETRO_DEVICE_NONE ,
RETRO_DEVICE_JOYPAD ,
RETRO_DEVICE_ANALOG ,
RETRO_DEVICE_MOUSE ,
RETRO_DEVICE_JOYPAD_MULTITAP ,
RETRO_DEVICE_LIGHTGUN_SUPER_SCOPE ,
RETRO_DEVICE_LIGHTGUN_JUSTIFIER ,
RETRO_DEVICE_LIGHTGUN_JUSTIFIERS ,
} ;
2013-09-22 11:08:09 +02:00
unsigned current_device = g_settings . input . libretro_device [ port ] ;
2013-04-27 12:57:34 +02:00
unsigned current_index = 0 ;
for ( unsigned i = 0 ; i < ARRAY_SIZE ( device_types ) ; i + + )
{
if ( current_device = = device_types [ i ] )
{
current_index = i ;
break ;
}
}
bool updated = true ;
switch ( action )
{
case RGUI_ACTION_START :
current_device = RETRO_DEVICE_JOYPAD ;
break ;
case RGUI_ACTION_LEFT :
current_device = device_types [ ( current_index + ARRAY_SIZE ( device_types ) - 1 ) % ARRAY_SIZE ( device_types ) ] ;
break ;
case RGUI_ACTION_RIGHT :
case RGUI_ACTION_OK :
2013-04-27 13:29:01 +02:00
current_device = device_types [ ( current_index + 1 ) % ARRAY_SIZE ( device_types ) ] ;
2013-04-27 12:57:34 +02:00
break ;
default :
updated = false ;
}
if ( updated )
{
2013-09-22 11:08:09 +02:00
g_settings . input . libretro_device [ port ] = current_device ;
2013-04-27 12:57:34 +02:00
pretro_set_controller_port_device ( port , current_device ) ;
}
break ;
}
2012-08-21 18:41:56 -04:00
case RGUI_SETTINGS_BIND_DPAD_EMULATION :
2013-03-14 02:24:57 +01:00
g_settings . input . dpad_emulation [ port ] + = ANALOG_DPAD_LAST ;
2012-08-21 18:41:56 -04:00
if ( action = = RGUI_ACTION_START )
2013-03-14 02:24:57 +01:00
g_settings . input . dpad_emulation [ port ] = ANALOG_DPAD_LSTICK ;
2012-08-21 18:41:56 -04:00
else if ( action = = RGUI_ACTION_LEFT )
g_settings . input . dpad_emulation [ port ] - - ;
else if ( action = = RGUI_ACTION_RIGHT )
g_settings . input . dpad_emulation [ port ] + + ;
2013-03-14 02:24:57 +01:00
g_settings . input . dpad_emulation [ port ] % = ANALOG_DPAD_LAST ;
if ( driver . input - > set_keybinds )
{
unsigned keybind_action = 0 ;
switch ( g_settings . input . dpad_emulation [ port ] )
{
case ANALOG_DPAD_LSTICK :
keybind_action = ( 1ULL < < KEYBINDS_ACTION_SET_ANALOG_DPAD_LSTICK ) ;
break ;
case ANALOG_DPAD_RSTICK :
keybind_action = ( 1ULL < < KEYBINDS_ACTION_SET_ANALOG_DPAD_RSTICK ) ;
break ;
case ANALOG_DPAD_NONE :
keybind_action = ( 1ULL < < KEYBINDS_ACTION_SET_ANALOG_DPAD_NONE ) ;
break ;
default :
break ;
}
if ( keybind_action )
driver . input - > set_keybinds ( driver . input_data , g_settings . input . device [ port ] , port , 0 ,
keybind_action ) ;
}
2012-08-21 18:41:56 -04:00
break ;
2013-09-29 19:37:48 +02:00
case RGUI_SETTINGS_CUSTOM_BIND_ALL :
if ( action = = RGUI_ACTION_OK )
{
rgui - > binds . target = & g_settings . input . binds [ port ] [ 0 ] ;
2013-09-29 20:40:04 +02:00
rgui - > binds . begin = RGUI_SETTINGS_BIND_BEGIN ;
rgui - > binds . last = RGUI_SETTINGS_BIND_LAST ;
2013-09-29 19:37:48 +02:00
rgui_list_push ( rgui - > menu_stack , " " , RGUI_SETTINGS_CUSTOM_BIND , rgui - > selection_ptr ) ;
menu_poll_bind_get_rested_axes ( & rgui - > binds ) ;
menu_poll_bind_state ( & rgui - > binds ) ;
}
break ;
2013-09-29 20:40:04 +02:00
case RGUI_SETTINGS_CUSTOM_BIND_DEFAULT_ALL :
if ( action = = RGUI_ACTION_OK )
{
struct retro_keybind * target = & g_settings . input . binds [ port ] [ 0 ] ;
rgui - > binds . begin = RGUI_SETTINGS_BIND_BEGIN ;
rgui - > binds . last = RGUI_SETTINGS_BIND_LAST ;
for ( unsigned i = RGUI_SETTINGS_BIND_BEGIN ; i < RGUI_SETTINGS_BIND_LAST ; i + + , target + + )
{
target - > joykey = NO_BTN ;
target - > joyaxis = AXIS_NONE ;
}
}
break ;
2012-07-27 23:15:52 -04:00
case RGUI_SETTINGS_BIND_UP :
case RGUI_SETTINGS_BIND_DOWN :
case RGUI_SETTINGS_BIND_LEFT :
case RGUI_SETTINGS_BIND_RIGHT :
case RGUI_SETTINGS_BIND_A :
case RGUI_SETTINGS_BIND_B :
case RGUI_SETTINGS_BIND_X :
case RGUI_SETTINGS_BIND_Y :
case RGUI_SETTINGS_BIND_START :
case RGUI_SETTINGS_BIND_SELECT :
case RGUI_SETTINGS_BIND_L :
case RGUI_SETTINGS_BIND_R :
case RGUI_SETTINGS_BIND_L2 :
case RGUI_SETTINGS_BIND_R2 :
case RGUI_SETTINGS_BIND_L3 :
case RGUI_SETTINGS_BIND_R3 :
2013-09-29 20:40:04 +02:00
case RGUI_SETTINGS_BIND_ANALOG_LEFT_X_PLUS :
case RGUI_SETTINGS_BIND_ANALOG_LEFT_X_MINUS :
case RGUI_SETTINGS_BIND_ANALOG_LEFT_Y_PLUS :
case RGUI_SETTINGS_BIND_ANALOG_LEFT_Y_MINUS :
case RGUI_SETTINGS_BIND_ANALOG_RIGHT_X_PLUS :
case RGUI_SETTINGS_BIND_ANALOG_RIGHT_X_MINUS :
case RGUI_SETTINGS_BIND_ANALOG_RIGHT_Y_PLUS :
case RGUI_SETTINGS_BIND_ANALOG_RIGHT_Y_MINUS :
case RGUI_SETTINGS_BIND_MENU_TOGGLE :
2013-03-14 15:01:36 +01:00
if ( driver . input - > set_keybinds )
{
unsigned keybind_action = KEYBINDS_ACTION_NONE ;
2012-07-27 20:39:49 -04:00
2013-03-14 15:01:36 +01:00
if ( action = = RGUI_ACTION_START )
keybind_action = ( 1ULL < < KEYBINDS_ACTION_SET_DEFAULT_BIND ) ;
else if ( action = = RGUI_ACTION_LEFT )
keybind_action = ( 1ULL < < KEYBINDS_ACTION_DECREMENT_BIND ) ;
else if ( action = = RGUI_ACTION_RIGHT )
keybind_action = ( 1ULL < < KEYBINDS_ACTION_INCREMENT_BIND ) ;
2013-09-29 19:37:48 +02:00
// FIXME: The array indices here look totally wrong ... Fixed it so it looks kind of sane for now.
2013-03-14 15:01:36 +01:00
if ( keybind_action ! = KEYBINDS_ACTION_NONE )
2013-09-29 17:58:46 +02:00
driver . input - > set_keybinds ( driver . input_data , g_settings . input . device [ port ] , port ,
2013-09-29 20:40:04 +02:00
setting - RGUI_SETTINGS_BIND_BEGIN , keybind_action ) ;
2013-03-14 15:01:36 +01:00
}
2013-09-29 17:58:46 +02:00
else
{
2013-09-29 20:40:04 +02:00
struct retro_keybind * bind = & g_settings . input . binds [ port ] [ setting - RGUI_SETTINGS_BIND_BEGIN ] ;
2013-09-29 17:58:46 +02:00
if ( action = = RGUI_ACTION_OK )
{
2013-09-29 19:37:48 +02:00
rgui - > binds . begin = setting ;
rgui - > binds . last = setting ;
2013-09-29 17:58:46 +02:00
rgui - > binds . target = bind ;
rgui - > binds . player = port ;
rgui_list_push ( rgui - > menu_stack , " " , RGUI_SETTINGS_CUSTOM_BIND , rgui - > selection_ptr ) ;
2013-09-29 19:09:33 +02:00
menu_poll_bind_get_rested_axes ( & rgui - > binds ) ;
2013-09-29 17:58:46 +02:00
menu_poll_bind_state ( & rgui - > binds ) ;
}
else if ( action = = RGUI_ACTION_START )
{
bind - > joykey = NO_BTN ;
bind - > joyaxis = AXIS_NONE ;
}
}
break ;
2013-05-20 22:17:26 -04:00
case RGUI_BROWSER_DIR_PATH :
if ( action = = RGUI_ACTION_START )
{
2013-05-21 08:46:51 +02:00
* g_settings . rgui_browser_directory = ' \0 ' ;
* rgui - > base_path = ' \0 ' ;
2013-05-20 22:17:26 -04:00
}
break ;
2013-09-16 23:30:42 +02:00
# ifdef HAVE_SCREENSHOTS
case RGUI_SCREENSHOT_DIR_PATH :
if ( action = = RGUI_ACTION_START )
* g_settings . screenshot_directory = ' \0 ' ;
break ;
# endif
2013-05-20 22:17:26 -04:00
case RGUI_SAVEFILE_DIR_PATH :
if ( action = = RGUI_ACTION_START )
2013-05-21 08:46:51 +02:00
* g_extern . savefile_dir = ' \0 ' ;
2013-05-20 22:17:26 -04:00
break ;
2013-05-22 22:31:16 +02:00
# ifdef HAVE_OVERLAY
case RGUI_OVERLAY_DIR_PATH :
if ( action = = RGUI_ACTION_START )
* g_extern . overlay_dir = ' \0 ' ;
break ;
# endif
2013-05-20 22:17:26 -04:00
case RGUI_SAVESTATE_DIR_PATH :
if ( action = = RGUI_ACTION_START )
2013-05-21 08:46:51 +02:00
* g_extern . savestate_dir = ' \0 ' ;
2013-05-20 22:17:26 -04:00
break ;
2013-09-15 17:09:23 -04:00
# ifdef HAVE_DYNAMIC
2013-09-12 22:00:59 +02:00
case RGUI_LIBRETRO_DIR_PATH :
if ( action = = RGUI_ACTION_START )
* rgui - > libretro_dir = ' \0 ' ;
break ;
2013-09-15 17:09:23 -04:00
# endif
2013-09-15 16:15:38 +02:00
case RGUI_CONFIG_DIR_PATH :
if ( action = = RGUI_ACTION_START )
* g_settings . rgui_config_directory = ' \0 ' ;
break ;
2013-05-20 22:17:26 -04:00
case RGUI_SHADER_DIR_PATH :
if ( action = = RGUI_ACTION_START )
2013-05-21 08:46:51 +02:00
* g_settings . video . shader_dir = ' \0 ' ;
2013-05-20 22:17:26 -04:00
break ;
case RGUI_SYSTEM_DIR_PATH :
if ( action = = RGUI_ACTION_START )
2013-05-21 08:46:51 +02:00
* g_settings . system_directory = ' \0 ' ;
2013-05-20 22:17:26 -04:00
break ;
2012-07-16 17:57:43 -04:00
default :
break ;
}
2013-01-11 04:36:40 +01:00
return 0 ;
2012-07-16 17:57:43 -04:00
}
2013-05-04 19:00:57 +02:00
static void rgui_settings_audio_options_populate_entries ( rgui_handle_t * rgui )
{
rgui_list_clear ( rgui - > selection_buf ) ;
rgui_list_push ( rgui - > selection_buf , " Mute Audio " , RGUI_SETTINGS_AUDIO_MUTE , 0 ) ;
2013-05-04 22:47:14 +02:00
rgui_list_push ( rgui - > selection_buf , " Rate Control Delta " , RGUI_SETTINGS_AUDIO_CONTROL_RATE_DELTA , 0 ) ;
2013-05-04 19:00:57 +02:00
}
2013-05-04 19:26:34 +02:00
static void rgui_settings_disc_options_populate_entries ( rgui_handle_t * rgui )
{
rgui_list_clear ( rgui - > selection_buf ) ;
rgui_list_push ( rgui - > selection_buf , " Disk Index " , RGUI_SETTINGS_DISK_INDEX , 0 ) ;
rgui_list_push ( rgui - > selection_buf , " Disk Image Append " , RGUI_SETTINGS_DISK_APPEND , 0 ) ;
}
2013-05-05 22:02:30 +02:00
static void rgui_settings_options_populate_entries ( rgui_handle_t * rgui )
{
rgui_list_clear ( rgui - > selection_buf ) ;
2013-05-17 22:22:15 +02:00
rgui_list_push ( rgui - > selection_buf , " Rewind " , RGUI_SETTINGS_REWIND_ENABLE , 0 ) ;
rgui_list_push ( rgui - > selection_buf , " Rewind Granularity " , RGUI_SETTINGS_REWIND_GRANULARITY , 0 ) ;
2013-09-16 23:10:15 +02:00
# ifdef HAVE_SCREENSHOTS
rgui_list_push ( rgui - > selection_buf , " GPU Screenshots " , RGUI_SETTINGS_GPU_SCREENSHOT , 0 ) ;
# endif
2013-05-22 15:35:28 +02:00
rgui_list_push ( rgui - > selection_buf , " Config Save On Exit " , RGUI_SETTINGS_CONFIG_SAVE_ON_EXIT , 0 ) ;
2013-05-17 22:22:15 +02:00
# if defined(HAVE_THREADS) && !defined(RARCH_CONSOLE)
rgui_list_push ( rgui - > selection_buf , " SRAM Autosave " , RGUI_SETTINGS_SRAM_AUTOSAVE , 0 ) ;
# endif
2013-05-05 22:02:30 +02:00
rgui_list_push ( rgui - > selection_buf , " Debug Info Messages " , RGUI_SETTINGS_DEBUG_TEXT , 0 ) ;
}
2012-07-16 17:57:43 -04:00
static void rgui_settings_populate_entries ( rgui_handle_t * rgui )
{
2013-03-11 03:56:06 +01:00
rgui_list_clear ( rgui - > selection_buf ) ;
2012-07-27 20:39:49 -04:00
2013-04-08 01:51:18 +02:00
# if defined(HAVE_DYNAMIC) || defined(HAVE_LIBRETRO_MANAGEMENT)
2013-03-17 21:23:28 +01:00
rgui_list_push ( rgui - > selection_buf , " Core " , RGUI_SETTINGS_CORE , 0 ) ;
# endif
2013-04-29 14:12:39 +02:00
if ( rgui - > history )
rgui_list_push ( rgui - > selection_buf , " Load Game (History) " , RGUI_SETTINGS_OPEN_HISTORY , 0 ) ;
2013-04-20 18:06:08 +02:00
rgui_list_push ( rgui - > selection_buf , " Load Game " , RGUI_SETTINGS_OPEN_FILEBROWSER , 0 ) ;
2013-05-04 16:48:53 +02:00
rgui_list_push ( rgui - > selection_buf , " Core Options " , RGUI_SETTINGS_CORE_OPTIONS , 0 ) ;
2013-04-28 00:32:25 +02:00
rgui_list_push ( rgui - > selection_buf , " Video Options " , RGUI_SETTINGS_VIDEO_OPTIONS , 0 ) ;
2013-05-04 19:00:57 +02:00
rgui_list_push ( rgui - > selection_buf , " Audio Options " , RGUI_SETTINGS_AUDIO_OPTIONS , 0 ) ;
rgui_list_push ( rgui - > selection_buf , " Input Options " , RGUI_SETTINGS_INPUT_OPTIONS , 0 ) ;
2013-05-04 21:17:47 +02:00
rgui_list_push ( rgui - > selection_buf , " Path Options " , RGUI_SETTINGS_PATH_OPTIONS , 0 ) ;
2013-05-05 22:02:30 +02:00
rgui_list_push ( rgui - > selection_buf , " Settings " , RGUI_SETTINGS_OPTIONS , 0 ) ;
2013-04-20 18:06:08 +02:00
if ( g_extern . main_is_init & & ! g_extern . libretro_dummy )
2012-08-12 03:38:23 -04:00
{
2013-05-04 19:26:34 +02:00
if ( g_extern . system . disk_control . get_num_images )
rgui_list_push ( rgui - > selection_buf , " Disk Options " , RGUI_SETTINGS_DISK_OPTIONS , 0 ) ;
2013-03-11 03:56:06 +01:00
rgui_list_push ( rgui - > selection_buf , " Save State " , RGUI_SETTINGS_SAVESTATE_SAVE , 0 ) ;
rgui_list_push ( rgui - > selection_buf , " Load State " , RGUI_SETTINGS_SAVESTATE_LOAD , 0 ) ;
2013-03-10 17:54:46 -04:00
# ifdef HAVE_SCREENSHOTS
2013-03-11 03:56:06 +01:00
rgui_list_push ( rgui - > selection_buf , " Take Screenshot " , RGUI_SETTINGS_SCREENSHOT , 0 ) ;
2013-03-10 17:54:46 -04:00
# endif
2013-04-04 04:56:04 +02:00
rgui_list_push ( rgui - > selection_buf , " Resume Game " , RGUI_SETTINGS_RESUME_GAME , 0 ) ;
2013-03-11 03:56:06 +01:00
rgui_list_push ( rgui - > selection_buf , " Restart Game " , RGUI_SETTINGS_RESTART_GAME , 0 ) ;
2013-04-27 13:29:01 +02:00
2012-08-12 03:38:23 -04:00
}
2013-03-09 21:30:40 +01:00
# ifndef HAVE_DYNAMIC
2013-03-11 03:56:06 +01:00
rgui_list_push ( rgui - > selection_buf , " Restart RetroArch " , RGUI_SETTINGS_RESTART_EMULATOR , 0 ) ;
2013-03-09 21:30:40 +01:00
# endif
2013-09-15 15:36:45 +02:00
rgui_list_push ( rgui - > selection_buf , " RetroArch Config " , RGUI_SETTINGS_CONFIG , 0 ) ;
2013-09-22 12:48:33 +02:00
rgui_list_push ( rgui - > selection_buf , " Save New Config " , RGUI_SETTINGS_SAVE_CONFIG , 0 ) ;
2013-03-24 06:32:22 +01:00
rgui_list_push ( rgui - > selection_buf , " Quit RetroArch " , RGUI_SETTINGS_QUIT_RARCH , 0 ) ;
2012-07-16 17:57:43 -04:00
}
2013-04-04 21:47:37 +02:00
static void rgui_settings_core_options_populate_entries ( rgui_handle_t * rgui )
{
rgui_list_clear ( rgui - > selection_buf ) ;
2013-04-04 22:08:23 +02:00
if ( g_extern . system . core_options )
{
size_t opts = core_option_size ( g_extern . system . core_options ) ;
for ( size_t i = 0 ; i < opts ; i + + )
rgui_list_push ( rgui - > selection_buf ,
core_option_get_desc ( g_extern . system . core_options , i ) , RGUI_SETTINGS_CORE_OPTION_START + i , 0 ) ;
}
else
rgui_list_push ( rgui - > selection_buf , " No options available. " , RGUI_SETTINGS_CORE_OPTION_NONE , 0 ) ;
2013-04-04 21:47:37 +02:00
}
2013-05-04 23:35:39 +02:00
static void rgui_settings_video_options_populate_entries ( rgui_handle_t * rgui )
2013-04-07 15:46:36 +02:00
{
rgui_list_clear ( rgui - > selection_buf ) ;
2013-05-04 23:35:39 +02:00
# ifdef HAVE_SHADER_MANAGER
rgui_list_push ( rgui - > selection_buf , " Shader Options " , RGUI_SETTINGS_SHADER_OPTIONS , 0 ) ;
# endif
2013-04-28 01:41:38 +02:00
# ifdef GEKKO
rgui_list_push ( rgui - > selection_buf , " Screen Resolution " , RGUI_SETTINGS_VIDEO_RESOLUTION , 0 ) ;
# endif
2013-04-28 01:52:58 +02:00
# ifndef HAVE_SHADER_MANAGER
rgui_list_push ( rgui - > selection_buf , " Default Filter " , RGUI_SETTINGS_VIDEO_FILTER , 0 ) ;
2013-04-28 01:41:38 +02:00
# endif
# ifdef HW_RVL
rgui_list_push ( rgui - > selection_buf , " VI Trap filtering " , RGUI_SETTINGS_VIDEO_SOFT_FILTER , 0 ) ;
rgui_list_push ( rgui - > selection_buf , " Gamma " , RGUI_SETTINGS_VIDEO_GAMMA , 0 ) ;
# endif
rgui_list_push ( rgui - > selection_buf , " Integer Scale " , RGUI_SETTINGS_VIDEO_INTEGER_SCALE , 0 ) ;
rgui_list_push ( rgui - > selection_buf , " Aspect Ratio " , RGUI_SETTINGS_VIDEO_ASPECT_RATIO , 0 ) ;
rgui_list_push ( rgui - > selection_buf , " Custom Ratio " , RGUI_SETTINGS_CUSTOM_VIEWPORT , 0 ) ;
2013-09-01 13:46:35 +02:00
# if !defined(RARCH_CONSOLE) && !defined(RARCH_MOBILE)
2013-04-28 01:41:38 +02:00
rgui_list_push ( rgui - > selection_buf , " Toggle Fullscreen " , RGUI_SETTINGS_TOGGLE_FULLSCREEN , 0 ) ;
2013-09-01 13:46:35 +02:00
# endif
2013-04-28 01:04:34 +02:00
rgui_list_push ( rgui - > selection_buf , " Rotation " , RGUI_SETTINGS_VIDEO_ROTATION , 0 ) ;
2013-05-04 22:48:24 +02:00
rgui_list_push ( rgui - > selection_buf , " VSync " , RGUI_SETTINGS_VIDEO_VSYNC , 0 ) ;
2013-05-05 09:54:54 +02:00
rgui_list_push ( rgui - > selection_buf , " Hard GPU Sync " , RGUI_SETTINGS_VIDEO_HARD_SYNC , 0 ) ;
2013-05-26 13:43:24 +02:00
rgui_list_push ( rgui - > selection_buf , " Hard GPU Sync Frames " , RGUI_SETTINGS_VIDEO_HARD_SYNC_FRAMES , 0 ) ;
2013-08-30 09:35:13 +02:00
rgui_list_push ( rgui - > selection_buf , " Black Frame Insertion " , RGUI_SETTINGS_VIDEO_BLACK_FRAME_INSERTION , 0 ) ;
2013-09-01 13:20:10 +02:00
rgui_list_push ( rgui - > selection_buf , " VSync Swap Interval " , RGUI_SETTINGS_VIDEO_SWAP_INTERVAL , 0 ) ;
2013-09-01 13:46:35 +02:00
# if !defined(RARCH_CONSOLE) && !defined(RARCH_MOBILE)
rgui_list_push ( rgui - > selection_buf , " Windowed Scale (X) " , RGUI_SETTINGS_VIDEO_WINDOW_SCALE_X , 0 ) ;
rgui_list_push ( rgui - > selection_buf , " Windowed Scale (Y) " , RGUI_SETTINGS_VIDEO_WINDOW_SCALE_Y , 0 ) ;
# endif
rgui_list_push ( rgui - > selection_buf , " Crop Overscan (reload) " , RGUI_SETTINGS_VIDEO_CROP_OVERSCAN , 0 ) ;
2013-06-07 14:10:42 +02:00
rgui_list_push ( rgui - > selection_buf , " Estimated Monitor FPS " , RGUI_SETTINGS_VIDEO_REFRESH_RATE_AUTO , 0 ) ;
2013-05-04 23:35:39 +02:00
}
2013-04-28 00:32:25 +02:00
# ifdef HAVE_SHADER_MANAGER
2013-05-04 23:35:39 +02:00
static void rgui_settings_shader_manager_populate_entries ( rgui_handle_t * rgui )
{
rgui_list_clear ( rgui - > selection_buf ) ;
2013-04-28 01:52:58 +02:00
rgui_list_push ( rgui - > selection_buf , " Apply Shader Changes " ,
2013-04-07 16:45:05 +02:00
RGUI_SETTINGS_SHADER_APPLY , 0 ) ;
2013-04-28 01:52:58 +02:00
rgui_list_push ( rgui - > selection_buf , " Default Filter " , RGUI_SETTINGS_SHADER_FILTER , 0 ) ;
rgui_list_push ( rgui - > selection_buf , " Load Shader Preset " ,
2013-04-14 01:27:13 +02:00
RGUI_SETTINGS_SHADER_PRESET , 0 ) ;
2013-04-29 22:02:20 +02:00
rgui_list_push ( rgui - > selection_buf , " Shader Passes " ,
2013-04-07 16:45:05 +02:00
RGUI_SETTINGS_SHADER_PASSES , 0 ) ;
for ( unsigned i = 0 ; i < rgui - > shader . passes ; i + + )
{
char buf [ 64 ] ;
snprintf ( buf , sizeof ( buf ) , " Shader #%u " , i ) ;
rgui_list_push ( rgui - > selection_buf , buf ,
RGUI_SETTINGS_SHADER_0 + 3 * i , 0 ) ;
2013-04-28 01:52:58 +02:00
snprintf ( buf , sizeof ( buf ) , " Shader #%u Filter " , i ) ;
2013-04-07 16:45:05 +02:00
rgui_list_push ( rgui - > selection_buf , buf ,
RGUI_SETTINGS_SHADER_0_FILTER + 3 * i , 0 ) ;
2013-04-28 01:52:58 +02:00
snprintf ( buf , sizeof ( buf ) , " Shader #%u Scale " , i ) ;
2013-04-07 16:45:05 +02:00
rgui_list_push ( rgui - > selection_buf , buf ,
RGUI_SETTINGS_SHADER_0_SCALE + 3 * i , 0 ) ;
}
}
2013-04-11 16:01:42 +02:00
static enum rarch_shader_type shader_manager_get_type ( const struct gfx_shader * shader )
{
// All shader types must be the same, or we cannot use it.
enum rarch_shader_type type = RARCH_SHADER_NONE ;
for ( unsigned i = 0 ; i < shader - > passes ; i + + )
{
enum rarch_shader_type pass_type = gfx_shader_parse_type ( shader - > pass [ i ] . source . cg ,
RARCH_SHADER_NONE ) ;
switch ( pass_type )
{
case RARCH_SHADER_CG :
case RARCH_SHADER_GLSL :
if ( type = = RARCH_SHADER_NONE )
type = pass_type ;
else if ( type ! = pass_type )
return RARCH_SHADER_NONE ;
break ;
default :
return RARCH_SHADER_NONE ;
}
}
return type ;
}
2013-05-06 16:41:31 +02:00
static void shader_manager_set_preset ( struct gfx_shader * shader , enum rarch_shader_type type , const char * path )
2013-04-14 01:27:13 +02:00
{
RARCH_LOG ( " Setting RGUI shader: %s. \n " , path ? path : " N/A (stock) " ) ;
bool ret = video_set_shader_func ( type , path ) ;
if ( ret )
{
// Makes sure that we use RGUI CGP shader on driver reinit.
// Only do this when the cgp actually works to avoid potential errors.
strlcpy ( g_settings . video . shader_path , path ? path : " " ,
sizeof ( g_settings . video . shader_path ) ) ;
g_settings . video . shader_enable = true ;
2013-05-06 16:41:31 +02:00
if ( path & & shader )
{
// Load stored CGP into RGUI menu on success.
// Used when a preset is directly loaded.
// No point in updating when the CGP was created from RGUI itself.
config_file_t * conf = config_file_new ( path ) ;
if ( conf )
{
gfx_shader_read_conf_cgp ( conf , shader ) ;
gfx_shader_resolve_relative ( shader , path ) ;
config_file_free ( conf ) ;
}
rgui - > need_refresh = true ;
}
2013-04-14 01:27:13 +02:00
}
else
{
RARCH_ERR ( " Setting RGUI CGP failed. \n " ) ;
g_settings . video . shader_enable = false ;
}
}
2013-04-07 16:45:05 +02:00
static int shader_manager_toggle_setting ( rgui_handle_t * rgui , unsigned setting , rgui_action_t action )
{
2013-04-09 19:43:24 +02:00
unsigned dist_shader = setting - RGUI_SETTINGS_SHADER_0 ;
unsigned dist_filter = setting - RGUI_SETTINGS_SHADER_0_FILTER ;
unsigned dist_scale = setting - RGUI_SETTINGS_SHADER_0_SCALE ;
2013-05-04 22:29:22 +02:00
2013-05-08 18:17:30 +02:00
if ( setting = = RGUI_SETTINGS_SHADER_FILTER )
2013-04-14 01:45:33 +02:00
{
switch ( action )
{
case RGUI_ACTION_START :
g_settings . video . smooth = true ;
break ;
case RGUI_ACTION_LEFT :
case RGUI_ACTION_RIGHT :
case RGUI_ACTION_OK :
g_settings . video . smooth = ! g_settings . video . smooth ;
break ;
default :
break ;
}
}
else if ( setting = = RGUI_SETTINGS_SHADER_APPLY )
2013-04-09 21:39:02 +02:00
{
if ( ! driver . video - > set_shader | | action ! = RGUI_ACTION_OK )
return 0 ;
2013-04-09 19:43:24 +02:00
RARCH_LOG ( " Applying shader ... \n " ) ;
2013-04-09 21:39:02 +02:00
2013-04-11 16:01:42 +02:00
enum rarch_shader_type type = shader_manager_get_type ( & rgui - > shader ) ;
if ( rgui - > shader . passes & & type ! = RARCH_SHADER_NONE )
2013-04-09 21:39:02 +02:00
{
2013-09-15 20:34:36 +02:00
const char * conf_path = type = = RARCH_SHADER_GLSL ? rgui - > default_glslp : rgui - > default_cgp ;
2013-04-11 16:01:42 +02:00
2013-04-09 21:39:02 +02:00
char cgp_path [ PATH_MAX ] ;
const char * shader_dir = * g_settings . video . shader_dir ?
g_settings . video . shader_dir : g_settings . system_directory ;
2013-04-11 16:01:42 +02:00
fill_pathname_join ( cgp_path , shader_dir , conf_path , sizeof ( cgp_path ) ) ;
2013-04-09 21:39:02 +02:00
config_file_t * conf = config_file_new ( NULL ) ;
if ( ! conf )
return 0 ;
gfx_shader_write_conf_cgp ( conf , & rgui - > shader ) ;
config_file_write ( conf , cgp_path ) ;
config_file_free ( conf ) ;
2013-04-11 16:01:42 +02:00
2013-05-06 16:41:31 +02:00
shader_manager_set_preset ( NULL , type , cgp_path ) ;
2013-04-09 21:39:02 +02:00
}
else
2013-04-14 22:48:35 +02:00
{
type = gfx_shader_parse_type ( " " , DEFAULT_SHADER_TYPE ) ;
if ( type = = RARCH_SHADER_NONE )
{
# if defined(HAVE_GLSL)
type = RARCH_SHADER_GLSL ;
# elif defined(HAVE_CG) || defined(HAVE_HLSL)
type = RARCH_SHADER_CG ;
# endif
}
2013-05-06 16:41:31 +02:00
shader_manager_set_preset ( NULL , type , NULL ) ;
2013-04-14 22:48:35 +02:00
}
2013-04-09 21:39:02 +02:00
}
2013-04-09 19:43:24 +02:00
else if ( setting = = RGUI_SETTINGS_SHADER_PASSES )
{
switch ( action )
{
case RGUI_ACTION_START :
rgui - > shader . passes = 0 ;
break ;
2013-04-07 16:45:05 +02:00
2013-04-09 19:43:24 +02:00
case RGUI_ACTION_LEFT :
if ( rgui - > shader . passes )
rgui - > shader . passes - - ;
break ;
2013-04-07 16:45:05 +02:00
2013-04-09 19:43:24 +02:00
case RGUI_ACTION_RIGHT :
case RGUI_ACTION_OK :
if ( rgui - > shader . passes < RGUI_MAX_SHADERS )
rgui - > shader . passes + + ;
break ;
default :
break ;
}
rgui - > need_refresh = true ;
}
2013-04-14 01:27:13 +02:00
else if ( ( dist_shader % 3 ) = = 0 | | setting = = RGUI_SETTINGS_SHADER_PRESET )
2013-04-09 19:43:24 +02:00
{
dist_shader / = 3 ;
2013-04-14 01:27:13 +02:00
struct gfx_shader_pass * pass = setting = = RGUI_SETTINGS_SHADER_PRESET ?
& rgui - > shader . pass [ dist_shader ] : NULL ;
2013-04-09 21:01:12 +02:00
switch ( action )
{
case RGUI_ACTION_OK :
rgui_list_push ( rgui - > menu_stack , g_settings . video . shader_dir , setting , rgui - > selection_ptr ) ;
rgui - > selection_ptr = 0 ;
rgui - > need_refresh = true ;
break ;
case RGUI_ACTION_START :
2013-04-14 01:27:13 +02:00
if ( pass )
* pass - > source . cg = ' \0 ' ;
2013-04-09 21:01:12 +02:00
break ;
default :
break ;
}
2013-04-09 19:43:24 +02:00
}
else if ( ( dist_filter % 3 ) = = 0 )
{
dist_filter / = 3 ;
struct gfx_shader_pass * pass = & rgui - > shader . pass [ dist_filter ] ;
switch ( action )
{
case RGUI_ACTION_START :
rgui - > shader . pass [ dist_filter ] . filter = RARCH_FILTER_UNSPEC ;
break ;
case RGUI_ACTION_LEFT :
case RGUI_ACTION_RIGHT :
case RGUI_ACTION_OK :
{
unsigned delta = action = = RGUI_ACTION_LEFT ? 2 : 1 ;
pass - > filter = ( enum gfx_filter_type ) ( ( pass - > filter + delta ) % 3 ) ;
break ;
}
default :
2013-04-07 16:45:05 +02:00
break ;
2013-04-09 19:43:24 +02:00
}
}
else if ( ( dist_scale % 3 ) = = 0 )
{
dist_scale / = 3 ;
struct gfx_shader_pass * pass = & rgui - > shader . pass [ dist_scale ] ;
switch ( action )
{
case RGUI_ACTION_START :
pass - > fbo . scale_x = pass - > fbo . scale_y = 0 ;
pass - > fbo . valid = false ;
break ;
2013-04-07 16:45:05 +02:00
2013-04-09 19:43:24 +02:00
case RGUI_ACTION_LEFT :
case RGUI_ACTION_RIGHT :
case RGUI_ACTION_OK :
{
unsigned current_scale = pass - > fbo . scale_x ;
unsigned delta = action = = RGUI_ACTION_LEFT ? 5 : 1 ;
current_scale = ( current_scale + delta ) % 6 ;
pass - > fbo . valid = current_scale ;
pass - > fbo . scale_x = pass - > fbo . scale_y = current_scale ;
break ;
}
default :
2013-04-07 16:45:05 +02:00
break ;
2013-04-09 19:43:24 +02:00
}
2013-04-07 16:45:05 +02:00
}
2013-05-08 18:17:30 +02:00
return 0 ;
}
# endif
static int video_option_toggle_setting ( rgui_handle_t * rgui , unsigned setting , rgui_action_t action )
{
switch ( setting )
{
case RGUI_SETTINGS_VIDEO_ROTATION :
if ( action = = RGUI_ACTION_START )
{
2013-09-22 11:45:04 +02:00
settings_set ( 1ULL < < S_DEF_ROTATION ) ;
video_set_rotation_func ( ( g_settings . video . rotation + g_extern . system . rotation ) % 4 ) ;
2013-05-08 18:17:30 +02:00
}
else if ( action = = RGUI_ACTION_LEFT )
{
settings_set ( 1ULL < < S_ROTATION_DECREMENT ) ;
2013-09-22 11:45:04 +02:00
video_set_rotation_func ( ( g_settings . video . rotation + g_extern . system . rotation ) % 4 ) ;
2013-05-08 18:17:30 +02:00
}
else if ( action = = RGUI_ACTION_RIGHT )
{
settings_set ( 1ULL < < S_ROTATION_INCREMENT ) ;
2013-09-22 11:45:04 +02:00
video_set_rotation_func ( ( g_settings . video . rotation + g_extern . system . rotation ) % 4 ) ;
2013-05-08 18:17:30 +02:00
}
break ;
case RGUI_SETTINGS_VIDEO_FILTER :
if ( action = = RGUI_ACTION_START )
settings_set ( 1ULL < < S_DEF_HW_TEXTURE_FILTER ) ;
else
settings_set ( 1ULL < < S_HW_TEXTURE_FILTER ) ;
if ( driver . video_poke - > set_filtering )
driver . video_poke - > set_filtering ( driver . video_data , 1 , g_settings . video . smooth ) ;
break ;
case RGUI_SETTINGS_VIDEO_GAMMA :
if ( action = = RGUI_ACTION_START )
{
g_extern . console . screen . gamma_correction = 0 ;
if ( driver . video_poke - > apply_state_changes )
driver . video_poke - > apply_state_changes ( driver . video_data ) ;
}
else if ( action = = RGUI_ACTION_LEFT )
{
if ( g_extern . console . screen . gamma_correction > 0 )
{
g_extern . console . screen . gamma_correction - - ;
if ( driver . video_poke - > apply_state_changes )
driver . video_poke - > apply_state_changes ( driver . video_data ) ;
}
}
else if ( action = = RGUI_ACTION_RIGHT )
{
if ( g_extern . console . screen . gamma_correction < MAX_GAMMA_SETTING )
{
g_extern . console . screen . gamma_correction + + ;
if ( driver . video_poke - > apply_state_changes )
driver . video_poke - > apply_state_changes ( driver . video_data ) ;
}
}
break ;
case RGUI_SETTINGS_VIDEO_INTEGER_SCALE :
if ( action = = RGUI_ACTION_START )
settings_set ( 1ULL < < S_DEF_SCALE_INTEGER ) ;
else if ( action = = RGUI_ACTION_LEFT | |
action = = RGUI_ACTION_RIGHT | |
action = = RGUI_ACTION_OK )
settings_set ( 1ULL < < S_SCALE_INTEGER_TOGGLE ) ;
if ( driver . video_poke - > apply_state_changes )
driver . video_poke - > apply_state_changes ( driver . video_data ) ;
break ;
case RGUI_SETTINGS_VIDEO_ASPECT_RATIO :
if ( action = = RGUI_ACTION_START )
settings_set ( 1ULL < < S_DEF_ASPECT_RATIO ) ;
else if ( action = = RGUI_ACTION_LEFT )
settings_set ( 1ULL < < S_ASPECT_RATIO_DECREMENT ) ;
else if ( action = = RGUI_ACTION_RIGHT )
settings_set ( 1ULL < < S_ASPECT_RATIO_INCREMENT ) ;
if ( driver . video_poke - > set_aspect_ratio )
driver . video_poke - > set_aspect_ratio ( driver . video_data , g_settings . video . aspect_ratio_idx ) ;
break ;
case RGUI_SETTINGS_TOGGLE_FULLSCREEN :
if ( action = = RGUI_ACTION_OK )
rarch_set_fullscreen ( ! g_settings . video . fullscreen ) ;
break ;
2013-05-23 13:26:06 +02:00
# ifdef GEKKO
2013-05-08 18:17:30 +02:00
case RGUI_SETTINGS_VIDEO_RESOLUTION :
if ( action = = RGUI_ACTION_LEFT )
{
if ( rgui_current_gx_resolution > 0 )
{
rgui_current_gx_resolution - - ;
gx_set_video_mode ( rgui_gx_resolutions [ rgui_current_gx_resolution ] [ 0 ] , rgui_gx_resolutions [ rgui_current_gx_resolution ] [ 1 ] ) ;
}
}
else if ( action = = RGUI_ACTION_RIGHT )
{
if ( rgui_current_gx_resolution < GX_RESOLUTIONS_LAST - 1 )
{
2013-05-24 18:38:13 +02:00
# ifdef HW_RVL
2013-05-08 18:17:30 +02:00
if ( ( rgui_current_gx_resolution + 1 ) > GX_RESOLUTIONS_640_480 )
if ( CONF_GetVideo ( ) ! = CONF_VIDEO_PAL )
return 0 ;
2013-05-24 18:38:13 +02:00
# endif
2013-05-08 18:17:30 +02:00
rgui_current_gx_resolution + + ;
gx_set_video_mode ( rgui_gx_resolutions [ rgui_current_gx_resolution ] [ 0 ] ,
rgui_gx_resolutions [ rgui_current_gx_resolution ] [ 1 ] ) ;
}
}
break ;
2013-05-23 13:26:06 +02:00
# endif
# ifdef HW_RVL
2013-05-08 18:17:30 +02:00
case RGUI_SETTINGS_VIDEO_SOFT_FILTER :
if ( g_extern . lifecycle_mode_state & ( 1ULL < < MODE_VIDEO_SOFT_FILTER_ENABLE ) )
g_extern . lifecycle_mode_state & = ~ ( 1ULL < < MODE_VIDEO_SOFT_FILTER_ENABLE ) ;
else
g_extern . lifecycle_mode_state | = ( 1ULL < < MODE_VIDEO_SOFT_FILTER_ENABLE ) ;
if ( driver . video_poke - > apply_state_changes )
driver . video_poke - > apply_state_changes ( driver . video_data ) ;
break ;
2013-04-28 00:32:25 +02:00
# endif
2013-04-07 16:45:05 +02:00
2013-05-08 18:17:30 +02:00
case RGUI_SETTINGS_VIDEO_VSYNC :
switch ( action )
{
case RGUI_ACTION_START :
2013-09-19 11:38:12 +02:00
settings_set ( 1ULL < < S_DEF_VIDEO_VSYNC ) ;
2013-05-08 18:17:30 +02:00
break ;
case RGUI_ACTION_LEFT :
case RGUI_ACTION_RIGHT :
case RGUI_ACTION_OK :
2013-09-19 11:38:12 +02:00
settings_set ( 1ULL < < S_VIDEO_VSYNC_TOGGLE ) ;
2013-05-08 18:17:30 +02:00
break ;
default :
break ;
}
break ;
case RGUI_SETTINGS_VIDEO_HARD_SYNC :
switch ( action )
{
case RGUI_ACTION_START :
g_settings . video . hard_sync = false ;
break ;
case RGUI_ACTION_LEFT :
case RGUI_ACTION_RIGHT :
case RGUI_ACTION_OK :
g_settings . video . hard_sync = ! g_settings . video . hard_sync ;
break ;
default :
break ;
2013-05-26 13:43:24 +02:00
}
break ;
2013-08-30 09:35:13 +02:00
case RGUI_SETTINGS_VIDEO_BLACK_FRAME_INSERTION :
switch ( action )
{
case RGUI_ACTION_START :
g_settings . video . black_frame_insertion = false ;
break ;
case RGUI_ACTION_LEFT :
case RGUI_ACTION_RIGHT :
case RGUI_ACTION_OK :
g_settings . video . black_frame_insertion = ! g_settings . video . black_frame_insertion ;
break ;
default :
break ;
}
break ;
2013-09-01 13:46:35 +02:00
case RGUI_SETTINGS_VIDEO_CROP_OVERSCAN :
switch ( action )
{
case RGUI_ACTION_START :
g_settings . video . crop_overscan = true ;
break ;
case RGUI_ACTION_LEFT :
case RGUI_ACTION_RIGHT :
case RGUI_ACTION_OK :
g_settings . video . crop_overscan = ! g_settings . video . crop_overscan ;
break ;
default :
break ;
}
break ;
case RGUI_SETTINGS_VIDEO_WINDOW_SCALE_X :
case RGUI_SETTINGS_VIDEO_WINDOW_SCALE_Y :
{
float * scale = setting = = RGUI_SETTINGS_VIDEO_WINDOW_SCALE_X ? & g_settings . video . xscale : & g_settings . video . yscale ;
float old_scale = * scale ;
switch ( action )
{
case RGUI_ACTION_START :
* scale = 3.0f ;
break ;
case RGUI_ACTION_LEFT :
* scale - = 1.0f ;
break ;
case RGUI_ACTION_RIGHT :
* scale + = 1.0f ;
break ;
default :
break ;
}
* scale = roundf ( * scale ) ;
* scale = max ( * scale , 1.0f ) ;
if ( old_scale ! = * scale & & ! g_settings . video . fullscreen )
rarch_set_fullscreen ( g_settings . video . fullscreen ) ; // Reinit video driver.
break ;
}
2013-09-01 13:20:10 +02:00
case RGUI_SETTINGS_VIDEO_SWAP_INTERVAL :
{
unsigned old = g_settings . video . swap_interval ;
switch ( action )
{
case RGUI_ACTION_START :
g_settings . video . swap_interval = 1 ;
break ;
case RGUI_ACTION_LEFT :
g_settings . video . swap_interval - - ;
break ;
case RGUI_ACTION_RIGHT :
case RGUI_ACTION_OK :
g_settings . video . swap_interval + + ;
break ;
default :
break ;
}
g_settings . video . swap_interval = min ( g_settings . video . swap_interval , 4 ) ;
g_settings . video . swap_interval = max ( g_settings . video . swap_interval , 1 ) ;
if ( old ! = g_settings . video . swap_interval & & driver . video & & driver . video_data )
video_set_nonblock_state_func ( false ) ; // This will update the current swap interval. Since we're in RGUI now, always apply VSync.
break ;
}
2013-05-26 13:43:24 +02:00
case RGUI_SETTINGS_VIDEO_HARD_SYNC_FRAMES :
switch ( action )
{
case RGUI_ACTION_START :
g_settings . video . hard_sync_frames = 0 ;
break ;
case RGUI_ACTION_LEFT :
if ( g_settings . video . hard_sync_frames > 0 )
g_settings . video . hard_sync_frames - - ;
break ;
case RGUI_ACTION_RIGHT :
case RGUI_ACTION_OK :
if ( g_settings . video . hard_sync_frames < 3 )
g_settings . video . hard_sync_frames + + ;
break ;
default :
break ;
2013-05-08 18:17:30 +02:00
}
break ;
2013-06-07 14:10:42 +02:00
case RGUI_SETTINGS_VIDEO_REFRESH_RATE_AUTO :
2013-06-07 14:26:33 +02:00
switch ( action )
{
case RGUI_ACTION_START :
g_extern . measure_data . frame_time_samples_count = 0 ;
break ;
2013-06-07 14:34:09 +02:00
case RGUI_ACTION_OK :
{
double refresh_rate = 0.0 ;
double deviation = 0.0 ;
unsigned sample_points = 0 ;
if ( driver_monitor_fps_statistics ( & refresh_rate , & deviation , & sample_points ) )
{
driver_set_monitor_refresh_rate ( refresh_rate ) ;
// Incase refresh rate update forced non-block video.
video_set_nonblock_state_func ( false ) ;
}
break ;
}
2013-06-07 14:26:33 +02:00
default :
break ;
}
2013-06-07 14:10:42 +02:00
break ;
2013-05-08 18:17:30 +02:00
default :
break ;
}
2013-04-07 16:45:05 +02:00
return 0 ;
}
2013-05-04 21:17:47 +02:00
static void rgui_settings_path_populate_entries ( rgui_handle_t * rgui )
{
rgui_list_clear ( rgui - > selection_buf ) ;
2013-05-05 11:17:27 +02:00
rgui_list_push ( rgui - > selection_buf , " Browser Directory " , RGUI_BROWSER_DIR_PATH , 0 ) ;
2013-09-15 16:15:38 +02:00
rgui_list_push ( rgui - > selection_buf , " Config Directory " , RGUI_CONFIG_DIR_PATH , 0 ) ;
2013-09-12 22:00:59 +02:00
# ifdef HAVE_DYNAMIC
rgui_list_push ( rgui - > selection_buf , " Core Directory " , RGUI_LIBRETRO_DIR_PATH , 0 ) ;
# endif
2013-05-04 22:29:22 +02:00
# ifdef HAVE_SHADER_MANAGER
2013-05-05 11:17:27 +02:00
rgui_list_push ( rgui - > selection_buf , " Shader Directory " , RGUI_SHADER_DIR_PATH , 0 ) ;
2013-05-04 22:29:22 +02:00
# endif
2013-05-05 11:17:27 +02:00
rgui_list_push ( rgui - > selection_buf , " Savestate Directory " , RGUI_SAVESTATE_DIR_PATH , 0 ) ;
rgui_list_push ( rgui - > selection_buf , " Savefile Directory " , RGUI_SAVEFILE_DIR_PATH , 0 ) ;
2013-05-22 22:31:16 +02:00
# ifdef HAVE_OVERLAY
rgui_list_push ( rgui - > selection_buf , " Overlay Directory " , RGUI_OVERLAY_DIR_PATH , 0 ) ;
# endif
2013-05-05 11:17:27 +02:00
rgui_list_push ( rgui - > selection_buf , " System Directory " , RGUI_SYSTEM_DIR_PATH , 0 ) ;
2013-09-16 23:30:42 +02:00
# ifdef HAVE_SCREENSHOTS
rgui_list_push ( rgui - > selection_buf , " Screenshot Directory " , RGUI_SCREENSHOT_DIR_PATH , 0 ) ;
# endif
2013-05-04 21:17:47 +02:00
}
2013-04-07 15:46:36 +02:00
2013-09-29 20:40:04 +02:00
// TODO: Move to some extern. Maybe in input_common.c?
2012-07-27 23:15:52 -04:00
static void rgui_settings_controller_populate_entries ( rgui_handle_t * rgui )
2012-07-16 17:57:43 -04:00
{
2013-03-11 03:56:06 +01:00
rgui_list_clear ( rgui - > selection_buf ) ;
2013-05-17 23:13:09 +02:00
# ifdef HAVE_OVERLAY
rgui_list_push ( rgui - > selection_buf , " Overlay Preset " , RGUI_SETTINGS_OVERLAY_PRESET , 0 ) ;
2013-05-17 23:26:11 +02:00
rgui_list_push ( rgui - > selection_buf , " Overlay Opacity " , RGUI_SETTINGS_OVERLAY_OPACITY , 0 ) ;
2013-05-17 23:37:48 +02:00
rgui_list_push ( rgui - > selection_buf , " Overlay Scale " , RGUI_SETTINGS_OVERLAY_SCALE , 0 ) ;
2013-05-17 23:13:09 +02:00
# endif
2013-05-04 17:01:10 +02:00
rgui_list_push ( rgui - > selection_buf , " Player " , RGUI_SETTINGS_BIND_PLAYER , 0 ) ;
2013-03-11 03:56:06 +01:00
rgui_list_push ( rgui - > selection_buf , " Device " , RGUI_SETTINGS_BIND_DEVICE , 0 ) ;
2013-04-27 12:32:03 +02:00
rgui_list_push ( rgui - > selection_buf , " Device Type " , RGUI_SETTINGS_BIND_DEVICE_TYPE , 0 ) ;
2013-04-27 00:37:20 +02:00
if ( driver . input & & driver . input - > set_keybinds )
rgui_list_push ( rgui - > selection_buf , " DPad Emulation " , RGUI_SETTINGS_BIND_DPAD_EMULATION , 0 ) ;
2013-09-29 19:37:48 +02:00
else
2013-09-29 20:40:04 +02:00
{
rgui_list_push ( rgui - > selection_buf , " Configure All (RetroPad) " , RGUI_SETTINGS_CUSTOM_BIND_ALL , 0 ) ; // This doesn't make sense on anything else than PC.
rgui_list_push ( rgui - > selection_buf , " Default All (RetroPad) " , RGUI_SETTINGS_CUSTOM_BIND_DEFAULT_ALL , 0 ) ; // This doesn't make sense on anything else than PC.
}
rgui_list_push ( rgui - > selection_buf , " RGUI Menu Toggle " , RGUI_SETTINGS_BIND_MENU_TOGGLE , 0 ) ;
unsigned last = ( driver . input & & driver . input - > set_keybinds ) ? RGUI_SETTINGS_BIND_R3 : RGUI_SETTINGS_BIND_LAST ;
for ( unsigned i = RGUI_SETTINGS_BIND_BEGIN ; i < = last ; i + + )
rgui_list_push ( rgui - > selection_buf , input_bind_to_str [ i - RGUI_SETTINGS_BIND_BEGIN ] , i , 0 ) ;
2013-09-29 17:58:46 +02:00
}
// This only makes sense for PC so far.
// Consoles use set_keybind callbacks instead.
static int rgui_custom_bind_iterate ( rgui_handle_t * rgui , rgui_action_t action )
{
( void ) action ; // Have to ignore action here. Only bind that should work here is Quit RetroArch or something like that.
render_text ( rgui ) ;
2013-09-29 19:37:48 +02:00
char msg [ 256 ] ;
2013-09-29 20:40:04 +02:00
snprintf ( msg , sizeof ( msg ) , " [%s] press joypad (RETURN to skip) " , input_bind_to_str [ rgui - > binds . begin - RGUI_SETTINGS_BIND_BEGIN ] ) ;
2013-09-29 19:37:48 +02:00
render_messagebox ( rgui , msg ) ;
2013-09-29 17:58:46 +02:00
struct rgui_bind_state binds = rgui - > binds ;
menu_poll_bind_state ( & binds ) ;
if ( ( binds . skip & & ! rgui - > binds . skip ) | | menu_poll_find_trigger ( & rgui - > binds , & binds ) )
2013-09-29 19:37:48 +02:00
{
binds . begin + + ;
if ( binds . begin < = binds . last )
binds . target + + ;
else
rgui_list_pop ( rgui - > menu_stack , & rgui - > selection_ptr ) ;
}
2013-09-29 17:58:46 +02:00
rgui - > binds = binds ;
return 0 ;
2012-07-27 23:15:52 -04:00
}
2013-02-27 20:20:29 -05:00
static int rgui_viewport_iterate ( rgui_handle_t * rgui , rgui_action_t action )
2012-08-20 21:56:07 -04:00
{
2013-04-20 10:56:04 +02:00
rarch_viewport_t * custom = & g_extern . console . screen . viewports . custom_vp ;
2013-03-10 16:40:36 +01:00
unsigned menu_type = 0 ;
2013-04-16 01:50:05 +02:00
rgui_list_get_last ( rgui - > menu_stack , NULL , & menu_type ) ;
2012-08-20 21:56:07 -04:00
2013-04-20 12:48:33 +02:00
struct retro_game_geometry * geom = & g_extern . system . av_info . geometry ;
int stride_x = g_settings . video . scale_integer ?
geom - > base_width : 1 ;
int stride_y = g_settings . video . scale_integer ?
geom - > base_height : 1 ;
2012-08-20 21:56:07 -04:00
switch ( action )
{
case RGUI_ACTION_UP :
if ( menu_type = = RGUI_SETTINGS_CUSTOM_VIEWPORT )
{
2013-04-20 12:48:33 +02:00
custom - > y - = stride_y ;
custom - > height + = stride_y ;
2012-08-20 21:56:07 -04:00
}
2013-04-20 12:48:33 +02:00
else if ( custom - > height > = ( unsigned ) stride_y )
custom - > height - = stride_y ;
2013-03-10 19:58:22 +01:00
if ( driver . video_poke - > apply_state_changes )
driver . video_poke - > apply_state_changes ( driver . video_data ) ;
2012-08-20 21:56:07 -04:00
break ;
2012-08-28 23:00:35 -04:00
2012-08-20 21:56:07 -04:00
case RGUI_ACTION_DOWN :
if ( menu_type = = RGUI_SETTINGS_CUSTOM_VIEWPORT )
{
2013-04-20 12:48:33 +02:00
custom - > y + = stride_y ;
2013-04-21 10:05:12 +02:00
if ( custom - > height > = ( unsigned ) stride_y )
2013-04-20 12:48:33 +02:00
custom - > height - = stride_y ;
2012-08-20 21:56:07 -04:00
}
else
2013-04-20 12:48:33 +02:00
custom - > height + = stride_y ;
2013-03-10 19:58:22 +01:00
if ( driver . video_poke - > apply_state_changes )
driver . video_poke - > apply_state_changes ( driver . video_data ) ;
2012-08-20 21:56:07 -04:00
break ;
2012-08-28 23:00:35 -04:00
2012-08-20 21:56:07 -04:00
case RGUI_ACTION_LEFT :
if ( menu_type = = RGUI_SETTINGS_CUSTOM_VIEWPORT )
{
2013-04-20 12:48:33 +02:00
custom - > x - = stride_x ;
custom - > width + = stride_x ;
2012-08-20 21:56:07 -04:00
}
2013-04-20 12:48:33 +02:00
else if ( custom - > width > = ( unsigned ) stride_x )
custom - > width - = stride_x ;
2013-03-10 19:58:22 +01:00
if ( driver . video_poke - > apply_state_changes )
driver . video_poke - > apply_state_changes ( driver . video_data ) ;
2012-08-20 21:56:07 -04:00
break ;
2012-08-28 23:00:35 -04:00
2012-08-20 21:56:07 -04:00
case RGUI_ACTION_RIGHT :
if ( menu_type = = RGUI_SETTINGS_CUSTOM_VIEWPORT )
{
2013-04-20 12:48:33 +02:00
custom - > x + = stride_x ;
if ( custom - > width > = ( unsigned ) stride_x )
custom - > width - = stride_x ;
2012-08-20 21:56:07 -04:00
}
else
2013-04-20 12:48:33 +02:00
custom - > width + = stride_x ;
2013-03-10 19:58:22 +01:00
if ( driver . video_poke - > apply_state_changes )
driver . video_poke - > apply_state_changes ( driver . video_data ) ;
2012-08-20 21:56:07 -04:00
break ;
2012-08-28 23:00:35 -04:00
2012-08-20 21:56:07 -04:00
case RGUI_ACTION_CANCEL :
2013-04-16 01:50:05 +02:00
rgui_list_pop ( rgui - > menu_stack , & rgui - > selection_ptr ) ;
2012-08-20 21:56:07 -04:00
if ( menu_type = = RGUI_SETTINGS_CUSTOM_VIEWPORT_2 )
2013-04-20 12:48:33 +02:00
{
rgui_list_push ( rgui - > menu_stack , " " ,
RGUI_SETTINGS_CUSTOM_VIEWPORT ,
2013-04-20 10:56:04 +02:00
rgui - > selection_ptr ) ;
2013-04-20 12:48:33 +02:00
}
2012-08-20 21:56:07 -04:00
break ;
2012-08-28 23:00:35 -04:00
2012-08-20 21:56:07 -04:00
case RGUI_ACTION_OK :
2013-04-16 01:50:05 +02:00
rgui_list_pop ( rgui - > menu_stack , & rgui - > selection_ptr ) ;
2013-04-20 12:48:33 +02:00
if ( menu_type = = RGUI_SETTINGS_CUSTOM_VIEWPORT
& & ! g_settings . video . scale_integer )
{
rgui_list_push ( rgui - > menu_stack , " " ,
RGUI_SETTINGS_CUSTOM_VIEWPORT_2 ,
2013-04-20 10:56:04 +02:00
rgui - > selection_ptr ) ;
2013-04-20 12:48:33 +02:00
}
2012-08-20 21:56:07 -04:00
break ;
2012-08-28 23:00:35 -04:00
2012-08-20 22:50:15 -04:00
case RGUI_ACTION_START :
2013-04-20 12:48:33 +02:00
if ( ! g_settings . video . scale_integer )
2012-08-20 22:50:15 -04:00
{
2013-04-20 12:48:33 +02:00
rarch_viewport_t vp ;
driver . video - > viewport_info ( driver . video_data , & vp ) ;
if ( menu_type = = RGUI_SETTINGS_CUSTOM_VIEWPORT )
{
custom - > width + = custom - > x ;
custom - > height + = custom - > y ;
custom - > x = 0 ;
custom - > y = 0 ;
}
else
{
custom - > width = vp . full_width - custom - > x ;
custom - > height = vp . full_height - custom - > y ;
}
if ( driver . video_poke - > apply_state_changes )
driver . video_poke - > apply_state_changes ( driver . video_data ) ;
2012-08-20 22:50:15 -04:00
}
break ;
2012-08-28 23:00:35 -04:00
2013-01-14 03:55:01 +01:00
case RGUI_ACTION_MESSAGE :
rgui - > msg_force = true ;
break ;
2012-08-20 21:56:07 -04:00
default :
break ;
}
2013-04-16 01:50:05 +02:00
rgui_list_get_last ( rgui - > menu_stack , NULL , & menu_type ) ;
2012-08-20 21:56:07 -04:00
render_text ( rgui ) ;
2013-04-20 10:56:04 +02:00
const char * base_msg = NULL ;
char msg [ 64 ] ;
2013-04-20 12:48:33 +02:00
if ( g_settings . video . scale_integer )
{
custom - > x = 0 ;
custom - > y = 0 ;
custom - > width = ( ( custom - > width + geom - > base_width - 1 ) / geom - > base_width ) * geom - > base_width ;
custom - > height = ( ( custom - > height + geom - > base_height - 1 ) / geom - > base_height ) * geom - > base_height ;
base_msg = " Set scale " ;
snprintf ( msg , sizeof ( msg ) , " %s (%4ux%4u, %u x %u scale) " ,
base_msg ,
custom - > width , custom - > height ,
custom - > width / geom - > base_width ,
custom - > height / geom - > base_height ) ;
}
else
{
if ( menu_type = = RGUI_SETTINGS_CUSTOM_VIEWPORT )
base_msg = " Set Upper-Left Corner " ;
else if ( menu_type = = RGUI_SETTINGS_CUSTOM_VIEWPORT_2 )
base_msg = " Set Bottom-Right Corner " ;
snprintf ( msg , sizeof ( msg ) , " %s (%d, %d : %4ux%4u) " ,
base_msg , custom - > x , custom - > y , custom - > width , custom - > height ) ;
}
2013-04-20 10:56:04 +02:00
render_messagebox ( rgui , msg ) ;
2013-01-11 04:36:40 +01:00
2013-04-20 12:48:33 +02:00
if ( ! custom - > width )
custom - > width = stride_x ;
if ( ! custom - > height )
custom - > height = stride_y ;
aspectratio_lut [ ASPECT_RATIO_CUSTOM ] . value =
( float ) custom - > width / custom - > height ;
if ( driver . video_poke - > apply_state_changes )
driver . video_poke - > apply_state_changes ( driver . video_data ) ;
2013-01-11 04:36:40 +01:00
return 0 ;
2012-08-20 21:56:07 -04:00
}
2013-02-27 20:20:29 -05:00
static int rgui_settings_iterate ( rgui_handle_t * rgui , rgui_action_t action )
2012-07-27 23:15:52 -04:00
{
2012-09-11 23:33:44 -04:00
rgui - > frame_buf_pitch = RGUI_WIDTH * 2 ;
2013-03-10 16:40:36 +01:00
unsigned type = 0 ;
2013-03-17 21:18:56 +01:00
const char * label = NULL ;
2013-02-27 20:20:29 -05:00
if ( action ! = RGUI_ACTION_REFRESH )
2013-04-16 01:50:05 +02:00
rgui_list_get_at_offset ( rgui - > selection_buf , rgui - > selection_ptr , & label , & type ) ;
2013-03-17 21:18:56 +01:00
if ( type = = RGUI_SETTINGS_CORE )
2013-04-27 15:14:59 +02:00
{
# if defined(HAVE_DYNAMIC)
2013-03-17 21:18:56 +01:00
label = rgui - > libretro_dir ;
# elif defined(HAVE_LIBRETRO_MANAGEMENT)
2012-08-21 00:28:38 -04:00
label = default_paths . core_dir ;
2013-04-27 15:14:59 +02:00
# else
label = " " ; // Shouldn't happen ...
2013-02-14 21:24:54 +01:00
# endif
2013-04-27 15:14:59 +02:00
}
2013-09-15 15:36:45 +02:00
else if ( type = = RGUI_SETTINGS_CONFIG )
2013-09-15 16:03:43 +02:00
label = g_settings . rgui_config_directory ;
2013-04-27 15:14:59 +02:00
else if ( type = = RGUI_SETTINGS_DISK_APPEND )
label = rgui - > base_path ;
2013-03-17 21:18:56 +01:00
const char * dir = NULL ;
2013-03-10 16:40:36 +01:00
unsigned menu_type = 0 ;
2013-04-16 01:50:05 +02:00
rgui_list_get_last ( rgui - > menu_stack , & dir , & menu_type ) ;
2012-07-31 21:19:46 -04:00
if ( rgui - > need_refresh )
action = RGUI_ACTION_NOOP ;
2012-07-16 17:57:43 -04:00
switch ( action )
{
case RGUI_ACTION_UP :
2013-03-11 03:53:28 +01:00
if ( rgui - > selection_ptr > 0 )
rgui - > selection_ptr - - ;
2012-07-16 17:57:43 -04:00
else
2013-03-11 03:56:06 +01:00
rgui - > selection_ptr = rgui - > selection_buf - > size - 1 ;
2012-07-16 17:57:43 -04:00
break ;
case RGUI_ACTION_DOWN :
2013-03-11 03:56:06 +01:00
if ( rgui - > selection_ptr + 1 < rgui - > selection_buf - > size )
2013-03-11 03:53:28 +01:00
rgui - > selection_ptr + + ;
2012-07-16 17:57:43 -04:00
else
2013-03-11 03:53:28 +01:00
rgui - > selection_ptr = 0 ;
2012-07-16 17:57:43 -04:00
break ;
2013-04-21 01:25:56 +02:00
case RGUI_ACTION_CANCEL :
if ( rgui - > menu_stack - > size > 1 )
{
rgui_list_pop ( rgui - > menu_stack , & rgui - > selection_ptr ) ;
rgui - > need_refresh = true ;
}
break ;
2012-07-18 20:38:09 -04:00
case RGUI_ACTION_LEFT :
2012-07-16 17:57:43 -04:00
case RGUI_ACTION_RIGHT :
case RGUI_ACTION_OK :
2012-07-18 20:38:09 -04:00
case RGUI_ACTION_START :
2013-04-07 23:39:52 +02:00
if ( type = = RGUI_SETTINGS_OPEN_FILEBROWSER & & action = = RGUI_ACTION_OK )
{
rgui_list_push ( rgui - > menu_stack , rgui - > base_path , RGUI_FILE_DIRECTORY , rgui - > selection_ptr ) ;
2013-04-14 16:28:40 +02:00
rgui - > selection_ptr = 0 ;
2013-04-07 23:39:52 +02:00
rgui - > need_refresh = true ;
}
2013-05-20 22:17:26 -04:00
else if ( ( type = = RGUI_SETTINGS_OPEN_HISTORY | | menu_type_is_directory_browser ( type ) ) & & action = = RGUI_ACTION_OK )
2013-04-28 01:35:31 +02:00
{
2013-05-20 22:17:26 -04:00
rgui_list_push ( rgui - > menu_stack , " " , type , rgui - > selection_ptr ) ;
2013-04-28 01:35:31 +02:00
rgui - > selection_ptr = 0 ;
rgui - > need_refresh = true ;
}
2013-09-15 15:36:45 +02:00
else if ( ( menu_type_is_settings ( type ) | | type = = RGUI_SETTINGS_CORE | | type = = RGUI_SETTINGS_CONFIG | | type = = RGUI_SETTINGS_DISK_APPEND ) & & action = = RGUI_ACTION_OK )
2012-07-27 23:15:52 -04:00
{
2013-03-11 03:56:06 +01:00
rgui_list_push ( rgui - > menu_stack , label , type , rgui - > selection_ptr ) ;
2013-03-11 03:53:28 +01:00
rgui - > selection_ptr = 0 ;
2012-07-27 23:15:52 -04:00
rgui - > need_refresh = true ;
}
2012-08-20 21:56:07 -04:00
else if ( type = = RGUI_SETTINGS_CUSTOM_VIEWPORT & & action = = RGUI_ACTION_OK )
{
2013-03-11 03:56:06 +01:00
rgui_list_push ( rgui - > menu_stack , " " , type , rgui - > selection_ptr ) ;
2013-03-10 02:42:16 +01:00
2013-04-20 10:56:04 +02:00
// Start with something sane.
rarch_viewport_t * custom = & g_extern . console . screen . viewports . custom_vp ;
driver . video - > viewport_info ( driver . video_data , custom ) ;
2013-04-20 12:48:33 +02:00
aspectratio_lut [ ASPECT_RATIO_CUSTOM ] . value =
( float ) custom - > width / custom - > height ;
2013-04-20 10:56:04 +02:00
g_settings . video . aspect_ratio_idx = ASPECT_RATIO_CUSTOM ;
2013-03-10 02:42:16 +01:00
if ( driver . video_poke - > set_aspect_ratio )
2013-04-20 10:56:04 +02:00
driver . video_poke - > set_aspect_ratio ( driver . video_data ,
g_settings . video . aspect_ratio_idx ) ;
2012-08-20 21:56:07 -04:00
}
2012-07-27 23:15:52 -04:00
else
2013-01-11 04:36:40 +01:00
{
2013-04-07 16:45:05 +02:00
int ret = rgui_settings_toggle_setting ( rgui , type , action , menu_type ) ;
2013-04-20 10:56:04 +02:00
if ( ret )
2013-01-11 04:36:40 +01:00
return ret ;
}
2012-07-16 17:57:43 -04:00
break ;
case RGUI_ACTION_REFRESH :
2013-03-11 03:53:28 +01:00
rgui - > selection_ptr = 0 ;
2012-07-27 23:15:52 -04:00
rgui - > need_refresh = true ;
2012-07-16 17:57:43 -04:00
break ;
2013-01-14 03:55:01 +01:00
case RGUI_ACTION_MESSAGE :
rgui - > msg_force = true ;
break ;
2012-07-16 17:57:43 -04:00
default :
break ;
}
2013-04-16 01:50:05 +02:00
rgui_list_get_last ( rgui - > menu_stack , & dir , & menu_type ) ;
2012-07-31 21:19:46 -04:00
2013-04-28 01:04:34 +02:00
if ( rgui - > need_refresh & & ! ( menu_type = = RGUI_FILE_DIRECTORY | |
# ifdef HAVE_SHADER_MANAGER
menu_type_is_shader_browser ( menu_type ) | |
2013-05-17 23:13:09 +02:00
# endif
2013-05-20 22:17:26 -04:00
menu_type_is_directory_browser ( menu_type ) | |
2013-05-17 23:13:09 +02:00
# ifdef HAVE_OVERLAY
menu_type = = RGUI_SETTINGS_OVERLAY_PRESET | |
2013-04-28 01:04:34 +02:00
# endif
2013-09-15 15:36:45 +02:00
menu_type = = RGUI_SETTINGS_CORE | |
menu_type = = RGUI_SETTINGS_CONFIG | |
menu_type = = RGUI_SETTINGS_DISK_APPEND | |
2013-04-28 01:35:31 +02:00
menu_type = = RGUI_SETTINGS_OPEN_HISTORY ) )
2012-07-27 23:15:52 -04:00
{
2012-07-31 21:19:46 -04:00
rgui - > need_refresh = false ;
2013-07-02 15:23:20 +02:00
if ( menu_type = = RGUI_SETTINGS_INPUT_OPTIONS )
2012-07-27 23:15:52 -04:00
rgui_settings_controller_populate_entries ( rgui ) ;
2013-07-02 15:23:20 +02:00
else if ( menu_type = = RGUI_SETTINGS_PATH_OPTIONS )
2013-05-04 21:17:47 +02:00
rgui_settings_path_populate_entries ( rgui ) ;
2013-07-02 15:23:20 +02:00
else if ( menu_type = = RGUI_SETTINGS_OPTIONS )
2013-05-05 22:02:30 +02:00
rgui_settings_options_populate_entries ( rgui ) ;
2013-04-04 21:47:37 +02:00
else if ( menu_type = = RGUI_SETTINGS_CORE_OPTIONS )
rgui_settings_core_options_populate_entries ( rgui ) ;
2013-05-04 19:00:57 +02:00
else if ( menu_type = = RGUI_SETTINGS_AUDIO_OPTIONS )
rgui_settings_audio_options_populate_entries ( rgui ) ;
2013-05-04 19:26:34 +02:00
else if ( menu_type = = RGUI_SETTINGS_DISK_OPTIONS )
rgui_settings_disc_options_populate_entries ( rgui ) ;
2013-04-28 00:32:25 +02:00
else if ( menu_type = = RGUI_SETTINGS_VIDEO_OPTIONS )
2013-05-04 23:35:39 +02:00
rgui_settings_video_options_populate_entries ( rgui ) ;
# ifdef HAVE_SHADER_MANAGER
else if ( menu_type = = RGUI_SETTINGS_SHADER_OPTIONS )
2013-04-07 15:46:36 +02:00
rgui_settings_shader_manager_populate_entries ( rgui ) ;
2013-05-04 23:35:39 +02:00
# endif
2012-07-27 23:15:52 -04:00
else
rgui_settings_populate_entries ( rgui ) ;
}
2013-04-20 18:06:08 +02:00
render_text ( rgui ) ;
2012-07-16 17:57:43 -04:00
2013-01-11 04:36:40 +01:00
return 0 ;
2012-07-16 17:57:43 -04:00
}
2013-04-28 01:35:31 +02:00
static void history_parse ( rgui_handle_t * rgui )
{
size_t history_size = rom_history_size ( rgui - > history ) ;
for ( size_t i = 0 ; i < history_size ; i + + )
{
const char * path = NULL ;
const char * core_path = NULL ;
const char * core_name = NULL ;
rom_history_get_index ( rgui - > history , i ,
& path , & core_path , & core_name ) ;
char fill_buf [ PATH_MAX ] ;
2013-05-02 14:42:58 +02:00
if ( path )
{
char path_short [ PATH_MAX ] ;
fill_pathname ( path_short , path_basename ( path ) , " " , sizeof ( path_short ) ) ;
snprintf ( fill_buf , sizeof ( fill_buf ) , " %s (%s) " ,
path_short , core_name ) ;
}
else
strlcpy ( fill_buf , core_name , sizeof ( fill_buf ) ) ;
2013-04-28 01:35:31 +02:00
rgui_list_push ( rgui - > selection_buf , fill_buf , RGUI_FILE_PLAIN , 0 ) ;
}
}
2013-09-27 21:05:51 +02:00
static bool rgui_directory_parse ( rgui_handle_t * rgui , const char * directory , unsigned menu_type , void * ctx )
2013-03-11 04:21:40 +01:00
{
if ( ! * directory )
{
# if defined(GEKKO)
# ifdef HW_RVL
2013-04-21 16:30:26 +02:00
rgui_list_push ( ctx , " sd:/ " , menu_type , 0 ) ;
rgui_list_push ( ctx , " usb:/ " , menu_type , 0 ) ;
2013-03-11 04:21:40 +01:00
# endif
2013-04-28 18:37:55 +02:00
# if !(defined(HAVE_MINIOGC) && defined(HW_RVL))
2013-04-21 16:30:26 +02:00
rgui_list_push ( ctx , " carda:/ " , menu_type , 0 ) ;
rgui_list_push ( ctx , " cardb:/ " , menu_type , 0 ) ;
2013-04-28 18:37:55 +02:00
# endif
2013-03-11 04:21:40 +01:00
# elif defined(_XBOX1)
2013-04-21 16:30:26 +02:00
rgui_list_push ( ctx , " C: \\ " , menu_type , 0 ) ;
rgui_list_push ( ctx , " D: \\ " , menu_type , 0 ) ;
rgui_list_push ( ctx , " E: \\ " , menu_type , 0 ) ;
rgui_list_push ( ctx , " F: \\ " , menu_type , 0 ) ;
rgui_list_push ( ctx , " G: \\ " , menu_type , 0 ) ;
2013-04-04 20:21:51 +02:00
# elif defined(_WIN32)
unsigned drives = GetLogicalDrives ( ) ;
char drive [ ] = " : \\ " ;
for ( unsigned i = 0 ; i < 32 ; i + + )
{
drive [ 0 ] = ' A ' + i ;
if ( drives & ( 1 < < i ) )
2013-04-21 16:30:26 +02:00
rgui_list_push ( ctx , drive , menu_type , 0 ) ;
2013-04-04 20:21:51 +02:00
}
2013-03-11 04:21:40 +01:00
# elif defined(__CELLOS_LV2__)
2013-04-21 16:30:26 +02:00
rgui_list_push ( ctx , " app_home:/ " , menu_type , 0 ) ;
rgui_list_push ( ctx , " dev_hdd0:/ " , menu_type , 0 ) ;
rgui_list_push ( ctx , " dev_hdd1:/ " , menu_type , 0 ) ;
rgui_list_push ( ctx , " host_root:/ " , menu_type , 0 ) ;
# else
rgui_list_push ( ctx , " / " , menu_type , 0 ) ;
2013-03-11 04:21:40 +01:00
# endif
2013-04-21 16:30:26 +02:00
return true ;
2013-03-11 04:21:40 +01:00
}
# if defined(GEKKO) && defined(HW_RVL)
LWP_MutexLock ( gx_device_mutex ) ;
int dev = gx_get_device_from_path ( directory ) ;
if ( dev ! = - 1 & & ! gx_devices [ dev ] . mounted & & gx_devices [ dev ] . interface - > isInserted ( ) )
fatMountSimple ( gx_devices [ dev ] . name , gx_devices [ dev ] . interface ) ;
LWP_MutexUnlock ( gx_device_mutex ) ;
# endif
2013-03-17 21:18:56 +01:00
const char * exts ;
2013-04-30 23:36:29 +02:00
char ext_buf [ 1024 ] ;
2013-04-21 16:30:26 +02:00
if ( menu_type = = RGUI_SETTINGS_CORE )
2013-03-17 21:18:56 +01:00
exts = EXT_EXECUTABLES ;
2013-09-15 15:36:45 +02:00
else if ( menu_type = = RGUI_SETTINGS_CONFIG )
exts = " cfg " ;
2013-04-28 01:04:34 +02:00
# ifdef HAVE_SHADER_MANAGER
2013-04-14 01:27:13 +02:00
else if ( menu_type = = RGUI_SETTINGS_SHADER_PRESET )
exts = " cgp|glslp " ;
2013-04-09 21:01:12 +02:00
else if ( menu_type_is_shader_browser ( menu_type ) )
2013-04-11 16:01:42 +02:00
exts = " cg|glsl " ;
2013-05-17 23:13:09 +02:00
# endif
# ifdef HAVE_OVERLAY
else if ( menu_type = = RGUI_SETTINGS_OVERLAY_PRESET )
exts = " cfg " ;
2013-04-28 01:04:34 +02:00
# endif
2013-05-20 22:17:26 -04:00
else if ( menu_type_is_directory_browser ( menu_type ) )
exts = " " ; // we ignore files anyway
2013-03-17 21:18:56 +01:00
else if ( rgui - > info . valid_extensions )
2013-04-30 23:36:29 +02:00
{
exts = ext_buf ;
if ( * rgui - > info . valid_extensions )
2013-04-30 23:58:32 +02:00
snprintf ( ext_buf , sizeof ( ext_buf ) , " %s|zip " , rgui - > info . valid_extensions ) ;
2013-04-30 23:36:29 +02:00
else
* ext_buf = ' \0 ' ;
}
2013-03-17 21:18:56 +01:00
else
exts = g_extern . system . valid_extensions ;
2013-04-21 16:30:26 +02:00
struct string_list * list = dir_list_new ( directory , exts , true ) ;
2013-03-11 04:21:40 +01:00
if ( ! list )
return false ;
2013-03-11 05:22:05 +01:00
dir_list_sort ( list , true ) ;
2013-05-20 22:17:26 -04:00
if ( menu_type_is_directory_browser ( menu_type ) )
rgui_list_push ( ctx , " <Use this directory> " , RGUI_FILE_USE_DIRECTORY , 0 ) ;
2013-03-11 04:21:40 +01:00
for ( size_t i = 0 ; i < list - > size ; i + + )
{
bool is_dir = list - > elems [ i ] . attr . b ;
2013-04-21 16:30:26 +02:00
2013-05-20 22:17:26 -04:00
if ( menu_type_is_directory_browser ( menu_type ) & & ! is_dir )
continue ;
2013-03-11 04:21:40 +01:00
# ifdef HAVE_LIBRETRO_MANAGEMENT
2013-04-21 16:30:26 +02:00
if ( menu_type = = RGUI_SETTINGS_CORE & & ( is_dir | | strcasecmp ( list - > elems [ i ] . data , SALAMANDER_FILE ) = = 0 ) )
2013-03-11 04:57:17 +01:00
continue ;
2013-04-21 16:30:26 +02:00
# endif
2013-03-11 04:21:40 +01:00
2013-03-16 11:16:55 +01:00
// Need to preserve slash first time.
const char * path = list - > elems [ i ] . data ;
if ( * directory )
path = path_basename ( path ) ;
2013-04-12 09:08:07 +02:00
// Push menu_type further down in the chain.
// Needed for shader manager currently.
2013-03-16 11:16:55 +01:00
rgui_list_push ( ctx , path ,
2013-04-12 09:08:07 +02:00
is_dir ? menu_type : RGUI_FILE_PLAIN , 0 ) ;
2013-03-11 04:21:40 +01:00
}
string_list_free ( list ) ;
return true ;
}
2013-09-26 22:34:06 +02:00
static int rgui_iterate ( void * data , unsigned action )
2012-05-06 04:04:33 +02:00
{
2013-09-19 14:49:07 +02:00
rgui_handle_t * rgui = ( rgui_handle_t * ) data ;
2013-04-18 23:00:27 +02:00
2012-07-31 21:19:46 -04:00
const char * dir = 0 ;
2013-03-10 16:40:36 +01:00
unsigned menu_type = 0 ;
2013-04-16 01:50:05 +02:00
rgui_list_get_last ( rgui - > menu_stack , & dir , & menu_type ) ;
2013-01-13 15:26:12 -05:00
int ret = 0 ;
2012-07-27 23:15:52 -04:00
2013-04-18 23:00:27 +02:00
if ( driver . video_poke & & driver . video_poke - > set_texture_enable )
driver . video_poke - > set_texture_frame ( driver . video_data , menu_framebuf ,
false , RGUI_WIDTH , RGUI_HEIGHT , 1.0f ) ;
2013-04-07 15:46:36 +02:00
if ( menu_type_is_settings ( menu_type ) )
2012-07-27 23:15:52 -04:00
return rgui_settings_iterate ( rgui , action ) ;
2013-03-18 02:01:14 +01:00
else if ( menu_type = = RGUI_SETTINGS_CUSTOM_VIEWPORT | | menu_type = = RGUI_SETTINGS_CUSTOM_VIEWPORT_2 )
2012-08-20 21:56:07 -04:00
return rgui_viewport_iterate ( rgui , action ) ;
2013-09-29 17:58:46 +02:00
else if ( menu_type = = RGUI_SETTINGS_CUSTOM_BIND )
return rgui_custom_bind_iterate ( rgui , action ) ;
2013-09-27 20:32:29 +02:00
2012-08-28 23:00:35 -04:00
if ( rgui - > need_refresh & & action ! = RGUI_ACTION_MESSAGE )
2012-07-31 21:19:46 -04:00
action = RGUI_ACTION_NOOP ;
2012-05-06 04:04:33 +02:00
switch ( action )
{
case RGUI_ACTION_UP :
2013-03-11 03:53:28 +01:00
if ( rgui - > selection_ptr > 0 )
rgui - > selection_ptr - - ;
2012-06-27 00:43:25 -04:00
else
2013-03-11 03:56:06 +01:00
rgui - > selection_ptr = rgui - > selection_buf - > size - 1 ;
2012-05-06 04:04:33 +02:00
break ;
case RGUI_ACTION_DOWN :
2013-03-11 03:56:06 +01:00
if ( rgui - > selection_ptr + 1 < rgui - > selection_buf - > size )
2013-03-11 03:53:28 +01:00
rgui - > selection_ptr + + ;
2012-06-27 00:43:25 -04:00
else
2013-03-11 03:53:28 +01:00
rgui - > selection_ptr = 0 ;
2012-05-06 04:04:33 +02:00
break ;
case RGUI_ACTION_LEFT :
2013-04-04 22:27:16 +02:00
if ( rgui - > selection_ptr > 8 )
2013-03-11 03:53:28 +01:00
rgui - > selection_ptr - = 8 ;
2012-07-18 20:38:09 -04:00
else
2013-03-11 03:53:28 +01:00
rgui - > selection_ptr = 0 ;
2012-07-18 20:38:09 -04:00
break ;
case RGUI_ACTION_RIGHT :
2013-03-11 03:56:06 +01:00
if ( rgui - > selection_ptr + 8 < rgui - > selection_buf - > size )
2013-03-11 03:53:28 +01:00
rgui - > selection_ptr + = 8 ;
2012-07-18 20:38:09 -04:00
else
2013-03-11 03:56:06 +01:00
rgui - > selection_ptr = rgui - > selection_buf - > size - 1 ;
2012-07-18 20:38:09 -04:00
break ;
2013-09-26 15:49:17 +02:00
case RGUI_ACTION_SCROLL_UP :
if ( rgui - > selection_ptr > 16 )
rgui - > selection_ptr - = 16 ;
else
rgui - > selection_ptr = 0 ;
break ;
case RGUI_ACTION_SCROLL_DOWN :
if ( rgui - > selection_ptr + 16 < rgui - > selection_buf - > size )
rgui - > selection_ptr + = 16 ;
else
rgui - > selection_ptr = rgui - > selection_buf - > size - 1 ;
break ;
2012-07-18 20:38:09 -04:00
2012-05-06 04:04:33 +02:00
case RGUI_ACTION_CANCEL :
2013-03-11 03:56:06 +01:00
if ( rgui - > menu_stack - > size > 1 )
2012-05-06 04:04:33 +02:00
{
rgui - > need_refresh = true ;
2013-04-16 01:50:05 +02:00
rgui_list_pop ( rgui - > menu_stack , & rgui - > selection_ptr ) ;
2012-05-06 04:04:33 +02:00
}
break ;
case RGUI_ACTION_OK :
{
2013-03-11 03:56:06 +01:00
if ( rgui - > selection_buf - > size = = 0 )
2013-01-11 04:36:40 +01:00
return 0 ;
2012-05-06 04:04:33 +02:00
2012-07-28 15:36:03 -04:00
const char * path = 0 ;
2013-03-10 16:40:36 +01:00
unsigned type = 0 ;
2013-04-16 01:50:05 +02:00
rgui_list_get_at_offset ( rgui - > selection_buf , rgui - > selection_ptr , & path , & type ) ;
2012-05-06 04:04:33 +02:00
2013-04-28 01:04:34 +02:00
if (
# ifdef HAVE_SHADER_MANAGER
menu_type_is_shader_browser ( type ) | |
2013-05-17 23:13:09 +02:00
# endif
2013-05-20 22:17:26 -04:00
menu_type_is_directory_browser ( type ) | |
2013-05-17 23:13:09 +02:00
# ifdef HAVE_OVERLAY
type = = RGUI_SETTINGS_OVERLAY_PRESET | |
2013-04-28 01:04:34 +02:00
# endif
2013-04-21 16:30:26 +02:00
type = = RGUI_SETTINGS_CORE | |
2013-09-15 15:36:45 +02:00
type = = RGUI_SETTINGS_CONFIG | |
2013-04-27 15:14:59 +02:00
type = = RGUI_SETTINGS_DISK_APPEND | |
2013-04-21 16:30:26 +02:00
type = = RGUI_FILE_DIRECTORY )
2012-05-06 04:04:33 +02:00
{
char cat_path [ PATH_MAX ] ;
2013-03-11 06:23:14 +01:00
fill_pathname_join ( cat_path , dir , path , sizeof ( cat_path ) ) ;
2012-05-06 04:04:33 +02:00
2013-04-09 21:01:12 +02:00
rgui_list_push ( rgui - > menu_stack , cat_path , type , rgui - > selection_ptr ) ;
2013-03-11 06:05:01 +01:00
rgui - > selection_ptr = 0 ;
2012-06-30 03:08:05 -04:00
rgui - > need_refresh = true ;
}
2012-05-06 04:04:33 +02:00
else
{
2013-04-09 21:01:12 +02:00
# ifdef HAVE_SHADER_MANAGER
if ( menu_type_is_shader_browser ( menu_type ) )
{
2013-04-14 01:27:13 +02:00
if ( menu_type = = RGUI_SETTINGS_SHADER_PRESET )
{
char shader_path [ PATH_MAX ] ;
fill_pathname_join ( shader_path , dir , path , sizeof ( shader_path ) ) ;
2013-05-06 16:41:31 +02:00
shader_manager_set_preset ( & rgui - > shader , gfx_shader_parse_type ( shader_path , RARCH_SHADER_NONE ) ,
2013-04-14 01:27:13 +02:00
shader_path ) ;
}
else
{
unsigned pass = ( menu_type - RGUI_SETTINGS_SHADER_0 ) / 3 ;
fill_pathname_join ( rgui - > shader . pass [ pass ] . source . cg ,
dir , path , sizeof ( rgui - > shader . pass [ pass ] . source . cg ) ) ;
}
2013-04-09 21:23:34 +02:00
// Pop stack until we hit shader manager again.
2013-05-17 23:57:06 +02:00
rgui_flush_menu_stack_type ( rgui , RGUI_SETTINGS_SHADER_OPTIONS ) ;
2013-04-09 21:01:12 +02:00
}
else
# endif
2012-07-31 21:19:46 -04:00
if ( menu_type = = RGUI_SETTINGS_CORE )
{
2013-03-11 05:34:25 +01:00
# if defined(HAVE_DYNAMIC)
2013-04-21 16:30:26 +02:00
fill_pathname_join ( g_settings . libretro , dir , path , sizeof ( g_settings . libretro ) ) ;
2013-03-17 21:18:56 +01:00
libretro_free_system_info ( & rgui - > info ) ;
2013-05-02 14:42:58 +02:00
libretro_get_system_info ( g_settings . libretro , & rgui - > info ,
& rgui - > load_no_rom ) ;
// No ROM needed for this core, load game immediately.
if ( rgui - > load_no_rom )
{
g_extern . lifecycle_mode_state | = ( 1ULL < < MODE_LOAD_GAME ) ;
* g_extern . fullpath = ' \0 ' ;
rgui - > msg_force = true ;
ret = - 1 ;
}
2013-03-17 21:18:56 +01:00
// Core selection on non-console just updates directory listing.
// Will take affect on new ROM load.
2013-05-22 00:29:48 +02:00
# elif defined(GEKKO) && defined(HW_RVL)
2013-08-25 11:07:06 +02:00
rarch_environment_cb ( RETRO_ENVIRONMENT_SET_LIBRETRO_PATH , ( void * ) path ) ;
2013-08-24 22:35:54 +02:00
2013-03-17 21:18:56 +01:00
fill_pathname_join ( g_extern . fullpath , default_paths . core_dir ,
SALAMANDER_FILE , sizeof ( g_extern . fullpath ) ) ;
2013-02-02 07:01:55 +01:00
g_extern . lifecycle_mode_state & = ~ ( 1ULL < < MODE_GAME ) ;
g_extern . lifecycle_mode_state | = ( 1ULL < < MODE_EXITSPAWN ) ;
2013-03-17 21:18:56 +01:00
ret = - 1 ;
2013-03-11 05:34:25 +01:00
# endif
2013-04-21 16:30:26 +02:00
2013-09-28 18:34:37 +02:00
rgui_flush_menu_stack_type ( rgui , RGUI_SETTINGS ) ;
2012-07-31 21:19:46 -04:00
}
2013-09-15 15:36:45 +02:00
else if ( menu_type = = RGUI_SETTINGS_CONFIG )
{
char config [ PATH_MAX ] ;
fill_pathname_join ( config , dir , path , sizeof ( config ) ) ;
2013-09-28 18:34:37 +02:00
rgui_flush_menu_stack_type ( rgui , RGUI_SETTINGS ) ;
2013-09-15 15:36:45 +02:00
rgui - > msg_force = true ;
if ( menu_replace_config ( config ) )
2013-09-17 21:11:30 +02:00
{
rgui - > selection_ptr = 0 ; // Menu can shrink.
2013-09-15 15:36:45 +02:00
ret = - 1 ;
2013-09-17 21:11:30 +02:00
}
2013-09-15 15:36:45 +02:00
}
2013-05-17 23:13:09 +02:00
# ifdef HAVE_OVERLAY
else if ( menu_type = = RGUI_SETTINGS_OVERLAY_PRESET )
{
fill_pathname_join ( g_settings . input . overlay , dir , path , sizeof ( g_settings . input . overlay ) ) ;
2013-05-17 23:57:06 +02:00
if ( driver . overlay )
input_overlay_free ( driver . overlay ) ;
2013-05-17 23:13:09 +02:00
driver . overlay = input_overlay_new ( g_settings . input . overlay ) ;
if ( ! driver . overlay )
RARCH_ERR ( " Failed to load overlay. \n " ) ;
2013-05-17 23:57:06 +02:00
2013-05-22 22:31:16 +02:00
rgui_flush_menu_stack_type ( rgui , RGUI_SETTINGS_INPUT_OPTIONS ) ;
2013-05-17 23:13:09 +02:00
}
# endif
2013-04-27 15:14:59 +02:00
else if ( menu_type = = RGUI_SETTINGS_DISK_APPEND )
{
char image [ PATH_MAX ] ;
fill_pathname_join ( image , dir , path , sizeof ( image ) ) ;
rarch_disk_control_append_image ( image ) ;
g_extern . lifecycle_mode_state | = 1ULL < < MODE_GAME ;
2013-04-27 16:48:00 +02:00
2013-09-28 18:34:37 +02:00
rgui_flush_menu_stack_type ( rgui , RGUI_SETTINGS ) ;
2013-04-27 15:14:59 +02:00
ret = - 1 ;
}
2013-04-28 01:35:31 +02:00
else if ( menu_type = = RGUI_SETTINGS_OPEN_HISTORY )
{
2013-04-29 03:10:26 +02:00
load_menu_game_history ( rgui - > selection_ptr ) ;
2013-09-28 18:34:37 +02:00
rgui_flush_menu_stack_type ( rgui , RGUI_SETTINGS ) ;
2013-04-28 01:35:31 +02:00
ret = - 1 ;
}
2013-05-20 22:17:26 -04:00
else if ( menu_type = = RGUI_BROWSER_DIR_PATH )
{
strlcpy ( g_settings . rgui_browser_directory , dir , sizeof ( g_settings . rgui_browser_directory ) ) ;
strlcpy ( rgui - > base_path , dir , sizeof ( rgui - > base_path ) ) ;
rgui_flush_menu_stack_type ( rgui , RGUI_SETTINGS_PATH_OPTIONS ) ;
}
2013-09-16 23:30:42 +02:00
# ifdef HAVE_SCREENSHOTS
else if ( menu_type = = RGUI_SCREENSHOT_DIR_PATH )
{
strlcpy ( g_settings . screenshot_directory , dir , sizeof ( g_settings . screenshot_directory ) ) ;
rgui_flush_menu_stack_type ( rgui , RGUI_SETTINGS_PATH_OPTIONS ) ;
}
# endif
2013-05-20 22:17:26 -04:00
else if ( menu_type = = RGUI_SAVEFILE_DIR_PATH )
{
strlcpy ( g_extern . savefile_dir , dir , sizeof ( g_extern . savefile_dir ) ) ;
rgui_flush_menu_stack_type ( rgui , RGUI_SETTINGS_PATH_OPTIONS ) ;
}
2013-05-22 22:31:16 +02:00
# ifdef HAVE_OVERLAY
else if ( menu_type = = RGUI_OVERLAY_DIR_PATH )
{
strlcpy ( g_extern . overlay_dir , dir , sizeof ( g_extern . overlay_dir ) ) ;
rgui_flush_menu_stack_type ( rgui , RGUI_SETTINGS_PATH_OPTIONS ) ;
}
# endif
2013-05-20 22:17:26 -04:00
else if ( menu_type = = RGUI_SAVESTATE_DIR_PATH )
{
strlcpy ( g_extern . savestate_dir , dir , sizeof ( g_extern . savestate_dir ) ) ;
rgui_flush_menu_stack_type ( rgui , RGUI_SETTINGS_PATH_OPTIONS ) ;
}
2013-09-15 17:09:23 -04:00
# ifdef HAVE_DYNAMIC
2013-09-12 22:00:59 +02:00
else if ( menu_type = = RGUI_LIBRETRO_DIR_PATH )
{
2013-09-15 16:15:38 +02:00
strlcpy ( rgui - > libretro_dir , dir , sizeof ( rgui - > libretro_dir ) ) ;
rgui_flush_menu_stack_type ( rgui , RGUI_SETTINGS_PATH_OPTIONS ) ;
}
else if ( menu_type = = RGUI_CONFIG_DIR_PATH )
{
strlcpy ( g_settings . rgui_config_directory , dir , sizeof ( g_settings . rgui_config_directory ) ) ;
2013-09-12 22:00:59 +02:00
rgui_flush_menu_stack_type ( rgui , RGUI_SETTINGS_PATH_OPTIONS ) ;
}
2013-09-15 17:09:23 -04:00
# endif
2013-05-20 22:17:26 -04:00
else if ( menu_type = = RGUI_SHADER_DIR_PATH )
{
strlcpy ( g_settings . video . shader_dir , dir , sizeof ( g_settings . video . shader_dir ) ) ;
rgui_flush_menu_stack_type ( rgui , RGUI_SETTINGS_PATH_OPTIONS ) ;
}
else if ( menu_type = = RGUI_SYSTEM_DIR_PATH )
{
strlcpy ( g_settings . system_directory , dir , sizeof ( g_settings . system_directory ) ) ;
rgui_flush_menu_stack_type ( rgui , RGUI_SETTINGS_PATH_OPTIONS ) ;
}
2012-07-31 21:19:46 -04:00
else
{
2013-03-11 06:23:14 +01:00
fill_pathname_join ( g_extern . fullpath , dir , path , sizeof ( g_extern . fullpath ) ) ;
2013-01-22 01:12:02 +01:00
g_extern . lifecycle_mode_state | = ( 1ULL < < MODE_LOAD_GAME ) ;
2013-09-28 18:34:37 +02:00
rgui_flush_menu_stack_type ( rgui , RGUI_SETTINGS ) ;
2013-01-14 03:55:01 +01:00
rgui - > msg_force = true ;
2013-03-17 21:18:56 +01:00
ret = - 1 ;
2012-07-31 21:19:46 -04:00
}
2012-05-06 04:04:33 +02:00
}
break ;
}
case RGUI_ACTION_REFRESH :
2013-03-11 03:53:28 +01:00
rgui - > selection_ptr = 0 ;
2012-05-06 04:04:33 +02:00
rgui - > need_refresh = true ;
break ;
2013-01-14 03:55:01 +01:00
case RGUI_ACTION_MESSAGE :
rgui - > msg_force = true ;
break ;
2012-05-06 04:04:33 +02:00
default :
2012-06-29 21:53:00 -04:00
break ;
2012-05-06 04:04:33 +02:00
}
2012-07-31 21:19:46 -04:00
// refresh values in case the stack changed
2013-04-16 01:50:05 +02:00
rgui_list_get_last ( rgui - > menu_stack , & dir , & menu_type ) ;
2012-07-31 21:19:46 -04:00
2013-04-28 01:04:34 +02:00
if ( rgui - > need_refresh & & ( menu_type = = RGUI_FILE_DIRECTORY | |
# ifdef HAVE_SHADER_MANAGER
menu_type_is_shader_browser ( menu_type ) | |
2013-05-17 23:13:09 +02:00
# endif
2013-05-20 22:17:26 -04:00
menu_type_is_directory_browser ( menu_type ) | |
2013-05-17 23:13:09 +02:00
# ifdef HAVE_OVERLAY
menu_type = = RGUI_SETTINGS_OVERLAY_PRESET | |
2013-04-28 01:04:34 +02:00
# endif
2013-04-28 01:35:31 +02:00
menu_type = = RGUI_SETTINGS_CORE | |
2013-09-15 15:36:45 +02:00
menu_type = = RGUI_SETTINGS_CONFIG | |
2013-04-28 01:35:31 +02:00
menu_type = = RGUI_SETTINGS_OPEN_HISTORY | |
menu_type = = RGUI_SETTINGS_DISK_APPEND ) )
2012-05-06 04:04:33 +02:00
{
2012-06-30 04:03:48 -04:00
rgui - > need_refresh = false ;
2013-03-11 03:56:06 +01:00
rgui_list_clear ( rgui - > selection_buf ) ;
2013-04-28 01:35:31 +02:00
if ( menu_type = = RGUI_SETTINGS_OPEN_HISTORY )
history_parse ( rgui ) ;
else
2013-09-27 21:05:51 +02:00
rgui_directory_parse ( rgui , dir , menu_type , rgui - > selection_buf ) ;
2013-04-16 12:32:03 +02:00
// Before a refresh, we could have deleted a file on disk, causing
// selection_ptr to suddendly be out of range. Ensure it doesn't overflow.
if ( rgui - > selection_ptr > = rgui - > selection_buf - > size & & rgui - > selection_buf - > size )
rgui - > selection_ptr = rgui - > selection_buf - > size - 1 ;
else if ( ! rgui - > selection_buf - > size )
rgui - > selection_ptr = 0 ;
2012-05-06 04:04:33 +02:00
}
2012-07-31 21:19:46 -04:00
render_text ( rgui ) ;
2013-01-11 04:36:40 +01:00
2013-01-13 15:26:12 -05:00
return ret ;
2012-05-06 04:04:33 +02:00
}
2013-03-09 15:33:44 +01:00
2013-04-19 17:34:46 +02:00
int rgui_input_postprocess ( void * data , uint64_t old_state )
2013-03-09 15:33:44 +01:00
{
2013-04-17 23:31:49 +02:00
( void ) data ;
2013-04-18 23:00:27 +02:00
2013-04-17 21:11:13 +02:00
int ret = 0 ;
2013-09-27 14:31:16 +02:00
if ( ( rgui - > trigger_state & ( 1ULL < < RARCH_MENU_TOGGLE ) ) & &
2013-04-26 23:52:29 +02:00
g_extern . main_is_init & &
! g_extern . libretro_dummy )
2013-03-09 15:33:44 +01:00
{
2013-05-05 15:20:45 +02:00
g_extern . lifecycle_mode_state | = ( 1ULL < < MODE_MENU_INGAME_EXIT ) ;
2013-04-26 23:52:29 +02:00
g_extern . lifecycle_mode_state | = ( 1ULL < < MODE_GAME ) ;
ret = - 1 ;
2013-03-09 15:33:44 +01:00
}
2013-05-05 15:20:45 +02:00
if ( g_extern . lifecycle_mode_state & ( 1ULL < < MODE_MENU_INGAME_EXIT ) )
g_extern . lifecycle_mode_state & = ~ ( 1ULL < < MODE_MENU_INGAME_EXIT ) ;
2013-04-17 21:11:13 +02:00
2013-04-28 00:23:58 +02:00
if ( ret < 0 )
{
unsigned type = 0 ;
rgui_list_get_last ( rgui - > menu_stack , NULL , & type ) ;
while ( type ! = RGUI_SETTINGS )
{
rgui_list_pop ( rgui - > menu_stack , & rgui - > selection_ptr ) ;
rgui_list_get_last ( rgui - > menu_stack , NULL , & type ) ;
}
}
2013-04-17 21:11:13 +02:00
return ret ;
2013-03-09 15:33:44 +01:00
}
2013-09-19 14:49:07 +02:00
const menu_ctx_driver_t menu_ctx_rgui = {
rgui_iterate ,
rgui_init ,
rgui_free ,
" rgui " ,
} ;