Merge branch 'master' of https://github.com/libretro/RetroArch into discord_improvements

This commit is contained in:
Jesse Bryan 2018-08-20 08:30:57 -05:00
commit 44180e55b1
25 changed files with 764 additions and 229 deletions

View File

@ -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.

View File

@ -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)

View File

@ -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:

View File

@ -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,

View File

@ -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,
"シェーダーパスはありません。")

View File

@ -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.")

View File

@ -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;
}

View File

@ -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;

View File

@ -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;

View File

@ -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)
{

View File

@ -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,

View File

@ -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);

View File

@ -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),

View File

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

View File

@ -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;

View File

@ -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);
}

View File

@ -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();

View File

@ -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);

View File

@ -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:

View File

@ -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

View File

@ -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);
}
)");

View File

@ -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;

View File

@ -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();