mirror of
https://github.com/libretro/RetroArch
synced 2025-03-03 04:14:00 +00:00
Merge branch 'master' of https://github.com/libretro/RetroArch into discord_improvements
This commit is contained in:
commit
44180e55b1
@ -21,6 +21,8 @@
|
||||
- MENU/QT/WIMP: Initial grid view.
|
||||
- MENU/QT/WIMP: Drag&drop to add new playlist items, add option to add/edit/delete playlists.
|
||||
- MENU/QT/WIMP: Add menu option to update RetroArch (Windows only for now).
|
||||
- MENU/XMB: Add new icons for the settings
|
||||
- MENU/XMB: Add an option to show the desktop ui
|
||||
- METAL: Initial work-in-progress video driver for Metal. macOS-only right now, and currently requires macOS 10.13.
|
||||
- METAL: Supports XMB/MaterialUI, has a menu display driver. Has a font rendering driver.
|
||||
- METAL/SLANG: Slang shaders should be compatible with Metal video driver.
|
||||
@ -91,7 +93,7 @@ video drivers that implement it (D3D8/9/10/11/12/GL)
|
||||
- MENU/RGUI: D3D8/D3D9: Hookup Menu Linear Filter
|
||||
- MENU/XMB: Disable XMB shadow icons by default for PowerPC and ARM for performance reasons.
|
||||
- MENU/XMB: Left/right thumbnails are now automatically scaled according to layout.
|
||||
- MENU/XMB: Add Left Thumbnails (additional to the right).
|
||||
- MENU/XMB: Add Left Thumbnails (additional to the right).
|
||||
- MENU/XMB: Fixed left/right tab regression.
|
||||
- MENU/XMB: Fix scaling of tall images that were cut on bottom previously.
|
||||
- MENU/XMB: Menu scale factor setting now changes texts length, image scaling and margins.
|
||||
|
@ -1674,7 +1674,7 @@ static void cheevos_test_cheevo_set(const cheevoset_t *set)
|
||||
shotname[sizeof(shotname) - 1] = '\0';
|
||||
|
||||
if (take_screenshot(shotname, true,
|
||||
video_driver_cached_frame_has_valid_framebuffer()))
|
||||
video_driver_cached_frame_has_valid_framebuffer(), false, true))
|
||||
CHEEVOS_LOG("[CHEEVOS]: got a screenshot for cheevo %u\n", cheevo->id);
|
||||
else
|
||||
CHEEVOS_LOG("[CHEEVOS]: failed to get screenshot for cheevo %u\n", cheevo->id);
|
||||
@ -2080,7 +2080,7 @@ void cheevos_populate_menu(void *data)
|
||||
cheevo_t *cheevo = cheevos_locals.core.cheevos;
|
||||
end = cheevo + cheevos_locals.core.count;
|
||||
|
||||
if(settings->bools.cheevos_enable && settings->bools.cheevos_hardcore_mode_enable
|
||||
if(settings->bools.cheevos_enable && settings->bools.cheevos_hardcore_mode_enable
|
||||
&& cheevos_loaded)
|
||||
{
|
||||
if (!cheevos_hardcore_paused)
|
||||
|
@ -1954,7 +1954,7 @@ bool command_event(enum event_command cmd, void *data)
|
||||
break;
|
||||
case CMD_EVENT_TAKE_SCREENSHOT:
|
||||
if (!take_screenshot(path_get(RARCH_PATH_BASENAME), false,
|
||||
video_driver_cached_frame_has_valid_framebuffer()))
|
||||
video_driver_cached_frame_has_valid_framebuffer(), false, true))
|
||||
return false;
|
||||
break;
|
||||
case CMD_EVENT_UNLOAD_CORE:
|
||||
|
@ -6417,6 +6417,14 @@ MSG_HASH(
|
||||
"<li>reiniciar RetroArch si actualizaste algo con el \"Actualizador en línea\"</li></ul>\n"
|
||||
"Por último, el contenido debe coincidir las bases de datos existente de <a href=\"https://docs.libretro.com/guides/roms-playlists-thumbnails/#sources\">aquí</a>. Si aún no funciona, considere <a href=\"https://www.github.com/libretro/RetroArch/issues\">enviar un reporte de error.</a>"
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_SHOW_WIMP,
|
||||
"Mostrar el menú de escritorio"
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_SUBLABEL_SHOW_WIMP,
|
||||
"Abre el menú de escritorio si fue cerrado"
|
||||
)
|
||||
#endif
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_QT_DONT_SHOW_AGAIN,
|
||||
|
@ -3768,3 +3768,17 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_MOVE_DOWN,
|
||||
"下へ移動")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_MOVE_UP,
|
||||
"上へ移動")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_LOAD,
|
||||
"ロード")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_SAVE,
|
||||
"保存")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_REMOVE,
|
||||
"取り除く")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_APPLY,
|
||||
"適用")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_SHADER_ADD_PASS,
|
||||
"パスを追加")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_SHADER_CLEAR_ALL_PASSES,
|
||||
"すべてのパスを取り除く")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_SHADER_NO_PASSES,
|
||||
"シェーダーパスはありません。")
|
||||
|
@ -3839,6 +3839,14 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_SCAN_FINISHED,
|
||||
"<li>have \"Databases\" updated via Online Updater</li>\n"
|
||||
"<li>restart RetroArch if any of the above was just done</li></ul>\n"
|
||||
"Finally, the content must match existing databases from <a href=\"https://docs.libretro.com/guides/roms-playlists-thumbnails/#sources\">here</a>. If it is still not working, consider <a href=\"https://www.github.com/libretro/RetroArch/issues\">submitting a bug report</a>.")
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_SHOW_WIMP,
|
||||
"Show Desktop Menu"
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_SUBLABEL_SHOW_WIMP,
|
||||
"Opens the desktop menu if it was closed"
|
||||
)
|
||||
#endif
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_DONT_SHOW_AGAIN,
|
||||
"Don't show this again")
|
||||
@ -4270,3 +4278,17 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_MOVE_DOWN,
|
||||
"Move Down")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_MOVE_UP,
|
||||
"Move Up")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_LOAD,
|
||||
"Load")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_SAVE,
|
||||
"Save")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_REMOVE,
|
||||
"Remove")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_APPLY,
|
||||
"Apply")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_SHADER_ADD_PASS,
|
||||
"Add Pass")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_SHADER_CLEAR_ALL_PASSES,
|
||||
"Clear All Passes")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_SHADER_NO_PASSES,
|
||||
"No shader passes.")
|
||||
|
@ -150,7 +150,10 @@ static unsigned count_sad(const uint8_t *data, size_t size)
|
||||
size_t i;
|
||||
unsigned cnt = 0;
|
||||
for (i = 0; i < size; i++)
|
||||
cnt += abs((int8_t)data[i]);
|
||||
{
|
||||
if (data[i])
|
||||
cnt += abs((int8_t)data[i]);
|
||||
}
|
||||
return cnt;
|
||||
}
|
||||
|
||||
|
@ -88,6 +88,9 @@ enum
|
||||
ACTION_OK_SET_PATH_VIDEO_FILTER,
|
||||
ACTION_OK_SET_PATH_OVERLAY,
|
||||
ACTION_OK_SET_DIRECTORY,
|
||||
#ifdef HAVE_QT
|
||||
ACTION_OK_SHOW_WIMP,
|
||||
#endif
|
||||
ACTION_OK_LOAD_CHEAT_FILE_APPEND
|
||||
};
|
||||
|
||||
@ -820,11 +823,11 @@ int generic_action_ok_displaylist_push(const char *path,
|
||||
case ACTION_OK_DL_DEFERRED_CORE_LIST_SET:
|
||||
info.directory_ptr = idx;
|
||||
menu->scratchpad.unsigned_var = (unsigned)idx;
|
||||
info_path =
|
||||
info_path =
|
||||
settings->paths.directory_libretro;
|
||||
info_label = msg_hash_to_str(
|
||||
MENU_ENUM_LABEL_DEFERRED_CORE_LIST_SET);
|
||||
info.enum_idx =
|
||||
info.enum_idx =
|
||||
MENU_ENUM_LABEL_DEFERRED_CORE_LIST_SET;
|
||||
dl_type = DISPLAYLIST_GENERIC;
|
||||
break;
|
||||
@ -1525,7 +1528,7 @@ static int action_ok_file_load(const char *path,
|
||||
|
||||
if (filebrowser_get_type() == FILEBROWSER_SELECT_FILE_SUBSYSTEM)
|
||||
{
|
||||
/* TODO/FIXME - this path is triggered when we try to load a
|
||||
/* TODO/FIXME - this path is triggered when we try to load a
|
||||
* file from an archive while inside the load subsystem
|
||||
* action */
|
||||
menu_handle_t *menu = NULL;
|
||||
@ -1676,7 +1679,7 @@ static int action_ok_playlist_entry_collection(const char *path,
|
||||
core_info.inf->display_name,
|
||||
NULL,
|
||||
NULL);
|
||||
}
|
||||
}
|
||||
else
|
||||
strlcpy(new_core_path, core_path, sizeof(new_core_path));
|
||||
|
||||
@ -1750,7 +1753,7 @@ static int action_ok_playlist_entry(const char *path,
|
||||
core_info.inf->display_name,
|
||||
NULL,
|
||||
NULL);
|
||||
|
||||
|
||||
}
|
||||
else if (!string_is_empty(core_path))
|
||||
strlcpy(new_core_path, core_path, sizeof(new_core_path));
|
||||
@ -1813,9 +1816,9 @@ static int action_ok_playlist_entry_start_content(const char *path,
|
||||
if (!core_info_find(&core_info, new_core_path))
|
||||
found_associated_core = false;
|
||||
|
||||
/* TODO: figure out if this should refer to
|
||||
/* TODO: figure out if this should refer to
|
||||
* the inner or outer entry_path. */
|
||||
/* TODO: make sure there's only one entry_path
|
||||
/* TODO: make sure there's only one entry_path
|
||||
* in this function. */
|
||||
if (!found_associated_core)
|
||||
return action_ok_file_load_with_detect_core(entry_path,
|
||||
@ -2111,7 +2114,7 @@ static void menu_input_st_string_cb_rename_entry(void *userdata,
|
||||
NULL);
|
||||
}
|
||||
|
||||
|
||||
|
||||
menu_input_dialog_end();
|
||||
}
|
||||
|
||||
@ -2719,7 +2722,7 @@ static int action_ok_cheat_add_bottom(const char *path,
|
||||
cheat_manager_realloc(new_size, CHEAT_HANDLER_TYPE_RETRO);
|
||||
|
||||
msg[0] = '\0';
|
||||
strlcpy(msg,
|
||||
strlcpy(msg,
|
||||
msg_hash_to_str(MSG_CHEAT_ADD_BOTTOM_SUCCESS), sizeof(msg));
|
||||
msg[sizeof(msg) - 1] = 0;
|
||||
|
||||
@ -3167,7 +3170,6 @@ static void cb_generic_dir_download(void *task_data,
|
||||
void *user_data, const char *err)
|
||||
{
|
||||
file_transfer_t *transf = (file_transfer_t*)user_data;
|
||||
|
||||
if (transf)
|
||||
{
|
||||
generic_action_ok_network(transf->path, transf->path, 0, 0, 0,
|
||||
@ -3521,15 +3523,17 @@ int (func_name)(const char *path, const char *label, unsigned type, size_t idx,
|
||||
return generic_action_ok_command(cmd); \
|
||||
}
|
||||
|
||||
default_action_ok_cmd_func(action_ok_cheat_apply_changes,CMD_EVENT_CHEATS_APPLY)
|
||||
default_action_ok_cmd_func(action_ok_quit, CMD_EVENT_QUIT)
|
||||
default_action_ok_cmd_func(action_ok_save_new_config, CMD_EVENT_MENU_SAVE_CONFIG)
|
||||
default_action_ok_cmd_func(action_ok_resume_content, CMD_EVENT_RESUME)
|
||||
default_action_ok_cmd_func(action_ok_restart_content, CMD_EVENT_RESET)
|
||||
default_action_ok_cmd_func(action_ok_screenshot, CMD_EVENT_TAKE_SCREENSHOT)
|
||||
default_action_ok_cmd_func(action_ok_disk_cycle_tray_status, CMD_EVENT_DISK_EJECT_TOGGLE )
|
||||
default_action_ok_cmd_func(action_ok_shader_apply_changes, CMD_EVENT_SHADERS_APPLY_CHANGES )
|
||||
|
||||
default_action_ok_cmd_func(action_ok_cheat_apply_changes, CMD_EVENT_CHEATS_APPLY)
|
||||
default_action_ok_cmd_func(action_ok_quit, CMD_EVENT_QUIT)
|
||||
default_action_ok_cmd_func(action_ok_save_new_config, CMD_EVENT_MENU_SAVE_CONFIG)
|
||||
default_action_ok_cmd_func(action_ok_resume_content, CMD_EVENT_RESUME)
|
||||
default_action_ok_cmd_func(action_ok_restart_content, CMD_EVENT_RESET)
|
||||
default_action_ok_cmd_func(action_ok_screenshot, CMD_EVENT_TAKE_SCREENSHOT)
|
||||
default_action_ok_cmd_func(action_ok_disk_cycle_tray_status, CMD_EVENT_DISK_EJECT_TOGGLE)
|
||||
default_action_ok_cmd_func(action_ok_shader_apply_changes, CMD_EVENT_SHADERS_APPLY_CHANGES)
|
||||
#ifdef HAVE_QT
|
||||
default_action_ok_cmd_func(action_ok_show_wimp, CMD_EVENT_UI_COMPANION_TOGGLE)
|
||||
#endif
|
||||
|
||||
static int action_ok_reset_core_association(const char *path,
|
||||
const char *label, unsigned type, size_t idx, size_t entry_idx)
|
||||
@ -3944,7 +3948,7 @@ void netplay_refresh_rooms_menu(file_list_t *list)
|
||||
char country[PATH_MAX_LENGTH] = {0};
|
||||
|
||||
if (*netplay_room_list[i].country)
|
||||
string_add_between_pairs(country, netplay_room_list[i].country,
|
||||
string_add_between_pairs(country, netplay_room_list[i].country,
|
||||
sizeof(country));
|
||||
|
||||
/* Uncomment this to debug mismatched room parameters*/
|
||||
@ -4739,6 +4743,11 @@ static int menu_cbs_init_bind_ok_compare_label(menu_file_list_cbs_t *cbs,
|
||||
case MENU_ENUM_LABEL_XMB_MAIN_MENU_ENABLE_SETTINGS:
|
||||
BIND_ACTION_OK(cbs, action_ok_enable_settings);
|
||||
break;
|
||||
#ifdef HAVE_QT
|
||||
case MENU_ENUM_LABEL_SHOW_WIMP:
|
||||
BIND_ACTION_OK(cbs, action_ok_show_wimp);
|
||||
break;
|
||||
#endif
|
||||
case MENU_ENUM_LABEL_QUIT_RETROARCH:
|
||||
BIND_ACTION_OK(cbs, action_ok_quit);
|
||||
break;
|
||||
|
@ -461,7 +461,9 @@ default_sublabel_macro(action_bind_sublabel_midi_output,
|
||||
default_sublabel_macro(action_bind_sublabel_midi_volume, MENU_ENUM_SUBLABEL_MIDI_VOLUME)
|
||||
default_sublabel_macro(action_bind_sublabel_onscreen_overlay_settings_list, MENU_ENUM_SUBLABEL_ONSCREEN_OVERLAY_SETTINGS)
|
||||
default_sublabel_macro(action_bind_sublabel_onscreen_notifications_settings_list, MENU_ENUM_SUBLABEL_ONSCREEN_NOTIFICATIONS_SETTINGS)
|
||||
|
||||
#ifdef HAVE_QT
|
||||
default_sublabel_macro(action_bind_sublabel_show_wimp, MENU_ENUM_SUBLABEL_SHOW_WIMP)
|
||||
#endif
|
||||
|
||||
static int action_bind_sublabel_cheevos_entry(
|
||||
file_list_t *list,
|
||||
@ -1942,6 +1944,11 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs,
|
||||
case MENU_ENUM_LABEL_ONSCREEN_NOTIFICATIONS_SETTINGS:
|
||||
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_onscreen_notifications_settings_list);
|
||||
break;
|
||||
#ifdef HAVE_QT
|
||||
case MENU_ENUM_LABEL_SHOW_WIMP:
|
||||
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_show_wimp);
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
case MSG_UNKNOWN:
|
||||
return -1;
|
||||
|
@ -2359,6 +2359,9 @@ static uintptr_t xmb_icon_get_id(xmb_handle_t *xmb,
|
||||
return xmb->textures.list[XMB_TEXTURE_RECORD];
|
||||
case MENU_ENUM_LABEL_ONSCREEN_DISPLAY_SETTINGS:
|
||||
return xmb->textures.list[XMB_TEXTURE_OSD];
|
||||
#ifdef HAVE_QT
|
||||
case MENU_ENUM_LABEL_SHOW_WIMP:
|
||||
#endif
|
||||
case MENU_ENUM_LABEL_USER_INTERFACE_SETTINGS:
|
||||
return xmb->textures.list[XMB_TEXTURE_UI];
|
||||
case MENU_ENUM_LABEL_POWER_MANAGEMENT_SETTINGS:
|
||||
@ -5263,6 +5266,13 @@ static int xmb_list_push(void *data, void *userdata,
|
||||
|
||||
entry.enum_idx = MENU_ENUM_LABEL_ADD_CONTENT_LIST;
|
||||
menu_displaylist_ctl(DISPLAYLIST_SETTING_ENUM, &entry);
|
||||
#ifdef HAVE_QT
|
||||
if (settings->bools.desktop_menu_enable)
|
||||
{
|
||||
entry.enum_idx = MENU_ENUM_LABEL_SHOW_WIMP;
|
||||
menu_displaylist_ctl(DISPLAYLIST_SETTING_ENUM, &entry);
|
||||
}
|
||||
#endif
|
||||
#if defined(HAVE_NETWORKING)
|
||||
{
|
||||
settings_t *settings = config_get_ptr();
|
||||
@ -5307,7 +5317,6 @@ static int xmb_list_push(void *data, void *userdata,
|
||||
entry.enum_idx = MENU_ENUM_LABEL_HELP_LIST;
|
||||
menu_displaylist_ctl(DISPLAYLIST_SETTING_ENUM, &entry);
|
||||
}
|
||||
|
||||
#if !defined(IOS)
|
||||
if (settings->bools.menu_show_quit_retroarch)
|
||||
{
|
||||
|
@ -4857,7 +4857,7 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, void *data)
|
||||
string_is_equal(core_path, path_get(RARCH_PATH_CORE)))
|
||||
{
|
||||
strlcpy(new_path_entry, core_path, sizeof(new_path_entry));
|
||||
snprintf(new_entry, sizeof(new_entry), "%s (%s)",
|
||||
snprintf(new_entry, sizeof(new_entry), "%s (%s)",
|
||||
msg_hash_to_str(MENU_ENUM_LABEL_VALUE_DETECT_CORE_LIST_OK_CURRENT_CORE),
|
||||
core_name);
|
||||
new_lbl_entry[0] = '\0';
|
||||
@ -5538,7 +5538,11 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, void *data)
|
||||
menu_displaylist_parse_settings_enum(menu, info,
|
||||
MENU_ENUM_LABEL_MENU_SHOW_HELP,
|
||||
PARSE_ONLY_BOOL, false);
|
||||
|
||||
#ifdef HAVE_QT
|
||||
menu_displaylist_parse_settings_enum(menu, info,
|
||||
MENU_ENUM_LABEL_SHOW_WIMP,
|
||||
PARSE_ONLY_UINT, false);
|
||||
#endif
|
||||
menu_displaylist_parse_settings_enum(menu, info,
|
||||
MENU_ENUM_LABEL_MENU_SHOW_QUIT_RETROARCH,
|
||||
PARSE_ONLY_BOOL, false);
|
||||
@ -6291,11 +6295,11 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, void *data)
|
||||
menu_displaylist_parse_settings_enum(menu, info,
|
||||
MENU_ENUM_LABEL_SCREEN_RESOLUTION,
|
||||
PARSE_ACTION, false);
|
||||
menu_displaylist_parse_settings_enum(menu, info,
|
||||
MENU_ENUM_LABEL_CRT_SWITCH_RESOLUTION,
|
||||
menu_displaylist_parse_settings_enum(menu, info,
|
||||
MENU_ENUM_LABEL_CRT_SWITCH_RESOLUTION,
|
||||
PARSE_ONLY_BOOL, false);
|
||||
menu_displaylist_parse_settings_enum(menu, info,
|
||||
MENU_ENUM_LABEL_CRT_SWITCH_RESOLUTION_SUPER,
|
||||
menu_displaylist_parse_settings_enum(menu, info,
|
||||
MENU_ENUM_LABEL_CRT_SWITCH_RESOLUTION_SUPER,
|
||||
PARSE_ONLY_UINT, false);
|
||||
menu_displaylist_parse_settings_enum(menu, info,
|
||||
MENU_ENUM_LABEL_PAL60_ENABLE,
|
||||
@ -6908,7 +6912,7 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, void *data)
|
||||
|
||||
{
|
||||
settings_t *settings = config_get_ptr();
|
||||
if (settings->bools.quick_menu_show_save_core_overrides
|
||||
if (settings->bools.quick_menu_show_save_core_overrides
|
||||
&& !settings->bools.kiosk_mode_enable)
|
||||
{
|
||||
menu_entries_append_enum(info->list,
|
||||
@ -6919,7 +6923,7 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, void *data)
|
||||
count++;
|
||||
}
|
||||
|
||||
if (settings->bools.quick_menu_show_save_content_dir_overrides
|
||||
if (settings->bools.quick_menu_show_save_content_dir_overrides
|
||||
&& !settings->bools.kiosk_mode_enable)
|
||||
{
|
||||
menu_entries_append_enum(info->list,
|
||||
@ -6930,7 +6934,7 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, void *data)
|
||||
count++;
|
||||
}
|
||||
|
||||
if (settings->bools.quick_menu_show_save_game_overrides
|
||||
if (settings->bools.quick_menu_show_save_game_overrides
|
||||
&& !settings->bools.kiosk_mode_enable)
|
||||
{
|
||||
menu_entries_append_enum(info->list,
|
||||
|
@ -2468,7 +2468,16 @@ static bool setting_append_list(
|
||||
&subgroup_info,
|
||||
parent_group);
|
||||
settings_data_list_current_add_flags(list, list_info, SD_FLAG_LAKKA_ADVANCED);
|
||||
|
||||
#ifdef HAVE_QT
|
||||
CONFIG_ACTION(
|
||||
list, list_info,
|
||||
MENU_ENUM_LABEL_SHOW_WIMP,
|
||||
MENU_ENUM_LABEL_VALUE_SHOW_WIMP,
|
||||
&group_info,
|
||||
&subgroup_info,
|
||||
parent_group);
|
||||
menu_settings_list_current_add_cmd(list, list_info, CMD_EVENT_UI_COMPANION_TOGGLE);
|
||||
#endif
|
||||
#if !defined(IOS)
|
||||
/* Apple rejects iOS apps that let you forcibly quit them. */
|
||||
CONFIG_ACTION(
|
||||
@ -3497,7 +3506,7 @@ static bool setting_append_list(
|
||||
case SETTINGS_LIST_CHEAT_SEARCH:
|
||||
if ( ! cheat_manager_state.cheats )
|
||||
break ;
|
||||
|
||||
|
||||
START_GROUP(list, list_info, &group_info, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CHEAT_SEARCH_SETTINGS), parent_group);
|
||||
|
||||
parent_group = msg_hash_to_str(MENU_ENUM_LABEL_CHEAT_SEARCH_SETTINGS);
|
||||
@ -3764,9 +3773,9 @@ static bool setting_append_list(
|
||||
general_write_handler,
|
||||
general_read_handler,
|
||||
SD_FLAG_NONE);
|
||||
|
||||
|
||||
CONFIG_BOOL(
|
||||
|
||||
|
||||
CONFIG_BOOL(
|
||||
list, list_info,
|
||||
&settings->bools.crt_switch_resolution,
|
||||
MENU_ENUM_LABEL_CRT_SWITCH_RESOLUTION,
|
||||
@ -3780,18 +3789,18 @@ static bool setting_append_list(
|
||||
general_write_handler,
|
||||
general_read_handler,
|
||||
SD_FLAG_ADVANCED
|
||||
);
|
||||
|
||||
);
|
||||
|
||||
CONFIG_UINT(
|
||||
list, list_info,
|
||||
&settings->uints.crt_switch_resolution_super,
|
||||
MENU_ENUM_LABEL_CRT_SWITCH_RESOLUTION_SUPER,
|
||||
MENU_ENUM_LABEL_VALUE_CRT_SWITCH_RESOLUTION_SUPER,
|
||||
crt_switch_resolution_super,
|
||||
&group_info,
|
||||
&subgroup_info,
|
||||
parent_group,
|
||||
general_write_handler,
|
||||
list, list_info,
|
||||
&settings->uints.crt_switch_resolution_super,
|
||||
MENU_ENUM_LABEL_CRT_SWITCH_RESOLUTION_SUPER,
|
||||
MENU_ENUM_LABEL_VALUE_CRT_SWITCH_RESOLUTION_SUPER,
|
||||
crt_switch_resolution_super,
|
||||
&group_info,
|
||||
&subgroup_info,
|
||||
parent_group,
|
||||
general_write_handler,
|
||||
general_read_handler);
|
||||
settings_data_list_current_add_flags(list, list_info, SD_FLAG_ADVANCED);
|
||||
|
||||
|
10
msg_hash.h
10
msg_hash.h
@ -1504,6 +1504,9 @@ enum msg_hash_enums
|
||||
MENU_LABEL(BUILDBOT_ASSETS_URL),
|
||||
MENU_LABEL(CORE_SET_SUPPORTS_NO_CONTENT_ENABLE),
|
||||
MENU_LABEL(CLOSE_CONTENT),
|
||||
#ifdef HAVE_QT
|
||||
MENU_LABEL(SHOW_WIMP),
|
||||
#endif
|
||||
MENU_LABEL(QUIT_RETROARCH),
|
||||
MENU_LABEL(SHUTDOWN),
|
||||
MENU_LABEL(REBOOT),
|
||||
@ -1990,6 +1993,13 @@ enum msg_hash_enums
|
||||
MENU_ENUM_LABEL_VALUE_QT_CURRENT_SHADER,
|
||||
MENU_ENUM_LABEL_VALUE_QT_MOVE_DOWN,
|
||||
MENU_ENUM_LABEL_VALUE_QT_MOVE_UP,
|
||||
MENU_ENUM_LABEL_VALUE_QT_LOAD,
|
||||
MENU_ENUM_LABEL_VALUE_QT_SAVE,
|
||||
MENU_ENUM_LABEL_VALUE_QT_REMOVE,
|
||||
MENU_ENUM_LABEL_VALUE_QT_APPLY,
|
||||
MENU_ENUM_LABEL_VALUE_QT_SHADER_ADD_PASS,
|
||||
MENU_ENUM_LABEL_VALUE_QT_SHADER_CLEAR_ALL_PASSES,
|
||||
MENU_ENUM_LABEL_VALUE_QT_SHADER_NO_PASSES,
|
||||
|
||||
MENU_LABEL(MIDI_INPUT),
|
||||
MENU_LABEL(MIDI_OUTPUT),
|
||||
|
@ -139,6 +139,14 @@ else ifeq ($(LIBRETRO), mame2003)
|
||||
APP_BANNER = pkg/ctr/assets/mame2003_banner.png
|
||||
APP_BIG_TEXT_SECTION = 1
|
||||
|
||||
else ifeq ($(LIBRETRO), mame2003_plus)
|
||||
APP_TITLE = MAME-2003-PLUS
|
||||
APP_PRODUCT_CODE = RARCH-MAME2003-PLUS
|
||||
APP_UNIQUE_ID = 0xBAC22
|
||||
APP_ICON = pkg/ctr/assets/mame2003_plus.png
|
||||
APP_BANNER = pkg/ctr/assets/mame2003_plus_banner.png
|
||||
APP_BIG_TEXT_SECTION = 1
|
||||
|
||||
else ifeq ($(LIBRETRO), mednafen_pce_fast)
|
||||
APP_TITLE = Mednafen/Beetle PCE FAST
|
||||
APP_AUTHOR = Ryphecha
|
||||
|
BIN
pkg/ctr/assets/mame2003_plus.png
Normal file
BIN
pkg/ctr/assets/mame2003_plus.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.2 KiB |
BIN
pkg/ctr/assets/mame2003_plus_banner.png
Normal file
BIN
pkg/ctr/assets/mame2003_plus_banner.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 38 KiB |
240
retroarch.c
240
retroarch.c
@ -165,7 +165,9 @@ enum
|
||||
RA_OPT_VERSION,
|
||||
RA_OPT_EOF_EXIT,
|
||||
RA_OPT_LOG_FILE,
|
||||
RA_OPT_MAX_FRAMES
|
||||
RA_OPT_MAX_FRAMES,
|
||||
RA_OPT_MAX_FRAMES_SCREENSHOT,
|
||||
RA_OPT_MAX_FRAMES_SCREENSHOT_PATH
|
||||
};
|
||||
|
||||
enum runloop_state
|
||||
@ -187,86 +189,88 @@ typedef struct runloop_ctx_msg_info
|
||||
} runloop_ctx_msg_info_t;
|
||||
|
||||
static jmp_buf error_sjlj_context;
|
||||
static enum rarch_core_type current_core_type = CORE_TYPE_PLAIN;
|
||||
static enum rarch_core_type explicit_current_core_type = CORE_TYPE_PLAIN;
|
||||
static char error_string[255] = {0};
|
||||
static enum rarch_core_type current_core_type = CORE_TYPE_PLAIN;
|
||||
static enum rarch_core_type explicit_current_core_type = CORE_TYPE_PLAIN;
|
||||
static char error_string[255] = {0};
|
||||
static char runtime_shader_preset[255] = {0};
|
||||
|
||||
#ifdef HAVE_THREAD_STORAGE
|
||||
static sthread_tls_t rarch_tls;
|
||||
const void *MAGIC_POINTER = (void*)(uintptr_t)0x0DEFACED;
|
||||
const void *MAGIC_POINTER = (void*)(uintptr_t)0x0DEFACED;
|
||||
#endif
|
||||
|
||||
static retro_bits_t has_set_libretro_device;
|
||||
|
||||
static bool has_set_core = false;
|
||||
static bool has_set_username = false;
|
||||
static bool has_set_core = false;
|
||||
static bool has_set_username = false;
|
||||
#ifdef HAVE_DISCORD
|
||||
static bool discord_is_inited = false;
|
||||
static bool discord_is_inited = false;
|
||||
#endif
|
||||
static bool rarch_is_inited = false;
|
||||
static bool rarch_error_on_init = false;
|
||||
static bool rarch_block_config_read = false;
|
||||
static bool rarch_force_fullscreen = false;
|
||||
static bool has_set_verbosity = false;
|
||||
static bool has_set_libretro = false;
|
||||
static bool has_set_libretro_directory = false;
|
||||
static bool has_set_save_path = false;
|
||||
static bool has_set_state_path = false;
|
||||
static bool has_set_netplay_mode = false;
|
||||
static bool has_set_netplay_ip_address = false;
|
||||
static bool has_set_netplay_ip_port = false;
|
||||
static bool has_set_netplay_stateless_mode = false;
|
||||
static bool has_set_netplay_check_frames = false;
|
||||
static bool has_set_ups_pref = false;
|
||||
static bool has_set_bps_pref = false;
|
||||
static bool has_set_ips_pref = false;
|
||||
static bool rarch_is_inited = false;
|
||||
static bool rarch_error_on_init = false;
|
||||
static bool rarch_block_config_read = false;
|
||||
static bool rarch_force_fullscreen = false;
|
||||
static bool has_set_verbosity = false;
|
||||
static bool has_set_libretro = false;
|
||||
static bool has_set_libretro_directory = false;
|
||||
static bool has_set_save_path = false;
|
||||
static bool has_set_state_path = false;
|
||||
static bool has_set_netplay_mode = false;
|
||||
static bool has_set_netplay_ip_address = false;
|
||||
static bool has_set_netplay_ip_port = false;
|
||||
static bool has_set_netplay_stateless_mode = false;
|
||||
static bool has_set_netplay_check_frames = false;
|
||||
static bool has_set_ups_pref = false;
|
||||
static bool has_set_bps_pref = false;
|
||||
static bool has_set_ips_pref = false;
|
||||
|
||||
static bool rarch_is_sram_load_disabled = false;
|
||||
static bool rarch_is_sram_save_disabled = false;
|
||||
static bool rarch_use_sram = false;
|
||||
static bool rarch_ups_pref = false;
|
||||
static bool rarch_bps_pref = false;
|
||||
static bool rarch_ips_pref = false;
|
||||
static bool rarch_patch_blocked = false;
|
||||
static bool rarch_first_start = true;
|
||||
static bool rarch_is_sram_load_disabled = false;
|
||||
static bool rarch_is_sram_save_disabled = false;
|
||||
static bool rarch_use_sram = false;
|
||||
static bool rarch_ups_pref = false;
|
||||
static bool rarch_bps_pref = false;
|
||||
static bool rarch_ips_pref = false;
|
||||
static bool rarch_patch_blocked = false;
|
||||
static bool rarch_first_start = true;
|
||||
|
||||
static bool runloop_force_nonblock = false;
|
||||
static bool runloop_paused = false;
|
||||
static bool runloop_idle = false;
|
||||
static bool runloop_exec = false;
|
||||
static bool runloop_slowmotion = false;
|
||||
static bool runloop_fastmotion = false;
|
||||
static bool runloop_shutdown_initiated = false;
|
||||
static bool runloop_core_shutdown_initiated = false;
|
||||
static bool runloop_perfcnt_enable = false;
|
||||
static bool runloop_overrides_active = false;
|
||||
static bool runloop_remaps_core_active = false;
|
||||
static bool runloop_remaps_game_active = false;
|
||||
static bool runloop_remaps_content_dir_active = false;
|
||||
static bool runloop_game_options_active = false;
|
||||
static bool runloop_missing_bios = false;
|
||||
static bool runloop_autosave = false;
|
||||
static bool runloop_force_nonblock = false;
|
||||
static bool runloop_paused = false;
|
||||
static bool runloop_idle = false;
|
||||
static bool runloop_exec = false;
|
||||
static bool runloop_slowmotion = false;
|
||||
static bool runloop_fastmotion = false;
|
||||
static bool runloop_shutdown_initiated = false;
|
||||
static bool runloop_core_shutdown_initiated = false;
|
||||
static bool runloop_perfcnt_enable = false;
|
||||
static bool runloop_overrides_active = false;
|
||||
static bool runloop_remaps_core_active = false;
|
||||
static bool runloop_remaps_game_active = false;
|
||||
static bool runloop_remaps_content_dir_active = false;
|
||||
static bool runloop_game_options_active = false;
|
||||
static bool runloop_missing_bios = false;
|
||||
static bool runloop_autosave = false;
|
||||
#ifdef HAVE_DYNAMIC
|
||||
static bool core_set_on_cmdline = false;
|
||||
static bool core_set_on_cmdline = false;
|
||||
#endif
|
||||
static rarch_system_info_t runloop_system;
|
||||
static struct retro_frame_time_callback runloop_frame_time;
|
||||
static retro_keyboard_event_t runloop_key_event = NULL;
|
||||
static retro_keyboard_event_t runloop_frontend_key_event = NULL;
|
||||
static core_option_manager_t *runloop_core_options = NULL;
|
||||
static retro_keyboard_event_t runloop_key_event = NULL;
|
||||
static retro_keyboard_event_t runloop_frontend_key_event = NULL;
|
||||
static core_option_manager_t *runloop_core_options = NULL;
|
||||
#ifdef HAVE_THREADS
|
||||
static slock_t *_runloop_msg_queue_lock = NULL;
|
||||
static slock_t *_runloop_msg_queue_lock = NULL;
|
||||
#endif
|
||||
static msg_queue_t *runloop_msg_queue = NULL;
|
||||
static msg_queue_t *runloop_msg_queue = NULL;
|
||||
|
||||
static unsigned runloop_pending_windowed_scale = 0;
|
||||
static unsigned runloop_max_frames = 0;
|
||||
static unsigned fastforward_after_frames = 0;
|
||||
static unsigned runloop_pending_windowed_scale = 0;
|
||||
static unsigned runloop_max_frames = 0;
|
||||
static bool runloop_max_frames_screenshot = false;
|
||||
static char runloop_max_frames_screenshot_path[PATH_MAX_LENGTH] = {0};
|
||||
static unsigned fastforward_after_frames = 0;
|
||||
|
||||
static retro_usec_t runloop_frame_time_last = 0;
|
||||
static retro_time_t frame_limit_minimum_time = 0.0;
|
||||
static retro_time_t frame_limit_last_time = 0.0;
|
||||
static retro_usec_t runloop_frame_time_last = 0;
|
||||
static retro_time_t frame_limit_minimum_time = 0.0;
|
||||
static retro_time_t frame_limit_last_time = 0.0;
|
||||
|
||||
extern bool input_driver_flushing_input;
|
||||
|
||||
@ -593,7 +597,11 @@ static void retroarch_print_help(const char *arg0)
|
||||
"Not relevant for all platforms.");
|
||||
puts(" --max-frames=NUMBER\n"
|
||||
" Runs for the specified number of frames, "
|
||||
"then exits.\n");
|
||||
"then exits.");
|
||||
puts(" --max-frames-ss\n"
|
||||
" Takes a screenshot at the end of max-frames.");
|
||||
puts(" --max-frames-ss-path=FILE\n"
|
||||
" Path to save the screenshot to at the end of max-frames.\n");
|
||||
}
|
||||
|
||||
#define FFMPEG_RECORD_ARG "r:"
|
||||
@ -629,48 +637,50 @@ static void retroarch_parse_input_and_config(int argc, char *argv[])
|
||||
|
||||
const struct option opts[] = {
|
||||
#ifdef HAVE_DYNAMIC
|
||||
{ "libretro", 1, NULL, 'L' },
|
||||
{ "libretro", 1, NULL, 'L' },
|
||||
#endif
|
||||
{ "menu", 0, NULL, RA_OPT_MENU },
|
||||
{ "help", 0, NULL, 'h' },
|
||||
{ "save", 1, NULL, 's' },
|
||||
{ "fullscreen", 0, NULL, 'f' },
|
||||
{ "record", 1, NULL, 'r' },
|
||||
{ "recordconfig", 1, NULL, RA_OPT_RECORDCONFIG },
|
||||
{ "size", 1, NULL, RA_OPT_SIZE },
|
||||
{ "verbose", 0, NULL, 'v' },
|
||||
{ "config", 1, NULL, 'c' },
|
||||
{ "appendconfig", 1, NULL, RA_OPT_APPENDCONFIG },
|
||||
{ "nodevice", 1, NULL, 'N' },
|
||||
{ "dualanalog", 1, NULL, 'A' },
|
||||
{ "device", 1, NULL, 'd' },
|
||||
{ "savestate", 1, NULL, 'S' },
|
||||
{ "bsvplay", 1, NULL, 'P' },
|
||||
{ "bsvrecord", 1, NULL, 'R' },
|
||||
{ "sram-mode", 1, NULL, 'M' },
|
||||
{ "menu", 0, NULL, RA_OPT_MENU },
|
||||
{ "help", 0, NULL, 'h' },
|
||||
{ "save", 1, NULL, 's' },
|
||||
{ "fullscreen", 0, NULL, 'f' },
|
||||
{ "record", 1, NULL, 'r' },
|
||||
{ "recordconfig", 1, NULL, RA_OPT_RECORDCONFIG },
|
||||
{ "size", 1, NULL, RA_OPT_SIZE },
|
||||
{ "verbose", 0, NULL, 'v' },
|
||||
{ "config", 1, NULL, 'c' },
|
||||
{ "appendconfig", 1, NULL, RA_OPT_APPENDCONFIG },
|
||||
{ "nodevice", 1, NULL, 'N' },
|
||||
{ "dualanalog", 1, NULL, 'A' },
|
||||
{ "device", 1, NULL, 'd' },
|
||||
{ "savestate", 1, NULL, 'S' },
|
||||
{ "bsvplay", 1, NULL, 'P' },
|
||||
{ "bsvrecord", 1, NULL, 'R' },
|
||||
{ "sram-mode", 1, NULL, 'M' },
|
||||
#ifdef HAVE_NETWORKING
|
||||
{ "host", 0, NULL, 'H' },
|
||||
{ "connect", 1, NULL, 'C' },
|
||||
{ "stateless", 0, NULL, RA_OPT_STATELESS },
|
||||
{ "check-frames", 1, NULL, RA_OPT_CHECK_FRAMES },
|
||||
{ "port", 1, NULL, RA_OPT_PORT },
|
||||
{ "host", 0, NULL, 'H' },
|
||||
{ "connect", 1, NULL, 'C' },
|
||||
{ "stateless", 0, NULL, RA_OPT_STATELESS },
|
||||
{ "check-frames", 1, NULL, RA_OPT_CHECK_FRAMES },
|
||||
{ "port", 1, NULL, RA_OPT_PORT },
|
||||
#if defined(HAVE_NETWORK_CMD)
|
||||
{ "command", 1, NULL, RA_OPT_COMMAND },
|
||||
{ "command", 1, NULL, RA_OPT_COMMAND },
|
||||
#endif
|
||||
#endif
|
||||
{ "nick", 1, NULL, RA_OPT_NICK },
|
||||
{ "ups", 1, NULL, 'U' },
|
||||
{ "bps", 1, NULL, RA_OPT_BPS },
|
||||
{ "ips", 1, NULL, RA_OPT_IPS },
|
||||
{ "no-patch", 0, NULL, RA_OPT_NO_PATCH },
|
||||
{ "detach", 0, NULL, 'D' },
|
||||
{ "features", 0, NULL, RA_OPT_FEATURES },
|
||||
{ "subsystem", 1, NULL, RA_OPT_SUBSYSTEM },
|
||||
{ "max-frames", 1, NULL, RA_OPT_MAX_FRAMES },
|
||||
{ "eof-exit", 0, NULL, RA_OPT_EOF_EXIT },
|
||||
{ "version", 0, NULL, RA_OPT_VERSION },
|
||||
{ "nick", 1, NULL, RA_OPT_NICK },
|
||||
{ "ups", 1, NULL, 'U' },
|
||||
{ "bps", 1, NULL, RA_OPT_BPS },
|
||||
{ "ips", 1, NULL, RA_OPT_IPS },
|
||||
{ "no-patch", 0, NULL, RA_OPT_NO_PATCH },
|
||||
{ "detach", 0, NULL, 'D' },
|
||||
{ "features", 0, NULL, RA_OPT_FEATURES },
|
||||
{ "subsystem", 1, NULL, RA_OPT_SUBSYSTEM },
|
||||
{ "max-frames", 1, NULL, RA_OPT_MAX_FRAMES },
|
||||
{ "max-frames-ss", 0, NULL, RA_OPT_MAX_FRAMES_SCREENSHOT },
|
||||
{ "max-frames-ss-path", 1, NULL, RA_OPT_MAX_FRAMES_SCREENSHOT_PATH },
|
||||
{ "eof-exit", 0, NULL, RA_OPT_EOF_EXIT },
|
||||
{ "version", 0, NULL, RA_OPT_VERSION },
|
||||
#ifdef HAVE_FILE_LOGGER
|
||||
{ "log-file", 1, NULL, RA_OPT_LOG_FILE },
|
||||
{ "log-file", 1, NULL, RA_OPT_LOG_FILE },
|
||||
#endif
|
||||
{ NULL, 0, NULL, 0 }
|
||||
};
|
||||
@ -1088,6 +1098,14 @@ static void retroarch_parse_input_and_config(int argc, char *argv[])
|
||||
runloop_max_frames = (unsigned)strtoul(optarg, NULL, 10);
|
||||
break;
|
||||
|
||||
case RA_OPT_MAX_FRAMES_SCREENSHOT:
|
||||
runloop_max_frames_screenshot = true;
|
||||
break;
|
||||
|
||||
case RA_OPT_MAX_FRAMES_SCREENSHOT_PATH:
|
||||
strlcpy(runloop_max_frames_screenshot_path, optarg, sizeof(runloop_max_frames_screenshot_path));
|
||||
break;
|
||||
|
||||
case RA_OPT_SUBSYSTEM:
|
||||
path_set(RARCH_PATH_SUBSYSTEM, optarg);
|
||||
break;
|
||||
@ -2631,6 +2649,32 @@ static enum runloop_state runloop_check_state(
|
||||
|
||||
if (time_to_exit(trig_quit_key))
|
||||
{
|
||||
if ((runloop_max_frames != 0) && (frame_count >= runloop_max_frames))
|
||||
{
|
||||
if (runloop_max_frames_screenshot)
|
||||
{
|
||||
const char *screenshot_path = NULL;
|
||||
bool fullpath = false;
|
||||
|
||||
if (string_is_empty(runloop_max_frames_screenshot_path))
|
||||
screenshot_path = path_get(RARCH_PATH_BASENAME);
|
||||
else
|
||||
{
|
||||
fullpath = true;
|
||||
screenshot_path = runloop_max_frames_screenshot_path;
|
||||
}
|
||||
|
||||
RARCH_LOG("Taking a screenshot before exiting...\n");
|
||||
|
||||
/* Take a screenshot before we exit. */
|
||||
if (!take_screenshot(screenshot_path, false,
|
||||
video_driver_cached_frame_has_valid_framebuffer(), fullpath, false))
|
||||
{
|
||||
RARCH_ERR("Could not take a screenshot before exiting.\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (runloop_exec)
|
||||
runloop_exec = false;
|
||||
|
||||
|
@ -1010,7 +1010,7 @@ static void save_state_cb(void *task_data,
|
||||
char *path = strdup(state->path);
|
||||
|
||||
if (state->thumbnail_enable)
|
||||
take_screenshot(path, true, state->has_valid_framebuffer);
|
||||
take_screenshot(path, true, state->has_valid_framebuffer, false, true);
|
||||
|
||||
free(path);
|
||||
}
|
||||
|
@ -70,39 +70,17 @@ struct screenshot_task_state
|
||||
uint8_t *out_buffer;
|
||||
const void *frame;
|
||||
char filename[PATH_MAX_LENGTH];
|
||||
char shotname[256];
|
||||
void *userbuf;
|
||||
struct scaler_ctx scaler;
|
||||
};
|
||||
|
||||
/**
|
||||
* task_screenshot_handler:
|
||||
* @task : the task being worked on
|
||||
*
|
||||
* Saves a screenshot to disk.
|
||||
**/
|
||||
static void task_screenshot_handler(retro_task_t *task)
|
||||
static bool screenshot_dump_direct(screenshot_task_state_t *state)
|
||||
{
|
||||
struct scaler_ctx *scaler = (struct scaler_ctx*)&state->scaler;
|
||||
bool ret = false;
|
||||
#ifdef HAVE_RBMP
|
||||
enum rbmp_source_type bmp_type = RBMP_SOURCE_TYPE_DONT_CARE;
|
||||
#endif
|
||||
screenshot_task_state_t *state = (screenshot_task_state_t*)task->state;
|
||||
struct scaler_ctx *scaler = (struct scaler_ctx*)&state->scaler;
|
||||
bool ret = false;
|
||||
|
||||
if (task_get_progress(task) == 100)
|
||||
{
|
||||
task_set_finished(task, true);
|
||||
|
||||
if (state->userbuf)
|
||||
free(state->userbuf);
|
||||
|
||||
free(state);
|
||||
return;
|
||||
}
|
||||
|
||||
#ifdef HAVE_RBMP
|
||||
(void)bmp_type;
|
||||
(void)bmp_type;
|
||||
#endif
|
||||
|
||||
#if defined(HAVE_RPNG)
|
||||
@ -146,6 +124,33 @@ static void task_screenshot_handler(retro_task_t *task)
|
||||
bmp_type);
|
||||
#endif
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* task_screenshot_handler:
|
||||
* @task : the task being worked on
|
||||
*
|
||||
* Saves a screenshot to disk.
|
||||
**/
|
||||
static void task_screenshot_handler(retro_task_t *task)
|
||||
{
|
||||
screenshot_task_state_t *state = (screenshot_task_state_t*)task->state;
|
||||
bool ret = false;
|
||||
|
||||
if (task_get_progress(task) == 100)
|
||||
{
|
||||
task_set_finished(task, true);
|
||||
|
||||
if (state->userbuf)
|
||||
free(state->userbuf);
|
||||
|
||||
free(state);
|
||||
return;
|
||||
}
|
||||
|
||||
ret = screenshot_dump_direct(state);
|
||||
|
||||
#ifdef HAVE_IMAGEVIEWER
|
||||
if ( ret &&
|
||||
!state->silence &&
|
||||
@ -178,7 +183,9 @@ static bool screenshot_dump(
|
||||
int pitch, bool bgr24,
|
||||
void *userbuf, bool savestate,
|
||||
bool is_idle,
|
||||
bool is_paused)
|
||||
bool is_paused,
|
||||
bool fullpath,
|
||||
bool use_thread)
|
||||
{
|
||||
char screenshot_path[PATH_MAX_LENGTH];
|
||||
uint8_t *buf = NULL;
|
||||
@ -187,14 +194,22 @@ static bool screenshot_dump(
|
||||
screenshot_task_state_t *state = (screenshot_task_state_t*)
|
||||
calloc(1, sizeof(*state));
|
||||
const char *screenshot_dir = settings->paths.directory_screenshot;
|
||||
char shotname[256];
|
||||
|
||||
shotname[0] = '\0';
|
||||
screenshot_path[0] = '\0';
|
||||
|
||||
if (string_is_empty(screenshot_dir) || settings->bools.screenshots_in_content_dir)
|
||||
/* If fullpath is true, name_base already contains a static path + filename to save the screenshot to. */
|
||||
if (fullpath)
|
||||
strlcpy(state->filename, name_base, sizeof(state->filename));
|
||||
else
|
||||
{
|
||||
fill_pathname_basedir(screenshot_path, name_base,
|
||||
sizeof(screenshot_path));
|
||||
screenshot_dir = screenshot_path;
|
||||
if (string_is_empty(screenshot_dir) || settings->bools.screenshots_in_content_dir)
|
||||
{
|
||||
fill_pathname_basedir(screenshot_path, name_base,
|
||||
sizeof(screenshot_path));
|
||||
screenshot_dir = screenshot_path;
|
||||
}
|
||||
}
|
||||
|
||||
state->is_idle = is_idle;
|
||||
@ -209,20 +224,23 @@ static bool screenshot_dump(
|
||||
state->history_list_enable = settings->bools.history_list_enable;
|
||||
state->pixel_format_type = video_driver_get_pixel_format();
|
||||
|
||||
if (savestate)
|
||||
snprintf(state->filename,
|
||||
sizeof(state->filename), "%s.png", name_base);
|
||||
else
|
||||
if (!fullpath)
|
||||
{
|
||||
if (settings->bools.auto_screenshot_filename)
|
||||
fill_str_dated_filename(state->shotname, path_basename(name_base),
|
||||
IMG_EXT, sizeof(state->shotname));
|
||||
if (savestate)
|
||||
snprintf(state->filename,
|
||||
sizeof(state->filename), "%s.png", name_base);
|
||||
else
|
||||
snprintf(state->shotname, sizeof(state->shotname),
|
||||
"%s.png", path_basename(name_base));
|
||||
{
|
||||
if (settings->bools.auto_screenshot_filename)
|
||||
fill_str_dated_filename(shotname, path_basename(name_base),
|
||||
IMG_EXT, sizeof(shotname));
|
||||
else
|
||||
snprintf(shotname, sizeof(shotname),
|
||||
"%s.png", path_basename(name_base));
|
||||
|
||||
fill_pathname_join(state->filename, screenshot_dir,
|
||||
state->shotname, sizeof(state->filename));
|
||||
fill_pathname_join(state->filename, screenshot_dir,
|
||||
shotname, sizeof(state->filename));
|
||||
}
|
||||
}
|
||||
|
||||
#if defined(HAVE_RPNG)
|
||||
@ -241,17 +259,22 @@ static bool screenshot_dump(
|
||||
task->state = state;
|
||||
task->handler = task_screenshot_handler;
|
||||
|
||||
if (!savestate)
|
||||
task->title = strdup(msg_hash_to_str(MSG_TAKING_SCREENSHOT));
|
||||
if (use_thread)
|
||||
return screenshot_dump_direct(state);
|
||||
else
|
||||
{
|
||||
if (!savestate)
|
||||
task->title = strdup(msg_hash_to_str(MSG_TAKING_SCREENSHOT));
|
||||
|
||||
task_queue_push(task);
|
||||
task_queue_push(task);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
#if !defined(VITA)
|
||||
static bool take_screenshot_viewport(const char *name_base, bool savestate,
|
||||
bool is_idle, bool is_paused)
|
||||
bool is_idle, bool is_paused, bool fullpath, bool use_thread)
|
||||
{
|
||||
struct video_viewport vp;
|
||||
uint8_t *buffer = NULL;
|
||||
@ -280,7 +303,7 @@ static bool take_screenshot_viewport(const char *name_base, bool savestate,
|
||||
/* Data read from viewport is in bottom-up order, suitable for BMP. */
|
||||
if (!screenshot_dump(name_base,
|
||||
buffer, vp.width, vp.height,
|
||||
vp.width * 3, true, buffer, savestate, is_idle, is_paused))
|
||||
vp.width * 3, true, buffer, savestate, is_idle, is_paused, fullpath, use_thread))
|
||||
goto error;
|
||||
|
||||
return true;
|
||||
@ -293,7 +316,7 @@ error:
|
||||
#endif
|
||||
|
||||
static bool take_screenshot_raw(const char *name_base, void *userbuf,
|
||||
bool savestate, bool is_idle, bool is_paused)
|
||||
bool savestate, bool is_idle, bool is_paused, bool fullpath, bool use_thread)
|
||||
{
|
||||
size_t pitch;
|
||||
unsigned width, height;
|
||||
@ -306,14 +329,14 @@ static bool take_screenshot_raw(const char *name_base, void *userbuf,
|
||||
*/
|
||||
if (!screenshot_dump(name_base,
|
||||
(const uint8_t*)data + (height - 1) * pitch,
|
||||
width, height, (int)(-pitch), false, userbuf, savestate, is_idle, is_paused))
|
||||
width, height, (int)(-pitch), false, userbuf, savestate, is_idle, is_paused, fullpath, use_thread))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool take_screenshot_choice(const char *name_base, bool savestate,
|
||||
bool is_paused, bool is_idle, bool has_valid_framebuffer)
|
||||
bool is_paused, bool is_idle, bool has_valid_framebuffer, bool fullpath, bool use_thread)
|
||||
{
|
||||
size_t old_pitch;
|
||||
unsigned old_width, old_height;
|
||||
@ -335,14 +358,14 @@ static bool take_screenshot_choice(const char *name_base, bool savestate,
|
||||
if (!is_idle)
|
||||
video_driver_cached_frame();
|
||||
#if defined(VITA)
|
||||
return take_screenshot_raw(name_base, NULL, savestate, is_idle, is_paused);
|
||||
return take_screenshot_raw(name_base, NULL, savestate, is_idle, is_paused, fullpath, use_thread);
|
||||
#else
|
||||
return take_screenshot_viewport(name_base, savestate, is_idle, is_paused);
|
||||
return take_screenshot_viewport(name_base, savestate, is_idle, is_paused, fullpath, use_thread);
|
||||
#endif
|
||||
}
|
||||
|
||||
if (!has_valid_framebuffer)
|
||||
return take_screenshot_raw(name_base, NULL, savestate, is_idle, is_paused);
|
||||
return take_screenshot_raw(name_base, NULL, savestate, is_idle, is_paused, fullpath, use_thread);
|
||||
|
||||
if (!video_driver_supports_read_frame_raw())
|
||||
return false;
|
||||
@ -359,14 +382,14 @@ static bool take_screenshot_choice(const char *name_base, bool savestate,
|
||||
if (frame_data)
|
||||
{
|
||||
video_driver_set_cached_frame_ptr(frame_data);
|
||||
if (take_screenshot_raw(name_base, frame_data, savestate, is_idle, is_paused))
|
||||
if (take_screenshot_raw(name_base, frame_data, savestate, is_idle, is_paused, fullpath, use_thread))
|
||||
ret = true;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
bool take_screenshot(const char *name_base, bool silence, bool has_valid_framebuffer)
|
||||
bool take_screenshot(const char *name_base, bool silence, bool has_valid_framebuffer, bool fullpath, bool use_thread)
|
||||
{
|
||||
bool is_paused = false;
|
||||
bool is_idle = false;
|
||||
@ -377,7 +400,7 @@ bool take_screenshot(const char *name_base, bool silence, bool has_valid_framebu
|
||||
runloop_get_status(&is_paused, &is_idle, &is_slowmotion, &is_perfcnt_enable);
|
||||
|
||||
ret = take_screenshot_choice(name_base, silence, is_paused, is_idle,
|
||||
has_valid_framebuffer);
|
||||
has_valid_framebuffer, fullpath, use_thread);
|
||||
|
||||
if (is_paused && !is_idle)
|
||||
video_driver_cached_frame();
|
||||
|
@ -223,7 +223,7 @@ void task_file_load_handler(retro_task_t *task);
|
||||
|
||||
bool task_audio_mixer_load_handler(retro_task_t *task);
|
||||
|
||||
bool take_screenshot(const char *path, bool silence, bool has_valid_framebuffer);
|
||||
bool take_screenshot(const char *path, bool silence, bool has_valid_framebuffer, bool fullpath, bool use_thread);
|
||||
|
||||
bool event_load_save_files(void);
|
||||
|
||||
|
@ -1,5 +1,6 @@
|
||||
#include <QCloseEvent>
|
||||
#include <QResizeEvent>
|
||||
#include <QPainter>
|
||||
#include <QScrollArea>
|
||||
#include <QVBoxLayout>
|
||||
#include <QGroupBox>
|
||||
@ -11,18 +12,33 @@
|
||||
#include <QComboBox>
|
||||
#include <QPushButton>
|
||||
#include <QToolButton>
|
||||
#include <QMenu>
|
||||
#include <QFileDialog>
|
||||
|
||||
#include "shaderparamsdialog.h"
|
||||
#include "../ui_qt.h"
|
||||
|
||||
extern "C" {
|
||||
#include <string/stdstring.h>
|
||||
#include <streams/file_stream.h>
|
||||
#include <file/file_path.h>
|
||||
#include "../../../command.h"
|
||||
#include "../../../configuration.h"
|
||||
#include "../../../retroarch.h"
|
||||
#include "../../../paths.h"
|
||||
#ifdef HAVE_MENU
|
||||
#include "../../../menu/menu_shader.h"
|
||||
#endif
|
||||
}
|
||||
|
||||
enum
|
||||
{
|
||||
SHADER_PRESET_SAVE_CORE = 0,
|
||||
SHADER_PRESET_SAVE_GAME,
|
||||
SHADER_PRESET_SAVE_PARENT,
|
||||
SHADER_PRESET_SAVE_NORMAL
|
||||
};
|
||||
|
||||
ShaderParamsDialog::ShaderParamsDialog(QWidget *parent) :
|
||||
QDialog(parent)
|
||||
,m_layout(NULL)
|
||||
@ -75,6 +91,19 @@ void ShaderParamsDialog::closeEvent(QCloseEvent *event)
|
||||
emit closed();
|
||||
}
|
||||
|
||||
void ShaderParamsDialog::paintEvent(QPaintEvent *event)
|
||||
{
|
||||
QStyleOption o;
|
||||
QPainter p;
|
||||
o.initFrom(this);
|
||||
p.begin(this);
|
||||
style()->drawPrimitive(
|
||||
QStyle::PE_Widget, &o, &p, this);
|
||||
p.end();
|
||||
|
||||
QDialog::paintEvent(event);
|
||||
}
|
||||
|
||||
QString ShaderParamsDialog::getFilterLabel(unsigned filter)
|
||||
{
|
||||
QString filterString;
|
||||
@ -375,13 +404,265 @@ void ShaderParamsDialog::onShaderPassMoveUpClicked()
|
||||
command_event(CMD_EVENT_SHADERS_APPLY_CHANGES, NULL);
|
||||
}
|
||||
|
||||
void ShaderParamsDialog::onShaderLoadPresetClicked()
|
||||
{
|
||||
#ifdef HAVE_MENU
|
||||
QString path;
|
||||
QByteArray pathArray;
|
||||
struct video_shader *menu_shader = NULL;
|
||||
struct video_shader *video_shader = NULL;
|
||||
const char *pathData = NULL;
|
||||
settings_t *settings = config_get_ptr();
|
||||
enum rarch_shader_type type = RARCH_SHADER_NONE;
|
||||
|
||||
if (!settings)
|
||||
return;
|
||||
|
||||
getShaders(&menu_shader, &video_shader);
|
||||
|
||||
if (!menu_shader)
|
||||
return;
|
||||
|
||||
path = QFileDialog::getOpenFileName(this, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET), settings->paths.directory_video_shader);
|
||||
|
||||
if (path.isEmpty())
|
||||
return;
|
||||
|
||||
pathArray = path.toUtf8();
|
||||
pathData = pathArray.constData();
|
||||
|
||||
type = video_shader_parse_type(pathData, RARCH_SHADER_NONE);
|
||||
|
||||
menu_shader_manager_set_preset(menu_shader, type, pathData);
|
||||
#endif
|
||||
}
|
||||
|
||||
void ShaderParamsDialog::onShaderAddPassClicked()
|
||||
{
|
||||
#ifdef HAVE_MENU
|
||||
QString path;
|
||||
QByteArray pathArray;
|
||||
struct video_shader *menu_shader = NULL;
|
||||
struct video_shader *video_shader = NULL;
|
||||
struct video_shader_pass *shader_pass = NULL;
|
||||
const char *pathData = NULL;
|
||||
settings_t *settings = config_get_ptr();
|
||||
|
||||
if (!settings)
|
||||
return;
|
||||
|
||||
getShaders(&menu_shader, &video_shader);
|
||||
|
||||
if (!menu_shader)
|
||||
return;
|
||||
|
||||
path = QFileDialog::getOpenFileName(this, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET), settings->paths.directory_video_shader);
|
||||
|
||||
if (path.isEmpty())
|
||||
return;
|
||||
|
||||
pathArray = path.toUtf8();
|
||||
pathData = pathArray.constData();
|
||||
|
||||
if (menu_shader->passes < GFX_MAX_SHADERS)
|
||||
menu_shader_manager_increment_amount_passes();
|
||||
else
|
||||
return;
|
||||
|
||||
shader_pass = &menu_shader->pass[menu_shader->passes - 1];
|
||||
|
||||
if (!shader_pass)
|
||||
return;
|
||||
|
||||
strlcpy(shader_pass->source.path, pathData, sizeof(shader_pass->source.path));
|
||||
|
||||
video_shader_resolve_parameters(NULL, menu_shader);
|
||||
|
||||
command_event(CMD_EVENT_SHADERS_APPLY_CHANGES, NULL);
|
||||
#endif
|
||||
}
|
||||
|
||||
void ShaderParamsDialog::onShaderSavePresetAsClicked()
|
||||
{
|
||||
#ifdef HAVE_MENU
|
||||
settings_t *settings = config_get_ptr();
|
||||
QString path;
|
||||
QByteArray pathArray;
|
||||
const char *pathData = NULL;
|
||||
|
||||
path = QFileDialog::getSaveFileName(this, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_AS), settings->paths.directory_video_shader);
|
||||
|
||||
if (path.isEmpty())
|
||||
return;
|
||||
|
||||
pathArray = path.toUtf8();
|
||||
pathData = pathArray.constData();
|
||||
|
||||
saveShaderPreset(pathData, SHADER_PRESET_SAVE_NORMAL);
|
||||
#endif
|
||||
}
|
||||
|
||||
void ShaderParamsDialog::saveShaderPreset(const char *path, unsigned action_type)
|
||||
{
|
||||
char directory[PATH_MAX_LENGTH];
|
||||
char file[PATH_MAX_LENGTH];
|
||||
char tmp[PATH_MAX_LENGTH];
|
||||
settings_t *settings = config_get_ptr();
|
||||
const char *core_name = NULL;
|
||||
rarch_system_info_t *info = runloop_get_system_info();
|
||||
|
||||
directory[0] = file[0] = tmp[0] = '\0';
|
||||
|
||||
if (info)
|
||||
core_name = info->info.library_name;
|
||||
|
||||
if (!string_is_empty(core_name))
|
||||
{
|
||||
fill_pathname_join(
|
||||
tmp,
|
||||
settings->paths.directory_video_shader,
|
||||
"presets",
|
||||
sizeof(tmp));
|
||||
fill_pathname_join(
|
||||
directory,
|
||||
tmp,
|
||||
core_name,
|
||||
sizeof(directory));
|
||||
}
|
||||
|
||||
if (!filestream_exists(directory))
|
||||
path_mkdir(directory);
|
||||
|
||||
switch (action_type)
|
||||
{
|
||||
case SHADER_PRESET_SAVE_CORE:
|
||||
if (!string_is_empty(core_name))
|
||||
fill_pathname_join(file, directory, core_name, sizeof(file));
|
||||
break;
|
||||
case SHADER_PRESET_SAVE_GAME:
|
||||
{
|
||||
const char *game_name = path_basename(path_get(RARCH_PATH_BASENAME));
|
||||
fill_pathname_join(file, directory, game_name, sizeof(file));
|
||||
break;
|
||||
}
|
||||
case SHADER_PRESET_SAVE_PARENT:
|
||||
{
|
||||
fill_pathname_parent_dir_name(tmp, path_get(RARCH_PATH_BASENAME), sizeof(tmp));
|
||||
fill_pathname_join(file, directory, tmp, sizeof(file));
|
||||
break;
|
||||
}
|
||||
case SHADER_PRESET_SAVE_NORMAL:
|
||||
default:
|
||||
if (!string_is_empty(path))
|
||||
strlcpy(file, path, sizeof(file));
|
||||
break;
|
||||
}
|
||||
|
||||
if (menu_shader_manager_save_preset(file, false, true))
|
||||
runloop_msg_queue_push(
|
||||
msg_hash_to_str(MSG_SHADER_PRESET_SAVED_SUCCESSFULLY),
|
||||
1, 100, true);
|
||||
else
|
||||
runloop_msg_queue_push(
|
||||
msg_hash_to_str(MSG_ERROR_SAVING_SHADER_PRESET),
|
||||
1, 100, true);
|
||||
}
|
||||
|
||||
void ShaderParamsDialog::onShaderSaveCorePresetClicked()
|
||||
{
|
||||
saveShaderPreset(NULL, SHADER_PRESET_SAVE_CORE);
|
||||
}
|
||||
|
||||
void ShaderParamsDialog::onShaderSaveParentPresetClicked()
|
||||
{
|
||||
saveShaderPreset(NULL, SHADER_PRESET_SAVE_PARENT);
|
||||
}
|
||||
|
||||
void ShaderParamsDialog::onShaderSaveGamePresetClicked()
|
||||
{
|
||||
saveShaderPreset(NULL, SHADER_PRESET_SAVE_GAME);
|
||||
}
|
||||
|
||||
void ShaderParamsDialog::onShaderClearAllPassesClicked()
|
||||
{
|
||||
#ifdef HAVE_MENU
|
||||
struct video_shader *menu_shader = NULL;
|
||||
struct video_shader *video_shader = NULL;
|
||||
|
||||
getShaders(&menu_shader, &video_shader);
|
||||
|
||||
if (!menu_shader)
|
||||
return;
|
||||
|
||||
while (menu_shader->passes > 0)
|
||||
menu_shader_manager_decrement_amount_passes();
|
||||
|
||||
onShaderApplyClicked();
|
||||
#endif
|
||||
}
|
||||
|
||||
void ShaderParamsDialog::onShaderRemovePassClicked()
|
||||
{
|
||||
#ifdef HAVE_MENU
|
||||
QAction *action = qobject_cast<QAction*>(sender());
|
||||
QVariant passVariant;
|
||||
struct video_shader *menu_shader = NULL;
|
||||
struct video_shader *video_shader = NULL;
|
||||
int pass = 0;
|
||||
int i;
|
||||
bool ok = false;
|
||||
|
||||
getShaders(&menu_shader, &video_shader);
|
||||
|
||||
if (!menu_shader || menu_shader->passes == 0 || !action)
|
||||
return;
|
||||
|
||||
passVariant = action->data();
|
||||
|
||||
if (!passVariant.isValid())
|
||||
return;
|
||||
|
||||
pass = passVariant.toInt(&ok);
|
||||
|
||||
if (!ok)
|
||||
return;
|
||||
|
||||
if (pass < 0 || pass > static_cast<int>(menu_shader->passes))
|
||||
return;
|
||||
|
||||
/* move selected pass to the bottom */
|
||||
for (i = pass; i < static_cast<int>(menu_shader->passes) - 1; i++)
|
||||
{
|
||||
std::swap(menu_shader->pass[i], menu_shader->pass[i + 1]);
|
||||
}
|
||||
|
||||
menu_shader_manager_decrement_amount_passes();
|
||||
|
||||
onShaderApplyClicked();
|
||||
#endif
|
||||
}
|
||||
|
||||
void ShaderParamsDialog::onShaderApplyClicked()
|
||||
{
|
||||
command_event(CMD_EVENT_SHADERS_APPLY_CHANGES, NULL);
|
||||
}
|
||||
|
||||
void ShaderParamsDialog::reload()
|
||||
{
|
||||
QPushButton *loadButton = NULL;
|
||||
QPushButton *saveButton = NULL;
|
||||
QPushButton *removeButton = NULL;
|
||||
QPushButton *applyButton = NULL;
|
||||
QHBoxLayout *topButtonLayout = NULL;
|
||||
QMenu *loadMenu = NULL;
|
||||
QMenu *saveMenu = NULL;
|
||||
QMenu *removeMenu = NULL;
|
||||
struct video_shader *menu_shader = NULL;
|
||||
struct video_shader *video_shader = NULL;
|
||||
const char *shader_path = NULL;
|
||||
int i;
|
||||
unsigned j;
|
||||
bool hasPasses = false;
|
||||
|
||||
getShaders(&menu_shader, &video_shader);
|
||||
|
||||
@ -409,6 +690,56 @@ void ShaderParamsDialog::reload()
|
||||
else
|
||||
setWindowTitle(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SHADER_OPTIONS));
|
||||
|
||||
loadButton = new QPushButton(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_LOAD), this);
|
||||
saveButton = new QPushButton(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_SAVE), this);
|
||||
removeButton = new QPushButton(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_REMOVE), this);
|
||||
applyButton = new QPushButton(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_APPLY), this);
|
||||
|
||||
loadMenu = new QMenu(loadButton);
|
||||
loadMenu->addAction(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET), this, SLOT(onShaderLoadPresetClicked()));
|
||||
loadMenu->addAction(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_SHADER_ADD_PASS), this, SLOT(onShaderAddPassClicked()));
|
||||
|
||||
loadButton->setMenu(loadMenu);
|
||||
|
||||
saveMenu = new QMenu(saveButton);
|
||||
saveMenu->addAction(QString(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_AS)) + "...", this, SLOT(onShaderSavePresetAsClicked()));
|
||||
saveMenu->addAction(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_CORE), this, SLOT(onShaderSaveCorePresetClicked()));
|
||||
saveMenu->addAction(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_PARENT), this, SLOT(onShaderSaveParentPresetClicked()));
|
||||
saveMenu->addAction(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_GAME), this, SLOT(onShaderSaveGamePresetClicked()));
|
||||
|
||||
saveButton->setMenu(saveMenu);
|
||||
|
||||
removeMenu = new QMenu(removeButton);
|
||||
|
||||
/* When there are no passes, at least on first startup, it seems video_shader erroneously shows 1 pass, with an empty source file.
|
||||
* So we use menu_shader instead for that.
|
||||
*/
|
||||
if (menu_shader)
|
||||
{
|
||||
for (i = 0; i < static_cast<int>(menu_shader->passes); i++)
|
||||
{
|
||||
QFileInfo fileInfo(menu_shader->pass[i].source.path);
|
||||
QString shaderBasename = fileInfo.completeBaseName();
|
||||
QAction *action = removeMenu->addAction(shaderBasename, this, SLOT(onShaderRemovePassClicked()));
|
||||
|
||||
action->setData(i);
|
||||
}
|
||||
}
|
||||
|
||||
removeMenu->addAction(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_SHADER_CLEAR_ALL_PASSES), this, SLOT(onShaderClearAllPassesClicked()));
|
||||
|
||||
removeButton->setMenu(removeMenu);
|
||||
|
||||
connect(applyButton, SIGNAL(clicked()), this, SLOT(onShaderApplyClicked()));
|
||||
|
||||
topButtonLayout = new QHBoxLayout();
|
||||
topButtonLayout->addWidget(loadButton);
|
||||
topButtonLayout->addWidget(saveButton);
|
||||
topButtonLayout->addWidget(removeButton);
|
||||
topButtonLayout->addWidget(applyButton);
|
||||
|
||||
m_layout->addLayout(topButtonLayout);
|
||||
|
||||
/* NOTE: We assume that parameters are always grouped in order by the pass number, e.g., all parameters for pass 0 come first, then params for pass 1, etc. */
|
||||
for (i = 0; i < static_cast<int>(video_shader->passes); i++)
|
||||
{
|
||||
@ -417,20 +748,26 @@ void ShaderParamsDialog::reload()
|
||||
QFileInfo fileInfo(video_shader->pass[i].source.path);
|
||||
QString shaderBasename = fileInfo.completeBaseName();
|
||||
QHBoxLayout *filterScaleHBoxLayout = NULL;
|
||||
QComboBox *filterComboBox = new QComboBox();
|
||||
QComboBox *scaleComboBox = new QComboBox();
|
||||
QComboBox *filterComboBox = new QComboBox(this);
|
||||
QComboBox *scaleComboBox = new QComboBox(this);
|
||||
QToolButton *moveDownButton = NULL;
|
||||
QToolButton *moveUpButton = NULL;
|
||||
unsigned j = 0;
|
||||
|
||||
/* Sometimes video_shader shows 1 pass with no source file, when there are really 0 passes. */
|
||||
if (shaderBasename.isEmpty())
|
||||
continue;
|
||||
|
||||
hasPasses = true;
|
||||
|
||||
filterComboBox->setProperty("pass", i);
|
||||
scaleComboBox->setProperty("pass", i);
|
||||
|
||||
moveDownButton = new QToolButton();
|
||||
moveDownButton = new QToolButton(this);
|
||||
moveDownButton->setText("↓");
|
||||
moveDownButton->setProperty("pass", i);
|
||||
|
||||
moveUpButton = new QToolButton();
|
||||
moveUpButton = new QToolButton(this);
|
||||
moveUpButton->setText("↑");
|
||||
moveUpButton->setProperty("pass", i);
|
||||
|
||||
@ -488,9 +825,9 @@ void ShaderParamsDialog::reload()
|
||||
|
||||
filterScaleHBoxLayout = new QHBoxLayout();
|
||||
filterScaleHBoxLayout->addSpacerItem(new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Preferred));
|
||||
filterScaleHBoxLayout->addWidget(new QLabel(QString(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_FILTER)) + ":"));
|
||||
filterScaleHBoxLayout->addWidget(new QLabel(QString(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_FILTER)) + ":", this));
|
||||
filterScaleHBoxLayout->addWidget(filterComboBox);
|
||||
filterScaleHBoxLayout->addWidget(new QLabel(QString(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SCALE)) + ":"));
|
||||
filterScaleHBoxLayout->addWidget(new QLabel(QString(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SCALE)) + ":", this));
|
||||
filterScaleHBoxLayout->addWidget(scaleComboBox);
|
||||
filterScaleHBoxLayout->addSpacerItem(new QSpacerItem(20, 0, QSizePolicy::Preferred, QSizePolicy::Preferred));
|
||||
|
||||
@ -513,6 +850,14 @@ void ShaderParamsDialog::reload()
|
||||
}
|
||||
}
|
||||
|
||||
if (!hasPasses)
|
||||
{
|
||||
QLabel *noParamsLabel = new QLabel(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_SHADER_NO_PASSES), this);
|
||||
noParamsLabel->setAlignment(Qt::AlignCenter);
|
||||
|
||||
m_layout->addWidget(noParamsLabel);
|
||||
}
|
||||
|
||||
m_layout->addItem(new QSpacerItem(20, 20, QSizePolicy::Minimum, QSizePolicy::Expanding));
|
||||
|
||||
end:
|
||||
|
@ -29,16 +29,27 @@ private slots:
|
||||
void onScaleComboBoxIndexChanged(int index);
|
||||
void onShaderPassMoveDownClicked();
|
||||
void onShaderPassMoveUpClicked();
|
||||
void onShaderLoadPresetClicked();
|
||||
void onShaderAddPassClicked();
|
||||
void onShaderSavePresetAsClicked();
|
||||
void onShaderSaveCorePresetClicked();
|
||||
void onShaderSaveParentPresetClicked();
|
||||
void onShaderSaveGamePresetClicked();
|
||||
void onShaderClearAllPassesClicked();
|
||||
void onShaderRemovePassClicked();
|
||||
void onShaderApplyClicked();
|
||||
private:
|
||||
QString getFilterLabel(unsigned filter);
|
||||
void addShaderParam(struct video_shader_parameter *param, int parameter, QFormLayout *form);
|
||||
void clearLayout(QLayout *layout);
|
||||
void getShaders(struct video_shader **menu_shader, struct video_shader **video_shader);
|
||||
void saveShaderPreset(const char *path, unsigned action_type);
|
||||
|
||||
QVBoxLayout *m_layout;
|
||||
protected:
|
||||
void closeEvent(QCloseEvent *event);
|
||||
void resizeEvent(QResizeEvent *event);
|
||||
void paintEvent(QPaintEvent *event);
|
||||
};
|
||||
|
||||
#endif
|
||||
|
@ -34,22 +34,18 @@ static const QString qt_theme_dark_stylesheet = QStringLiteral(R"(
|
||||
QTextEdit, LogTextEdit {
|
||||
background-color:rgb(25,25,25);
|
||||
}
|
||||
QSpinBox, QCheckBox {
|
||||
QSpinBox, QDoubleSpinBox, QCheckBox {
|
||||
background-color:rgb(25,25,25);
|
||||
}
|
||||
QCheckBox:checked, QCheckBox:unchecked {
|
||||
background-color:rgb(53,53,53);
|
||||
}
|
||||
QDialog#shaderParamsDialog {
|
||||
QWidget#shaderParamsWidget {
|
||||
background-color:rgb(25,25,25);
|
||||
}
|
||||
QDialog#shaderParamsDialog QGroupBox, QDialog#shaderParamsDialog QGroupBox QLabel,
|
||||
QDialog#shaderParamsDialog QGroupBox QSlider, QDialog#shaderParamsDialog QGroupBox QCheckBox:checked,
|
||||
QDialog#shaderParamsDialog QGroupBox QCheckBox:unchecked {
|
||||
background-color:rgb(53,53,53);
|
||||
}
|
||||
QDialog#shaderParamsDialog QGroupBox {
|
||||
border-top-left-radius: 0px;
|
||||
background-color:rgb(53,53,53);
|
||||
border-top-left-radius:0px;
|
||||
}
|
||||
QDialog#shaderParamsDialog QGroupBox::title {
|
||||
margin-left:0px;
|
||||
@ -58,7 +54,7 @@ static const QString qt_theme_dark_stylesheet = QStringLiteral(R"(
|
||||
background-color:qlineargradient(x1:0,y1:1,x2:0,y2:0,stop:0 rgb(53,53,53),stop:1 rgba(125,125,125,127));
|
||||
border:1px solid rgba(25,25,25,75);
|
||||
border-top:1px solid rgba(175,175,175,50%);
|
||||
border-bottom: none transparent;
|
||||
border-bottom:none transparent;
|
||||
}
|
||||
QToolTip {
|
||||
color:white;
|
||||
@ -224,7 +220,7 @@ static const QString qt_theme_dark_stylesheet = QStringLiteral(R"(
|
||||
}
|
||||
QComboBox {
|
||||
min-height:20px;
|
||||
padding:1px 18px 1px 3px;
|
||||
padding:1px 6px 1px 6px;
|
||||
}
|
||||
QComboBox::focus {
|
||||
background:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,stop: 0 rgba(255,255,255,50), stop: 1 rgba(100,100,100,25));
|
||||
@ -238,6 +234,7 @@ static const QString qt_theme_dark_stylesheet = QStringLiteral(R"(
|
||||
}
|
||||
QComboBox::drop-down {
|
||||
background-color:transparent;
|
||||
width:0px;
|
||||
}
|
||||
QComboBox::selected:on, QComboBox::selected:off {
|
||||
background-color:%1;
|
||||
@ -262,6 +259,10 @@ static const QString qt_theme_dark_stylesheet = QStringLiteral(R"(
|
||||
padding:1px 3px 1px 3px;
|
||||
outline:none;
|
||||
}
|
||||
QPushButton::disabled, QToolButton::disabled {
|
||||
color:grey;
|
||||
background-color:rgb(25,25,25);
|
||||
}
|
||||
QPushButton::focus, QToolButton::focus {
|
||||
background:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,stop: 0 rgba(255,255,255,50), stop: 1 rgba(100,100,100,25));
|
||||
border:1px solid %1;
|
||||
@ -278,7 +279,7 @@ static const QString qt_theme_dark_stylesheet = QStringLiteral(R"(
|
||||
border-radius:4px;
|
||||
}
|
||||
QPushButton[flat="true"] {
|
||||
background-color: transparent;
|
||||
background-color:transparent;
|
||||
}
|
||||
QRadioButton::indicator {
|
||||
width:18px;
|
||||
@ -428,7 +429,7 @@ static const QString qt_theme_dark_stylesheet = QStringLiteral(R"(
|
||||
background-color:rgb(40,40,40);
|
||||
border:3px solid %1;
|
||||
}
|
||||
QScrollArea QWidget {
|
||||
background:rgb(25,25,25);
|
||||
QWidget#gridLayoutWidget {
|
||||
background-color:rgb(25,25,25);
|
||||
}
|
||||
)");
|
||||
|
@ -370,6 +370,7 @@ MainWindow::MainWindow(QWidget *parent) :
|
||||
m_gridWidget->setLayout(new QVBoxLayout());
|
||||
|
||||
m_gridLayout = new FlowLayout(m_gridLayoutWidget);
|
||||
m_gridLayoutWidget->setObjectName("gridLayoutWidget");
|
||||
|
||||
m_gridScrollArea->setAlignment(Qt::AlignCenter);
|
||||
m_gridScrollArea->setFrameShape(QFrame::NoFrame);
|
||||
@ -839,7 +840,7 @@ void MainWindow::onFileBrowserTreeContextMenuRequested(const QPoint&)
|
||||
QList<QAction*> actions;
|
||||
QScopedPointer<QAction> scanAction;
|
||||
QDir dir;
|
||||
QString currentDirString = m_dirModel->filePath(m_dirTree->currentIndex());
|
||||
QString currentDirString = QDir::toNativeSeparators(m_dirModel->filePath(m_dirTree->currentIndex()));
|
||||
settings_t *settings = config_get_ptr();
|
||||
QByteArray dirArray;
|
||||
const char *fullpath = NULL;
|
||||
@ -1398,7 +1399,7 @@ void MainWindow::selectBrowserDir(QString path)
|
||||
QString fileName = dirList.at(i);
|
||||
QTableWidgetItem *item = new QTableWidgetItem(fileName);
|
||||
QHash<QString, QString> hash;
|
||||
QString filePath(dir.absoluteFilePath(fileName));
|
||||
QString filePath(QDir::toNativeSeparators(dir.absoluteFilePath(fileName)));
|
||||
QFileInfo fileInfo(filePath);
|
||||
|
||||
hash["path"] = filePath;
|
||||
|
@ -607,6 +607,11 @@ static void ui_companion_qt_toggle(void *data, bool force)
|
||||
#endif
|
||||
if (settings->bools.ui_companion_toggle || force)
|
||||
{
|
||||
if (settings->bools.video_fullscreen)
|
||||
command_event(CMD_EVENT_FULLSCREEN_TOGGLE, NULL);
|
||||
|
||||
win_handle->qtWindow->activateWindow();
|
||||
win_handle->qtWindow->raise();
|
||||
video_driver_show_mouse();
|
||||
win_handle->qtWindow->show();
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user