Sync standalone + libretro emulator fixes from ROCKNIX

retroarch: bump to commit bdba046f (v1.22.2 + fixes) and rebase the
two local patches (0010-paths, 0011-cheevos-sounds) so they apply
cleanly against the new tree.

setsettings.sh: configure_hotkeys now detects the InputPlumber-emulated
DualSense pad first, then falls back to js0 / joypad. Without this,
retroarch took the raw event device and the hotkey binding never
matched what InputPlumber actually exposed to userspace.

drastic-sa: pull the new libdrastouch (sharp-shimmerless + quilez
pixel shaders, SDL2 hook) and the matching start_drastic.sh, which
now reads the shader setting and exports DSHOOK_SHADER. Drops the
dead S922X libmali block we never executed on RK3326.

hypseus-singe: rewrite of start_hypseus.sh fixes broken controls
(autoconfig.cfg lookup was matching too loosely) and adds the
set_kill on exit so the quit hotkey actually terminates the
emulator instead of leaving it parented to ES.

ppsspp-sa: add 005-hide-unsupported-ui-items.patch to drop the
"www.ppsspp.org" link and the "Buy PPSSPP Gold" button from the
main screen. Handheld UX cleanup, no behavioral change.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
Douglas Teles
2026-06-23 14:22:31 -03:00
parent 5805267f90
commit 120d279213
8 changed files with 654 additions and 61 deletions
@@ -348,7 +348,11 @@ EOF
function configure_hotkeys() {
log "Configure hotkeys..."
local MY_CONTROLLER
if grep -q "js0" /proc/bus/input/devices; then
if grep -q "Sony Interactive Entertainment DualSense Wireless Controller" /proc/bus/input/devices; then
# InputPlumber virtual DS5
MY_CONTROLLER="Sony Interactive Entertainment DualSense Wireless Controller"
elif grep -q "js0" /proc/bus/input/devices; then
MY_CONTROLLER=$(grep -b4 js0 /proc/bus/input/devices | awk 'BEGIN {FS="\""}; /Name/ {printf $2}')
else
MY_CONTROLLER=$(grep -b4 joypad /proc/bus/input/devices | awk 'BEGIN {FS="\""}; /Name/ {printf $2}')
@@ -3,7 +3,7 @@
# Copyright (C) 2023 JELOS (https://github.com/JustEnoughLinuxOS)
PKG_NAME="retroarch"
PKG_VERSION="fae7468de15b32a0e105e45325e5ca85e62ea7d4" # v1.22.2 + fixes
PKG_VERSION="bdba046fa6766380bc2457532f38e589df769aaf" # v1.22.2 + fixes
PKG_SITE="https://github.com/libretro/RetroArch"
PKG_URL="${PKG_SITE}/archive/${PKG_VERSION}.tar.gz"
PKG_LICENSE="GPLv3"
@@ -1,8 +1,8 @@
diff --git a/frontend/drivers/platform_unix.c b/frontend/drivers/platform_unix.c
index e1db1da096..7baf8a5f21 100644
index 1fcf97e507..17d1a10a40 100644
--- a/frontend/drivers/platform_unix.c
+++ b/frontend/drivers/platform_unix.c
@@ -1812,7 +1812,7 @@ static void frontend_unix_get_env(int *argc,
@@ -2018,7 +2018,7 @@ static void frontend_unix_get_env(int *argc,
"/usr/share/games/retroarch",
"assets", sizeof(g_defaults.dirs[DEFAULT_DIR_ASSETS]));
else
@@ -11,23 +11,23 @@ index e1db1da096..7baf8a5f21 100644
"assets", sizeof(g_defaults.dirs[DEFAULT_DIR_ASSETS]));
#if defined(DINGUX)
@@ -1885,7 +1885,7 @@ static void frontend_unix_get_env(int *argc,
@@ -2091,7 +2091,7 @@ static void frontend_unix_get_env(int *argc,
fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_REMAP],
g_defaults.dirs[DEFAULT_DIR_MENU_CONFIG],
"remaps", sizeof(g_defaults.dirs[DEFAULT_DIR_REMAP]));
- fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_PLAYLIST], base_path,
+ fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_PLAYLIST], "/tmp/",
+ fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_PLAYLIST], "/tmp/",
"playlists", sizeof(g_defaults.dirs[DEFAULT_DIR_PLAYLIST]));
fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_RECORD_CONFIG], base_path,
"records_config", sizeof(g_defaults.dirs[DEFAULT_DIR_RECORD_CONFIG]));
@@ -1896,14 +1896,14 @@ static void frontend_unix_get_env(int *argc,
@@ -2102,14 +2102,14 @@ static void frontend_unix_get_env(int *argc,
libretro_database_directory,
sizeof(g_defaults.dirs[DEFAULT_DIR_DATABASE]));
else
- fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_DATABASE], base_path,
+ fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_DATABASE], "/tmp/",
"database/rdb", sizeof(g_defaults.dirs[DEFAULT_DIR_DATABASE]));
if (!string_is_empty(libretro_video_shader_directory))
if (libretro_video_shader_directory && *libretro_video_shader_directory)
strlcpy(g_defaults.dirs[DEFAULT_DIR_SHADER],
libretro_video_shader_directory,
sizeof(g_defaults.dirs[DEFAULT_DIR_SHADER]));
@@ -35,9 +35,9 @@ index e1db1da096..7baf8a5f21 100644
- fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_SHADER], base_path,
+ fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_SHADER], "/tmp/",
"shaders", sizeof(g_defaults.dirs[DEFAULT_DIR_SHADER]));
if (!string_is_empty(libretro_cheats_directory))
if (libretro_cheats_directory && *libretro_cheats_directory)
strlcpy(g_defaults.dirs[DEFAULT_DIR_CHEATS],
@@ -1912,9 +1912,9 @@ static void frontend_unix_get_env(int *argc,
@@ -2118,9 +2118,9 @@ static void frontend_unix_get_env(int *argc,
else
fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_CHEATS], base_path,
"cheats", sizeof(g_defaults.dirs[DEFAULT_DIR_CHEATS]));
@@ -1,8 +1,8 @@
diff --git a/audio/audio_driver.c b/audio/audio_driver.c
index 01a727eb95..fc43700d22 100644
index d5cabac95b..caa992381c 100644
--- a/audio/audio_driver.c
+++ b/audio/audio_driver.c
@@ -1339,8 +1339,8 @@ static void audio_driver_load_menu_bgm_callback(retro_task_t *task,
@@ -1569,8 +1569,8 @@ static void audio_driver_load_menu_bgm_c
void audio_driver_load_system_sounds(void)
{
char basename_noext[NAME_MAX_LENGTH];
@@ -13,7 +13,7 @@ index 01a727eb95..fc43700d22 100644
settings_t *settings = config_get_ptr();
const char *dir_assets = settings->paths.directory_assets;
const bool audio_enable_menu = settings->bools.audio_enable_menu;
@@ -1365,19 +1365,6 @@ void audio_driver_load_system_sounds(void)
@@ -1597,19 +1597,6 @@ void audio_driver_load_system_sounds(voi
if (!audio_enable_menu && !audio_enable_cheevo_unlock)
goto end;
@@ -33,10 +33,10 @@ index 01a727eb95..fc43700d22 100644
list = dir_list_new(sounds_path, MENU_SOUND_FORMATS, false, false, false, false);
list_fallback = dir_list_new(sounds_fallback_path, MENU_SOUND_FORMATS, false, false, false, false);
@@ -1423,8 +1410,13 @@ void audio_driver_load_system_sounds(void)
path_notice_back = path;
@@ -1660,8 +1647,13 @@ void audio_driver_load_system_sounds(voi
else if (string_is_equal_noncase(basename_noext, "bgm"))
path_bgm = path;
#endif
- else if (string_is_equal_noncase(basename_noext, "unlock"))
- path_cheevo_unlock = path;
+ else if(string_is_empty(settings->arrays.cheevos_unlock_sound) == false) {
@@ -17,6 +17,7 @@ HIRES3D=$(get_setting hires_3d "${PLATFORM}" "${GAME}")
THREADED3D=$(get_setting threaded_3d "${PLATFORM}" "${GAME}")
FOLLOW3D=$(get_setting follow_3d_renderer "${PLATFORM}" "${GAME}")
MICTHRESH=$(get_setting microphone_sensitivity "${PLATFORM}" "${GAME}")
SHADER=$(get_setting shader "${PLATFORM}" "${GAME}")
#load gptokeyb support files
control-gen_init.sh
@@ -82,21 +83,11 @@ fi
cd /storage/.config/drastic/
@HOTKEY@
# Fix for libmali gpu driver on S922X platform
if [ "${HW_DEVICE}" = "S922X" ]; then
GPUDRIVER=$(/usr/bin/gpudriver)
if [ "${GPUDRIVER}" = "libmali" ]; then
export SDL_VIDEO_GL_DRIVER=\/usr\/lib\/egl\/libGL.so.1
export SDL_VIDEO_EGL_DRIVER=\/usr\/lib\/egl\/libEGL.so.1
fi
fi
$GPTOKEYB "drastic" -c "drastic.gptk" &
# Fix actual touch inputs by replacing touch->mouse translation and add hw mic support
export LD_PRELOAD="/usr/lib/libdrastouch.so"
export SDL_TOUCH_MOUSE_EVENTS="0"
export DSHOOK_MIC_THRESH="${MICTHRESH}"
export DSHOOK_SHADER="${SHADER:-none}"
./drastic "$1"
_gptokeyb_pid="$(pidof gptokeyb 2>/dev/null)"
[ -n "${_gptokeyb_pid}" ] && kill -9 ${_gptokeyb_pid}
kill -9 $(pidof gptokeyb)
File diff suppressed because it is too large Load Diff
@@ -4,6 +4,9 @@
# Copyright (C) 2021-present Shanti Gilbert (https://github.com/shantigilbert)
# Copyright (C) 2023 JELOS (https://github.com/JustEnoughLinuxOS)
. /etc/profile
set_kill set "-9 hypseus"
dir="${1}"
name=${dir##*/}
name=${name%.*}
@@ -11,53 +14,49 @@ config="/storage/.config/game/configs/hypseus"
configfile="${config}/hypinput.ini"
# Attempt to auto configure gamepad
#
GAMEPADINFO="$(sdljoytest -skip_loop)"
#JOYGUID=$(echo "${GAMEPADINFO}" | grep "Joystick 0 Guid " | sed "s|Joystick 0 Guid ||")
JOYNAME=$(echo "${GAMEPADINFO}" | grep "Joystick 0 name " | sed "s|Joystick 0 name ||" | sed "s|'||g")
#
for file in /usr/share/libretro/autoconfig/*.cfg; do
GAMEPAD=$(cat "$file" | grep input_device | cut -d'"' -f 2)
if [ "${JOYNAME}" == "${GAMEPAD}" ]; then
GPFILE="${file}"
GPFILE="/usr/share/libretro/autoconfig/${JOYNAME}.cfg"
if [[ -f "${GPFILE}" ]]; then
# Other keys to consider KEY_SCREENSHOT KEY_QUIT KEY_PAUSE
for key in KEY_UP KEY_DOWN KEY_LEFT KEY_RIGHT KEY_BUTTON1 KEY_BUTTON2 KEY_BUTTON3 KEY_START1 KEY_COIN1; do
case ${key} in
"KEY_UP")
button=$(cat "${GPFILE}" | grep -E 'input_up_btn' | cut -d '"' -f2)
button=$(cat "${GPFILE}" | grep -E '^input_up_btn\b' | cut -d '"' -f2)
keyboard="1073741906 0"
;;
"KEY_DOWN")
button=$(cat "${GPFILE}" | grep -E 'input_down_btn' | cut -d '"' -f2)
button=$(cat "${GPFILE}" | grep -E '^input_down_btn\b' | cut -d '"' -f2)
keyboard="1073741905 0"
;;
"KEY_LEFT")
button=$(cat "${GPFILE}" | grep -E 'input_left_btn' | cut -d '"' -f2)
button=$(cat "${GPFILE}" | grep -E '^input_left_btn\b' | cut -d '"' -f2)
keyboard="1073741904 0"
;;
"KEY_RIGHT")
button=$(cat "${GPFILE}" | grep -E 'input_right_btn' | cut -d '"' -f2)
button=$(cat "${GPFILE}" | grep -E '^input_right_btn\b' | cut -d '"' -f2)
keyboard="1073741903 0"
;;
"KEY_BUTTON1")
button=$(cat "${GPFILE}" | grep -E 'input_a_btn' | cut -d '"' -f2)
button=$(cat "${GPFILE}" | grep -E '^input_a_btn\b' | cut -d '"' -f2)
keyboard="1073742048 0"
;;
"KEY_BUTTON2")
button=$(cat "${GPFILE}" | grep -E 'input_b_btn' | cut -d '"' -f2)
button=$(cat "${GPFILE}" | grep -E '^input_b_btn\b' | cut -d '"' -f2)
keyboard="1073742050 0"
;;
"KEY_BUTTON3")
button=$(cat "${GPFILE}" | grep -E 'input_x_btn' | cut -d '"' -f2)
button=$(cat "${GPFILE}" | grep -E '^input_x_btn\b' | cut -d '"' -f2)
keyboard="32 0"
;;
"KEY_START1")
button=$(cat "${GPFILE}" | grep -E 'input_start_btn' | cut -d '"' -f2)
button=$(cat "${GPFILE}" | grep -E '^input_start_btn\b' | cut -d '"' -f2)
keyboard="49 0"
;;
"KEY_COIN1")
button=$(cat "${GPFILE}" | grep -E 'input_select_btn' | cut -d '"' -f2)
button=$(cat "${GPFILE}" | grep -E '^input_select_btn\b' | cut -d '"' -f2)
keyboard="53 54"
;;
esac
@@ -71,8 +70,7 @@ for file in /usr/share/libretro/autoconfig/*.cfg; do
sed -i "s|${key}.*|${key} = ${keyboard} ${button} |" ${configfile}
done
fi
done # finish auto gamepad
fi # finish auto gamepad
if [[ -f "${dir}/${name}.commands" ]]; then
params=$(<"${dir}/${name}.commands")
@@ -0,0 +1,87 @@
diff --git a/UI/MainScreen.cpp b/UI/MainScreen.cpp
index 1af913cbc8..fd5c7fccaf 100644
--- a/UI/MainScreen.cpp
+++ b/UI/MainScreen.cpp
@@ -285,19 +285,19 @@ void MainScreen::CreateMainButtons(UI::ViewGroup *parent, bool portrait) {
parent->Add(portrait ? new Choice(ImageID("I_GEAR"), portrait ? new LinearLayoutParams() : nullptr) : new Choice(mm->T("Game Settings", "Settings")))->OnClick.Handle(this, &MainScreen::OnGameSettings);
parent->Add(portrait ? new Choice(ImageID("I_INFO"), portrait ? new LinearLayoutParams() : nullptr) : new Choice(mm->T("About PPSSPP")))->OnClick.Handle(this, &MainScreen::OnCredits);
- if (!portrait) {
- parent->Add(new Choice(mm->T("www.ppsspp.org")))->OnClick.Handle(this, &MainScreen::OnPPSSPPOrg);
- }
-
- if (!System_GetPropertyBool(SYSPROP_APP_GOLD) && (System_GetPropertyInt(SYSPROP_DEVICE_TYPE) != DEVICE_TYPE_VR)) {
- Choice *gold = parent->Add(portrait ? new Choice(ImageID("I_ICON_GOLD"), portrait ? new LinearLayoutParams() : nullptr) : new Choice(mm->T("Buy PPSSPP Gold")));
- gold->OnClick.Add([this](UI::EventParams &) {
- LaunchBuyGold(this->screenManager());
- });
- gold->SetIconRight(ImageID("I_ICON_GOLD"), 0.5f);
- gold->SetImageScale(0.6f); // for the left-icon in case of vertical.
- gold->SetShine(true);
- }
+ //if (!portrait) {
+ // parent->Add(new Choice(mm->T("www.ppsspp.org")))->OnClick.Handle(this, &MainScreen::OnPPSSPPOrg);
+ //}
+
+ //if (!System_GetPropertyBool(SYSPROP_APP_GOLD) && (System_GetPropertyInt(SYSPROP_DEVICE_TYPE) != DEVICE_TYPE_VR)) {
+ // Choice *gold = parent->Add(portrait ? new Choice(ImageID("I_ICON_GOLD"), portrait ? new LinearLayoutParams() : nullptr) : new Choice(mm->T("Buy PPSSPP Gold")));
+ // gold->OnClick.Add([this](UI::EventParams &) {
+ // LaunchBuyGold(this->screenManager());
+ // });
+ // gold->SetIconRight(ImageID("I_ICON_GOLD"), 0.5f);
+ // gold->SetImageScale(0.6f); // for the left-icon in case of vertical.
+ // gold->SetShine(true);
+ //}
if (!portrait) {
parent->Add(new Spacer(16.0));
@@ -359,8 +359,9 @@ void MainScreen::CreateViews() {
Button *focusButton = nullptr;
if (hasStorageAccess) {
- CreateBrowserTab(Path(g_Config.currentDirectory), "Games", "How to get games", getGamesUri, BrowseFlags::STANDARD, &g_Config.bGridView2, &g_Config.fGameListScrollPosition);
- CreateBrowserTab(GetSysDirectory(DIRECTORY_GAME), "Homebrew & Demos", "How to get homebrew & demos", getHomebrewUri, BrowseFlags::HOMEBREW_STORE, &g_Config.bGridView3, &g_Config.fHomebrewScrollPosition);
+ CreateBrowserTab(Path(g_Config.currentDirectory), "Games", "", "", BrowseFlags::STANDARD, &g_Config.bGridView2, &g_Config.fGameListScrollPosition);
+ CreateBrowserTab(GetSysDirectory(DIRECTORY_GAME), "Homebrew & Demos", "", "", BrowseFlags::HOMEBREW_STORE, &g_Config.bGridView3, &g_Config.fHomebrewScrollPosition);
+
if (g_Config.bRemoteTab && !g_Config.sLastRemoteISOServer.empty()) {
Path remotePath(FormatRemoteISOUrl(g_Config.sLastRemoteISOServer.c_str(), g_Config.iLastRemoteISOPort, RemoteSubdir().c_str()));
diff --git a/UI/MiscScreens.cpp b/UI/MiscScreens.cpp
index 7bd09b9fe7..4030ee32bc 100644
--- a/UI/MiscScreens.cpp
+++ b/UI/MiscScreens.cpp
@@ -547,33 +547,6 @@ void CreditsScreen::CreateDialogViews(UI::ViewGroup *parent) {
}
int rightYOffset = 0;
- if (!System_GetPropertyBool(SYSPROP_APP_GOLD)) {
- ScreenManager *sm = screenManager();
- Choice *gold = new Choice(mm->T("Buy PPSSPP Gold"));
- gold->SetIconRight(ImageID("I_ICON_GOLD"), 0.5f);
- gold->SetImageScale(0.6f); // for the left-icon in case of vertical.
- gold->SetShine(true);
-
- left->Add(gold)->OnClick.Add([sm](UI::EventParams) {
- LaunchBuyGold(sm);
- });
- rightYOffset = 74;
- }
- left->Add(new Choice(cr->T("PPSSPP Forums"), ImageID("I_LINK_OUT")))->OnClick.Add([](UI::EventParams &e) {
- System_LaunchUrl(LaunchUrlType::BROWSER_URL, "https://forums.ppsspp.org");
- });
- left->Add(new Choice(cr->T("Discord"), ImageID("I_LOGO_DISCORD")))->OnClick.Add([](UI::EventParams &e) {
- System_LaunchUrl(LaunchUrlType::BROWSER_URL, "https://discord.gg/5NJB6dD");
- });
- left->Add(new Choice("www.ppsspp.org", ImageID("I_LINK_OUT")))->OnClick.Add([](UI::EventParams &e) {
- System_LaunchUrl(LaunchUrlType::BROWSER_URL, "https://www.ppsspp.org");
- });
- right->Add(new Choice(cr->T("Privacy Policy"), ImageID("I_LINK_OUT")))->OnClick.Add([](UI::EventParams &e) {
- System_LaunchUrl(LaunchUrlType::BROWSER_URL, "https://www.ppsspp.org/privacy");
- });
- right->Add(new Choice(cr->T("@PPSSPP_emu"), ImageID("I_LOGO_X")))->OnClick.Add([](UI::EventParams &e) {
- System_LaunchUrl(LaunchUrlType::BROWSER_URL, "https://x.com/PPSSPP_emu");
- });
if (System_GetPropertyBool(SYSPROP_SUPPORTS_SHARE_TEXT)) {
right->Add(new Choice(cr->T("Share PPSSPP"), ImageID("I_SHARE")))->OnClick.Add([](UI::EventParams &e) {