Merge branch 'cooker' of https://github.com/RetroDECK/RetroDECK into cooker

This commit is contained in:
XargonWan 2025-03-29 09:59:28 +09:00
commit aa5374d7fd
20 changed files with 957 additions and 861 deletions

View file

@ -213,10 +213,6 @@
"filename": "how-to-install-psvita-games.txt", "filename": "how-to-install-psvita-games.txt",
"location": "$roms_folder/psvita" "location": "$roms_folder/psvita"
}, },
"ryujinx_firmware": {
"filename": "Install-firmware-through-Ryujinx.txt",
"location": "$bios_folder/switch/firmware"
},
"custom_systems": { "custom_systems": {
"filename": "es_systems.xml", "filename": "es_systems.xml",
"location": "$rdhome/ES-DE/custom_systems" "location": "$rdhome/ES-DE/custom_systems"

View file

@ -4,7 +4,7 @@ ES_SYSTEMS_FILE="../ES-DE/resources/systems/linux/es_systems.xml"
MIME_FILE="config/retrodeck/net.retrodeck.retrodeck.mime.xml" MIME_FILE="config/retrodeck/net.retrodeck.retrodeck.mime.xml"
# List of extensions to ignore # List of extensions to ignore
IGNORED_EXTENSIONS=". .appimage cue" IGNORED_EXTENSIONS=". .appimage cue png po"
# Check if xmlstarlet is installed # Check if xmlstarlet is installed
if ! command -v xmlstarlet &> /dev/null; then if ! command -v xmlstarlet &> /dev/null; then

View file

@ -10,7 +10,7 @@ save_migration() {
# ROMs on SD card # ROMs on SD card
roms_folder="$default_sd/retrodeck/roms" roms_folder="$default_sd/retrodeck/roms"
if [[ ! -L "$rdhome" && ! -L "$rdhome/roms" ]]; then # Add a roms folder symlink back to ~/retrodeck if missing, to fix things like PS2 autosaves until user migrates whole ~retrodeck directory if [[ ! -L "$rdhome" && ! -L "$rdhome/roms" ]]; then # Add a roms folder symlink back to ~/retrodeck if missing, to fix things like PS2 autosaves until user migrates whole ~retrodeck directory
ln -s $roms_folder "$rdhome/roms" ln -s "$roms_folder" "$rdhome/roms"
fi fi
else else
# ROMs on Internal # ROMs on Internal
@ -31,19 +31,19 @@ save_migration() {
fi fi
# Doing the dir prep as we don't know from which version we came # Doing the dir prep as we don't know from which version we came
dir_prep "$media_folder" "/var/config/ES-DE/downloaded_media" dir_prep "$media_folder" "$XDG_CONFIG_HOME/ES-DE/downloaded_media"
dir_prep "$themes_folder" "/var/config/ES-DE/themes" dir_prep "$themes_folder" "$XDG_CONFIG_HOME/ES-DE/themes"
create_dir "$rdhome/logs" #this was added later, maybe safe to remove in a few versions create_dir "$rdhome/logs" #this was added later, maybe safe to remove in a few versions
# Resetting es_settings, now we need it but in the future I should think a better solution, maybe with sed # Resetting es_settings, now we need it but in the future I should think a better solution, maybe with sed
cp -fv /app/retrodeck/es_settings.xml /var/config/ES-DE/settings/es_settings.xml cp -fv "/app/retrodeck/es_settings.xml" "$XDG_CONFIG_HOME/ES-DE/settings/es_settings.xml"
# 0.4 -> 0.5 # 0.4 -> 0.5
# Perform save and state migration if needed # Perform save and state migration if needed
# Moving PCSX2 Saves # Moving PCSX2 Saves
mv -fv /var/config/PCSX2/sstates/* "$rdhome/states/ps2/pcsx2" mv -fv "$XDG_CONFIG_HOME/PCSX2/sstates/"* "$rdhome/states/ps2/pcsx2"
mv -fv /var/config/PCSX2/memcards/* "$rdhome/saves/ps2/memcards" mv -fv "$XDG_CONFIG_HOME/PCSX2/memcards/"* "$rdhome/saves/ps2/memcards"
# Moving Citra saves from legacy location to 0.5.0b structure # Moving Citra saves from legacy location to 0.5.0b structure
@ -52,7 +52,7 @@ save_migration() {
versionwheresaveschanged="0.4.5b" # Hardcoded break point between unsorted and sorted saves versionwheresaveschanged="0.4.5b" # Hardcoded break point between unsorted and sorted saves
if [[ $(sed -e "s/\.//g" <<< $hard_version) > $(sed -e "s/\.//g" <<< $versionwheresaveschanged) ]] && [[ ! $(sed -e "s/\.//g" <<< $version) > $(sed -e "s/\.//g" <<< $versionwheresaveschanged) ]]; then # Check if user is upgrading from the version where save organization was changed. Try not to reuse this, it things 0.4.5b is newer than 0.4.5 if [[ $(sed -e "s/\.//g" <<< "$hard_version") > $(sed -e "s/\.//g" <<< "$versionwheresaveschanged") ]] && [[ ! $(sed -e "s/\.//g" <<< "$version") > $(sed -e "s/\.//g" <<< "$versionwheresaveschanged") ]]; then # Check if user is upgrading from the version where save organization was changed. Try not to reuse this, it things 0.4.5b is newer than 0.4.5
migration_logfile="$rdhome/logs/savemove_$(date +"%Y_%m_%d_%I_%M_%p").log" migration_logfile="$rdhome/logs/savemove_$(date +"%Y_%m_%d_%I_%M_%p").log"
save_backup_file="$rdhome/savebackup_$(date +"%Y_%m_%d_%I_%M_%p").zip" save_backup_file="$rdhome/savebackup_$(date +"%Y_%m_%d_%I_%M_%p").zip"
state_backup_file="$rdhome/statesbackup_$(date +"%Y_%m_%d_%I_%M_%p").zip" state_backup_file="$rdhome/statesbackup_$(date +"%Y_%m_%d_%I_%M_%p").zip"
@ -74,16 +74,16 @@ save_migration() {
current_dest_folder= current_dest_folder=
gamestoskip= gamestoskip=
tar -C "$rdhome" -czf $save_backup_file saves # Backup save directory for safety tar -C "$rdhome" -czf "$save_backup_file" saves # Backup save directory for safety
log i "Saves backed up to" $save_backup_file $migration_logfile log i "Saves backed up to" "$save_backup_file" "$migration_logfile"
tar -C "$rdhome" -czf $state_backup_file states # Backup state directory for safety tar -C "$rdhome" -czf "$state_backup_file" states # Backup state directory for safety
log i "States backed up to" $state_backup_file $migration_logfile log i "States backed up to" "$state_backup_file" "$migration_logfile"
( (
movefile() { # Take matching save and rom files and sort save into appropriate system folder movefile() { # Take matching save and rom files and sort save into appropriate system folder
echo "# $filesleft $currentlybeingmoved remaining..." # These lines update the Zenity progress bar echo "# $filesleft $currentlybeingmoved remaining..." # These lines update the Zenity progress bar
progress=$(( 100 - (( 100 / "$totalfiles" ) * "$filesleft" ))) progress=$(( 100 - (( 100 / "$totalfiles" ) * "$filesleft" )))
echo $progress echo "$progress"
filesleft=$((filesleft-1)) filesleft=$((filesleft-1))
if [[ ! " ${gamestoskip[*]} " =~ " ${1} " ]]; then # If the current game name exists multiple times in array ie. /roms/snes/Mortal Kombat 3.zip and /roms/genesis/Mortal Kombat 3.zip, skip and alert user to sort manually if [[ ! " ${gamestoskip[*]} " =~ " ${1} " ]]; then # If the current game name exists multiple times in array ie. /roms/snes/Mortal Kombat 3.zip and /roms/genesis/Mortal Kombat 3.zip, skip and alert user to sort manually
game=$(sed -e "s/\^/ /g" <<< "$1") # Remove whitespace placeholder game=$(sed -e "s/\^/ /g" <<< "$1") # Remove whitespace placeholder
@ -91,59 +91,59 @@ save_migration() {
systemdir="$(basename "$(dirname "$1")")" # Extract parent directory identifying system ROM belongs to systemdir="$(basename "$(dirname "$1")")" # Extract parent directory identifying system ROM belongs to
matches=($(find "$roms_folder" -maxdepth 2 -mindepth 2 -name "$gamebasename"".*" | sed -e 's/ /^/g' | sed -e 's/\..*//')) # Search for multiple instances of pure game name, adding to skip list if found matches=($(find "$roms_folder" -maxdepth 2 -mindepth 2 -name "$gamebasename"".*" | sed -e 's/ /^/g' | sed -e 's/\..*//')) # Search for multiple instances of pure game name, adding to skip list if found
if [[ ${#matches[@]} -gt 1 ]]; then if [[ ${#matches[@]} -gt 1 ]]; then
echo "ERROR: Multiple ROMS found with name:" $gamebasename "Please sort saves and states for these ROMS manually" >> $migration_logfile echo "ERROR: Multiple ROMS found with name: $gamebasename Please sort saves and states for these ROMS manually" >> "$migration_logfile"
gamestoskip+=("$1") gamestoskip+=("$1")
return return
fi fi
log i "Examining ROM file:" "$game" $migration_logfile log i "Examining ROM file:" "$game" "$migration_logfile"
log i "System detected as" $systemdir $migration_logfile log i "System detected as" "$systemdir" "$migration_logfile"
sosfile=$(sed -e "s/\^/ /g" <<< "$2") # Remove whitespace placeholder from s-ave o-r s-tate file sosfile=$(sed -e "s/\^/ /g" <<< "$2") # Remove whitespace placeholder from s-ave o-r s-tate file
sospurebasename="$(basename "$sosfile")" # Extract pure file name ie. /saves/game1.sav becomes game1 sospurebasename="$(basename "$sosfile")" # Extract pure file name ie. /saves/game1.sav becomes game1
log i "Current save or state being examined for match:" $sosfile $migration_logfile log i "Current save or state being examined for match:" "$sosfile" "$migration_logfile"
log i "Matching save or state" $sosfile "and game" $game "found." $migration_logfile log i "Matching save or state $sosfile and game $game found." "$migration_logfile"
log i "Moving save or state to $current_dest_folder/$systemdir/$sosbasename" $migration_logfile log i "Moving save or state to $current_dest_folder/$systemdir/$sosbasename" "$migration_logfile"
if [[ ! -d $current_dest_folder"/"$systemdir ]]; then # If system directory doesn't exist for save yet, create it if [[ ! -d $current_dest_folder"/"$systemdir ]]; then # If system directory doesn't exist for save yet, create it
log w "Creating missing system directory $current_dest_folder/$systemdir" log w "Creating missing system directory $current_dest_folder/$systemdir"
mkdir $current_dest_folder/$systemdir mkdir "$current_dest_folder/$systemdir"
fi fi
mv "$sosfile" -t $current_dest_folder/$systemdir # Move save to appropriate system directory mv "$sosfile" -t "$current_dest_folder/$systemdir" # Move save to appropriate system directory
return return
else else
local name="$(basename "$1" | sed -e "s/\^/ /g")" local name="$(basename "$1" | sed -e "s/\^/ /g")"
log w "Game with name \"$name\" already found. Skipping to next game..." $migration_logfile # Inform user of game being skipped due to duplicate ROM names log w "Game with name \"$name\" already found. Skipping to next game..." "$migration_logfile" # Inform user of game being skipped due to duplicate ROM names
fi fi
} }
find "$roms_folder" -mindepth 2 -maxdepth 2 -name "*\^*" -exec echo "ERROR: Game named" {} "found, please move save manually" \; >> $migration_logfile # Warn user if any of their files have the whitespace replacement character used by the script find "$roms_folder" -mindepth 2 -maxdepth 2 -name "*\^*" -exec echo "ERROR: Game named" {} "found, please move save manually" \; >> "$migration_logfile" # Warn user if any of their files have the whitespace replacement character used by the script
totalfiles=$totalsaves #set variables for save file migration totalfiles="$totalsaves" #set variables for save file migration
filesleft=$totalsaves filesleft="$totalsaves"
currentlybeingmoved="saves" currentlybeingmoved="saves"
current_dest_folder=$saves_folder current_dest_folder="$saves_folder"
for i in "${allsaves[@]}"; do # For each save file, compare to every ROM file name looking for a match for i in "${allsaves[@]}"; do # For each save file, compare to every ROM file name looking for a match
found= found=
currentsave=($(basename "$i" | sed -e 's/\..*//')) # Extract pure file name ie. /saves/game1.sav becomes game1 currentsave=($(basename "$i" | sed -e 's/\..*//')) # Extract pure file name ie. /saves/game1.sav becomes game1
for j in "${allgames[@]}"; do for j in "${allgames[@]}"; do
currentgame=($(basename "$j" | sed -e 's/\..*//')) # Extract pure file name ie. /roms/snes/game1.zip becomes game1 currentgame=($(basename "$j" | sed -e 's/\..*//')) # Extract pure file name ie. /roms/snes/game1.zip becomes game1
[[ $currentgame == $currentsave ]] && { found=1; break; } # If names match move to next stage, otherwise skip [[ "$currentgame" == "$currentsave" ]] && { found=1; break; } # If names match move to next stage, otherwise skip
done done
[[ -n $found ]] && movefile $j $i || echo "ERROR: No ROM match found for save file" $i | sed -e 's/\^/ /g' >> $migration_logfile # If a match is found, run movefile() otherwise warn user of stranded save file [[ -n "$found" ]] && movefile "$j" "$i" || echo "ERROR: No ROM match found for save file" "$i" | sed -e 's/\^/ /g' >> "$migration_logfile" # If a match is found, run movefile() otherwise warn user of stranded save file
done done
totalfiles=$totalstates #set variables for state file migration totalfiles="$totalstates" #set variables for state file migration
filesleft=$totalstates filesleft="$totalstates"
currentlybeingmoved="states" currentlybeingmoved="states"
current_dest_folder=$states_folder current_dest_folder="$states_folder"
for i in "${allstates[@]}"; do # For each state file, compare to every ROM file name looking for a match for i in "${allstates[@]}"; do # For each state file, compare to every ROM file name looking for a match
found= found=
currentstate=($(basename "$i" | sed -e 's/\..*//')) # Extract pure file name ie. /states/game1.sav becomes game1 currentstate=($(basename "$i" | sed -e 's/\..*//')) # Extract pure file name ie. /states/game1.sav becomes game1
for j in "${allgames[@]}"; do for j in "${allgames[@]}"; do
currentgame=($(basename "$j" | sed -e 's/\..*//')) # Extract pure file name ie. /roms/snes/game1.zip becomes game1 currentgame=($(basename "$j" | sed -e 's/\..*//')) # Extract pure file name ie. /roms/snes/game1.zip becomes game1
[[ $currentgame == $currentstate ]] && { found=1; break; } # If names match move to next stage, otherwise skip [[ "$currentgame" == "$currentstate" ]] && { found=1; break; } # If names match move to next stage, otherwise skip
done done
[[ -n $found ]] && movefile $j $i || echo "ERROR: No ROM match found for state file" $i | sed -e 's/\^/ /g' >> $migration_logfile # If a match is found, run movefile() otherwise warn user of stranded state file [[ -n "$found" ]] && movefile "$j" "$i" || echo "ERROR: No ROM match found for state file" "$i" | sed -e 's/\^/ /g' >> "$migration_logfile" # If a match is found, run movefile() otherwise warn user of stranded state file
done done
) | ) |
@ -156,18 +156,18 @@ save_migration() {
--no-cancel \ --no-cancel \
--auto-close --auto-close
if [[ $(cat $migration_logfile | grep "ERROR" | wc -l) -eq 0 ]]; then if [[ $(cat "$migration_logfile" | grep "ERROR" | wc -l) -eq 0 ]]; then
rd_zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap \ rd_zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap \
--window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \
--title "RetroDECK" \ --title "RetroDECK" \
--text="The migration process has sorted all of your files automatically.\n\nEverything should be working normally, if you experience any issues please check the RetroDECK wiki or contact us directly on the Discord." --text="The migration process has sorted all of your files automatically.\n\nEverything should be working normally, if you experience any issues please check the RetroDECK wiki or contact us directly on the Discord."
else else
cat $migration_logfile | grep "ERROR" > "$rdhome/manual_sort_needed.log" cat "$migration_logfile" | grep "ERROR" > "$rdhome/manual_sort_needed.log"
rd_zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap \ rd_zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap \
--window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \
--title "RetroDECK" \ --title "RetroDECK" \
--text="The migration process was unable to sort $(cat $migration_logfile | grep "ERROR" | wc -l) files automatically.\n\nThese files will need to be moved manually to their new locations, find more detail on the RetroDECK wiki.\n\nA log of the files that need manual sorting can be found at $rdhome/manual_sort_needed.log" --text="The migration process was unable to sort $(cat "$migration_logfile" | grep "ERROR" | wc -l) files automatically.\n\nThese files will need to be moved manually to their new locations, find more detail on the RetroDECK wiki.\n\nA log of the files that need manual sorting can be found at $rdhome/manual_sort_needed.log"
fi fi
else else

View file

@ -4,11 +4,11 @@ check_network_connectivity() {
# This function will do a basic check for network availability and return "true" if it is working. # This function will do a basic check for network availability and return "true" if it is working.
# USAGE: if [[ $(check_network_connectivity) == "true" ]]; then # USAGE: if [[ $(check_network_connectivity) == "true" ]]; then
if [[ ! -z $(wget --spider -t 1 $remote_network_target_1 | grep "HTTP response 200") ]]; then if [[ ! -z $(wget --spider -t 1 "$remote_network_target_1" | grep "HTTP response 200") ]]; then
local network_connected="true" local network_connected="true"
elif [[ ! -z $(wget --spider -t 1 $remote_network_target_2 | grep "HTTP response 200") ]]; then elif [[ ! -z $(wget --spider -t 1 "$remote_network_target_2" | grep "HTTP response 200") ]]; then
local network_connected="true" local network_connected="true"
elif [[ ! -z $(wget --spider -t 1 $remote_network_target_3 | grep "HTTP response 200") ]]; then elif [[ ! -z $(wget --spider -t 1 "$remote_network_target_3" | grep "HTTP response 200") ]]; then
local network_connected="true" local network_connected="true"
else else
local network_connected="false" local network_connected="false"
@ -21,7 +21,7 @@ check_desktop_mode() {
# This function will do a basic check of if we are running in Steam Deck game mode or not, and return "true" if we are outside of game mode # This function will do a basic check of if we are running in Steam Deck game mode or not, and return "true" if we are outside of game mode
# USAGE: if [[ $(check_desktop_mode) == "true" ]]; then # USAGE: if [[ $(check_desktop_mode) == "true" ]]; then
if [[ ! $XDG_CURRENT_DESKTOP == "gamescope" ]]; then if [[ ! "$XDG_CURRENT_DESKTOP" == "gamescope" ]]; then
echo "true" echo "true"
else else
echo "false" echo "false"
@ -32,7 +32,7 @@ check_is_steam_deck() {
# This function will check the internal product ID for the Steam Deck codename and return "true" if RetroDECK is running on a real Deck # This function will check the internal product ID for the Steam Deck codename and return "true" if RetroDECK is running on a real Deck
# USAGE: if [[ $(check_is_steam_deck) == "true" ]]; then # USAGE: if [[ $(check_is_steam_deck) == "true" ]]; then
if [[ $(cat /sys/devices/virtual/dmi/id/product_name) =~ ^(Jupiter|Galileo)$ ]]; then if [[ $(cat "/sys/devices/virtual/dmi/id/product_name") =~ ^(Jupiter|Galileo)$ ]]; then
echo "true" echo "true"
else else
echo "false" echo "false"
@ -58,7 +58,7 @@ check_for_version_update() {
fi fi
if [[ ! "$update_ignore" == "$online_version" ]]; then if [[ ! "$update_ignore" == "$online_version" ]]; then
if [[ "$update_repo" == "RetroDECK" ]] && [[ $(sed -e 's/[\.a-z]//g' <<< $version) -le $(sed -e 's/[\.a-z]//g' <<< $online_version) ]]; then if [[ "$update_repo" == "RetroDECK" ]] && [[ $(sed -e 's/[\.a-z]//g' <<< "$version") -le $(sed -e 's/[\.a-z]//g' <<< "$online_version") ]]; then
choice=$(rd_zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap --ok-label="OK" --extra-button="Ignore this version" \ choice=$(rd_zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap --ok-label="OK" --extra-button="Ignore this version" \
--window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \
--title "RetroDECK - New Update Available" \ --title "RetroDECK - New Update Available" \
@ -66,7 +66,7 @@ check_for_version_update() {
rc=$? # Capture return code, as "OK" button has no text value rc=$? # Capture return code, as "OK" button has no text value
if [[ $rc == "1" ]]; then # If any button other than "OK" was clicked if [[ $rc == "1" ]]; then # If any button other than "OK" was clicked
log i "Selected: \"OK\"" log i "Selected: \"OK\""
set_setting_value $rd_conf "update_ignore" "$online_version" retrodeck "options" # Store version to ignore for future checks set_setting_value "$rd_conf" "update_ignore" "$online_version" retrodeck "options" # Store version to ignore for future checks
fi fi
elif [[ "$update_repo" == "$cooker_repository_name" ]] && [[ ! $version == $online_version ]]; then elif [[ "$update_repo" == "$cooker_repository_name" ]] && [[ ! $version == $online_version ]]; then
log i "Showing update request dialog as \"$online_version\" was found and is greater then \"$version\"" log i "Showing update request dialog as \"$online_version\" was found and is greater then \"$version\""
@ -78,10 +78,10 @@ check_for_version_update() {
if [[ $rc == "1" ]]; then # If any button other than "Yes" was clicked if [[ $rc == "1" ]]; then # If any button other than "Yes" was clicked
if [[ $choice == "Ignore this version" ]]; then if [[ $choice == "Ignore this version" ]]; then
log i "\"Ignore this version\" selected, updating \"$rd_conf\"" log i "\"Ignore this version\" selected, updating \"$rd_conf\""
set_setting_value $rd_conf "update_ignore" "$online_version" retrodeck "options" # Store version to ignore for future checks. set_setting_value "$rd_conf" "update_ignore" "$online_version" retrodeck "options" # Store version to ignore for future checks.
fi fi
else # User clicked "Yes" else # User clicked "Yes"
install_release $online_version install_release "$online_version"
fi fi
fi fi
fi fi
@ -93,13 +93,13 @@ check_for_version_update() {
validate_input() { validate_input() {
while IFS="^" read -r input action || [[ -n "$input" ]]; while IFS="^" read -r input action || [[ -n "$input" ]];
do do
if [[ ! $input == "#"* ]] && [[ ! -z "$input" ]]; then if [[ ! "$input" == "#"* ]] && [[ ! -z "$input" ]]; then
if [[ "$input" == "$1" ]]; then if [[ "$input" == "$1" ]]; then
eval "$action" eval "$action"
input_validated="true" input_validated="true"
fi fi
fi fi
done < $input_validation done < "$input_validation"
} }
check_version_is_older_than() { check_version_is_older_than() {
@ -135,7 +135,7 @@ fi
# Perform post_update commands for current version if it is a cooker or PR # Perform post_update commands for current version if it is a cooker or PR
if grep -qF "cooker" <<< "$hard_version" || grep -qF "PR" <<< "$hard_version"; then if grep -qF "cooker" <<< "$hard_version" || grep -qF "PR" <<< "$hard_version"; then
# If newly-installed version is a "cooker" or "PR" build, always perform post_update commands for current version # If newly-installed version is a "cooker" or "PR" build, always perform post_update commands for current version
if [[ "$(echo $hard_version | cut -d'-' -f2)" == "$new_version" ]]; then if [[ "$(echo "$hard_version" | cut -d'-' -f2)" == "$new_version" ]]; then
is_newer_version="true" is_newer_version="true"
fi fi
fi fi

View file

@ -63,10 +63,10 @@ find_compatible_compression_format() {
local system=$(echo "$1" | grep -oE "$roms_folder/[^/]+" | grep -oE "[^/]+$") local system=$(echo "$1" | grep -oE "$roms_folder/[^/]+" | grep -oE "[^/]+$")
# Extract the relevant lists from the JSON file # Extract the relevant lists from the JSON file
local chd_systems=$(jq -r '.compression_targets.chd[]' $features) local chd_systems=$(jq -r '.compression_targets.chd[]' "$features")
local rvz_systems=$(jq -r '.compression_targets.rvz[]' $features) local rvz_systems=$(jq -r '.compression_targets.rvz[]' "$features")
local zip_systems=$(jq -r '.compression_targets.zip[]' $features) local zip_systems=$(jq -r '.compression_targets.zip[]' "$features")
local zip_compressable_extensions=$(jq -r '.zip_compressable_extensions[]' $features) local zip_compressable_extensions=$(jq -r '.zip_compressable_extensions[]' "$features")
if [[ $(validate_for_chd "$1") == "true" ]] && echo "$chd_systems" | grep -q "\b$system\b"; then if [[ $(validate_for_chd "$1") == "true" ]] && echo "$chd_systems" | grep -q "\b$system\b"; then
echo "chd" echo "chd"
@ -259,9 +259,9 @@ cli_compress_all_games() {
local compressable_game="" local compressable_game=""
local all_compressable_games=() local all_compressable_games=()
if [[ $compression_format == "all" ]]; then if [[ $compression_format == "all" ]]; then
local compressible_systems_list=$(jq -r '.compression_targets | to_entries[] | .value[]' $features) local compressible_systems_list=$(jq -r '.compression_targets | to_entries[] | .value[]' "$features")
else else
local compressible_systems_list=$(jq -r '.compression_targets["'"$compression_format"'"][]' $features) local compressible_systems_list=$(jq -r '.compression_targets["'"$compression_format"'"][]' "$features")
fi fi
read -p "Do you want to have the original files removed after compression is complete? Please answer y/n and press Enter: " post_compression_cleanup read -p "Do you want to have the original files removed after compression is complete? Please answer y/n and press Enter: " post_compression_cleanup

View file

@ -51,13 +51,13 @@ find_empty_rom_folders() {
} }
configurator_check_multifile_game_structure() { configurator_check_multifile_game_structure() {
local folder_games=($(find $roms_folder -maxdepth 2 -mindepth 2 -type d ! -name "*.m3u" ! -name "*.ps3")) local folder_games=($(find "$roms_folder" -maxdepth 2 -mindepth 2 -type d ! -name "*.m3u" ! -name "*.ps3"))
if [[ ${#folder_games[@]} -gt 1 ]]; then if [[ ${#folder_games[@]} -gt 1 ]]; then
echo "$(find $roms_folder -maxdepth 2 -mindepth 2 -type d ! -name "*.m3u" ! -name "*.ps3")" > $logs_folder/multi_file_games_"$(date +"%Y_%m_%d_%I_%M_%p").log" echo "$(find "$roms_folder" -maxdepth 2 -mindepth 2 -type d ! -name "*.m3u" ! -name "*.ps3")" > "$logs_folder"/multi_file_games_"$(date +"%Y_%m_%d_%I_%M_%p").log"
rd_zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap \ rd_zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap \
--window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \
--title "RetroDECK Configurator - Verify Multi-file Structure" \ --title "RetroDECK Configurator - Verify Multi-file Structure" \
--text="The following games were found to have the incorrect folder structure:\n\n$(find $roms_folder -maxdepth 2 -mindepth 2 -type d ! -name "*.m3u" ! -name "*.ps3")\n\nIncorrect folder structure can result in failure to launch games or saves being in the incorrect location.\n\nPlease see the RetroDECK wiki for more details!\n\nYou can find this list of games in ~/retrodeck/logs" --text="The following games were found to have the incorrect folder structure:\n\n$(find "$roms_folder" -maxdepth 2 -mindepth 2 -type d ! -name "*.m3u" ! -name "*.ps3")\n\nIncorrect folder structure can result in failure to launch games or saves being in the incorrect location.\n\nPlease see the RetroDECK wiki for more details!\n\nYou can find this list of games in ~/retrodeck/logs"
else else
configurator_generic_dialog "RetroDECK Configurator - Verify Multi-file Structure" "No incorrect multi-file game folder structures found." configurator_generic_dialog "RetroDECK Configurator - Verify Multi-file Structure" "No incorrect multi-file game folder structures found."
fi fi

View file

@ -65,7 +65,7 @@ configurator_destination_choice_dialog() {
if [[ $rc == "0" ]] && [[ -z "$choice" ]]; then if [[ $rc == "0" ]] && [[ -z "$choice" ]]; then
echo "Back" echo "Back"
else else
echo $choice echo "$choice"
fi fi
} }
@ -88,7 +88,7 @@ configurator_move_folder_dialog() {
# USAGE: configurator_move_folder_dialog "folder_variable_name" # USAGE: configurator_move_folder_dialog "folder_variable_name"
local rd_dir_name="$1" # The folder variable name from retrodeck.cfg local rd_dir_name="$1" # The folder variable name from retrodeck.cfg
local dir_to_move="$(get_setting_value "$rd_conf" "$rd_dir_name" "retrodeck" "paths")/" # The path of that folder variable local dir_to_move="$(get_setting_value "$rd_conf" "$rd_dir_name" "retrodeck" "paths")/" # The path of that folder variable
local source_root="$(echo $dir_to_move | sed -e 's/\(.*\)\/retrodeck\/.*/\1/')" # The root path of the folder, excluding retrodeck/<folder name>. So /home/deck/retrodeck/roms becomes /home/deck local source_root="$(echo "$dir_to_move" | sed -e 's/\(.*\)\/retrodeck\/.*/\1/')" # The root path of the folder, excluding retrodeck/<folder name>. So /home/deck/retrodeck/roms becomes /home/deck
if [[ ! "$rd_dir_name" == "rdhome" ]]; then # If a sub-folder is being moved, find it's path without the source_root. So /home/deck/retrodeck/roms becomes retrodeck/roms if [[ ! "$rd_dir_name" == "rdhome" ]]; then # If a sub-folder is being moved, find it's path without the source_root. So /home/deck/retrodeck/roms becomes retrodeck/roms
local rd_dir_path="$(echo "$dir_to_move" | sed "s/.*\(retrodeck\/.*\)/\1/; s/\/$//")" local rd_dir_path="$(echo "$dir_to_move" | sed "s/.*\(retrodeck\/.*\)/\1/; s/\/$//")"
else # Otherwise just set the retrodeck root folder else # Otherwise just set the retrodeck root folder
@ -114,7 +114,7 @@ configurator_move_folder_dialog() {
configurator_generic_dialog "RetroDECK Configurator - Move Folder" "The $(basename "$dir_to_move") folder is already at that location, please pick a new one." configurator_generic_dialog "RetroDECK Configurator - Move Folder" "The $(basename "$dir_to_move") folder is already at that location, please pick a new one."
configurator_move_folder_dialog "$rd_dir_name" configurator_move_folder_dialog "$rd_dir_name"
else else
if [[ $(verify_space "$(echo $dir_to_move | sed 's/\/$//')" "$dest_root") ]]; then # Make sure there is enough space at the destination if [[ $(verify_space "$(echo "$dir_to_move" | sed 's/\/$//')" "$dest_root") ]]; then # Make sure there is enough space at the destination
configurator_generic_dialog "RetroDECK Configurator - Move Folder" "Moving $(basename "$dir_to_move") folder to $choice" configurator_generic_dialog "RetroDECK Configurator - Move Folder" "Moving $(basename "$dir_to_move") folder to $choice"
unlink "$dest_root/$rd_dir_path" # In case there is already a symlink at the picked destination unlink "$dest_root/$rd_dir_path" # In case there is already a symlink at the picked destination
move "$dir_to_move" "$dest_root/$rd_dir_path" move "$dir_to_move" "$dest_root/$rd_dir_path"
@ -168,28 +168,28 @@ changelog_dialog() {
log d "Showing changelog dialog" log d "Showing changelog dialog"
if [[ "$1" == "all" ]]; then if [[ "$1" == "all" ]]; then
> "/var/config/retrodeck/changelog-full.xml" > "$XDG_CONFIG_HOME/retrodeck/changelog-full.xml"
for release in $(xml sel -t -m "//component/releases/release" -v "@version" -n $rd_metainfo); do for release in $(xml sel -t -m "//component/releases/release" -v "@version" -n "$rd_metainfo"); do
echo "<h1>RetroDECK v$release</h1>" >> "/var/config/retrodeck/changelog-full.xml" echo "<h1>RetroDECK v$release</h1>" >> "$XDG_CONFIG_HOME/retrodeck/changelog-full.xml"
xml sel -t -m "//component/releases/release[@version='$release']/description" -c . $rd_metainfo | tr -s '\n' | sed 's/^\s*//' >> "/var/config/retrodeck/changelog-full.xml" xml sel -t -m "//component/releases/release[@version='"$release"']/description" -c . "$rd_metainfo" | tr -s '\n' | sed 's/^\s*//' >> "$XDG_CONFIG_HOME/retrodeck/changelog-full.xml"
echo "" >> "/var/config/retrodeck/changelog-full.xml" echo "" >> "$XDG_CONFIG_HOME/retrodeck/changelog-full.xml"
done done
#convert_to_markdown "/var/config/retrodeck/changelog-full.xml" #convert_to_markdown "$XDG_CONFIG_HOME/retrodeck/changelog-full.xml"
rd_zenity --icon-name=net.retrodeck.retrodeck --text-info --width=1200 --height=720 \ rd_zenity --icon-name=net.retrodeck.retrodeck --text-info --width=1200 --height=720 \
--window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \
--title "RetroDECK Changelogs" \ --title "RetroDECK Changelogs" \
--filename="/var/config/retrodeck/changelog-full.xml.md" --filename="$XDG_CONFIG_HOME/retrodeck/changelog-full.xml.md"
else else
xml sel -t -m "//component/releases/release[@version='$1']/description" -c . $rd_metainfo | tr -s '\n' | sed 's/^\s*//' > "/var/config/retrodeck/changelog.xml" xml sel -t -m "//component/releases/release[@version='"$1"']/description" -c . "$rd_metainfo" | tr -s '\n' | sed 's/^\s*//' > "$XDG_CONFIG_HOME/retrodeck/changelog.xml"
convert_to_markdown "/var/config/retrodeck/changelog.xml" convert_to_markdown "$XDG_CONFIG_HOME/retrodeck/changelog.xml"
rd_zenity --icon-name=net.retrodeck.retrodeck --text-info --width=1200 --height=720 \ rd_zenity --icon-name=net.retrodeck.retrodeck --text-info --width=1200 --height=720 \
--window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \
--title "RetroDECK Changelogs" \ --title "RetroDECK Changelogs" \
--filename="/var/config/retrodeck/changelog.xml.md" --filename="$XDG_CONFIG_HOME/retrodeck/changelog.xml.md"
fi fi
} }
@ -204,9 +204,9 @@ get_cheevos_token_dialog() {
--add-password="Password") --add-password="Password")
IFS='^' read -r cheevos_username cheevos_password < <(printf '%s\n' "$cheevos_info") IFS='^' read -r cheevos_username cheevos_password < <(printf '%s\n' "$cheevos_info")
local cheevos_response=$(curl --silent --data "r=login&u=$cheevos_username&p=$cheevos_password" $RA_API_URL) local cheevos_response=$(curl --silent --data "r=login&u=$cheevos_username&p=$cheevos_password" "$RA_API_URL")
local cheevos_success=$(echo $cheevos_response | jq .Success | tr -d '"') local cheevos_success=$(echo "$cheevos_response" | jq .Success | tr -d '"')
local cheevos_token=$(echo $cheevos_response | jq .Token | tr -d '"') local cheevos_token=$(echo "$cheevos_response" | jq .Token | tr -d '"')
local cheevos_login_timestamp=$(date +%s) local cheevos_login_timestamp=$(date +%s)
if [[ "$cheevos_success" == "true" ]]; then if [[ "$cheevos_success" == "true" ]]; then
echo "$cheevos_username,$cheevos_token,$cheevos_login_timestamp" echo "$cheevos_username,$cheevos_token,$cheevos_login_timestamp"
@ -235,7 +235,7 @@ desktop_mode_warning() {
exit 1 exit 1
elif [[ $choice == "Never show this again" ]]; then elif [[ $choice == "Never show this again" ]]; then
log i "Selected: \"Never show this again\"" log i "Selected: \"Never show this again\""
set_setting_value $rd_conf "desktop_mode_warning" "false" retrodeck "options" # Store desktop mode warning variable for future checks set_setting_value "$rd_conf" "desktop_mode_warning" "false" retrodeck "options" # Store desktop mode warning variable for future checks
fi fi
else else
log i "Selected: \"Yes\"" log i "Selected: \"Yes\""
@ -258,7 +258,7 @@ low_space_warning() {
--text="$message") --text="$message")
if [[ $choice == "Never show this again" ]]; then if [[ $choice == "Never show this again" ]]; then
log i "Selected: \"Never show this again\"" log i "Selected: \"Never show this again\""
set_setting_value $rd_conf "low_space_warning" "false" retrodeck "options" # Store low space warning variable for future checks set_setting_value "$rd_conf" "low_space_warning" "false" retrodeck "options" # Store low space warning variable for future checks
fi fi
fi fi
log i "Selected: \"OK\"" log i "Selected: \"OK\""

View file

@ -141,7 +141,7 @@ get_setting_value() {
"dolphin" | "duckstation" | "pcsx2" | "ppsspp" | "primehack" | "xemu" ) # For files with this syntax - setting_name = setting_value "dolphin" | "duckstation" | "pcsx2" | "ppsspp" | "primehack" | "xemu" ) # For files with this syntax - setting_name = setting_value
if [[ -z $current_section_name ]]; then if [[ -z $current_section_name ]]; then
echo $(grep -o -P "(?<=^$current_setting_name = ).*" $1) echo $(grep -o -P "(?<=^$current_setting_name = ).*" "$1")
else else
sed -n -E '\^\['"$current_section_name"'\]^,\^\^'"$current_setting_name"'|\[^{ \^\['"$current_section_name"'\]^! { \^\^'"$current_setting_name"'^ p } }' "$1" | grep -o -P "(?<=^$current_setting_name = ).*" sed -n -E '\^\['"$current_section_name"'\]^,\^\^'"$current_setting_name"'|\[^{ \^\['"$current_section_name"'\]^! { \^\^'"$current_setting_name"'^ p } }' "$1" | grep -o -P "(?<=^$current_setting_name = ).*"
fi fi
@ -337,7 +337,7 @@ generate_single_patch() {
current_setting_name=$(get_setting_name "$escaped_setting_line" "$system") current_setting_name=$(get_setting_name "$escaped_setting_line" "$system")
if [[ (-z $(sed -n -E '\^\['"$current_section"'\]|\b'"$current_section"':$^,\^\b'"$current_setting_name"'\s*?[:=]^{ \^\['"$current_section"'\]|\b'"$current_section"':$^! { \^\b'"$(sed -E 's/^[ \t]*//;' <<< "$escaped_setting_line")"'$^ p } }' "$modified_file")) ]]; then # If the same setting line is not found in the same section of the modified file... if [[ (-z $(sed -n -E '\^\['"$current_section"'\]|\b'"$current_section"':$^,\^\b'"$current_setting_name"'\s*?[:=]^{ \^\['"$current_section"'\]|\b'"$current_section"':$^! { \^\b'"$(sed -E 's/^[ \t]*//;' <<< "$escaped_setting_line")"'$^ p } }' "$modified_file")) ]]; then # If the same setting line is not found in the same section of the modified file...
if [[ ! -z $(sed -n -E '\^\['"$current_section"'\]|\b'"$current_section"':$^,\^\b'"$current_setting_name"'\s*?[:=]^{ \^\['"$current_section"'\]|\b'"$current_section"':$^! { \^\b'"$current_setting_name"'\s*?[:=]^ p } }' "$modified_file") ]]; then # But the setting exists in that section, only with a different value... if [[ ! -z $(sed -n -E '\^\['"$current_section"'\]|\b'"$current_section"':$^,\^\b'"$current_setting_name"'\s*?[:=]^{ \^\['"$current_section"'\]|\b'"$current_section"':$^! { \^\b'"$current_setting_name"'\s*?[:=]^ p } }' "$modified_file") ]]; then # But the setting exists in that section, only with a different value...
new_setting_value=$(get_setting_value "$2" "$current_setting_name" "$system" $current_section) new_setting_value=$(get_setting_value "$2" "$current_setting_name" "$system" "$current_section")
action="change" action="change"
echo $action"^"$current_section"^"$(sed -e 's%\\\\%\\%g' <<< "$current_setting_name")"^"$new_setting_value"^"$system >> "$patch_file" echo $action"^"$current_section"^"$(sed -e 's%\\\\%\\%g' <<< "$current_setting_name")"^"$new_setting_value"^"$system >> "$patch_file"
fi fi
@ -356,7 +356,7 @@ generate_single_patch() {
if [[ (-z $(sed -n -E '\^\s*?\b'"$(sed -E 's/^[ \t]*//' <<< "$escaped_setting_line")"'$^p' "$modified_file")) ]]; then # If the same setting line is not found in the modified file... if [[ (-z $(sed -n -E '\^\s*?\b'"$(sed -E 's/^[ \t]*//' <<< "$escaped_setting_line")"'$^p' "$modified_file")) ]]; then # If the same setting line is not found in the modified file...
current_setting_name=$(get_setting_name "$escaped_setting_line" "$system") current_setting_name=$(get_setting_name "$escaped_setting_line" "$system")
if [[ ! -z $(sed -n -E '\^\s*?\b'"$current_setting_name"'\s*?[:=]^p' "$modified_file") ]]; then # But the setting exists, only with a different value... if [[ ! -z $(sed -n -E '\^\s*?\b'"$current_setting_name"'\s*?[:=]^p' "$modified_file") ]]; then # But the setting exists, only with a different value...
new_setting_value=$(get_setting_value $2 "$current_setting_name" "$system") new_setting_value=$(get_setting_value "$2" "$current_setting_name" "$system")
action="change" action="change"
echo $action"^"$current_section"^"$(sed -e 's%\\\\%\\%g' <<< "$current_setting_name")"^"$new_setting_value"^"$system >> "$patch_file" echo $action"^"$current_section"^"$(sed -e 's%\\\\%\\%g' <<< "$current_setting_name")"^"$new_setting_value"^"$system >> "$patch_file"
fi fi
@ -381,22 +381,22 @@ generate_single_patch() {
if [[ ! -z $(grep -o -P "^\[.+?\]$" <<< "$current_setting_line") || ! -z $(grep -o -P "^\b.+?:$" <<< "$current_setting_line") ]]; then # Capture section header lines if [[ ! -z $(grep -o -P "^\[.+?\]$" <<< "$current_setting_line") || ! -z $(grep -o -P "^\b.+?:$" <<< "$current_setting_line") ]]; then # Capture section header lines
if [[ $current_setting_line =~ ^\[.+\] ]]; then # If normal section line if [[ $current_setting_line =~ ^\[.+\] ]]; then # If normal section line
action="section" action="section"
current_section=$(sed 's^[][]^^g' <<< $current_setting_line) # Remove brackets from section name current_section=$(sed 's^[][]^^g' <<< "$current_setting_line") # Remove brackets from section name
elif [[ ! -z $(grep -o -P "^\b.+?:$" <<< "$current_setting_line") ]]; then # If RPCS3 section name elif [[ ! -z $(grep -o -P "^\b.+?:$" <<< "$current_setting_line") ]]; then # If RPCS3 section name
action="section" action="section"
current_section=$(sed 's^:$^^' <<< $current_setting_line) # Remove colon from section name current_section=$(sed 's^:$^^' <<< "$current_setting_line") # Remove colon from section name
fi fi
elif [[ (! -z $current_section) ]]; then elif [[ (! -z $current_section) ]]; then
current_setting_name=$(get_setting_name "$escaped_setting_line" "$4") current_setting_name=$(get_setting_name "$escaped_setting_line" "$4")
if [[ -z $(sed -n -E '\^\['"$current_section"'\]|\b'"$current_section"':$^,\^\b'"$current_setting_name"'.*^{ \^\['"$current_section"'\]|\b'"$current_section"':$^! { \^\b'"$current_setting_name"'^p } }' $1 ) ]]; then # If setting name is not found in this section of the original file... if [[ -z $(sed -n -E '\^\['"$current_section"'\]|\b'"$current_section"':$^,\^\b'"$current_setting_name"'.*^{ \^\['"$current_section"'\]|\b'"$current_section"':$^! { \^\b'"$current_setting_name"'^p } }' "$1" ) ]]; then # If setting name is not found in this section of the original file...
action="add_setting_line" # TODO: This should include the previous line, so that new lines can be inserted in the correct place rather than at the end. action="add_setting_line" # TODO: This should include the previous line, so that new lines can be inserted in the correct place rather than at the end.
echo $action"^"$current_section"^"$current_setting_line"^^"$4 >> $3 echo $action"^"$current_section"^"$current_setting_line"^^"$4 >> "$3"
fi fi
elif [[ (-z $current_section) ]]; then elif [[ (-z $current_section) ]]; then
current_setting_name=$(get_setting_name "$escaped_setting_line" "$4") current_setting_name=$(get_setting_name "$escaped_setting_line" "$4")
if [[ -z $(sed -n -E '\^\s*?\b'"$current_setting_name"'\s*?[:=]^p' $1) ]]; then # If setting name is not found in the original file... if [[ -z $(sed -n -E '\^\s*?\b'"$current_setting_name"'\s*?[:=]^p' "$1") ]]; then # If setting name is not found in the original file...
action="add_setting_line" # TODO: This should include the previous line, so that new lines can be inserted in the correct place rather than at the end. action="add_setting_line" # TODO: This should include the previous line, so that new lines can be inserted in the correct place rather than at the end.
echo $action"^"$current_section"^"$current_setting_line"^^"$4 >> $3 echo $action"^"$current_section"^"$current_setting_line"^^"$4 >> "$3"
fi fi
fi fi
fi fi

View file

@ -7,7 +7,7 @@
# export LD_LIBRARY_PATH="/app/retrodeck/lib:/app/retrodeck/lib/debug:/app/retrodeck/lib/pkgconfig:$LD_LIBRARY_PATH" # export LD_LIBRARY_PATH="/app/retrodeck/lib:/app/retrodeck/lib/debug:/app/retrodeck/lib/pkgconfig:$LD_LIBRARY_PATH"
: "${logging_level:=info}" # Initializing the log level variable if not already valued, this will be actually red later from the config file : "${logging_level:=info}" # Initializing the log level variable if not already valued, this will be actually red later from the config file
rd_logs_folder="/var/config/retrodeck/logs" # Static location to write all RetroDECK-related logs rd_logs_folder="$XDG_CONFIG_HOME/retrodeck/logs" # Static location to write all RetroDECK-related logs
if [ -h "$rd_logs_folder" ]; then # Check if internal logging folder is already a symlink if [ -h "$rd_logs_folder" ]; then # Check if internal logging folder is already a symlink
if [ ! -e "$rd_logs_folder" ]; then # Check if internal logging folder symlink is broken if [ ! -e "$rd_logs_folder" ]; then # Check if internal logging folder symlink is broken
unlink "$rd_logs_folder" # Remove broken symlink so the folder is recreated when sourcing logger.sh unlink "$rd_logs_folder" # Remove broken symlink so the folder is recreated when sourcing logger.sh
@ -55,21 +55,21 @@ source /app/libexec/run_game.sh
source /app/libexec/steam_sync.sh source /app/libexec/steam_sync.sh
# Static variables # Static variables
rd_conf="/var/config/retrodeck/retrodeck.cfg" # RetroDECK config file path rd_conf="$XDG_CONFIG_HOME/retrodeck/retrodeck.cfg" # RetroDECK config file path
rd_conf_backup="/var/config/retrodeck/retrodeck.bak" # Backup of RetroDECK config file from update rd_conf_backup="$XDG_CONFIG_HOME/retrodeck/retrodeck.bak" # Backup of RetroDECK config file from update
config="/app/retrodeck/config" # folder with all the default emulator configs config="/app/retrodeck/config" # folder with all the default emulator configs
rd_defaults="$config/retrodeck/retrodeck.cfg" # A default RetroDECK config file rd_defaults="$config/retrodeck/retrodeck.cfg" # A default RetroDECK config file
rd_update_patch="/var/config/retrodeck/rd_update.patch" # A static location for the temporary patch file used during retrodeck.cfg updates rd_update_patch="$XDG_CONFIG_HOME/retrodeck/rd_update.patch" # A static location for the temporary patch file used during retrodeck.cfg updates
bios_checklist="$config/retrodeck/reference_lists/bios.json" # A config file listing BIOS file information that can be verified bios_checklist="$config/retrodeck/reference_lists/bios.json" # A config file listing BIOS file information that can be verified
input_validation="$config/retrodeck/reference_lists/input_validation.cfg" # A config file listing valid CLI inputs input_validation="$config/retrodeck/reference_lists/input_validation.cfg" # A config file listing valid CLI inputs
finit_options_list="$config/retrodeck/reference_lists/finit_options_list.cfg" # A config file listing available optional installs during finit finit_options_list="$config/retrodeck/reference_lists/finit_options_list.cfg" # A config file listing available optional installs during finit
splashscreen_dir="/var/config/ES-DE/resources/graphics/extra_splashes" # The default location of extra splash screens splashscreen_dir="$XDG_CONFIG_HOME/ES-DE/resources/graphics/extra_splashes" # The default location of extra splash screens
current_splash_file="/var/config/ES-DE/resources/graphics/splash.svg" # The active splash file that will be shown on boot current_splash_file="$XDG_CONFIG_HOME/ES-DE/resources/graphics/splash.svg" # The active splash file that will be shown on boot
default_splash_file="/var/config/ES-DE/resources/graphics/splash-orig.svg" # The default RetroDECK splash screen default_splash_file="$XDG_CONFIG_HOME/ES-DE/resources/graphics/splash-orig.svg" # The default RetroDECK splash screen
# TODO: instead of this maybe we can iterate the features.json # TODO: instead of this maybe we can iterate the features.json
multi_user_emulator_config_dirs="$config/retrodeck/reference_lists/multi_user_emulator_config_dirs.cfg" # A list of emulator config folders that can be safely linked/unlinked entirely in multi-user mode multi_user_emulator_config_dirs="$config/retrodeck/reference_lists/multi_user_emulator_config_dirs.cfg" # A list of emulator config folders that can be safely linked/unlinked entirely in multi-user mode
rd_es_themes="/app/share/es-de/themes" # The directory where themes packaged with RetroDECK are stored rd_es_themes="/app/share/es-de/themes" # The directory where themes packaged with RetroDECK are stored
lockfile="/var/config/retrodeck/.lock" # Where the lockfile is located lockfile="$XDG_CONFIG_HOME/retrodeck/.lock" # Where the lockfile is located
default_sd="/run/media/mmcblk0p1" # Steam Deck SD default path default_sd="/run/media/mmcblk0p1" # Steam Deck SD default path
hard_version="$(cat '/app/retrodeck/version')" # hardcoded version (in the readonly filesystem) hard_version="$(cat '/app/retrodeck/version')" # hardcoded version (in the readonly filesystem)
rd_repo="https://github.com/RetroDECK/RetroDECK" # The URL of the main RetroDECK GitHub repo rd_repo="https://github.com/RetroDECK/RetroDECK" # The URL of the main RetroDECK GitHub repo
@ -91,84 +91,84 @@ es_find_rules="/app/share/es-de/resources/systems/linux/es_find_rules.xml"
# Godot data transfer temp files # Godot data transfer temp files
godot_bios_files_checked="/var/config/retrodeck/godot/godot_bios_files_checked.tmp" godot_bios_files_checked="$XDG_CONFIG_HOME/retrodeck/godot/godot_bios_files_checked.tmp"
godot_current_preset_settings="/var/config/retrodeck/godot/godot_current_preset_settings.tmp" godot_current_preset_settings="$XDG_CONFIG_HOME/retrodeck/godot/godot_current_preset_settings.tmp"
godot_compression_compatible_games="/var/config/retrodeck/godot/godot_compression_compatible_games.tmp" godot_compression_compatible_games="$XDG_CONFIG_HOME/retrodeck/godot/godot_compression_compatible_games.tmp"
godot_empty_roms_folders="/var/config/retrodeck/godot/godot_empty_roms_folders.tmp" godot_empty_roms_folders="$XDG_CONFIG_HOME/retrodeck/godot/godot_empty_roms_folders.tmp"
# Config files for emulators with single config files # Config files for emulators with single config files
duckstationconf="/var/config/duckstation/settings.ini" duckstationconf="$XDG_CONFIG_HOME/duckstation/settings.ini"
melondsconf="/var/config/melonDS/melonDS.ini" melondsconf="$XDG_CONFIG_HOME/melonDS/melonDS.ini"
ryujinxconf="/var/config/Ryujinx/Config.json" ryujinxconf="$XDG_CONFIG_HOME/Ryujinx/Config.json"
xemuconf="/var/config/xemu/xemu.toml" xemuconf="$XDG_CONFIG_HOME/xemu/xemu.toml"
yuzuconf="/var/config/yuzu/qt-config.ini" yuzuconf="$XDG_CONFIG_HOME/yuzu/qt-config.ini"
citraconf="/var/config/citra-emu/qt-config.ini" citraconf="$XDG_CONFIG_HOME/citra-emu/qt-config.ini"
# ES-DE config files # ES-DE config files
export ESDE_APPDATA_DIR="/var/config/ES-DE" export ESDE_APPDATA_DIR="$XDG_CONFIG_HOME/ES-DE"
es_settings="/var/config/ES-DE/settings/es_settings.xml" es_settings="$XDG_CONFIG_HOME/ES-DE/settings/es_settings.xml"
es_source_logs="/var/config/ES-DE/logs" es_source_logs="$XDG_CONFIG_HOME/ES-DE/logs"
# RetroArch config files # RetroArch config files
raconf="/var/config/retroarch/retroarch.cfg" raconf="$XDG_CONFIG_HOME/retroarch/retroarch.cfg"
ra_core_conf="/var/config/retroarch/retroarch-core-options.cfg" ra_core_conf="$XDG_CONFIG_HOME/retroarch/retroarch-core-options.cfg"
ra_scummvm_conf="/var/config/retroarch/system/scummvm.ini" ra_scummvm_conf="$XDG_CONFIG_HOME/retroarch/system/scummvm.ini"
ra_cores_path="/var/config/retroarch/cores" ra_cores_path="$XDG_CONFIG_HOME/retroarch/cores"
# CEMU config files # CEMU config files
cemuconf="/var/config/Cemu/settings.xml" cemuconf="$XDG_CONFIG_HOME/Cemu/settings.xml"
cemucontrollerconf="/var/config/Cemu/controllerProfiles/controller0.xml" cemucontrollerconf="$XDG_CONFIG_HOME/Cemu/controllerProfiles/controller0.xml"
# Dolphin config files # Dolphin config files
dolphinconf="/var/config/dolphin-emu/Dolphin.ini" dolphinconf="$XDG_CONFIG_HOME/dolphin-emu/Dolphin.ini"
dolphingcpadconf="/var/config/dolphin-emu/GCPadNew.ini" dolphingcpadconf="$XDG_CONFIG_HOME/dolphin-emu/GCPadNew.ini"
dolphingfxconf="/var/config/dolphin-emu/GFX.ini" dolphingfxconf="$XDG_CONFIG_HOME/dolphin-emu/GFX.ini"
dolphinhkconf="/var/config/dolphin-emu/Hotkeys.ini" dolphinhkconf="$XDG_CONFIG_HOME/dolphin-emu/Hotkeys.ini"
dolphinqtconf="/var/config/dolphin-emu/Qt.ini" dolphinqtconf="$XDG_CONFIG_HOME/dolphin-emu/Qt.ini"
dolphinDynamicInputTexturesPath="/var/data/dolphin-emu/Load/DynamicInputTextures" dolphinDynamicInputTexturesPath="$XDG_DATA_HOME/dolphin-emu/Load/DynamicInputTextures"
dolphinCheevosConf="/var/config/dolphin-emu/RetroAchievements.ini" dolphinCheevosConf="$XDG_CONFIG_HOME/dolphin-emu/RetroAchievements.ini"
# PCSX2 config files # PCSX2 config files
pcsx2conf="/var/config/PCSX2/inis/PCSX2.ini" pcsx2conf="$XDG_CONFIG_HOME/PCSX2/inis/PCSX2.ini"
pcsx2gsconf="/var/config/PCSX2/inis/GS.ini" # This file should be deprecated since moving to PCSX2-QT pcsx2gsconf="$XDG_CONFIG_HOME/PCSX2/inis/GS.ini" # This file should be deprecated since moving to PCSX2-QT
pcsx2uiconf="/var/config/PCSX2/inis/PCSX2_ui.ini" # This file should be deprecated since moving to PCSX2-QT pcsx2uiconf="$XDG_CONFIG_HOME/PCSX2/inis/PCSX2_ui.ini" # This file should be deprecated since moving to PCSX2-QT
pcsx2vmconf="/var/config/PCSX2/inis/PCSX2_vm.ini" # This file should be deprecated since moving to PCSX2-QT pcsx2vmconf="$XDG_CONFIG_HOME/PCSX2/inis/PCSX2_vm.ini" # This file should be deprecated since moving to PCSX2-QT
# PPSSPP-SDL config files # PPSSPP-SDL config files
ppssppconf="/var/config/ppsspp/PSP/SYSTEM/ppsspp.ini" ppssppconf="$XDG_CONFIG_HOME/ppsspp/PSP/SYSTEM/ppsspp.ini"
ppssppcontrolsconf="/var/config/ppsspp/PSP/SYSTEM/controls.ini" ppssppcontrolsconf="$XDG_CONFIG_HOME/ppsspp/PSP/SYSTEM/controls.ini"
ppssppcheevosconf="/var/config/ppsspp/PSP/SYSTEM/ppsspp_retroachievements.dat" ppssppcheevosconf="$XDG_CONFIG_HOME/ppsspp/PSP/SYSTEM/ppsspp_retroachievements.dat"
# Primehack config files # Primehack config files
primehackconf="/var/config/primehack/Dolphin.ini" primehackconf="$XDG_CONFIG_HOME/primehack/Dolphin.ini"
primehackgcpadconf="/var/config/primehack/GCPadNew.ini" primehackgcpadconf="$XDG_CONFIG_HOME/primehack/GCPadNew.ini"
primehackgfxconf="/var/config/primehack/GFX.ini" primehackgfxconf="$XDG_CONFIG_HOME/primehack/GFX.ini"
primehackhkconf="/var/config/primehack/Hotkeys.ini" primehackhkconf="$XDG_CONFIG_HOME/primehack/Hotkeys.ini"
primehackqtconf="/var/config/primehack/Qt.ini" primehackqtconf="$XDG_CONFIG_HOME/primehack/Qt.ini"
primehackDynamicInputTexturesPath="/var/data/primehack/Load/DynamicInputTextures" primehackDynamicInputTexturesPath="$XDG_DATA_HOME/primehack/Load/DynamicInputTextures"
# RPCS3 config files # RPCS3 config files
rpcs3conf="/var/config/rpcs3/config.yml" rpcs3conf="$XDG_CONFIG_HOME/rpcs3/config.yml"
rpcs3vfsconf="/var/config/rpcs3/vfs.yml" rpcs3vfsconf="$XDG_CONFIG_HOME/rpcs3/vfs.yml"
# Vita3k config files # Vita3k config files
vita3kconf="/var/config/Vita3K/config.yml" vita3kconf="$XDG_CONFIG_HOME/Vita3K/config.yml"
# MAME-SA config files # MAME-SA config files
mameconf="/var/config/mame/ini/mame.ini" mameconf="$XDG_CONFIG_HOME/mame/ini/mame.ini"
mameuiconf="/var/config/mame/ini/ui.ini" mameuiconf="$XDG_CONFIG_HOME/mame/ini/ui.ini"
mamedefconf="/var/config/mame/cfg/default.cfg" mamedefconf="$XDG_CONFIG_HOME/mame/cfg/default.cfg"
# Initialize logging location if it doesn't exist, before anything else happens # Initialize logging location if it doesn't exist, before anything else happens
if [ ! -d "$rd_logs_folder" ]; then if [ ! -d "$rd_logs_folder" ]; then
@ -176,13 +176,13 @@ if [ ! -d "$rd_logs_folder" ]; then
fi fi
# Initialize location of Godot temp data files, if it doesn't exist # Initialize location of Godot temp data files, if it doesn't exist
if [[ ! -d "/var/config/retrodeck/godot" ]]; then if [[ ! -d "$XDG_CONFIG_HOME/retrodeck/godot" ]]; then
create_dir "/var/config/retrodeck/godot" create_dir "$XDG_CONFIG_HOME/retrodeck/godot"
fi fi
# We moved the lockfile in /var/config/retrodeck in order to solve issue #53 - Remove in a few versions # We moved the lockfile in $XDG_CONFIG_HOME/retrodeck in order to solve issue #53 - Remove in a few versions
if [[ -f "$HOME/retrodeck/.lock" ]]; then if [[ -f "$HOME/retrodeck/.lock" ]]; then
mv "$HOME/retrodeck/.lock" $lockfile mv "$HOME/retrodeck/.lock" "$lockfile"
fi fi
# If there is no config file I initalize the file with the the default values # If there is no config file I initalize the file with the the default values
@ -193,9 +193,9 @@ if [[ ! -f "$rd_conf" ]]; then
# Initializing the variables # Initializing the variables
if [[ -z "$version" ]]; then if [[ -z "$version" ]]; then
if [[ -f "$lockfile" ]]; then if [[ -f "$lockfile" ]]; then
if [[ $(cat $lockfile) == *"0.4."* ]] || [[ $(cat $lockfile) == *"0.3."* ]] || [[ $(cat $lockfile) == *"0.2."* ]] || [[ $(cat $lockfile) == *"0.1."* ]]; then # If the previous version is very out of date, pre-rd_conf if [[ $(cat "$lockfile") == *"0.4."* ]] || [[ $(cat "$lockfile") == *"0.3."* ]] || [[ $(cat "$lockfile") == *"0.2."* ]] || [[ $(cat "$lockfile") == *"0.1."* ]]; then # If the previous version is very out of date, pre-rd_conf
log d "Running version workaround" log d "Running version workaround"
version=$(cat $lockfile) version=$(cat "$lockfile")
fi fi
else else
version="$hard_version" version="$hard_version"
@ -203,28 +203,28 @@ if [[ ! -f "$rd_conf" ]]; then
fi fi
# Check if SD card path has changed from SteamOS update # Check if SD card path has changed from SteamOS update
if [[ ! -d "$default_sd" && "$(ls -A /run/media/deck/)" ]]; then if [[ ! -d "$default_sd" && "$(ls -A "/run/media/deck/")" ]]; then
if [[ $(find /run/media/deck/* -maxdepth 0 -type d -print | wc -l) -eq 1 ]]; then # If there is only one SD card found in the new SteamOS 3.5 location, assign it as the default if [[ $(find "/run/media/deck/"* -maxdepth 0 -type d -print | wc -l) -eq 1 ]]; then # If there is only one SD card found in the new SteamOS 3.5 location, assign it as the default
default_sd="$(find /run/media/deck/* -maxdepth 0 -type d -print)" default_sd="$(find "/run/media/deck/"* -maxdepth 0 -type d -print)"
else # If the default legacy path cannot be found, and there are multiple entries in the new Steam OS 3.5 SD card path, let the user pick which one to use else # If the default legacy path cannot be found, and there are multiple entries in the new Steam OS 3.5 SD card path, let the user pick which one to use
configurator_generic_dialog "RetroDECK Setup" "The SD card was not found in the default location, and multiple drives were detected.\nPlease browse to the location of the desired SD card.\n\nIf you are not using an SD card, please click \"Cancel\"." configurator_generic_dialog "RetroDECK Setup" "The SD card was not found in the default location, and multiple drives were detected.\nPlease browse to the location of the desired SD card.\n\nIf you are not using an SD card, please click \"Cancel\"."
default_sd="$(directory_browse "SD Card Location")" default_sd="$(directory_browse "SD Card Location")"
fi fi
fi fi
cp $rd_defaults $rd_conf # Load default settings file cp "$rd_defaults" "$rd_conf" # Load default settings file
set_setting_value $rd_conf "version" "$version" retrodeck # Set current version for new installs set_setting_value "$rd_conf" "version" "$version" retrodeck # Set current version for new installs
set_setting_value $rd_conf "sdcard" "$default_sd" retrodeck "paths" # Set SD card location if default path has changed set_setting_value "$rd_conf" "sdcard" "$default_sd" retrodeck "paths" # Set SD card location if default path has changed
if grep -qF "cooker" <<< "$hard_version" || grep -qF "PR-" <<< "$hard_version"; then # If newly-installed version is a "cooker" or PR build if grep -qF "cooker" <<< "$hard_version" || grep -qF "PR-" <<< "$hard_version"; then # If newly-installed version is a "cooker" or PR build
set_setting_value $rd_conf "update_repo" "$cooker_repository_name" retrodeck "options" set_setting_value "$rd_conf" "update_repo" "$cooker_repository_name" retrodeck "options"
set_setting_value $rd_conf "update_check" "true" retrodeck "options" set_setting_value "$rd_conf" "update_check" "true" retrodeck "options"
set_setting_value $rd_conf "developer_options" "true" retrodeck "options" set_setting_value "$rd_conf" "developer_options" "true" retrodeck "options"
fi fi
log i "Setting config file permissions" log i "Setting config file permissions"
chmod +rw $rd_conf chmod +rw "$rd_conf"
log i "RetroDECK config file initialized. Contents:\n\n$(cat $rd_conf)\n" log i "RetroDECK config file initialized. Contents:\n\n$(cat "$rd_conf")\n"
conf_read # Load new variables into memory conf_read # Load new variables into memory
#tmplog_merger # This function is tempry(?) removed #tmplog_merger # This function is tempry(?) removed
@ -232,10 +232,10 @@ if [[ ! -f "$rd_conf" ]]; then
else else
log i "Loading RetroDECK config file in $rd_conf" log i "Loading RetroDECK config file in $rd_conf"
if grep -qF "cooker" <<< $hard_version; then # If newly-installed version is a "cooker" build if grep -qF "cooker" <<< "$hard_version"; then # If newly-installed version is a "cooker" build
set_setting_value $rd_conf "update_repo" "$cooker_repository_name" retrodeck "options" set_setting_value "$rd_conf" "update_repo" "$cooker_repository_name" retrodeck "options"
set_setting_value $rd_conf "update_check" "true" retrodeck "options" set_setting_value "$rd_conf" "update_check" "true" retrodeck "options"
set_setting_value $rd_conf "developer_options" "true" retrodeck "options" set_setting_value "$rd_conf" "developer_options" "true" retrodeck "options"
fi fi
conf_read conf_read
@ -244,7 +244,7 @@ else
if [[ ! -d "$rdhome" ]]; then if [[ ! -d "$rdhome" ]]; then
configurator_generic_dialog "RetroDECK Setup" "The RetroDECK data folder was not found in the expected location.\nThis may happen when SteamOS is updated.\n\nPlease browse to the current location of the \"retrodeck\" folder." configurator_generic_dialog "RetroDECK Setup" "The RetroDECK data folder was not found in the expected location.\nThis may happen when SteamOS is updated.\n\nPlease browse to the current location of the \"retrodeck\" folder."
new_home_path=$(directory_browse "RetroDECK folder location") new_home_path=$(directory_browse "RetroDECK folder location")
set_setting_value $rd_conf "rdhome" "$new_home_path" retrodeck "paths" set_setting_value "$rd_conf" "rdhome" "$new_home_path" retrodeck "paths"
conf_read conf_read
#tmplog_merger # This function is tempry(?) removed #tmplog_merger # This function is tempry(?) removed
prepare_component "postmove" "retrodeck" prepare_component "postmove" "retrodeck"
@ -262,6 +262,7 @@ fi
steamsync_folder="$rdhome/.sync" # Folder containing favorites manifest for SRM steamsync_folder="$rdhome/.sync" # Folder containing favorites manifest for SRM
retrodeck_favorites_file="$steamsync_folder/retrodeck_favorites.json" # The current SRM manifest of all games that have been favorited in ES-DE retrodeck_favorites_file="$steamsync_folder/retrodeck_favorites.json" # The current SRM manifest of all games that have been favorited in ES-DE
srm_log="$logs_folder/srm_log.log" # Log file for capturing the output of the most recent SRM run, for debugging purposes srm_log="$logs_folder/srm_log.log" # Log file for capturing the output of the most recent SRM run, for debugging purposes
retrodeck_added_favorites="$steamsync_folder/retrodeck_added_favorites.json" # Temporary manifest of any games that were newly added to the ES-DE favorites and should be added to Steam
retrodeck_removed_favorites="$steamsync_folder/retrodeck_removed_favorites.json" # Temporary manifest of any games that were unfavorited in ES-DE and should be removed from Steam retrodeck_removed_favorites="$steamsync_folder/retrodeck_removed_favorites.json" # Temporary manifest of any games that were unfavorited in ES-DE and should be removed from Steam
export GLOBAL_SOURCED=true export GLOBAL_SOURCED=true

View file

@ -8,11 +8,11 @@ multi_user_set_default_dialog() {
--text="Would you like to set $chosen_user as the default user?\n\nIf the current user cannot be determined from the system, the default will be used.\nThis normally only happens in Desktop Mode.\n\nIf you would like to be asked which user is playing every time, click \"No and don't ask again\"") --text="Would you like to set $chosen_user as the default user?\n\nIf the current user cannot be determined from the system, the default will be used.\nThis normally only happens in Desktop Mode.\n\nIf you would like to be asked which user is playing every time, click \"No and don't ask again\"")
rc=$? # Capture return code, as "Yes" button has no text value rc=$? # Capture return code, as "Yes" button has no text value
if [[ $rc == "1" ]]; then # If any button other than "Yes" was clicked if [[ $rc == "1" ]]; then # If any button other than "Yes" was clicked
if [[ $choice == "No and don't ask again" ]]; then if [[ "$choice" == "No and don't ask again" ]]; then
set_setting_value $rd_conf "ask_default_user" "false" retrodeck "options" set_setting_value "$rd_conf" "ask_default_user" "false" retrodeck "options"
fi fi
else # User clicked "Yes" else # User clicked "Yes"
set_setting_value $rd_conf "default_user" "$chosen_user" retrodeck "options" set_setting_value "$rd_conf" "default_user" "$chosen_user" retrodeck "options"
fi fi
} }
@ -30,7 +30,7 @@ chosen_user=$(rd_zenity \
--column "Steam Username" --print-column=1 \ --column "Steam Username" --print-column=1 \
"${full_userlist[@]}") "${full_userlist[@]}")
if [[ ! -z $chosen_user && -z $default_user && $ask_default_user == "true" ]]; then if [[ ! -z "$chosen_user" && -z "$default_user" && "$ask_default_user" == "true" ]]; then
multi_user_set_default_dialog "$chosen_user" multi_user_set_default_dialog "$chosen_user"
fi fi
echo "$chosen_user" echo "$chosen_user"
@ -48,7 +48,7 @@ multi_user_enable_multi_user_mode() {
rm -rf "$multi_user_data_folder/$SteamAppUser" # Remove stale data after backup rm -rf "$multi_user_data_folder/$SteamAppUser" # Remove stale data after backup
fi fi
fi fi
set_setting_value $rd_conf "multi_user_mode" "true" retrodeck "options" set_setting_value "$rd_conf" "multi_user_mode" "true" retrodeck "options"
multi_user_determine_current_user multi_user_determine_current_user
if [[ -d "$multi_user_data_folder/$SteamAppUser" ]]; then if [[ -d "$multi_user_data_folder/$SteamAppUser" ]]; then
configurator_process_complete_dialog "enabling multi-user support" configurator_process_complete_dialog "enabling multi-user support"
@ -74,7 +74,7 @@ multi_user_disable_multi_user_mode() {
if [[ ! -z "$single_user" ]]; then # Single user was selected if [[ ! -z "$single_user" ]]; then # Single user was selected
multi_user_return_to_single_user "$single_user" multi_user_return_to_single_user "$single_user"
set_setting_value $rd_conf "multi_user_mode" "false" retrodeck "options" set_setting_value "$rd_conf" "multi_user_mode" "false" retrodeck "options"
configurator_process_complete_dialog "disabling multi-user support" configurator_process_complete_dialog "disabling multi-user support"
else else
configurator_generic_dialog "RetroDECK Multi-User Mode" "No single user was selected, please try the process again." configurator_generic_dialog "RetroDECK Multi-User Mode" "No single user was selected, please try the process again."
@ -83,13 +83,13 @@ multi_user_disable_multi_user_mode() {
else else
single_user=$(ls -1 "$multi_user_data_folder") single_user=$(ls -1 "$multi_user_data_folder")
multi_user_return_to_single_user "$single_user" multi_user_return_to_single_user "$single_user"
set_setting_value $rd_conf "multi_user_mode" "false" retrodeck "options" set_setting_value "$rd_conf" "multi_user_mode" "false" retrodeck "options"
configurator_process_complete_dialog "disabling multi-user support" configurator_process_complete_dialog "disabling multi-user support"
fi fi
} }
multi_user_determine_current_user() { multi_user_determine_current_user() {
if [[ $(get_setting_value $rd_conf "multi_user_mode" retrodeck "options") == "true" ]]; then # If multi-user environment is enabled in rd_conf if [[ $(get_setting_value "$rd_conf" "multi_user_mode" retrodeck "options") == "true" ]]; then # If multi-user environment is enabled in rd_conf
if [[ -d "$multi_user_data_folder" ]]; then if [[ -d "$multi_user_data_folder" ]]; then
if [[ ! -z $SteamAppUser ]]; then # If running in Game Mode and this variable exists if [[ ! -z $SteamAppUser ]]; then # If running in Game Mode and this variable exists
if [[ -z $(ls -1 "$multi_user_data_folder" | grep "$SteamAppUser") ]]; then if [[ -z $(ls -1 "$multi_user_data_folder" | grep "$SteamAppUser") ]]; then
@ -99,24 +99,24 @@ multi_user_determine_current_user() {
fi fi
else # Unable to find Steam user ID else # Unable to find Steam user ID
if [[ $(ls -1 "$multi_user_data_folder" | wc -l) -gt 1 ]]; then if [[ $(ls -1 "$multi_user_data_folder" | wc -l) -gt 1 ]]; then
if [[ -z $default_user ]]; then # And a default user is not set if [[ -z "$default_user" ]]; then # And a default user is not set
configurator_generic_dialog "RetroDECK Multi-User Mode" "The current user could not be determined from the system, and there are multiple users registered.\n\nPlease select which user is currently playing in the next dialog." configurator_generic_dialog "RetroDECK Multi-User Mode" "The current user could not be determined from the system, and there are multiple users registered.\n\nPlease select which user is currently playing in the next dialog."
SteamAppUser=$(multi_user_choose_current_user_dialog) SteamAppUser=$(multi_user_choose_current_user_dialog)
if [[ ! -z $SteamAppUser ]]; then # User was chosen from dialog if [[ ! -z "$SteamAppUser" ]]; then # User was chosen from dialog
multi_user_link_current_user_files multi_user_link_current_user_files
else else
configurator_generic_dialog "RetroDECK Multi-User Mode" "No user was chosen, RetroDECK will launch with the files from the user who played most recently." configurator_generic_dialog "RetroDECK Multi-User Mode" "No user was chosen, RetroDECK will launch with the files from the user who played most recently."
fi fi
else # The default user is set else # The default user is set
if [[ ! -z $(ls -1 $multi_user_data_folder | grep "$default_user") ]]; then # Confirm user data folder exists if [[ ! -z $(ls -1 "$multi_user_data_folder" | grep "$default_user") ]]; then # Confirm user data folder exists
SteamAppUser=$default_user SteamAppUser="$default_user"
multi_user_link_current_user_files multi_user_link_current_user_files
else # Default user has no data folder, something may have gone horribly wrong. Setting up as a new user. else # Default user has no data folder, something may have gone horribly wrong. Setting up as a new user.
multi_user_setup_new_user multi_user_setup_new_user
fi fi
fi fi
else # If there is only 1 user in the userlist, default to that user else # If there is only 1 user in the userlist, default to that user
SteamAppUser=$(ls -1 $multi_user_data_folder) SteamAppUser=$(ls -1 "$multi_user_data_folder")
multi_user_link_current_user_files multi_user_link_current_user_files
fi fi
fi fi
@ -134,11 +134,11 @@ multi_user_determine_current_user() {
multi_user_setup_new_user multi_user_setup_new_user
else # But dialog box was blank else # But dialog box was blank
configurator_generic_dialog "RetroDECK Multi-User Mode" "No username was entered, so multi-user data folder cannot be created.\n\nDisabling multi-user mode, please try the process again." configurator_generic_dialog "RetroDECK Multi-User Mode" "No username was entered, so multi-user data folder cannot be created.\n\nDisabling multi-user mode, please try the process again."
set_setting_value $rd_conf "multi_user_mode" "false" retrodeck "options" set_setting_value "$rd_conf" "multi_user_mode" "false" retrodeck "options"
fi fi
else # User clicked "Cancel" else # User clicked "Cancel"
configurator_generic_dialog "RetroDECK Multi-User Mode" "Cancelling multi-user mode activation." configurator_generic_dialog "RetroDECK Multi-User Mode" "Cancelling multi-user mode activation."
set_setting_value $rd_conf "multi_user_mode" "false" retrodeck "options" set_setting_value "$rd_conf" "multi_user_mode" "false" retrodeck "options"
fi fi
fi fi
fi fi
@ -155,16 +155,16 @@ multi_user_return_to_single_user() {
unlink "$rd_conf" unlink "$rd_conf"
mv -f "$multi_user_data_folder/$SteamAppUser/config/retrodeck/retrodeck.cfg" "$rd_conf" mv -f "$multi_user_data_folder/$SteamAppUser/config/retrodeck/retrodeck.cfg" "$rd_conf"
# RetroArch one-offs, because it has so many folders that should be shared between users # RetroArch one-offs, because it has so many folders that should be shared between users
unlink "/var/config/retroarch/retroarch.cfg" unlink "$XDG_CONFIG_HOME/retroarch/retroarch.cfg"
unlink "/var/config/retroarch/retroarch-core-options.cfg" unlink "$XDG_CONFIG_HOME/retroarch/retroarch-core-options.cfg"
mv -f "$multi_user_data_folder/$SteamAppUser/config/retroarch/retroarch.cfg" "/var/config/retroarch/retroarch.cfg" mv -f "$multi_user_data_folder/$SteamAppUser/config/retroarch/retroarch.cfg" "$XDG_CONFIG_HOME/retroarch/retroarch.cfg"
mv -f "$multi_user_data_folder/$SteamAppUser/config/retroarch/retroarch-core-options.cfg" "/var/config/retroarch/retroarch-core-options.cfg" mv -f "$multi_user_data_folder/$SteamAppUser/config/retroarch/retroarch-core-options.cfg" "$XDG_CONFIG_HOME/retroarch/retroarch-core-options.cfg"
# XEMU one-offs, because it stores its config in /var/data, not /var/config like everything else # XEMU one-offs, because it stores its config in $XDG_DATA_HOME, not $XDG_CONFIG_HOME like everything else
unlink "/var/config/xemu" unlink "$XDG_CONFIG_HOME/xemu"
unlink "/var/data/xemu/xemu" unlink "$XDG_DATA_HOME/xemu/xemu"
create_dir "/var/config/xemu" create_dir "$XDG_CONFIG_HOME/xemu"
mv -f "$multi_user_data_folder/$single_user/config/xemu"/{.[!.],}* "/var/config/xemu" mv -f "$multi_user_data_folder/$single_user/config/xemu"/{.[!.],}* "$XDG_CONFIG_HOME/xemu"
dir_prep "/var/config/xemu" "/var/data/xemu/xemu" dir_prep "$XDG_CONFIG_HOME/xemu" "$XDG_DATA_HOME/xemu/xemu"
create_dir "$saves_folder" create_dir "$saves_folder"
create_dir "$states_folder" create_dir "$states_folder"
mv -f "$multi_user_data_folder/$single_user/saves"/{.[!.],}* "$saves_folder" mv -f "$multi_user_data_folder/$single_user/saves"/{.[!.],}* "$saves_folder"
@ -172,9 +172,9 @@ multi_user_return_to_single_user() {
for emu_conf in $(find "$multi_user_data_folder/$single_user/config" -mindepth 1 -maxdepth 1 -type d -printf '%f\n') for emu_conf in $(find "$multi_user_data_folder/$single_user/config" -mindepth 1 -maxdepth 1 -type d -printf '%f\n')
do do
if [[ ! -z $(grep "^$emu_conf$" "$multi_user_emulator_config_dirs") ]]; then if [[ ! -z $(grep "^$emu_conf$" "$multi_user_emulator_config_dirs") ]]; then
unlink "/var/config/$emu_conf" unlink "$XDG_CONFIG_HOME/$emu_conf"
create_dir "/var/config/$emu_conf" create_dir "$XDG_CONFIG_HOME/$emu_conf"
mv -f "$multi_user_data_folder/$single_user/config/$emu_conf"/{.[!.],}* "/var/config/$emu_conf" mv -f "$multi_user_data_folder/$single_user/config/$emu_conf"/{.[!.],}* "$XDG_CONFIG_HOME/$emu_conf"
fi fi
done done
rm -r "$multi_user_data_folder/$single_user" # Should be empty, omitting -f for safety rm -r "$multi_user_data_folder/$single_user" # Should be empty, omitting -f for safety
@ -192,9 +192,9 @@ multi_user_setup_new_user() {
rm -f "$rd_conf" rm -f "$rd_conf"
ln -sfT "$multi_user_data_folder/$SteamAppUser/config/retrodeck/retrodeck.cfg" "$rd_conf" ln -sfT "$multi_user_data_folder/$SteamAppUser/config/retrodeck/retrodeck.cfg" "$rd_conf"
create_dir "$multi_user_data_folder/$SteamAppUser/config/retroarch" create_dir "$multi_user_data_folder/$SteamAppUser/config/retroarch"
if [[ ! -L "/var/config/retroarch/retroarch.cfg" ]]; then if [[ ! -L "$XDG_CONFIG_HOME/retroarch/retroarch.cfg" ]]; then
mv "/var/config/retroarch/retroarch.cfg" "$multi_user_data_folder/$SteamAppUser/config/retroarch/retroarch.cfg" mv "$XDG_CONFIG_HOME/retroarch/retroarch.cfg" "$multi_user_data_folder/$SteamAppUser/config/retroarch/retroarch.cfg"
mv "/var/config/retroarch/retroarch-core-options.cfg" "$multi_user_data_folder/$SteamAppUser/config/retroarch/retroarch-core-options.cfg" mv "$XDG_CONFIG_HOME/retroarch/retroarch-core-options.cfg" "$multi_user_data_folder/$SteamAppUser/config/retroarch/retroarch-core-options.cfg"
else else
cp "$config/retroarch/retroarch.cfg" "$multi_user_data_folder/$SteamAppUser/config/retroarch/retroarch.cfg" cp "$config/retroarch/retroarch.cfg" "$multi_user_data_folder/$SteamAppUser/config/retroarch/retroarch.cfg"
cp "$config/retroarch/retroarch-core-options.cfg" "$multi_user_data_folder/$SteamAppUser/config/retroarch/retroarch-core-options.cfg" cp "$config/retroarch/retroarch-core-options.cfg" "$multi_user_data_folder/$SteamAppUser/config/retroarch/retroarch-core-options.cfg"
@ -202,19 +202,19 @@ multi_user_setup_new_user() {
set_setting_value "$raconf" "savestate_directory" "$states_folder" "retroarch" set_setting_value "$raconf" "savestate_directory" "$states_folder" "retroarch"
set_setting_value "$raconf" "screenshot_directory" "$screenshots_folder" "retroarch" set_setting_value "$raconf" "screenshot_directory" "$screenshots_folder" "retroarch"
fi fi
ln -sfT "$multi_user_data_folder/$SteamAppUser/config/retroarch/retroarch.cfg" "/var/config/retroarch/retroarch.cfg" ln -sfT "$multi_user_data_folder/$SteamAppUser/config/retroarch/retroarch.cfg" "$XDG_CONFIG_HOME/retroarch/retroarch.cfg"
ln -sfT "$multi_user_data_folder/$SteamAppUser/config/retroarch/retroarch-core-options.cfg" "/var/config/retroarch/retroarch-core-options.cfg" ln -sfT "$multi_user_data_folder/$SteamAppUser/config/retroarch/retroarch-core-options.cfg" "$XDG_CONFIG_HOME/retroarch/retroarch-core-options.cfg"
for emu_conf in $(find "/var/config" -mindepth 1 -maxdepth 1 -type l -printf '%f\n') # For all the config folders already linked to a different user for emu_conf in $(find "$XDG_CONFIG_HOME" -mindepth 1 -maxdepth 1 -type l -printf '%f\n') # For all the config folders already linked to a different user
do do
if [[ ! -z $(grep "^$emu_conf$" "$multi_user_emulator_config_dirs") ]]; then if [[ ! -z $(grep "^$emu_conf$" "$multi_user_emulator_config_dirs") ]]; then
unlink "/var/config/$emu_conf" unlink "$XDG_CONFIG_HOME/$emu_conf"
prepare_component "reset" "$emu_conf" prepare_component "reset" "$emu_conf"
fi fi
done done
for emu_conf in $(find "/var/config" -mindepth 1 -maxdepth 1 -type d -printf '%f\n') # For all the currently non-linked config folders, like from a newly-added emulator for emu_conf in $(find "$XDG_CONFIG_HOME" -mindepth 1 -maxdepth 1 -type d -printf '%f\n') # For all the currently non-linked config folders, like from a newly-added emulator
do do
if [[ ! -z $(grep "^$emu_conf$" "$multi_user_emulator_config_dirs") ]]; then if [[ ! -z $(grep "^$emu_conf$" "$multi_user_emulator_config_dirs") ]]; then
dir_prep "$multi_user_data_folder/$SteamAppUser/config/$emu_conf" "/var/config/$emu_conf" dir_prep "$multi_user_data_folder/$SteamAppUser/config/$emu_conf" "$XDG_CONFIG_HOME/$emu_conf"
fi fi
done done
} }
@ -224,22 +224,22 @@ multi_user_link_current_user_files() {
ln -sfT "$multi_user_data_folder/$SteamAppUser/saves" "$saves_folder" ln -sfT "$multi_user_data_folder/$SteamAppUser/saves" "$saves_folder"
ln -sfT "$multi_user_data_folder/$SteamAppUser/states" "$states_folder" ln -sfT "$multi_user_data_folder/$SteamAppUser/states" "$states_folder"
ln -sfT "$multi_user_data_folder/$SteamAppUser/config/retrodeck/retrodeck.cfg" "$rd_conf" ln -sfT "$multi_user_data_folder/$SteamAppUser/config/retrodeck/retrodeck.cfg" "$rd_conf"
ln -sfT "$multi_user_data_folder/$SteamAppUser/config/retroarch/retroarch.cfg" "/var/config/retroarch/retroarch.cfg" ln -sfT "$multi_user_data_folder/$SteamAppUser/config/retroarch/retroarch.cfg" "$XDG_CONFIG_HOME/retroarch/retroarch.cfg"
ln -sfT "$multi_user_data_folder/$SteamAppUser/config/retroarch/retroarch-core-options.cfg" "/var/config/retroarch/retroarch-core-options.cfg" ln -sfT "$multi_user_data_folder/$SteamAppUser/config/retroarch/retroarch-core-options.cfg" "$XDG_CONFIG_HOME/retroarch/retroarch-core-options.cfg"
for emu_conf in $(find "/var/config" -mindepth 1 -maxdepth 1 -type d -printf '%f\n') # Find any new emulator config folders from last time this user played for emu_conf in $(find "$XDG_CONFIG_HOME" -mindepth 1 -maxdepth 1 -type d -printf '%f\n') # Find any new emulator config folders from last time this user played
do do
if [[ ! -z $(grep "^$emu_conf$" "$multi_user_emulator_config_dirs") ]]; then if [[ ! -z $(grep "^$emu_conf$" "$multi_user_emulator_config_dirs") ]]; then
dir_prep "$multi_user_data_folder/$SteamAppUser/config/$emu_conf" "/var/config/$emu_conf" dir_prep "$multi_user_data_folder/$SteamAppUser/config/$emu_conf" "$XDG_CONFIG_HOME/$emu_conf"
fi fi
done done
for emu_conf in $(find "/var/config" -mindepth 1 -maxdepth 1 -type l -printf '%f\n') for emu_conf in $(find "$XDG_CONFIG_HOME" -mindepth 1 -maxdepth 1 -type l -printf '%f\n')
do do
if [[ ! -z $(grep "^$emu_conf$" "$multi_user_emulator_config_dirs") ]]; then if [[ ! -z $(grep "^$emu_conf$" "$multi_user_emulator_config_dirs") ]]; then
if [[ -d "$multi_user_data_folder/$SteamAppUser/config/$emu_conf" ]]; then # If the current user already has a config folder for this emulator if [[ -d "$multi_user_data_folder/$SteamAppUser/config/$emu_conf" ]]; then # If the current user already has a config folder for this emulator
ln -sfT "$multi_user_data_folder/$SteamAppUser/config/$emu_conf" "retrodeck/config/$emu_conf" ln -sfT "$multi_user_data_folder/$SteamAppUser/config/$emu_conf" "retrodeck/config/$emu_conf"
else # If the current user doesn't have a config folder for this emulator, init it and then link it else # If the current user doesn't have a config folder for this emulator, init it and then link it
prepare_component "reset" "$emu_conf" prepare_component "reset" "$emu_conf"
dir_prep "$multi_user_data_folder/$SteamAppUser/config/$emu_conf" "/var/config/$emu_conf" dir_prep "$multi_user_data_folder/$SteamAppUser/config/$emu_conf" "$XDG_CONFIG_HOME/$emu_conf"
fi fi
fi fi
done done

View file

@ -80,8 +80,8 @@ move() {
# Function to move a directory from one parent to another # Function to move a directory from one parent to another
# USAGE: move $source_dir $dest_dir # USAGE: move $source_dir $dest_dir
source_dir="$(echo $1 | sed 's![^/]$!&/!')" # Add trailing slash if it is missing source_dir="$(echo "$1" | sed 's![^/]$!&/!')" # Add trailing slash if it is missing
dest_dir="$(echo $2 | sed 's![^/]$!&/!')" # Add trailing slash if it is missing dest_dir="$(echo "$2" | sed 's![^/]$!&/!')" # Add trailing slash if it is missing
log d "Moving \"$source_dir\" to \"$dest_dir\"" log d "Moving \"$source_dir\" to \"$dest_dir\""
@ -147,17 +147,17 @@ update_rd_conf() {
# STAGE 1: For current files that haven't been broken into sections yet, where every setting name is unique # STAGE 1: For current files that haven't been broken into sections yet, where every setting name is unique
conf_read # Read current settings into memory conf_read # Read current settings into memory
mv -f $rd_conf $rd_conf_backup # Backup config file before update mv -f "$rd_conf" "$rd_conf_backup" # Backup config file before update
cp $rd_defaults $rd_conf # Copy defaults file into place cp "$rd_defaults" "$rd_conf" # Copy defaults file into place
conf_write # Write old values into new retrodeck.cfg file conf_write # Write old values into new retrodeck.cfg file
# STAGE 2: To handle presets sections that use duplicate setting names # STAGE 2: To handle presets sections that use duplicate setting names
generate_single_patch $rd_defaults $rd_conf_backup $rd_update_patch retrodeck # Create a patch file for differences between defaults and current user settings generate_single_patch "$rd_defaults" "$rd_conf_backup" "$rd_update_patch" retrodeck # Create a patch file for differences between defaults and current user settings
sed -i '/change^^version/d' $rd_update_patch # Remove version line from temporary patch file sed -i '/change^^version/d' "$rd_update_patch" # Remove version line from temporary patch file
deploy_single_patch $rd_defaults $rd_update_patch $rd_conf # Re-apply user settings to defaults file deploy_single_patch "$rd_defaults" "$rd_update_patch" "$rd_conf" # Re-apply user settings to defaults file
set_setting_value $rd_conf "version" "$hard_version" retrodeck # Set version of currently running RetroDECK to updated retrodeck.cfg set_setting_value "$rd_conf" "version" "$hard_version" retrodeck # Set version of currently running RetroDECK to updated retrodeck.cfg
rm -f $rd_update_patch # Cleanup temporary patch file rm -f "$rd_update_patch" # Cleanup temporary patch file
conf_read # Read all settings into memory conf_read # Read all settings into memory
# STAGE 3: Create new folders that were added to the shipped retrodeck.cfg, if any # STAGE 3: Create new folders that were added to the shipped retrodeck.cfg, if any
@ -196,13 +196,13 @@ update_rd_conf() {
"\(.key):\(.value)", "\(.key):\(.value)",
"\(.value):\(.key)" "\(.value):\(.key)"
] | join("\n") ] | join("\n")
' $features) ' "$features")
while IFS= read -r current_setting_line # Read the existing retrodeck.cfg while IFS= read -r current_setting_line # Read the existing retrodeck.cfg
do do
if [[ (! -z "$current_setting_line") && (! "$current_setting_line" == "#"*) && (! "$current_setting_line" == "[]") ]]; then # If the line has a valid entry in it if [[ (! -z "$current_setting_line") && (! "$current_setting_line" == "#"*) && (! "$current_setting_line" == "[]") ]]; then # If the line has a valid entry in it
if [[ ! -z $(grep -o -P "^\[.+?\]$" <<< "$current_setting_line") ]]; then # If the line is a section header if [[ ! -z $(grep -o -P "^\[.+?\]$" <<< "$current_setting_line") ]]; then # If the line is a section header
local current_section=$(sed 's^[][]^^g' <<< $current_setting_line) # Remove brackets from section name local current_section=$(sed 's^[][]^^g' <<< "$current_setting_line") # Remove brackets from section name
else else
if [[ ! ("$current_section" == "" || "$current_section" == "paths" || "$current_section" == "options" || "$current_section" == "cheevos" || "$current_section" == "cheevos_hardcore") ]]; then if [[ ! ("$current_section" == "" || "$current_section" == "paths" || "$current_section" == "options" || "$current_section" == "cheevos" || "$current_section" == "cheevos_hardcore") ]]; then
local system_name=$(get_setting_name "$current_setting_line" "retrodeck") # Read the variable name from the current line local system_name=$(get_setting_name "$current_setting_line" "retrodeck") # Read the variable name from the current line
@ -220,7 +220,7 @@ update_rd_conf() {
fi fi
fi fi
fi fi
done < $rd_conf done < "$rd_conf"
} }
conf_read() { conf_read() {
@ -252,7 +252,7 @@ conf_write() {
do do
if [[ (! -z "$current_setting_line") && (! "$current_setting_line" == "#"*) && (! "$current_setting_line" == "[]") ]]; then # If the line has a valid entry in it if [[ (! -z "$current_setting_line") && (! "$current_setting_line" == "#"*) && (! "$current_setting_line" == "[]") ]]; then # If the line has a valid entry in it
if [[ ! -z $(grep -o -P "^\[.+?\]$" <<< "$current_setting_line") ]]; then # If the line is a section header if [[ ! -z $(grep -o -P "^\[.+?\]$" <<< "$current_setting_line") ]]; then # If the line is a section header
local current_section=$(sed 's^[][]^^g' <<< $current_setting_line) # Remove brackets from section name local current_section=$(sed 's^[][]^^g' <<< "$current_setting_line") # Remove brackets from section name
else else
if [[ "$current_section" == "" || "$current_section" == "paths" || "$current_section" == "options" ]]; then if [[ "$current_section" == "" || "$current_section" == "paths" || "$current_section" == "options" ]]; then
local current_setting_name=$(get_setting_name "$current_setting_line" "retrodeck") # Read the variable name from the current line local current_setting_name=$(get_setting_name "$current_setting_line" "retrodeck") # Read the variable name from the current line
@ -264,7 +264,7 @@ conf_write() {
fi fi
fi fi
fi fi
done < $rd_conf done < "$rd_conf"
log d "retrodeck.cfg written" log d "retrodeck.cfg written"
} }
@ -335,7 +335,7 @@ rd_zenity() {
unset CONFIGURATOR_GUI unset CONFIGURATOR_GUI
return $status return "$status"
} }
update_rpcs3_firmware() { update_rpcs3_firmware() {
@ -359,7 +359,7 @@ backup_retrodeck_userdata() {
# The function can also do a "core" backup of all the very important userdata files (like saves, states and gamelists) or a "custom" backup of only specified paths # The function can also do a "core" backup of all the very important userdata files (like saves, states and gamelists) or a "custom" backup of only specified paths
# The function can take both folder names as defined in retrodeck.cfg or full paths as arguments for folders to backup # The function can take both folder names as defined in retrodeck.cfg or full paths as arguments for folders to backup
# It will also validate that all the provided paths exist and that there is enough free space to perform the backup before actually proceeding. # It will also validate that all the provided paths exist and that there is enough free space to perform the backup before actually proceeding.
# It will also rotate backups so that there are only 3 maximum of each type (standard or custom) # It will also rotate backups so that there are only 3 maximum of each type (complete, core or custom)
# USAGE: backup_retrodeck_userdata complete # USAGE: backup_retrodeck_userdata complete
# backup_retrodeck_userdata core # backup_retrodeck_userdata core
# backup_retrodeck_userdata custom saves_folder states_folder /some/other/path # backup_retrodeck_userdata custom saves_folder states_folder /some/other/path
@ -377,8 +377,8 @@ backup_retrodeck_userdata() {
if [[ "$CONFIGURATOR_GUI" == "zenity" ]]; then if [[ "$CONFIGURATOR_GUI" == "zenity" ]]; then
configurator_generic_dialog "RetroDECK Userdata Backup" "No valid backup option chosen. Valid options are <standard> and <custom>." configurator_generic_dialog "RetroDECK Userdata Backup" "No valid backup option chosen. Valid options are <standard> and <custom>."
fi fi
log e "No valid backup option chosen. Valid options are <standard> and <custom>." log e "No valid backup option chosen. Valid options are <complete>, <core> and <custom>."
exit 1 return 1
fi fi
zip_file="$backups_folder/retrodeck_${backup_date}_${backup_type}.zip" zip_file="$backups_folder/retrodeck_${backup_date}_${backup_type}.zip"
@ -394,7 +394,7 @@ backup_retrodeck_userdata() {
local current_setting_value=$(get_setting_value "$rd_conf" "$current_setting_name" "retrodeck" "paths") local current_setting_value=$(get_setting_value "$rd_conf" "$current_setting_name" "retrodeck" "paths")
config_paths["$current_setting_name"]="$current_setting_value" config_paths["$current_setting_name"]="$current_setting_value"
fi fi
done < <(grep -v '^\s*$' $rd_conf | awk '/^\[paths\]/{f=1;next} /^\[/{f=0} f') done < <(grep -v '^\s*$' "$rd_conf" | awk '/^\[paths\]/{f=1;next} /^\[/{f=0} f')
# Determine which paths to backup # Determine which paths to backup
if [[ "$backup_type" == "complete" ]]; then if [[ "$backup_type" == "complete" ]]; then
@ -553,7 +553,7 @@ backup_retrodeck_userdata() {
path_size=$(du -sk "$path" 2>/dev/null | cut -f1) # Get size in KB path_size=$(du -sk "$path" 2>/dev/null | cut -f1) # Get size in KB
path_size=$((path_size * 1024)) # Convert to bytes for calculation path_size=$((path_size * 1024)) # Convert to bytes for calculation
total_size=$((total_size + path_size)) total_size=$((total_size + path_size))
echo "$total_size" > $total_size_file echo "$total_size" > "$total_size_file"
fi fi
done done
) | ) |
@ -578,15 +578,15 @@ backup_retrodeck_userdata() {
available_space=$(df -B1 "$backups_folder" | awk 'NR==2 {print $4}') available_space=$(df -B1 "$backups_folder" | awk 'NR==2 {print $4}')
# Log sizes for reference # Log sizes for reference
log i "Total size of backup data: $(numfmt --to=iec-i --suffix=B $total_size)" log i "Total size of backup data: $(numfmt --to=iec-i --suffix=B "$total_size")"
log i "Available space at destination: $(numfmt --to=iec-i --suffix=B $available_space)" log i "Available space at destination: $(numfmt --to=iec-i --suffix=B "$available_space")"
# Check if we have enough space (using uncompressed size as a conservative estimate) # Check if we have enough space (using uncompressed size as a conservative estimate)
if [[ "$available_space" -lt "$total_size" ]]; then if [[ "$available_space" -lt "$total_size" ]]; then
if [[ "$CONFIGURATOR_GUI" == "zenity" ]]; then if [[ "$CONFIGURATOR_GUI" == "zenity" ]]; then
configurator_generic_dialog "RetroDECK Userdata Backup" "There is not enough free space to perform this backup.\n\nYou need at least $(numfmt --to=iec-i --suffix=B $total_size),\nplease free up some space and try again." configurator_generic_dialog "RetroDECK Userdata Backup" "There is not enough free space to perform this backup.\n\nYou need at least $(numfmt --to=iec-i --suffix=B "$total_size"),\nplease free up some space and try again."
fi fi
log e "Error: Not enough space to perform backup. Need at least $(numfmt --to=iec-i --suffix=B $total_size)" log e "Error: Not enough space to perform backup. Need at least $(numfmt --to=iec-i --suffix=B "$total_size")"
return 1 return 1
fi fi
@ -853,9 +853,9 @@ install_retrodeck_starterpack() {
## DOOM section ## ## DOOM section ##
cp /app/retrodeck/extras/doom1.wad "$roms_folder/doom/doom1.wad" # No -f in case the user already has it cp /app/retrodeck/extras/doom1.wad "$roms_folder/doom/doom1.wad" # No -f in case the user already has it
create_dir "/var/config/ES-DE/gamelists/doom" create_dir "$XDG_CONFIG_HOME/ES-DE/gamelists/doom"
if [[ ! -f "/var/config/ES-DE/gamelists/doom/gamelist.xml" ]]; then # Don't overwrite an existing gamelist if [[ ! -f "$XDG_CONFIG_HOME/ES-DE/gamelists/doom/gamelist.xml" ]]; then # Don't overwrite an existing gamelist
cp "/app/retrodeck/rd_prepacks/doom/gamelist.xml" "/var/config/ES-DE/gamelists/doom/gamelist.xml" cp "/app/retrodeck/rd_prepacks/doom/gamelist.xml" "$XDG_CONFIG_HOME/ES-DE/gamelists/doom/gamelist.xml"
fi fi
create_dir "$media_folder/doom" create_dir "$media_folder/doom"
unzip -oq "/app/retrodeck/rd_prepacks/doom/doom.zip" -d "$media_folder/doom/" unzip -oq "/app/retrodeck/rd_prepacks/doom/doom.zip" -d "$media_folder/doom/"
@ -893,8 +893,8 @@ update_splashscreens() {
log i "Updating splash screen" log i "Updating splash screen"
rm -rf /var/config/ES-DE/resources/graphics rm -rf "$XDG_CONFIG_HOME/ES-DE/resources/graphics"
rsync -rlD --mkpath "/app/retrodeck/graphics/" "/var/config/ES-DE/resources/graphics/" rsync -rlD --mkpath "/app/retrodeck/graphics/" "$XDG_CONFIG_HOME/ES-DE/resources/graphics/"
} }
@ -930,7 +930,7 @@ splash_screen() {
($current_day | tonumber) <= (.value.end_date | tonumber) and ($current_day | tonumber) <= (.value.end_date | tonumber) and
($current_time | tonumber) >= (.value.start_time | tonumber) and ($current_time | tonumber) >= (.value.start_time | tonumber) and
($current_time | tonumber) <= (.value.end_time | tonumber) ($current_time | tonumber) <= (.value.end_time | tonumber)
) | .value.filename' $features) ) | .value.filename' "$features")
# Determine the splash file to use # Determine the splash file to use
if [[ -n "$splash_screen" ]]; then if [[ -n "$splash_screen" ]]; then
@ -972,7 +972,7 @@ install_release() {
mkdir -p "$rdhome/RetroDECK_Updates" mkdir -p "$rdhome/RetroDECK_Updates"
# Download the flatpak file # Download the flatpak file
wget -P "$rdhome/RetroDECK_Updates" $flatpak_url -O "$rdhome/RetroDECK_Updates/RetroDECK$iscooker.flatpak" wget -P "$rdhome/RetroDECK_Updates" "$flatpak_url" -O "$rdhome/RetroDECK_Updates/RetroDECK$iscooker.flatpak"
# Check if the download was successful # Check if the download was successful
if [[ $? -ne 0 ]]; then if [[ $? -ne 0 ]]; then
@ -1012,13 +1012,13 @@ ponzu() {
local executable local executable
# if the binaries are found, ponzu should be set as true into the retrodeck config # if the binaries are found, ponzu should be set as true into the retrodeck config
if [ -f "/var/data/ponzu/Citra/bin/citra-qt" ]; then if [ -f "$XDG_DATA_HOME/ponzu/Citra/bin/citra-qt" ]; then
log d "Citra binaries has already been installed, checking for updates and forcing the setting as true." log d "Citra binaries has already been installed, checking for updates and forcing the setting as true."
set_setting_value $rd_conf "akai_ponzu" "true" retrodeck "options" set_setting_value "$rd_conf" "akai_ponzu" "true" retrodeck "options"
fi fi
if [ -f "/var/data/ponzu/Yuzu/bin/yuzu" ]; then if [ -f "$XDG_DATA_HOME/ponzu/Yuzu/bin/yuzu" ]; then
log d "Yuzu binaries has already been installed, checking for updates and forcing the setting as true." log d "Yuzu binaries has already been installed, checking for updates and forcing the setting as true."
set_setting_value $rd_conf "kiroi_ponzu" "true" retrodeck "options" set_setting_value "$rd_conf" "kiroi_ponzu" "true" retrodeck "options"
fi fi
# Loop through all ponzu files # Loop through all ponzu files
@ -1027,11 +1027,11 @@ ponzu() {
if [ -f "$ponzu_file" ]; then if [ -f "$ponzu_file" ]; then
if [[ "$ponzu_file" == *itra* ]]; then if [[ "$ponzu_file" == *itra* ]]; then
log i "Found akai ponzu! Elaborating it" log i "Found akai ponzu! Elaborating it"
data_dir="/var/data/ponzu/Citra" data_dir="$XDG_DATA_HOME/ponzu/Citra"
local message="Akai ponzu is served, enjoy" local message="Akai ponzu is served, enjoy"
elif [[ "$ponzu_file" == *uzu* ]]; then elif [[ "$ponzu_file" == *uzu* ]]; then
log i "Found kiroi ponzu! Elaborating it" log i "Found kiroi ponzu! Elaborating it"
data_dir="/var/data/ponzu/Yuzu" data_dir="$XDG_DATA_HOME/ponzu/Yuzu"
local message="Kiroi ponzu is served, enjoy" local message="Kiroi ponzu is served, enjoy"
else else
log e "AppImage not recognized, not a ponzu ingredient!" log e "AppImage not recognized, not a ponzu ingredient!"
@ -1059,14 +1059,14 @@ ponzu() {
chmod +x "$executable" chmod +x "$executable"
chmod +x "$executable-qt" chmod +x "$executable-qt"
prepare_component "reset" "citra" prepare_component "reset" "citra"
set_setting_value $rd_conf "akai_ponzu" "true" retrodeck "options" set_setting_value "$rd_conf" "akai_ponzu" "true" retrodeck "options"
elif [[ "$ponzu_file" == *uzu* ]]; then elif [[ "$ponzu_file" == *uzu* ]]; then
mv "$tmp_folder/usr/"** . mv "$tmp_folder/usr/"** .
executable="$data_dir/bin/yuzu" executable="$data_dir/bin/yuzu"
log d "Making $executable executable" log d "Making $executable executable"
chmod +x "$executable" chmod +x "$executable"
prepare_component "reset" "yuzu" prepare_component "reset" "yuzu"
set_setting_value $rd_conf "kiroi_ponzu" "true" retrodeck "options" set_setting_value "$rd_conf" "kiroi_ponzu" "true" retrodeck "options"
fi fi
cd - cd -
@ -1084,15 +1084,15 @@ ponzu_remove() {
if [[ "$1" == "citra" ]]; then if [[ "$1" == "citra" ]]; then
if [[ $(configurator_generic_question_dialog "Ponzu - Remove Citra" "Do you really want to remove Citra binaries?\n\nYour games and saves will not be deleted.") == "true" ]]; then if [[ $(configurator_generic_question_dialog "Ponzu - Remove Citra" "Do you really want to remove Citra binaries?\n\nYour games and saves will not be deleted.") == "true" ]]; then
log i "Ponzu: removing Citra" log i "Ponzu: removing Citra"
rm -rf "/var/data/ponzu/Citra" rm -rf "$XDG_DATA_HOME/ponzu/Citra"
set_setting_value $rd_conf "akai_ponzu" "false" retrodeck "options" set_setting_value "$rd_conf" "akai_ponzu" "false" retrodeck "options"
configurator_generic_dialog "Ponzu - Remove Citra" "Done, Citra is now removed from RetroDECK" configurator_generic_dialog "Ponzu - Remove Citra" "Done, Citra is now removed from RetroDECK"
fi fi
elif [[ "$1" == "yuzu" ]]; then elif [[ "$1" == "yuzu" ]]; then
if [[ $(configurator_generic_question_dialog "Ponzu - Remove Yuzu" "Do you really want to remove Yuzu binaries?\n\nYour games and saves will not be deleted.") == "true" ]]; then if [[ $(configurator_generic_question_dialog "Ponzu - Remove Yuzu" "Do you really want to remove Yuzu binaries?\n\nYour games and saves will not be deleted.") == "true" ]]; then
log i "Ponzu: removing Yuzu" log i "Ponzu: removing Yuzu"
rm -rf "/var/data/ponzu/Yuzu" rm -rf "$XDG_DATA_HOME/ponzu/Yuzu"
set_setting_value $rd_conf "kiroi_ponzu" "false" retrodeck "options" set_setting_value "$rd_conf" "kiroi_ponzu" "false" retrodeck "options"
configurator_generic_dialog "Ponzu - Remove Yuzu" "Done, Yuzu is now removed from RetroDECK" configurator_generic_dialog "Ponzu - Remove Yuzu" "Done, Yuzu is now removed from RetroDECK"
fi fi
else else
@ -1115,7 +1115,7 @@ release_selector() {
# Fetch the main release from the RetroDECK repository # Fetch the main release from the RetroDECK repository
log d "Fetching latest main release from GitHub API for repository RetroDECK" log d "Fetching latest main release from GitHub API for repository RetroDECK"
local main_release=$(curl -s https://api.github.com/repos/$git_organization_name/RetroDECK/releases/latest) local main_release=$(curl -s "https://api.github.com/repos/$git_organization_name/RetroDECK/releases/latest")
if [[ -z "$main_release" ]]; then if [[ -z "$main_release" ]]; then
log e "Failed to fetch the main release" log e "Failed to fetch the main release"
@ -1134,7 +1134,7 @@ release_selector() {
local release_array=("Main Release" "$main_tag_name" "$main_human_readable_date") local release_array=("Main Release" "$main_tag_name" "$main_human_readable_date")
# Fetch all releases (including draft and pre-release) from the Cooker repository # Fetch all releases (including draft and pre-release) from the Cooker repository
local releases=$(curl -s https://api.github.com/repos/$git_organization_name/$cooker_repository_name/releases?per_page=100) local releases=$(curl -s "https://api.github.com/repos/$git_organization_name/$cooker_repository_name/releases?per_page=100")
if [[ -z "$releases" ]]; then if [[ -z "$releases" ]]; then
log e "Failed to fetch releases or no releases available" log e "Failed to fetch releases or no releases available"
@ -1220,16 +1220,16 @@ release_selector() {
log d "User confirmed installation of release $selected_tag" log d "User confirmed installation of release $selected_tag"
if echo "$selected_release" | grep -q "Main Release"; then if echo "$selected_release" | grep -q "Main Release"; then
set_setting_value $rd_conf "update_repo" "$main_repository_name" retrodeck "options" set_setting_value "$rd_conf" "update_repo" "$main_repository_name" retrodeck "options"
log i "Switching to main channel" log i "Switching to main channel"
else else
set_setting_value $rd_conf "update_repo" "$cooker_repository_name" retrodeck "options" set_setting_value "$rd_conf" "update_repo" "$cooker_repository_name" retrodeck "options"
log i "Switching to cooker channel" log i "Switching to cooker channel"
fi fi
set_setting_value "$rd_conf" "branch" "$selected_branch" "retrodeck" "options" set_setting_value "$rd_conf" "branch" "$selected_branch" "retrodeck" "options"
log d "Set branch to $selected_branch in configuration" log d "Set branch to $selected_branch in configuration"
install_release $selected_tag install_release "$selected_tag"
else else
log d "User canceled installation" log d "User canceled installation"
@ -1294,21 +1294,21 @@ retroarch_updater(){
log i "Running RetroArch updater" log i "Running RetroArch updater"
# Synchronize cores from the application share directory to the RetroArch cores directory # Synchronize cores from the application share directory to the RetroArch cores directory
rsync -rlD --mkpath "/app/share/libretro/cores/" "/var/config/retroarch/cores/" && log d "RetroArch cores updated correctly" rsync -rlD --mkpath "/app/share/libretro/cores/" "$XDG_CONFIG_HOME/retroarch/cores/" && log d "RetroArch cores updated correctly"
# Synchronize border overlays from the RetroDeck configuration directory to the RetroArch overlays directory # Synchronize border overlays from the RetroDeck configuration directory to the RetroArch overlays directory
rsync -rlD --mkpath "/app/retrodeck/config/retroarch/borders/" "/var/config/retroarch/overlays/borders/" && log d "RetroArch overlays and borders updated correctly" rsync -rlD --mkpath "/app/retrodeck/config/retroarch/borders/" "$XDG_CONFIG_HOME/retroarch/overlays/borders/" && log d "RetroArch overlays and borders updated correctly"
} }
portmaster_show(){ portmaster_show(){
log d "Setting PortMaster visibility in ES-DE" log d "Setting PortMaster visibility in ES-DE"
if [ "$1" = "true" ]; then if [ "$1" = "true" ]; then
log d "\"$roms_folder/portmaster/PortMaster.sh\" is not found, installing it" log d "\"$roms_folder/portmaster/PortMaster.sh\" is not found, installing it"
install -Dm755 "/var/data/PortMaster/PortMaster.sh" "$roms_folder/portmaster/PortMaster.sh" && log d "PortMaster is correctly showing in ES-DE" install -Dm755 "$XDG_DATA_HOME/PortMaster/PortMaster.sh" "$roms_folder/portmaster/PortMaster.sh" && log d "PortMaster is correctly showing in ES-DE"
set_setting_value $rd_conf "portmaster_show" "true" retrodeck "options" set_setting_value "$rd_conf" "portmaster_show" "true" retrodeck "options"
elif [ "$1" = "false" ]; then elif [ "$1" = "false" ]; then
rm -rf "$roms_folder/portmaster/PortMaster.sh" && log d "PortMaster is correctly hidden in ES-DE" rm -rf "$roms_folder/portmaster/PortMaster.sh" && log d "PortMaster is correctly hidden in ES-DE"
set_setting_value $rd_conf "portmaster_show" "false" retrodeck "options" set_setting_value "$rd_conf" "portmaster_show" "false" retrodeck "options"
else else
log e "\"$1\" is not a valid choice, quitting" log e "\"$1\" is not a valid choice, quitting"
fi fi
@ -1430,7 +1430,7 @@ repair_paths() {
fi fi
fi fi
fi fi
done < <(grep -v '^\s*$' $rd_conf | awk '/^\[paths\]/{f=1;next} /^\[/{f=0} f') done < <(grep -v '^\s*$' "$rd_conf" | awk '/^\[paths\]/{f=1;next} /^\[/{f=0} f')
if [[ $invalid_path_found == "true" ]]; then if [[ $invalid_path_found == "true" ]]; then
log i "One or more invalid paths repaired, fixing internal RetroDECK structures" log i "One or more invalid paths repaired, fixing internal RetroDECK structures"

View file

@ -21,7 +21,7 @@ run_and_check() {
fi fi
# Run command with timeout # Run command with timeout
timeout -s TERM $TIMEOUT $full_cmd timeout -s TERM $TIMEOUT "$full_cmd"
local exit_code=$? local exit_code=$?
# Log the results # Log the results

View file

@ -13,7 +13,7 @@ post_update() {
# Optional userdata backup prior to update # Optional userdata backup prior to update
choice=$(rd_zenity --title "RetroDECK Update - Backup Userdata" --info --no-wrap --ok-label="No Backup" --extra-button"Backup Core Userdata" --extra-button="Backup Some Userdata" --extra-button="Backup All Userdata" \ choice=$(rd_zenity --title "RetroDECK Update - Backup Userdata" --info --no-wrap --ok-label="No Backup" --extra-button="Backup Core Userdata" --extra-button="Backup Some Userdata" --extra-button="Backup All Userdata" \
--window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" --text="Would you like to backup some or all of the RetroDECK userdata prior to update?\n\nIf you choose \"Backup Core Userdata\" only irreplaceable files (like saves, states and gamelists) will be backed up. If you choose \"Backup Some Userdata\" you will be given a choice of which folders to backup.\n\nIf you choose \"Backup All Userdata\" then ALL data (including ROMs and downloaded media) will be backed up.\nPLEASE NOTE: A full backup may take up a large amount of space, especially if you have a lot of scraped media.") --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" --text="Would you like to backup some or all of the RetroDECK userdata prior to update?\n\nIf you choose \"Backup Core Userdata\" only irreplaceable files (like saves, states and gamelists) will be backed up. If you choose \"Backup Some Userdata\" you will be given a choice of which folders to backup.\n\nIf you choose \"Backup All Userdata\" then ALL data (including ROMs and downloaded media) will be backed up.\nPLEASE NOTE: A full backup may take up a large amount of space, especially if you have a lot of scraped media.")
local rc=$? local rc=$?
@ -23,7 +23,13 @@ post_update() {
case $choice in case $choice in
"Backup Core Userdata" ) "Backup Core Userdata" )
log i "User chose to backup core userdata prior to update." log i "User chose to backup core userdata prior to update."
backup_retrodeck_userdata "core" if ! backup_retrodeck_userdata "core"; then
log d "Userdata backup failed, giving option to proceed"
if [[ $(configurator_generic_question_dialog "RetroDECK Update" "Unfortunately the userdata backup process was not successful.\nWould you like to proceed with the upgrade anyway?\n\nRetroDECK will exit if you choose \"No\"") == "false" ]]; then
log d "User chose to stop post_update process after backup failure"
exit 1
fi
fi
;; ;;
"Backup Some Userdata" ) "Backup Some Userdata" )
log i "User chose to backup some userdata prior to update." log i "User chose to backup some userdata prior to update."
@ -34,7 +40,7 @@ post_update() {
local current_setting_value=$(get_setting_value "$rd_conf" "$current_setting_name" "retrodeck" "paths") local current_setting_value=$(get_setting_value "$rd_conf" "$current_setting_name" "retrodeck" "paths")
compressible_paths=("${compressible_paths[@]}" "false" "$current_setting_name" "$current_setting_value") compressible_paths=("${compressible_paths[@]}" "false" "$current_setting_name" "$current_setting_value")
fi fi
done < <(grep -v '^\s*$' $rd_conf | awk '/^\[paths\]/{f=1;next} /^\[/{f=0} f') done < <(grep -v '^\s*$' "$rd_conf" | awk '/^\[paths\]/{f=1;next} /^\[/{f=0} f')
choice=$(rd_zenity \ choice=$(rd_zenity \
--list --width=1200 --height=720 \ --list --width=1200 --height=720 \
@ -50,11 +56,23 @@ post_update() {
choices=() # Expand choice string into passable array choices=() # Expand choice string into passable array
IFS='^' read -ra choices <<< "$choice" IFS='^' read -ra choices <<< "$choice"
backup_retrodeck_userdata "custom" "${choices[@]}" # Expand array of choices into individual arguments if ! backup_retrodeck_userdata "custom" "${choices[@]}"; then # Expand array of choices into individual arguments
log d "Userdata backup failed, giving option to proceed"
if [[ $(configurator_generic_question_dialog "RetroDECK Update" "Unfortunately the userdata backup process was not successful.\nWould you like to proceed with the upgrade anyway?\n\nRetroDECK will exit if you choose \"No\"") == "false" ]]; then
log d "User chose to stop post_update process after backup failure"
exit 1
fi
fi
;; ;;
"Backup All Userdata" ) "Backup All Userdata" )
log i "User chose to backup all userdata prior to update." log i "User chose to backup all userdata prior to update."
backup_retrodeck_userdata "complete" if ! backup_retrodeck_userdata "complete"; then
log d "Userdata backup failed, giving option to proceed"
if [[ $(configurator_generic_question_dialog "RetroDECK Update" "Unfortunately the userdata backup process was not successful.\nWould you like to proceed with the upgrade anyway?\n\nRetroDECK will exit if you choose \"No\"") == "false" ]]; then
log d "User chose to stop post_update process after backup failure"
exit 1
fi
fi
;; ;;
esac esac
fi fi
@ -74,11 +92,11 @@ post_update() {
# - Duckstation save and state locations were dir_prep'd to the rdhome/save and /state folders, which was not previously done. Much safer now! # - Duckstation save and state locations were dir_prep'd to the rdhome/save and /state folders, which was not previously done. Much safer now!
# - Fix PICO-8 folder structure. ROM and save folders are now sane and binary files will go into ~/retrodeck/bios/pico-8/ # - Fix PICO-8 folder structure. ROM and save folders are now sane and binary files will go into ~/retrodeck/bios/pico-8/
rm -rf /var/config/primehack # Purge old Primehack config files. Saves are safe as they are linked into /var/data/primehack. rm -rf "$XDG_CONFIG_HOME/primehack" # Purge old Primehack config files. Saves are safe as they are linked into $XDG_DATA_HOME/primehack.
prepare_component "reset" "primehack" prepare_component "reset" "primehack"
dir_prep "$rdhome/saves/duckstation" "/var/data/duckstation/memcards" dir_prep "$rdhome/saves/duckstation" "$XDG_DATA_HOME/duckstation/memcards"
dir_prep "$rdhome/states/duckstation" "/var/data/duckstation/savestates" dir_prep "$rdhome/states/duckstation" "$XDG_DATA_HOME/duckstation/savestates"
mv "$bios_folder/pico8" "$bios_folder/pico8_olddata" # Move legacy (and incorrect / non-functional ) PICO-8 location for future cleanup / less confusion mv "$bios_folder/pico8" "$bios_folder/pico8_olddata" # Move legacy (and incorrect / non-functional ) PICO-8 location for future cleanup / less confusion
dir_prep "$bios_folder/pico-8" "$HOME/.lexaloffle/pico-8" # Store binary and config files together. The .lexaloffle directory is a hard-coded location for the PICO-8 config file, cannot be changed dir_prep "$bios_folder/pico-8" "$HOME/.lexaloffle/pico-8" # Store binary and config files together. The .lexaloffle directory is a hard-coded location for the PICO-8 config file, cannot be changed
@ -91,21 +109,21 @@ post_update() {
# - Fix symlink to hard-coded PICO-8 config folder (dir_prep doesn't like ~) # - Fix symlink to hard-coded PICO-8 config folder (dir_prep doesn't like ~)
# - Overwrite Citra and Yuzu configs, as controller mapping was broken due to emulator updates. # - Overwrite Citra and Yuzu configs, as controller mapping was broken due to emulator updates.
dir_prep "$rdhome/states/dolphin" "/var/data/dolphin-emu/StateSaves" dir_prep "$rdhome/states/dolphin" "$XDG_DATA_HOME/dolphin-emu/StateSaves"
dir_prep "$rdhome/states/primehack" "/var/data/primehack/StateSaves" dir_prep "$rdhome/states/primehack" "$XDG_DATA_HOME/primehack/StateSaves"
rm -rf "$HOME/~/" # Remove old incorrect location from 0.6.2b rm -rf "$HOME/~/" # Remove old incorrect location from 0.6.2b
rm -f "$HOME/.lexaloffle/pico-8" # Remove old symlink to prevent recursion rm -f "$HOME/.lexaloffle/pico-8" # Remove old symlink to prevent recursion
dir_prep "$bios_folder/pico-8" "$HOME/.lexaloffle/pico-8" # Store binary and config files together. The .lexaloffle directory is a hard-coded location for the PICO-8 config file, cannot be changed dir_prep "$bios_folder/pico-8" "$HOME/.lexaloffle/pico-8" # Store binary and config files together. The .lexaloffle directory is a hard-coded location for the PICO-8 config file, cannot be changed
dir_prep "$saves_folder/pico-8" "$bios_folder/pico-8/cdata" # PICO-8 saves folder structure was backwards, fixing for consistency. dir_prep "$saves_folder/pico-8" "$bios_folder/pico-8/cdata" # PICO-8 saves folder structure was backwards, fixing for consistency.
cp -f "$config/citra/qt-config.ini" /var/config/citra-emu/qt-config.ini cp -f "$config/citra/qt-config.ini" "$XDG_CONFIG_HOME/citra-emu/qt-config.ini"
sed -i 's#RETRODECKHOMEDIR#'$rdhome'#g' /var/config/citra-emu/qt-config.ini sed -i 's#RETRODECKHOMEDIR#'"$rdhome"'#g' "$XDG_CONFIG_HOME/citra-emu/qt-config.ini"
cp -fr "$config/yuzu/"* /var/config/yuzu/ cp -fr "$config/yuzu/"* "$XDG_CONFIG_HOME/yuzu/"
sed -i 's#RETRODECKHOMEDIR#'$rdhome'#g' /var/config/yuzu/qt-config.ini sed -i 's#RETRODECKHOMEDIR#'"$rdhome"'#g' "$XDG_CONFIG_HOME/yuzu/qt-config.ini"
# Remove unneeded tools folder, as location has changed to RO space # Remove unneeded tools folder, as location has changed to RO space
rm -rfv /var/config/retrodeck/tools/ rm -rfv "$XDG_CONFIG_HOME/retrodeck/tools/"
fi fi
if [[ $(check_version_is_older_than "$version_being_updated" "0.6.4b") == "true" ]]; then if [[ $(check_version_is_older_than "$version_being_updated" "0.6.4b") == "true" ]]; then
# In version 0.6.4b, the following changes were made: # In version 0.6.4b, the following changes were made:
@ -119,12 +137,12 @@ post_update() {
# In version 0.6.5b, the following changes were made: # In version 0.6.5b, the following changes were made:
# Change Yuzu GPU accuracy to normal for better performance # Change Yuzu GPU accuracy to normal for better performance
set_setting_value $yuzuconf "gpu_accuracy" "0" "yuzu" "Renderer" set_setting_value "$yuzuconf" "gpu_accuracy" "0" "yuzu" "Renderer"
fi fi
if [[ $(check_version_is_older_than "$version_being_updated" "0.7.0b") == "true" ]]; then if [[ $(check_version_is_older_than "$version_being_updated" "0.7.0b") == "true" ]]; then
# In version 0.7.0b, the following changes were made that required config file updates/reset or other changes to the filesystem: # In version 0.7.0b, the following changes were made that required config file updates/reset or other changes to the filesystem:
# - Update retrodeck.cfg and set new paths to $rdhome by default # - Update retrodeck.cfg and set new paths to $rdhome by default
# - Update PCSX2 and Duckstation configs to latest templates (to accomadate RetroAchievements feature) and move Duckstation config folder from /var/data to /var/config # - Update PCSX2 and Duckstation configs to latest templates (to accomadate RetroAchievements feature) and move Duckstation config folder from $XDG_DATA_HOME to $XDG_CONFIG_HOME
# - New ~/retrodeck/mods and ~/retrodeck/texture_packs directories are added and symlinked to multiple different emulators (where supported) # - New ~/retrodeck/mods and ~/retrodeck/texture_packs directories are added and symlinked to multiple different emulators (where supported)
# - Expose ES-DE gamelists folder to user at ~/retrodeck/gamelists # - Expose ES-DE gamelists folder to user at ~/retrodeck/gamelists
# - Copy new borders into RA config location # - Copy new borders into RA config location
@ -144,52 +162,52 @@ post_update() {
# - Init PICO-8 as it has newly-shipped config files # - Init PICO-8 as it has newly-shipped config files
update_rd_conf # Expand retrodeck.cfg to latest template update_rd_conf # Expand retrodeck.cfg to latest template
set_setting_value $rd_conf "screenshots_folder" "$rdhome/screenshots" set_setting_value "$rd_conf" "screenshots_folder" "$rdhome/screenshots"
set_setting_value $rd_conf "mods_folder" "$rdhome/mods" set_setting_value "$rd_conf" "mods_folder" "$rdhome/mods"
set_setting_value $rd_conf "texture_packs_folder" "$rdhome/texture_packs" set_setting_value "$rd_conf" "texture_packs_folder" "$rdhome/texture_packs"
set_setting_value $rd_conf "borders_folder" "$rdhome/borders" set_setting_value "$rd_conf" "borders_folder" "$rdhome/borders"
conf_read conf_read
mv -f "$pcsx2conf" "$pcsx2conf.bak" mv -f "$pcsx2conf" "$pcsx2conf.bak"
generate_single_patch "$config/PCSX2/PCSX2.ini" "$pcsx2conf.bak" "/var/config/PCSX2/inis/PCSX2-cheevos-upgrade.patch" pcsx2 generate_single_patch "$config/PCSX2/PCSX2.ini" "$pcsx2conf.bak" "$XDG_CONFIG_HOME/PCSX2/inis/PCSX2-cheevos-upgrade.patch" pcsx2
deploy_single_patch "$config/PCSX2/PCSX2.ini" "/var/config/PCSX2/inis/PCSX2-cheevos-upgrade.patch" "$pcsx2conf" deploy_single_patch "$config/PCSX2/PCSX2.ini" "$XDG_CONFIG_HOME/PCSX2/inis/PCSX2-cheevos-upgrade.patch" "$pcsx2conf"
rm -f "/var/config/PCSX2/inis/PCSX2-cheevos-upgrade.patch" rm -f "$XDG_CONFIG_HOME/PCSX2/inis/PCSX2-cheevos-upgrade.patch"
dir_prep "/var/config/duckstation" "/var/data/duckstation" dir_prep "$XDG_CONFIG_HOME/duckstation" "$XDG_DATA_HOME/duckstation"
mv -f "$duckstationconf" "$duckstationconf.bak" mv -f "$duckstationconf" "$duckstationconf.bak"
generate_single_patch "$config/duckstation/settings.ini" "$duckstationconf.bak" "/var/config/duckstation/duckstation-cheevos-upgrade.patch" pcsx2 generate_single_patch "$config/duckstation/settings.ini" "$duckstationconf.bak" "$XDG_CONFIG_HOME/duckstation/duckstation-cheevos-upgrade.patch" pcsx2
deploy_single_patch "$config/duckstation/settings.ini" "/var/config/duckstation/duckstation-cheevos-upgrade.patch" "$duckstationconf" deploy_single_patch "$config/duckstation/settings.ini" "$XDG_CONFIG_HOME/duckstation/duckstation-cheevos-upgrade.patch" "$duckstationconf"
rm -f "/var/config/duckstation/duckstation-cheevos-upgrade.patch" rm -f "$XDG_CONFIG_HOME/duckstation/duckstation-cheevos-upgrade.patch"
create_dir "$mods_folder" create_dir "$mods_folder"
create_dir "$texture_packs_folder" create_dir "$texture_packs_folder"
create_dir "$borders_folder" create_dir "$borders_folder"
dir_prep "$mods_folder/Primehack" "/var/data/primehack/Load/GraphicMods" dir_prep "$mods_folder/Primehack" "$XDG_DATA_HOME/primehack/Load/GraphicMods"
dir_prep "$texture_packs_folder/Primehack" "/var/data/primehack/Load/Textures" dir_prep "$texture_packs_folder/Primehack" "$XDG_DATA_HOME/primehack/Load/Textures"
dir_prep "$mods_folder/Dolphin" "/var/data/dolphin-emu/Load/GraphicMods" dir_prep "$mods_folder/Dolphin" "$XDG_DATA_HOME/dolphin-emu/Load/GraphicMods"
dir_prep "$texture_packs_folder/Dolphin" "/var/data/dolphin-emu/Load/Textures" dir_prep "$texture_packs_folder/Dolphin" "$XDG_DATA_HOME/dolphin-emu/Load/Textures"
dir_prep "$mods_folder/Citra" "/var/data/citra-emu/load/mods" dir_prep "$mods_folder/Citra" "$XDG_DATA_HOME/citra-emu/load/mods"
dir_prep "$texture_packs_folder/Citra" "/var/data/citra-emu/load/textures" dir_prep "$texture_packs_folder/Citra" "$XDG_DATA_HOME/citra-emu/load/textures"
dir_prep "$mods_folder/Yuzu" "/var/data/yuzu/load" dir_prep "$mods_folder/Yuzu" "$XDG_DATA_HOME/yuzu/load"
dir_prep "$texture_packs_folder/RetroArch-Mesen" "/var/config/retroarch/system/HdPacks" dir_prep "$texture_packs_folder/RetroArch-Mesen" "$XDG_CONFIG_HOME/retroarch/system/HdPacks"
dir_prep "$texture_packs_folder/PPSSPP" "/var/config/ppsspp/PSP/TEXTURES" dir_prep "$texture_packs_folder/PPSSPP" "$XDG_CONFIG_HOME/ppsspp/PSP/TEXTURES"
dir_prep "$texture_packs_folder/PCSX2" "/var/config/PCSX2/textures" dir_prep "$texture_packs_folder/PCSX2" "$XDG_CONFIG_HOME/PCSX2/textures"
dir_prep "$texture_packs_folder/RetroArch-Mupen64Plus/cache" "/var/config/retroarch/system/Mupen64plus/cache" dir_prep "$texture_packs_folder/RetroArch-Mupen64Plus/cache" "$XDG_CONFIG_HOME/retroarch/system/Mupen64plus/cache"
dir_prep "$texture_packs_folder/RetroArch-Mupen64Plus/hires_texture" "/var/config/retroarch/system/Mupen64plus/hires_texture" dir_prep "$texture_packs_folder/RetroArch-Mupen64Plus/hires_texture" "$XDG_CONFIG_HOME/retroarch/system/Mupen64plus/hires_texture"
dir_prep "$texture_packs_folder/Duckstation" "/var/config/duckstation/textures" dir_prep "$texture_packs_folder/Duckstation" "$XDG_CONFIG_HOME/duckstation/textures"
dir_prep "$rdhome/gamelists" "/var/config/emulationstation/ES-DE/gamelists" dir_prep "$rdhome/gamelists" "$XDG_CONFIG_HOME/emulationstation/ES-DE/gamelists"
dir_prep "$borders_folder" "/var/config/retroarch/overlays/borders" dir_prep "$borders_folder" "$XDG_CONFIG_HOME/retroarch/overlays/borders"
rsync -rlD --mkpath "/app/retrodeck/config/retroarch/borders/" "/var/config/retroarch/overlays/borders/" rsync -rlD --mkpath "/app/retrodeck/config/retroarch/borders/" "$XDG_CONFIG_HOME/retroarch/overlays/borders/"
rsync -rlD --mkpath "$config/retrodeck/presets/remaps/" "/var/config/retroarch/config/remaps/" rsync -rlD --mkpath "$config/retrodeck/presets/remaps/" "$XDG_CONFIG_HOME/retroarch/config/remaps/"
if [[ ! -f "$bios_folder/capsimg.so" ]]; then if [[ ! -f "$bios_folder/capsimg.so" ]]; then
cp -f "/app/retrodeck/extras/Amiga/capsimg.so" "$bios_folder/capsimg.so" cp -f "/app/retrodeck/extras/Amiga/capsimg.so" "$bios_folder/capsimg.so"
fi fi
cp -f $config/rpcs3/vfs.yml /var/config/rpcs3/vfs.yml cp -f "$config/rpcs3/vfs.yml" "$XDG_CONFIG_HOME/rpcs3/vfs.yml"
sed -i 's^\^$(EmulatorDir): .*^$(EmulatorDir): '"$bios_folder/rpcs3/"'^' "$rpcs3vfsconf" sed -i 's^\^$(EmulatorDir): .*^$(EmulatorDir): '"$bios_folder/rpcs3/"'^' "$rpcs3vfsconf"
set_setting_value "$rpcs3vfsconf" "/games/" "$roms_folder/ps3/" "rpcs3" set_setting_value "$rpcs3vfsconf" "/games/" "$roms_folder/ps3/" "rpcs3"
if [[ -d "$roms_folder/ps3/emudir" ]]; then # The old location exists, meaning the emulator was run at least once. if [[ -d "$roms_folder/ps3/emudir" ]]; then # The old location exists, meaning the emulator was run at least once.
@ -207,7 +225,7 @@ post_update() {
create_dir "$bios_folder/rpcs3/dev_usb000" create_dir "$bios_folder/rpcs3/dev_usb000"
dir_prep "$bios_folder/rpcs3/dev_hdd0/home/00000001/savedata" "$saves_folder/ps3/rpcs3" dir_prep "$bios_folder/rpcs3/dev_hdd0/home/00000001/savedata" "$saves_folder/ps3/rpcs3"
set_setting_value $es_settings "ApplicationUpdaterFrequency" "never" "es_settings" set_setting_value "$es_settings" "ApplicationUpdaterFrequency" "never" "es_settings"
if [[ -f "$saves_folder/duckstation/shared_card_1.mcd" || -f "$saves_folder/duckstation/shared_card_2.mcd" ]]; then if [[ -f "$saves_folder/duckstation/shared_card_1.mcd" || -f "$saves_folder/duckstation/shared_card_2.mcd" ]]; then
configurator_generic_dialog "RetroDECK 0.7.0b Upgrade" "As part of this update, the location of saves and states for Duckstation has been changed.\n\nYour files will be moved automatically, and can now be found at\n\n~.../saves/psx/duckstation/memcards/\nand\n~.../states/psx/duckstation/" configurator_generic_dialog "RetroDECK 0.7.0b Upgrade" "As part of this update, the location of saves and states for Duckstation has been changed.\n\nYour files will be moved automatically, and can now be found at\n\n~.../saves/psx/duckstation/memcards/\nand\n~.../states/psx/duckstation/"
@ -215,42 +233,42 @@ post_update() {
create_dir "$saves_folder/psx/duckstation/memcards" create_dir "$saves_folder/psx/duckstation/memcards"
mv "$saves_folder/duckstation/"* "$saves_folder/psx/duckstation/memcards/" mv "$saves_folder/duckstation/"* "$saves_folder/psx/duckstation/memcards/"
rmdir "$saves_folder/duckstation" # File-safe folder cleanup rmdir "$saves_folder/duckstation" # File-safe folder cleanup
unlink "/var/config/duckstation/memcards" unlink "$XDG_CONFIG_HOME/duckstation/memcards"
set_setting_value "$duckstationconf" "Card1Path" "$saves_folder/psx/duckstation/memcards/shared_card_1.mcd" "duckstation" "MemoryCards" set_setting_value "$duckstationconf" "Card1Path" "$saves_folder/psx/duckstation/memcards/shared_card_1.mcd" "duckstation" "MemoryCards"
set_setting_value "$duckstationconf" "Card2Path" "$saves_folder/psx/duckstation/memcards/shared_card_2.mcd" "duckstation" "MemoryCards" set_setting_value "$duckstationconf" "Card2Path" "$saves_folder/psx/duckstation/memcards/shared_card_2.mcd" "duckstation" "MemoryCards"
set_setting_value "$duckstationconf" "Directory" "$saves_folder/psx/duckstation/memcards" "duckstation" "MemoryCards" set_setting_value "$duckstationconf" "Directory" "$saves_folder/psx/duckstation/memcards" "duckstation" "MemoryCards"
set_setting_value "$duckstationconf" "RecursivePaths" "$roms_folder/psx" "duckstation" "GameList" set_setting_value "$duckstationconf" "RecursivePaths" "$roms_folder/psx" "duckstation" "GameList"
create_dir "$states_folder/psx" create_dir "$states_folder/psx"
mv -t "$states_folder/psx/" "$states_folder/duckstation" mv -t "$states_folder/psx/" "$states_folder/duckstation"
unlink "/var/config/duckstation/savestates" unlink "$XDG_CONFIG_HOME/duckstation/savestates"
dir_prep "$states_folder/psx/duckstation" "/var/config/duckstation/savestates" dir_prep "$states_folder/psx/duckstation" "$XDG_CONFIG_HOME/duckstation/savestates"
rm -rf /var/config/retrodeck/tools rm -rf "$XDG_CONFIG_HOME/retrodeck/tools"
rm -rf /var/config/emulationstation/ES-DE/gamelists/tools/ rm -rf "$XDG_CONFIG_HOME/emulationstation/ES-DE/gamelists/tools/"
mv "$saves_folder/gc/dolphin/EUR" "$saves_folder/gc/dolphin/EU" mv "$saves_folder/gc/dolphin/EUR" "$saves_folder/gc/dolphin/EU"
mv "$saves_folder/gc/dolphin/USA" "$saves_folder/gc/dolphin/US" mv "$saves_folder/gc/dolphin/USA" "$saves_folder/gc/dolphin/US"
mv "$saves_folder/gc/dolphin/JAP" "$saves_folder/gc/dolphin/JP" mv "$saves_folder/gc/dolphin/JAP" "$saves_folder/gc/dolphin/JP"
dir_prep "$saves_folder/gc/dolphin/EU" "/var/data/dolphin-emu/GC/EUR" dir_prep "$saves_folder/gc/dolphin/EU" "$XDG_DATA_HOME/dolphin-emu/GC/EUR"
dir_prep "$saves_folder/gc/dolphin/US" "/var/data/dolphin-emu/GC/USA" dir_prep "$saves_folder/gc/dolphin/US" "$XDG_DATA_HOME/dolphin-emu/GC/USA"
dir_prep "$saves_folder/gc/dolphin/JP" "/var/data/dolphin-emu/GC/JAP" dir_prep "$saves_folder/gc/dolphin/JP" "$XDG_DATA_HOME/dolphin-emu/GC/JAP"
mv "$saves_folder/gc/primehack/EUR" "$saves_folder/gc/primehack/EU" mv "$saves_folder/gc/primehack/EUR" "$saves_folder/gc/primehack/EU"
mv "$saves_folder/gc/primehack/USA" "$saves_folder/gc/primehack/US" mv "$saves_folder/gc/primehack/USA" "$saves_folder/gc/primehack/US"
mv "$saves_folder/gc/primehack/JAP" "$saves_folder/gc/primehack/JP" mv "$saves_folder/gc/primehack/JAP" "$saves_folder/gc/primehack/JP"
dir_prep "$saves_folder/gc/primehack/EU" "/var/data/primehack/GC/EUR" dir_prep "$saves_folder/gc/primehack/EU" "$XDG_DATA_HOME/primehack/GC/EUR"
dir_prep "$saves_folder/gc/primehack/US" "/var/data/primehack/GC/USA" dir_prep "$saves_folder/gc/primehack/US" "$XDG_DATA_HOME/primehack/GC/USA"
dir_prep "$saves_folder/gc/primehack/JP" "/var/data/primehack/GC/JAP" dir_prep "$saves_folder/gc/primehack/JP" "$XDG_DATA_HOME/primehack/GC/JAP"
dir_prep "$saves_folder/PSP/PPSSPP-SA" "/var/config/ppsspp/PSP/SAVEDATA" dir_prep "$saves_folder/PSP/PPSSPP-SA" "$XDG_CONFIG_HOME/ppsspp/PSP/SAVEDATA"
dir_prep "$states_folder/PSP/PPSSPP-SA" "/var/config/ppsspp/PSP/PPSSPP_STATE" dir_prep "$states_folder/PSP/PPSSPP-SA" "$XDG_CONFIG_HOME/ppsspp/PSP/PPSSPP_STATE"
set_setting_value "$es_settings" "ROMDirectory" "$roms_folder" "es_settings" set_setting_value "$es_settings" "ROMDirectory" "$roms_folder" "es_settings"
set_setting_value "$es_settings" "MediaDirectory" "$media_folder" "es_settings" set_setting_value "$es_settings" "MediaDirectory" "$media_folder" "es_settings"
sed -i '$ a <string name="UserThemeDirectory" value="" />' "$es_settings" # Add new default line to existing file sed -i '$ a <string name="UserThemeDirectory" value="" />' "$es_settings" # Add new default line to existing file
set_setting_value "$es_settings" "UserThemeDirectory" "$themes_folder" "es_settings" set_setting_value "$es_settings" "UserThemeDirectory" "$themes_folder" "es_settings"
unlink "/var/config/emulationstation/ROMs" unlink "$XDG_CONFIG_HOME/emulationstation/ROMs"
unlink "/var/config/emulationstation/ES-DE/downloaded_media" unlink "$XDG_CONFIG_HOME/emulationstation/ES-DE/downloaded_media"
unlink "/var/config/emulationstation/ES-DE/themes" unlink "$XDG_CONFIG_HOME/emulationstation/ES-DE/themes"
set_setting_value "$raconf" "savestate_auto_load" "false" "retroarch" set_setting_value "$raconf" "savestate_auto_load" "false" "retroarch"
set_setting_value "$raconf" "savestate_auto_save" "false" "retroarch" set_setting_value "$raconf" "savestate_auto_save" "false" "retroarch"
@ -285,7 +303,7 @@ post_update() {
if [[ $(check_version_is_older_than "$version_being_updated" "0.7.3b") == "true" ]]; then if [[ $(check_version_is_older_than "$version_being_updated" "0.7.3b") == "true" ]]; then
# In version 0.7.3b, there was a bug that prevented the correct creations of the roms/system folders, so we force recreate them. # In version 0.7.3b, there was a bug that prevented the correct creations of the roms/system folders, so we force recreate them.
emulationstation --home /var/config/emulationstation --create-system-dirs emulationstation --home "$XDG_CONFIG_HOME/emulationstation" --create-system-dirs
fi fi
if [[ $(check_version_is_older_than "$version_being_updated" "0.8.0b") == "true" ]]; then if [[ $(check_version_is_older_than "$version_being_updated" "0.8.0b") == "true" ]]; then
@ -324,8 +342,8 @@ post_update() {
set_setting_value "$raconf" "rewind_enable" "false" "retroarch" set_setting_value "$raconf" "rewind_enable" "false" "retroarch"
# in 3.0 .emulationstation was moved into ES-DE # in 3.0 .emulationstation was moved into ES-DE
log i "Renaming old \"/var/config/emulationstation\" folder as \"/var/config/ES-DE\"" log i "Renaming old \"$XDG_CONFIG_HOME/emulationstation\" folder as \"$XDG_CONFIG_HOME/ES-DE\""
mv -f /var/config/emulationstation /var/config/ES-DE mv -f "$XDG_CONFIG_HOME/emulationstation" "$XDG_CONFIG_HOME/ES-DE"
prepare_component "reset" "es-de" prepare_component "reset" "es-de"
prepare_component "reset" "mame" prepare_component "reset" "mame"
@ -339,7 +357,7 @@ post_update() {
# The save folder of rpcs3 was inverted so we're moving the saves into the real one # The save folder of rpcs3 was inverted so we're moving the saves into the real one
log i "RPCS3 saves needs to be migrated, executing." log i "RPCS3 saves needs to be migrated, executing."
if [[ "$(ls -A $bios_folder/rpcs3/dev_hdd0/home/00000001/savedata)" ]]; then if [[ "$(ls -A "$bios_folder/rpcs3/dev_hdd0/home/00000001/savedata")" ]]; then
log i "Existing RPCS3 savedata found, backing up..." log i "Existing RPCS3 savedata found, backing up..."
create_dir "$backups_folder" create_dir "$backups_folder"
zip -rq9 "$backups_folder/$(date +"%0m%0d")_rpcs3_save_data.zip" "$bios_folder/rpcs3/dev_hdd0/home/00000001/savedata" zip -rq9 "$backups_folder/$(date +"%0m%0d")_rpcs3_save_data.zip" "$bios_folder/rpcs3/dev_hdd0/home/00000001/savedata"
@ -351,7 +369,7 @@ post_update() {
mv "$bios_folder/switch/registered" "$bios_folder/switch/firmware" mv "$bios_folder/switch/registered" "$bios_folder/switch/firmware"
log i "New systems were added in this version, regenerating system folders." log i "New systems were added in this version, regenerating system folders."
#es-de --home "/var/config/" --create-system-dirs #es-de --home "$XDG_CONFIG_HOME/" --create-system-dirs
es-de --create-system-dirs es-de --create-system-dirs
fi # end of 0.8.0b fi # end of 0.8.0b
@ -362,8 +380,8 @@ post_update() {
log i "- Give the user the option to reset Ryujinx, which was not properly initialized in 0.8.0b" log i "- Give the user the option to reset Ryujinx, which was not properly initialized in 0.8.0b"
log d "ES-DE files were moved inside the retrodeck folder, migrating to the new structure" log d "ES-DE files were moved inside the retrodeck folder, migrating to the new structure"
dir_prep "$rdhome/ES-DE/collections" "/var/config/ES-DE/collections" dir_prep "$rdhome/ES-DE/collections" "$XDG_CONFIG_HOME/ES-DE/collections"
dir_prep "$rdhome/ES-DE/gamelists" "/var/config/ES-DE/gamelists" dir_prep "$rdhome/ES-DE/gamelists" "$XDG_CONFIG_HOME/ES-DE/gamelists"
log i "Moving ES-DE collections, downloaded_media, gamelist, and themes from \"$rdhome\" to \"$rdhome/ES-DE\"" log i "Moving ES-DE collections, downloaded_media, gamelist, and themes from \"$rdhome\" to \"$rdhome/ES-DE\""
set_setting_value "$es_settings" "MediaDirectory" "$rdhome/ES-DE/downloaded_media" "es_settings" set_setting_value "$es_settings" "MediaDirectory" "$rdhome/ES-DE/downloaded_media" "es_settings"
set_setting_value "$es_settings" "UserThemeDirectory" "$rdhome/ES-DE/themes" "es_settings" set_setting_value "$es_settings" "UserThemeDirectory" "$rdhome/ES-DE/themes" "es_settings"
@ -371,21 +389,21 @@ post_update() {
mv -f "$rdhome/downloaded_media" "$rdhome/ES-DE/downloaded_media" && log d "Move of \"$rdhome/downloaded_media\" in \"$rdhome/ES-DE\" folder completed" mv -f "$rdhome/downloaded_media" "$rdhome/ES-DE/downloaded_media" && log d "Move of \"$rdhome/downloaded_media\" in \"$rdhome/ES-DE\" folder completed"
mv -f "$rdhome/gamelists/"* "$rdhome/ES-DE/gamelists" && log d "Move of \"$rdhome/gamelists/\" in \"$rdhome/ES-DE\" folder completed" && rm -rf "$rdhome/gamelists" mv -f "$rdhome/gamelists/"* "$rdhome/ES-DE/gamelists" && log d "Move of \"$rdhome/gamelists/\" in \"$rdhome/ES-DE\" folder completed" && rm -rf "$rdhome/gamelists"
log i "MAME-SA, migrating samples to the new exposed folder: from \"/var/data/mame/assets/samples\" to \"$bios_folder/mame-sa/samples\"" log i "MAME-SA, migrating samples to the new exposed folder: from \"$XDG_DATA_HOME/mame/assets/samples\" to \"$bios_folder/mame-sa/samples\""
create_dir "$bios_folder/mame-sa/samples" create_dir "$bios_folder/mame-sa/samples"
mv -f "/var/data/mame/assets/samples/"* "$bios_folder/mame-sa/samples" mv -f "$XDG_DATA_HOME/mame/assets/samples/"* "$bios_folder/mame-sa/samples"
set_setting_value "$mameconf" "samplepath" "$bios_folder/mame-sa/samples" "mame" set_setting_value "$mameconf" "samplepath" "$bios_folder/mame-sa/samples" "mame"
log i "Installing the missing ScummVM assets and renaming \"$mods_folder/RetroArch/ScummVM/themes\" into \"theme\"" log i "Installing the missing ScummVM assets and renaming \"$mods_folder/RetroArch/ScummVM/themes\" into \"theme\""
mv -f "$mods_folder/RetroArch/ScummVM/themes" "$mods_folder/RetroArch/ScummVM/theme" mv -f "$mods_folder/RetroArch/ScummVM/themes" "$mods_folder/RetroArch/ScummVM/theme"
unzip -o "$config/retroarch/ScummVM.zip" 'scummvm/extra/*' -d /tmp unzip -o "$config/retroarch/ScummVM.zip" 'scummvm/extra/*' -d /tmp
unzip -o "$config/retroarch/ScummVM.zip" 'scummvm/theme/*' -d /tmp unzip -o "$config/retroarch/ScummVM.zip" 'scummvm/theme/*' -d /tmp
mv -f /tmp/scummvm/extra "$mods_folder/RetroArch/ScummVM" mv -f "/tmp/scummvm/extra" "$mods_folder/RetroArch/ScummVM"
mv -f /tmp/scummvm/theme "$mods_folder/RetroArch/ScummVM" mv -f "/tmp/scummvm/theme" "$mods_folder/RetroArch/ScummVM"
rm -rf /tmp/extra /tmp/theme rm -rf "/tmp/extra /tmp/theme"
log i "Placing cheats in \"/var/data/mame/cheat\"" log i "Placing cheats in \"$XDG_DATA_HOME/mame/cheat\""
unzip -j -o "$config/mame/cheat0264.zip" 'cheat.7z' -d "/var/data/mame/cheat" unzip -j -o "$config/mame/cheat0264.zip" 'cheat.7z' -d "$XDG_DATA_HOME/mame/cheat"
log d "Verifying with user if they want to reset Ryujinx" log d "Verifying with user if they want to reset Ryujinx"
if [[ "$(configurator_generic_question_dialog "RetroDECK 0.8.1b Ryujinx Reset" "In RetroDECK 0.8.0b the Ryujinx emulator was not properly initialized for upgrading users.\nThis would cause Ryujinx to not work properly.\n\nWould you like to reset Ryujinx to default RetroDECK settings now?\n\nIf you have made your own changes to the Ryujinx config, you can decline this reset.")" == "true" ]]; then if [[ "$(configurator_generic_question_dialog "RetroDECK 0.8.1b Ryujinx Reset" "In RetroDECK 0.8.0b the Ryujinx emulator was not properly initialized for upgrading users.\nThis would cause Ryujinx to not work properly.\n\nWould you like to reset Ryujinx to default RetroDECK settings now?\n\nIf you have made your own changes to the Ryujinx config, you can decline this reset.")" == "true" ]]; then
@ -395,15 +413,15 @@ post_update() {
fi # end of 0.8.1b fi # end of 0.8.1b
if [[ $(check_version_is_older_than "$version_being_updated" "0.8.2b") == "true" ]]; then if [[ $(check_version_is_older_than "$version_being_updated" "0.8.2b") == "true" ]]; then
log i "Vita3K changed some paths, reflecting them: moving \"/var/data/Vita3K\" in \"/var/config/Vita3K\"" log i "Vita3K changed some paths, reflecting them: moving \"$XDG_DATA_HOME/Vita3K\" in \"$XDG_CONFIG_HOME/Vita3K\""
move "/var/data/Vita3K" "/var/config/Vita3K" move "$XDG_DATA_HOME/Vita3K" "$XDG_CONFIG_HOME/Vita3K"
log i "Moving ES-DE downloaded_media, gamelist, and themes from \"$rdhome\" to \"$rdhome/ES-DE\" due to a RetroDECK Framework bug" log i "Moving ES-DE downloaded_media, gamelist, and themes from \"$rdhome\" to \"$rdhome/ES-DE\" due to a RetroDECK Framework bug"
move "$rdhome/themes" "$rdhome/ES-DE/themes" && log d "Move of \"$rdhome/themes\" in \"$rdhome/ES-DE\" folder completed" move "$rdhome/themes" "$rdhome/ES-DE/themes" && log d "Move of \"$rdhome/themes\" in \"$rdhome/ES-DE\" folder completed"
move "$rdhome/downloaded_media" "$rdhome/ES-DE/downloaded_media" && log d "Move of \"$rdhome/downloaded_media\" in \"$rdhome/ES-DE\" folder completed" move "$rdhome/downloaded_media" "$rdhome/ES-DE/downloaded_media" && log d "Move of \"$rdhome/downloaded_media\" in \"$rdhome/ES-DE\" folder completed"
move "$rdhome/gamelists" "$rdhome/ES-DE/gamelists" && log d "Move of \"$rdhome/gamelists/\" in \"$rdhome/ES-DE\" folder completed" move "$rdhome/gamelists" "$rdhome/ES-DE/gamelists" && log d "Move of \"$rdhome/gamelists/\" in \"$rdhome/ES-DE\" folder completed"
move "$rdhome/collections" "$rdhome/ES-DE/collections" && log d "Move of \"$rdhome/collections/\" in \"$rdhome/ES-DE\" folder completed" move "$rdhome/collections" "$rdhome/ES-DE/collections" && log d "Move of \"$rdhome/collections/\" in \"$rdhome/ES-DE\" folder completed"
log i "Since in this version we moved to a PR build of Ryujinx we need to symlink it." log i "Since in this version we moved to a PR build of Ryujinx we need to symlink it."
ln -sv $ryujinxconf "$(dirname $ryujinxconf)/PRConfig.json" ln -sv "$ryujinxconf" "$(dirname "$ryujinxconf")/PRConfig.json"
fi #end of 0.8.2b fi #end of 0.8.2b
if [[ $(check_version_is_older_than "$version_being_updated" "0.8.3b") == "true" ]]; then if [[ $(check_version_is_older_than "$version_being_updated" "0.8.3b") == "true" ]]; then
@ -587,26 +605,26 @@ post_update() {
# RetroArch # RetroArch
log i "Forcing RetroArch to use the new libretro info path" log i "Forcing RetroArch to use the new libretro info path"
set_setting_value "$raconf" "libretro_info_path" "/var/config/retroarch/cores" "retroarch" set_setting_value "$raconf" "libretro_info_path" "$XDG_CONFIG_HOME/retroarch/cores" "retroarch"
log i "Moving Ryujinx data to the new locations" log i "Moving Ryujinx data to the new locations"
if [[ -d "/var/config/Ryujinx/bis" ]]; then if [[ -d "$XDG_CONFIG_HOME/Ryujinx/bis" ]]; then
mv -f "/var/config/Ryujinx/bis"/* "$saves_folder/switch/ryujinx/nand" && rm -rf "/var/config/Ryujinx/bis" && log i "Migrated Ryujinx nand data to the new location" mv -f "$XDG_CONFIG_HOME/Ryujinx/bis"/* "$saves_folder/switch/ryujinx/nand" && rm -rf "$XDG_CONFIG_HOME/Ryujinx/bis" && log i "Migrated Ryujinx nand data to the new location"
fi fi
if [[ -d "/var/config/Ryujinx/sdcard" ]]; then if [[ -d "$XDG_CONFIG_HOME/Ryujinx/sdcard" ]]; then
mv -f "/var/config/Ryujinx/sdcard"/* "$saves_folder/switch/ryujinx/sdcard" && rm -rf "/var/config/Ryujinx/sdcard" && log i "Migrated Ryujinx sdcard data to the new location" mv -f "$XDG_CONFIG_HOME/Ryujinx/sdcard"/* "$saves_folder/switch/ryujinx/sdcard" && rm -rf "$XDG_CONFIG_HOME/Ryujinx/sdcard" && log i "Migrated Ryujinx sdcard data to the new location"
fi fi
if [[ -d "/var/config/Ryujinx/bis/system/Contents/registered" ]]; then if [[ -d "$XDG_CONFIG_HOME/Ryujinx/bis/system/Contents/registered" ]]; then
mv -f "/var/config/Ryujinx/bis/system/Contents/registered"/* "$bios_folder/switch/firmware" && rm -rf "/var/config/Ryujinx/bis/system/Contents/registered" && log i "Migration of Ryujinx firmware data to the new location" mv -f "$XDG_CONFIG_HOME/Ryujinx/bis/system/Contents/registered"/* "$bios_folder/switch/firmware" && rm -rf "$XDG_CONFIG_HOME/Ryujinx/bis/system/Contents/registered" && log i "Migration of Ryujinx firmware data to the new location"
fi fi
if [[ -d "/var/config/Ryujinx/system" ]]; then if [[ -d "$XDG_CONFIG_HOME/Ryujinx/system" ]]; then
mv -f "/var/config/Ryujinx/system"/* "$bios_folder/switch/keys" && rm -rf "/var/config/Ryujinx/system" && log i "Migrated Ryujinx keys data to the new location" mv -f "$XDG_CONFIG_HOME/Ryujinx/system"/* "$bios_folder/switch/keys" && rm -rf "$XDG_CONFIG_HOME/Ryujinx/system" && log i "Migrated Ryujinx keys data to the new location"
fi fi
if [[ -d "/var/config/Ryujinx/mods" ]]; then if [[ -d "$XDG_CONFIG_HOME/Ryujinx/mods" ]]; then
mv -f "/var/config/Ryujinx/mods"/* "$mods_folder/ryujinx" && rm -rf "/var/config/Ryujinx/mods" && log i "Migrated Ryujinx mods data to the new location" mv -f "$XDG_CONFIG_HOME/Ryujinx/mods"/* "$mods_folder/ryujinx" && rm -rf "$XDG_CONFIG_HOME/Ryujinx/mods" && log i "Migrated Ryujinx mods data to the new location"
fi fi
if [[ -d "/var/config/Ryujinx/screenshots" ]]; then if [[ -d "$XDG_CONFIG_HOME/Ryujinx/screenshots" ]]; then
mv -f "/var/config/Ryujinx/screenshots"/* "$screenshots_folder/ryujinx" && rm -rf "/var/config/Ryujinx/screenshots" && log i "Migrated Ryujinx screenshots to the new location" mv -f "$XDG_CONFIG_HOME/Ryujinx/screenshots"/* "$screenshots_folder/ryujinx" && rm -rf "$XDG_CONFIG_HOME/Ryujinx/screenshots" && log i "Migrated Ryujinx screenshots to the new location"
fi fi
fi # end of 0.9.0b fi # end of 0.9.0b
@ -690,7 +708,7 @@ post_update() {
# --- ALWAYS EXECUTED IN 0.9.1b --- # --- ALWAYS EXECUTED IN 0.9.1b ---
log i "Preparing the shaders folder for MAME..." log i "Preparing the shaders folder for MAME..."
shaders_folder=$rdhome/shaders && log i "Shaders folder set to \"$shaders_folder\"" shaders_folder="$rdhome/shaders" && log i "Shaders folder set to \"$shaders_folder\""
conf_write && log i "Done" conf_write && log i "Done"
create_dir "$shaders_folder/mame/bgfx" create_dir "$shaders_folder/mame/bgfx"
set_setting_value "$mameconf" "bgfx_path" "$shaders_folder/mame/bgfx/" "mame" set_setting_value "$mameconf" "bgfx_path" "$shaders_folder/mame/bgfx/" "mame"
@ -699,26 +717,26 @@ post_update() {
log i "Preparing the cheats for RetroArch..." log i "Preparing the cheats for RetroArch..."
create_dir "$cheats_folder/retroarch" create_dir "$cheats_folder/retroarch"
set_setting_value "$raconf" "cheat_database_path" "$cheats_folder/retroarch" "retroarch" set_setting_value "$raconf" "cheat_database_path" "$cheats_folder/retroarch" "retroarch"
tar --strip-components=1 -xzf /app/retrodeck/cheats/retroarch.tar.gz -C "$cheats_folder/retroarch" --overwrite && log i "Cheats for RetroArch installed" tar --strip-components=1 -xzf "/app/retrodeck/cheats/retroarch.tar.gz" -C "$cheats_folder/retroarch" --overwrite && log i "Cheats for RetroArch installed"
log i "Preparing the cheats for PPSSPP..." log i "Preparing the cheats for PPSSPP..."
create_dir -d "$cheats_folder/PPSSPP" create_dir -d "$cheats_folder/PPSSPP"
dir_prep "$cheats_folder/PPSSPP" "/var/config/ppsspp/PSP/Cheats" dir_prep "$cheats_folder/PPSSPP" "$XDG_CONFIG_HOME/ppsspp/PSP/Cheats"
tar -xzf /app/retrodeck/cheats/ppsspp.tar.gz -C "$cheats_folder/PPSSPP" --overwrite && log i "Cheats for PPSSPP installed" tar -xzf "/app/retrodeck/cheats/ppsspp.tar.gz" -C "$cheats_folder/PPSSPP" --overwrite && log i "Cheats for PPSSPP installed"
log i "Preparing the cheats for PCSX2..." log i "Preparing the cheats for PCSX2..."
create_dir "$cheats_folder/pcsx2" create_dir "$cheats_folder/pcsx2"
set_setting_value "$pcsx2conf" "Cheats" "$cheats_folder/pcsx2" "Folders" set_setting_value "$pcsx2conf" "Cheats" "$cheats_folder/pcsx2" "Folders"
tar --strip-components=1 -xzf /app/retrodeck/cheats/pcsx2.tar.gz -C "$cheats_folder/pcsx2" --overwrite && log i "Cheats for PCSX2 installed" tar --strip-components=1 -xzf "/app/retrodeck/cheats/pcsx2.tar.gz" -C "$cheats_folder/pcsx2" --overwrite && log i "Cheats for PCSX2 installed"
log i "Preparing the cheats for MAME..." log i "Preparing the cheats for MAME..."
create_dir "$cheats_folder/mame" create_dir "$cheats_folder/mame"
set_setting_value "$mameconf" "cheatpath" "$cheats_folder/mame" "mame" set_setting_value "$mameconf" "cheatpath" "$cheats_folder/mame" "mame"
unzip -j -o "$config/mame/cheat0264.zip" 'cheat.7z' -d "$cheats_folder/mame" && log i "Cheats for MAME installed" unzip -j -o "$config/mame/cheat0264.zip" 'cheat.7z' -d "$cheats_folder/mame" && log i "Cheats for MAME installed"
rm -rf /var/data/mame/cheat rm -rf "$XDG_DATA_HOME/mame/cheat"
log i "Preparing the RetroAchievements for Dolphin..." log i "Preparing the RetroAchievements for Dolphin..."
cp -vn "$config/dolphin/"* /var/config/dolphin-emu/ cp -vn "$config/dolphin/"* "$XDG_CONFIG_HOME/dolphin-emu/"
log i "Fixing PrimeHack roms paths..." log i "Fixing PrimeHack roms paths..."
set_setting_value "$rd_conf" "ppsspp" "$(get_setting_value "$rd_defaults" "ppsspp" "retrodeck" "cheevos")" "retrodeck" "cheevos" set_setting_value "$rd_conf" "ppsspp" "$(get_setting_value "$rd_defaults" "ppsspp" "retrodeck" "cheevos")" "retrodeck" "cheevos"
@ -728,12 +746,13 @@ post_update() {
if [[ $(check_version_is_older_than "$version_being_updated" "0.9.2b") == "true" ]]; then if [[ $(check_version_is_older_than "$version_being_updated" "0.9.2b") == "true" ]]; then
# In version 0.9.2b, the following changes were made that required config file updates/reset or other changes to the filesystem: # In version 0.9.2b, the following changes were made that required config file updates/reset or other changes to the filesystem:
# Steam Sync completely rebuilt into new manifest system. Favorites will need to be nuked and, if steam_sync is enabled will be rebuilt. # Steam Sync completely rebuilt into new manifest system. Favorites may need to be nuked and, if steam_sync is enabled will be rebuilt. This is an optional step.
if [[ -d "$steamsync_folder" ]]; then # If Steam Sync has ever been run if [[ -d "$steamsync_folder" && ! -z $(ls -1 "$steamsync_folder") ]]; then # If Steam Sync folder exists and is not empty
if [[ "$(configurator_generic_question_dialog "RetroDECK 0.9.2b Steam Sync Reset" "In RetroDECK 0.9.2b we upgraded our Steam Sync feature and the shortcuts in Steam may need to be rebuilt.\n\nAll of your ES-DE favorites are still unchanged.\nAny games you have favorited now will be recreated, but last-played information and custom artwork changes may be lost.\n\nIf you have added RetroDECK to Steam through our Configurator it will also be removed through this process.\nWould you like to refresh the RetroDECK Steam Sync system?")" == "true" ]]; then
steam-rom-manager nuke steam-rom-manager nuke
steam_sync steam_sync
if [[ "$(configurator_generic_question_dialog "RetroDECK 0.9.2b Steam Sync Reset" "In RetroDECK 0.9.2b we upgraded our Steam Sync feature and the shortcuts in Steam need to be rebuilt.\n\nAll of your ES-DE favorites are still unchanged.\nAny games you have favorited now will be recreated.\n\nIf you have added RetroDECK to Steam through our Configurator it will also be removed through this process.\nWould you like to add the RetroDECK shortcut again?")" == "true" ]]; then if [[ "$(configurator_generic_question_dialog "RetroDECK 0.9.2b Steam Sync Reset" "The Steam Sync reset is complete.\nIf you had previously added a RetroDECK shortcut to Steam through our tools, it would have also been removed.\n\nWould you like to add the RetroDECK shortcut now?")" == "true" ]]; then
( (
# Add RetroDECK launcher to Steam # Add RetroDECK launcher to Steam
steam-rom-manager enable --names "RetroDECK Launcher" >> "$srm_log" 2>&1 steam-rom-manager enable --names "RetroDECK Launcher" >> "$srm_log" 2>&1
@ -746,18 +765,18 @@ post_update() {
--pulsate --width=500 --height=150 --auto-close --no-cancel --pulsate --width=500 --height=150 --auto-close --no-cancel
fi fi
fi fi
fi
fi # end of 0.9.2b fi # end of 0.9.2b
# The following commands are run every time. # The following commands are run every time.
if [[ -d "/var/data/dolphin-emu/Load/DynamicInputTextures" ]]; then # Refresh installed textures if they have been enabled if [[ -d "$XDG_DATA_HOME/dolphin-emu/Load/DynamicInputTextures" ]]; then # Refresh installed textures if they have been enabled
log i "Refreshing installed textures for Dolphin..." log i "Refreshing installed textures for Dolphin..."
rsync -rlD --mkpath "/app/retrodeck/extras/DynamicInputTextures/" "/var/data/dolphin-emu/Load/DynamicInputTextures/" && log i "Done" rsync -rlD --mkpath "/app/retrodeck/extras/DynamicInputTextures/" "$XDG_DATA_HOME/dolphin-emu/Load/DynamicInputTextures/" && log i "Done"
fi fi
if [[ -d "/var/data/primehack/Load/DynamicInputTextures" ]]; then # Refresh installed textures if they have been enabled if [[ -d "$XDG_DATA_HOME/primehack/Load/DynamicInputTextures" ]]; then # Refresh installed textures if they have been enabled
log i "Refreshing installed textures for Dolphin..." log i "Refreshing installed textures for Dolphin..."
rsync -rlD --mkpath "/app/retrodeck/extras/DynamicInputTextures/" "/var/data/primehack/Load/DynamicInputTextures/" && log i "Done" rsync -rlD --mkpath "/app/retrodeck/extras/DynamicInputTextures/" "$XDG_DATA_HOME/primehack/Load/DynamicInputTextures/" && log i "Done"
fi fi
if [[ ! -z $(find "$HOME/.steam/steam/controller_base/templates/" -maxdepth 1 -type f -iname "RetroDECK*.vdf") || ! -z $(find "$HOME/.var/app/com.valvesoftware.Steam/.steam/steam/controller_base/templates/" -maxdepth 1 -type f -iname "RetroDECK*.vdf") ]]; then # If RetroDECK controller profile has been previously installed if [[ ! -z $(find "$HOME/.steam/steam/controller_base/templates/" -maxdepth 1 -type f -iname "RetroDECK*.vdf") || ! -z $(find "$HOME/.var/app/com.valvesoftware.Steam/.steam/steam/controller_base/templates/" -maxdepth 1 -type f -iname "RetroDECK*.vdf") ]]; then # If RetroDECK controller profile has been previously installed
@ -776,11 +795,11 @@ post_update() {
--text="RetroDECK is finishing up the upgrading process, please be patient.\n\n<span foreground='$purple' size='larger'><b>NOTICE - If the process is taking too long:</b></span>\n\nSome windows might be running in the background that could require your attention: pop-ups from emulators or the upgrade itself that needs user input to continue.\n\n" --text="RetroDECK is finishing up the upgrading process, please be patient.\n\n<span foreground='$purple' size='larger'><b>NOTICE - If the process is taking too long:</b></span>\n\nSome windows might be running in the background that could require your attention: pop-ups from emulators or the upgrade itself that needs user input to continue.\n\n"
conf_read conf_read
version=$hard_version version="$hard_version"
conf_write conf_write
if grep -qF "cooker" <<< $hard_version; then if grep -qF "cooker" <<< "$hard_version"; then
changelog_dialog "$(echo $version | cut -d'-' -f2)" changelog_dialog "$(echo "$version" | cut -d'-' -f2)"
else else
changelog_dialog "$version" changelog_dialog "$version"
fi fi

View file

@ -5,7 +5,7 @@ prepare_component() {
# The actions currently include "reset" and "postmove" # The actions currently include "reset" and "postmove"
# The "reset" action will initialize the component # The "reset" action will initialize the component
# The "postmove" action will update the component settings after one or more RetroDECK folders were moved # The "postmove" action will update the component settings after one or more RetroDECK folders were moved
# An component can be called by name, by parent folder name in the /var/config root or use the option "all" to perform the action on all components equally # An component can be called by name, by parent folder name in the $XDG_CONFIG_HOME root or use the option "all" to perform the action on all components equally
# USAGE: prepare_component "$action" "$component" "$call_source(optional)" # USAGE: prepare_component "$action" "$component" "$call_source(optional)"
if [[ "$1" == "--list" ]]; then if [[ "$1" == "--list" ]]; then
@ -76,8 +76,8 @@ prepare_component() {
log d "Logs folder moved to $logs_folder and linked back to $rd_logs_folder" log d "Logs folder moved to $logs_folder and linked back to $rd_logs_folder"
fi fi
fi fi
done < <(grep -v '^\s*$' $rd_conf | awk '/^\[paths\]/{f=1;next} /^\[/{f=0} f') done < <(grep -v '^\s*$' "$rd_conf" | awk '/^\[paths\]/{f=1;next} /^\[/{f=0} f')
create_dir "/var/config/retrodeck/godot" # TODO: what is this for? Can we delete it or add it to the retrodeck.cfg so the folder will be created by the above script? create_dir "$XDG_CONFIG_HOME/retrodeck/godot" # TODO: what is this for? Can we delete it or add it to the retrodeck.cfg so the folder will be created by the above script?
fi fi
if [[ "$action" == "postmove" ]]; then # Update the paths of any folders that came with the retrodeck folder during a move if [[ "$action" == "postmove" ]]; then # Update the paths of any folders that came with the retrodeck folder during a move
@ -89,7 +89,7 @@ prepare_component() {
declare -g "$current_setting_name=$rdhome/${current_setting_value#*retrodeck/}" declare -g "$current_setting_name=$rdhome/${current_setting_value#*retrodeck/}"
fi fi
fi fi
done < <(grep -v '^\s*$' $rd_conf | awk '/^\[paths\]/{f=1;next} /^\[/{f=0} f') done < <(grep -v '^\s*$' "$rd_conf" | awk '/^\[paths\]/{f=1;next} /^\[/{f=0} f')
dir_prep "$logs_folder" "$rd_logs_folder" dir_prep "$logs_folder" "$rd_logs_folder"
fi fi
fi fi
@ -100,16 +100,16 @@ prepare_component() {
log i "Prepearing ES-DE" log i "Prepearing ES-DE"
log i "--------------------------------" log i "--------------------------------"
if [[ "$action" == "reset" ]]; then if [[ "$action" == "reset" ]]; then
rm -rf /var/config/ES-DE rm -rf "$XDG_CONFIG_HOME/ES-DE"
create_dir /var/config/ES-DE/settings create_dir "$XDG_CONFIG_HOME/ES-DE/settings"
log d "Prepearing es_settings.xml" log d "Prepearing es_settings.xml"
cp -f /app/retrodeck/es_settings.xml /var/config/ES-DE/settings/es_settings.xml cp -f "/app/retrodeck/es_settings.xml" "$XDG_CONFIG_HOME/ES-DE/settings/es_settings.xml"
set_setting_value "$es_settings" "ROMDirectory" "$roms_folder" "es_settings" set_setting_value "$es_settings" "ROMDirectory" "$roms_folder" "es_settings"
set_setting_value "$es_settings" "MediaDirectory" "$media_folder" "es_settings" set_setting_value "$es_settings" "MediaDirectory" "$media_folder" "es_settings"
set_setting_value "$es_settings" "UserThemeDirectory" "$themes_folder" "es_settings" set_setting_value "$es_settings" "UserThemeDirectory" "$themes_folder" "es_settings"
dir_prep "$rdhome/ES-DE/gamelists" "/var/config/ES-DE/gamelists" dir_prep "$rdhome/ES-DE/gamelists" "$XDG_CONFIG_HOME/ES-DE/gamelists"
dir_prep "$rdhome/ES-DE/collections" "/var/config/ES-DE/collections" dir_prep "$rdhome/ES-DE/collections" "$XDG_CONFIG_HOME/ES-DE/collections"
dir_prep "$rdhome/ES-DE/custom_systems" "/var/config/ES-DE/custom_systems" dir_prep "$rdhome/ES-DE/custom_systems" "$XDG_CONFIG_HOME/ES-DE/custom_systems"
log d "Generating roms system folders" log d "Generating roms system folders"
es-de --create-system-dirs es-de --create-system-dirs
update_splashscreens update_splashscreens
@ -118,7 +118,7 @@ prepare_component() {
set_setting_value "$es_settings" "ROMDirectory" "$roms_folder" "es_settings" set_setting_value "$es_settings" "ROMDirectory" "$roms_folder" "es_settings"
set_setting_value "$es_settings" "MediaDirectory" "$media_folder" "es_settings" set_setting_value "$es_settings" "MediaDirectory" "$media_folder" "es_settings"
set_setting_value "$es_settings" "UserThemeDirectory" "$themes_folder" "es_settings" set_setting_value "$es_settings" "UserThemeDirectory" "$themes_folder" "es_settings"
dir_prep "$rdhome/gamelists" "/var/config/ES-DE/gamelists" dir_prep "$rdhome/gamelists" "$XDG_CONFIG_HOME/ES-DE/gamelists"
fi fi
fi fi
@ -128,14 +128,14 @@ prepare_component() {
log i "Prepearing Steam ROM Manager" log i "Prepearing Steam ROM Manager"
log i "-----------------------------" log i "-----------------------------"
local srm_userdata="/var/config/steam-rom-manager/userData" local srm_userdata="$XDG_CONFIG_HOME/steam-rom-manager/userData"
create_dir -d "$srm_userdata" create_dir -d "$srm_userdata"
cp -fv "$config/steam-rom-manager/"*.json "$srm_userdata" cp -fv "$config/steam-rom-manager/"*.json "$srm_userdata"
cp -fvr "$config/steam-rom-manager/manifests" "$srm_userdata" cp -fvr "$config/steam-rom-manager/manifests" "$srm_userdata"
log i "Updating steamDirectory and romDirectory lines in $srm_userdata/userSettings.json" log i "Updating steamDirectory and romDirectory lines in $srm_userdata/userSettings.json"
jq '.environmentVariables.steamDirectory = "'$HOME'/.steam/steam"' "$srm_userdata/userSettings.json" > "$srm_userdata/tmp.json" && mv -f "$srm_userdata/tmp.json" "$srm_userdata/userSettings.json" jq '.environmentVariables.steamDirectory = "'"$HOME"'/.steam/steam"' "$srm_userdata/userSettings.json" > "$srm_userdata/tmp.json" && mv -f "$srm_userdata/tmp.json" "$srm_userdata/userSettings.json"
jq '.environmentVariables.romsDirectory = "'$rdhome'/.sync"' "$srm_userdata/userSettings.json" > "$srm_userdata/tmp.json" && mv -f "$srm_userdata/tmp.json" "$srm_userdata/userSettings.json" jq '.environmentVariables.romsDirectory = "'"$rdhome"'/.sync"' "$srm_userdata/userSettings.json" > "$srm_userdata/tmp.json" && mv -f "$srm_userdata/tmp.json" "$srm_userdata/userSettings.json"
get_steam_user get_steam_user
fi fi
@ -148,28 +148,28 @@ prepare_component() {
if [[ "$action" == "reset" ]]; then # Run reset-only commands if [[ "$action" == "reset" ]]; then # Run reset-only commands
if [[ $multi_user_mode == "true" ]]; then # Multi-user actions if [[ $multi_user_mode == "true" ]]; then # Multi-user actions
create_dir -d "$multi_user_data_folder/$SteamAppUser/config/retroarch" create_dir -d "$multi_user_data_folder/$SteamAppUser/config/retroarch"
cp -fv $config/retroarch/retroarch.cfg "$multi_user_data_folder/$SteamAppUser/config/retroarch/" cp -fv "$config/retroarch/retroarch.cfg" "$multi_user_data_folder/$SteamAppUser/config/retroarch/"
cp -fv $config/retroarch/retroarch-core-options.cfg "$multi_user_data_folder/$SteamAppUser/config/retroarch/" cp -fv "$config/retroarch/retroarch-core-options.cfg" "$multi_user_data_folder/$SteamAppUser/config/retroarch/"
else # Single-user actions else # Single-user actions
create_dir -d /var/config/retroarch create_dir -d "$XDG_CONFIG_HOME/retroarch"
dir_prep "$bios_folder" "/var/config/retroarch/system" dir_prep "$bios_folder" "$XDG_CONFIG_HOME/retroarch/system"
dir_prep "$rdhome/logs/retroarch" "/var/config/retroarch/logs" dir_prep "$rdhome/logs/retroarch" "$XDG_CONFIG_HOME/retroarch/logs"
create_dir -d "/var/config/retroarch/shaders/" create_dir -d "$XDG_CONFIG_HOME/retroarch/shaders/"
if [[ -d "$cheats_folder/retroarch" && "$(ls -A $cheats_folder/retroarch)" ]]; then if [[ -d "$cheats_folder/retroarch" && "$(ls -A "$cheats_folder/retroarch")" ]]; then
backup_file="$backups_folder/cheats/retroarch-$(date +%y%m%d).tar.gz" backup_file="$backups_folder/cheats/retroarch-$(date +%y%m%d).tar.gz"
create_dir "$(dirname "$backup_file")" create_dir "$(dirname "$backup_file")"
tar -czf "$backup_file" -C "$cheats_folder" retroarch tar -czf "$backup_file" -C "$cheats_folder" retroarch
log i "RetroArch cheats backed up to $backup_file" log i "RetroArch cheats backed up to $backup_file"
fi fi
create_dir -d "$cheats_folder/retroarch" create_dir -d "$cheats_folder/retroarch"
tar --strip-components=1 -xzf /app/retrodeck/cheats/retroarch.tar.gz -C "$cheats_folder/retroarch" --overwrite tar --strip-components=1 -xzf "/app/retrodeck/cheats/retroarch.tar.gz" -C "$cheats_folder/retroarch" --overwrite
cp -rf /app/share/libretro/shaders /var/config/retroarch/ cp -rf "/app/share/libretro/shaders" "$XDG_CONFIG_HOME/retroarch/"
dir_prep "$shaders_folder/retroarch" "/var/config/retroarch/shaders" dir_prep "$shaders_folder/retroarch" "$XDG_CONFIG_HOME/retroarch/shaders"
cp -fv $config/retroarch/retroarch.cfg /var/config/retroarch/ cp -fv "$config/retroarch/retroarch.cfg" "$XDG_CONFIG_HOME/retroarch/"
cp -fv $config/retroarch/retroarch-core-options.cfg /var/config/retroarch/ cp -fv "$config/retroarch/retroarch-core-options.cfg" "$XDG_CONFIG_HOME/retroarch/"
rsync -rlD --mkpath "$config/retroarch/core-overrides/" "/var/config/retroarch/config/" rsync -rlD --mkpath "$config/retroarch/core-overrides/" "$XDG_CONFIG_HOME/retroarch/config/"
rsync -rlD --mkpath "$config/retrodeck/presets/remaps/" "/var/config/retroarch/config/remaps/" rsync -rlD --mkpath "$config/retrodeck/presets/remaps/" "$XDG_CONFIG_HOME/retroarch/config/remaps/"
dir_prep "$borders_folder" "/var/config/retroarch/overlays/borders" dir_prep "$borders_folder" "$XDG_CONFIG_HOME/retroarch/overlays/borders"
set_setting_value "$raconf" "savefile_directory" "$saves_folder" "retroarch" set_setting_value "$raconf" "savefile_directory" "$saves_folder" "retroarch"
set_setting_value "$raconf" "savestate_directory" "$states_folder" "retroarch" set_setting_value "$raconf" "savestate_directory" "$states_folder" "retroarch"
set_setting_value "$raconf" "screenshot_directory" "$screenshots_folder" "retroarch" set_setting_value "$raconf" "screenshot_directory" "$screenshots_folder" "retroarch"
@ -200,14 +200,14 @@ prepare_component() {
log i "--------------------------------" log i "--------------------------------"
log i "Prepearing PPSSPP_LIBRETRO" log i "Prepearing PPSSPP_LIBRETRO"
log i "--------------------------------" log i "--------------------------------"
if [ -d $bios_folder/PPSSPP/flash0/font ] if [ -d "$bios_folder/PPSSPP/flash0/font" ]
then then
mv -fv $bios_folder/PPSSPP/flash0/font $bios_folder/PPSSPP/flash0/font.bak mv -fv "$bios_folder/PPSSPP/flash0/font" "$bios_folder/PPSSPP/flash0/font.bak"
fi fi
cp -rf "/app/retrodeck/extras/PPSSPP" "$bios_folder/PPSSPP" cp -rf "/app/retrodeck/extras/PPSSPP" "$bios_folder/PPSSPP"
if [ -d $bios_folder/PPSSPP/flash0/font.bak ] if [ -d "$bios_folder/PPSSPP/flash0/font.bak" ]
then then
mv -f $bios_folder/PPSSPP/flash0/font.bak $bios_folder/PPSSPP/flash0/font mv -f "$bios_folder/PPSSPP/flash0/font.bak" "$bios_folder/PPSSPP/flash0/font"
fi fi
# MSX / SVI / ColecoVision / SG-1000 # MSX / SVI / ColecoVision / SG-1000
@ -244,9 +244,9 @@ prepare_component() {
set_setting_value "$ra_scummvm_conf" "savepath" "$saves_folder/scummvm" "libretro_scummvm" "scummvm" set_setting_value "$ra_scummvm_conf" "savepath" "$saves_folder/scummvm" "libretro_scummvm" "scummvm"
set_setting_value "$ra_scummvm_conf" "browser_lastpath" "$roms_folder/scummvm" "libretro_scummvm" "scummvm" set_setting_value "$ra_scummvm_conf" "browser_lastpath" "$roms_folder/scummvm" "libretro_scummvm" "scummvm"
dir_prep "$texture_packs_folder/RetroArch-Mesen" "/var/config/retroarch/system/HdPacks" dir_prep "$texture_packs_folder/RetroArch-Mesen" "$XDG_CONFIG_HOME/retroarch/system/HdPacks"
dir_prep "$texture_packs_folder/RetroArch-Mupen64Plus/cache" "/var/config/retroarch/system/Mupen64plus/cache" dir_prep "$texture_packs_folder/RetroArch-Mupen64Plus/cache" "$XDG_CONFIG_HOME/retroarch/system/Mupen64plus/cache"
dir_prep "$texture_packs_folder/RetroArch-Mupen64Plus/hires_texture" "/var/config/retroarch/system/Mupen64plus/hires_texture" dir_prep "$texture_packs_folder/RetroArch-Mupen64Plus/hires_texture" "$XDG_CONFIG_HOME/retroarch/system/Mupen64plus/hires_texture"
# Reset default preset settings # Reset default preset settings
set_setting_value "$rd_conf" "retroarch" "$(get_setting_value "$rd_defaults" "retroarch" "retrodeck" "cheevos")" "retrodeck" "cheevos" set_setting_value "$rd_conf" "retroarch" "$(get_setting_value "$rd_defaults" "retroarch" "retrodeck" "cheevos")" "retrodeck" "cheevos"
@ -272,12 +272,12 @@ prepare_component() {
set_setting_value "$rd_conf" "retroarch" "$(get_setting_value "$rd_defaults" "retroarch" "retrodeck" "savestate_auto_save")" "retrodeck" "savestate_auto_save" set_setting_value "$rd_conf" "retroarch" "$(get_setting_value "$rd_defaults" "retroarch" "retrodeck" "savestate_auto_save")" "retrodeck" "savestate_auto_save"
fi fi
if [[ "$action" == "postmove" ]]; then # Run only post-move commands if [[ "$action" == "postmove" ]]; then # Run only post-move commands
dir_prep "$bios_folder" "/var/config/retroarch/system" dir_prep "$bios_folder" "$XDG_CONFIG_HOME/retroarch/system"
dir_prep "$logs_folder/retroarch" "/var/config/retroarch/logs" dir_prep "$logs_folder/retroarch" "$XDG_CONFIG_HOME/retroarch/logs"
dir_prep "$shaders_folder/retroarch" "/var/config/retroarch/shaders" dir_prep "$shaders_folder/retroarch" "$XDG_CONFIG_HOME/retroarch/shaders"
dir_prep "$texture_packs_folder/RetroArch-Mesen" "/var/config/retroarch/system/HdPacks" dir_prep "$texture_packs_folder/RetroArch-Mesen" "$XDG_CONFIG_HOME/retroarch/system/HdPacks"
dir_prep "$texture_packs_folder/RetroArch-Mupen64Plus/cache" "/var/config/retroarch/system/Mupen64plus/cache" dir_prep "$texture_packs_folder/RetroArch-Mupen64Plus/cache" "$XDG_CONFIG_HOME/retroarch/system/Mupen64plus/cache"
dir_prep "$texture_packs_folder/RetroArch-Mupen64Plus/hires_texture" "/var/config/retroarch/system/Mupen64plus/hires_texture" dir_prep "$texture_packs_folder/RetroArch-Mupen64Plus/hires_texture" "$XDG_CONFIG_HOME/retroarch/system/Mupen64plus/hires_texture"
set_setting_value "$raconf" "savefile_directory" "$saves_folder" "retroarch" set_setting_value "$raconf" "savefile_directory" "$saves_folder" "retroarch"
set_setting_value "$raconf" "savestate_directory" "$states_folder" "retroarch" set_setting_value "$raconf" "savestate_directory" "$states_folder" "retroarch"
set_setting_value "$raconf" "screenshot_directory" "$screenshots_folder" "retroarch" set_setting_value "$raconf" "screenshot_directory" "$screenshots_folder" "retroarch"
@ -294,15 +294,15 @@ prepare_component() {
log i "------------------------" log i "------------------------"
if [[ $multi_user_mode == "true" ]]; then # Multi-user actions if [[ $multi_user_mode == "true" ]]; then # Multi-user actions
create_dir -d "$multi_user_data_folder/$SteamAppUser/config/citra-emu" create_dir -d "$multi_user_data_folder/$SteamAppUser/config/citra-emu"
cp -fv $config/citra/qt-config.ini "$multi_user_data_folder/$SteamAppUser/config/citra-emu/qt-config.ini" cp -fv "$config/citra/qt-config.ini" "$multi_user_data_folder/$SteamAppUser/config/citra-emu/qt-config.ini"
set_setting_value "$multi_user_data_folder/$SteamAppUser/config/citra-emu/qt-config.ini" "nand_directory" "$saves_folder/n3ds/citra/nand/" "citra" "Data%20Storage" set_setting_value "$multi_user_data_folder/$SteamAppUser/config/citra-emu/qt-config.ini" "nand_directory" "$saves_folder/n3ds/citra/nand/" "citra" "Data%20Storage"
set_setting_value "$multi_user_data_folder/$SteamAppUser/config/citra-emu/qt-config.ini" "sdmc_directory" "$saves_folder/n3ds/citra/sdmc/" "citra" "Data%20Storage" set_setting_value "$multi_user_data_folder/$SteamAppUser/config/citra-emu/qt-config.ini" "sdmc_directory" "$saves_folder/n3ds/citra/sdmc/" "citra" "Data%20Storage"
set_setting_value "$multi_user_data_folder/$SteamAppUser/config/citra-emu/qt-config.ini" "Paths\gamedirs\3\path" "$roms_folder/n3ds" "citra" "UI" set_setting_value "$multi_user_data_folder/$SteamAppUser/config/citra-emu/qt-config.ini" "Paths\gamedirs\3\path" "$roms_folder/n3ds" "citra" "UI"
set_setting_value "$multi_user_data_folder/$SteamAppUser/config/citra-emu/qt-config.ini" "Paths\screenshotPath" "$screenshots_folder" "citra" "UI" set_setting_value "$multi_user_data_folder/$SteamAppUser/config/citra-emu/qt-config.ini" "Paths\screenshotPath" "$screenshots_folder" "citra" "UI"
dir_prep "$multi_user_data_folder/$SteamAppUser/config/citra-emu" "/var/config/citra-emu" dir_prep "$multi_user_data_folder/$SteamAppUser/config/citra-emu" "$XDG_CONFIG_HOME/citra-emu"
else # Single-user actions else # Single-user actions
create_dir -d /var/config/citra-emu/ create_dir -d "$XDG_CONFIG_HOME/citra-emu/"
cp -f $config/citra/qt-config.ini /var/config/citra-emu/qt-config.ini cp -f "$config/citra/qt-config.ini" "$XDG_CONFIG_HOME/citra-emu/qt-config.ini"
set_setting_value "$citraconf" "nand_directory" "$saves_folder/n3ds/citra/nand/" "citra" "Data%20Storage" set_setting_value "$citraconf" "nand_directory" "$saves_folder/n3ds/citra/nand/" "citra" "Data%20Storage"
set_setting_value "$citraconf" "sdmc_directory" "$saves_folder/n3ds/citra/sdmc/" "citra" "Data%20Storage" set_setting_value "$citraconf" "sdmc_directory" "$saves_folder/n3ds/citra/sdmc/" "citra" "Data%20Storage"
set_setting_value "$citraconf" "Paths\gamedirs\3\path" "$roms_folder/n3ds" "citra" "UI" set_setting_value "$citraconf" "Paths\gamedirs\3\path" "$roms_folder/n3ds" "citra" "UI"
@ -311,20 +311,20 @@ prepare_component() {
# Shared actions # Shared actions
create_dir "$saves_folder/n3ds/citra/nand/" create_dir "$saves_folder/n3ds/citra/nand/"
create_dir "$saves_folder/n3ds/citra/sdmc/" create_dir "$saves_folder/n3ds/citra/sdmc/"
dir_prep "$bios_folder/citra/sysdata" "/var/data/citra-emu/sysdata" dir_prep "$bios_folder/citra/sysdata" "$XDG_DATA_HOME/citra-emu/sysdata"
dir_prep "$logs_folder/citra" "/var/data/citra-emu/log" dir_prep "$logs_folder/citra" "$XDG_DATA_HOME/citra-emu/log"
dir_prep "$mods_folder/Citra" "/var/data/citra-emu/load/mods" dir_prep "$mods_folder/Citra" "$XDG_DATA_HOME/citra-emu/load/mods"
dir_prep "$texture_packs_folder/Citra" "/var/data/citra-emu/load/textures" dir_prep "$texture_packs_folder/Citra" "$XDG_DATA_HOME/citra-emu/load/textures"
# Reset default preset settings # Reset default preset settings
set_setting_value "$rd_conf" "citra" "$(get_setting_value "$rd_defaults" "citra" "retrodeck" "abxy_button_swap")" "retrodeck" "abxy_button_swap" set_setting_value "$rd_conf" "citra" "$(get_setting_value "$rd_defaults" "citra" "retrodeck" "abxy_button_swap")" "retrodeck" "abxy_button_swap"
set_setting_value "$rd_conf" "citra" "$(get_setting_value "$rd_defaults" "citra" "retrodeck" "ask_to_exit")" "retrodeck" "ask_to_exit" set_setting_value "$rd_conf" "citra" "$(get_setting_value "$rd_defaults" "citra" "retrodeck" "ask_to_exit")" "retrodeck" "ask_to_exit"
fi fi
if [[ "$action" == "postmove" ]]; then # Run only post-move commands if [[ "$action" == "postmove" ]]; then # Run only post-move commands
dir_prep "$bios_folder/citra/sysdata" "/var/data/citra-emu/sysdata" dir_prep "$bios_folder/citra/sysdata" "$XDG_DATA_HOME/citra-emu/sysdata"
dir_prep "$rdhome/logs/citra" "/var/data/citra-emu/log" dir_prep "$rdhome/logs/citra" "$XDG_DATA_HOME/citra-emu/log"
dir_prep "$mods_folder/Citra" "/var/data/citra-emu/load/mods" dir_prep "$mods_folder/Citra" "$XDG_DATA_HOME/citra-emu/load/mods"
dir_prep "$texture_packs_folder/Citra" "/var/data/citra-emu/load/textures" dir_prep "$texture_packs_folder/Citra" "$XDG_DATA_HOME/citra-emu/load/textures"
set_setting_value "$citraconf" "nand_directory" "$saves_folder/n3ds/citra/nand/" "citra" "Data%20Storage" set_setting_value "$citraconf" "nand_directory" "$saves_folder/n3ds/citra/nand/" "citra" "Data%20Storage"
set_setting_value "$citraconf" "sdmc_directory" "$saves_folder/n3ds/citra/sdmc/" "citra" "Data%20Storage" set_setting_value "$citraconf" "sdmc_directory" "$saves_folder/n3ds/citra/sdmc/" "citra" "Data%20Storage"
set_setting_value "$citraconf" "Paths\gamedirs\3\path" "$roms_folder/n3ds" "citra" "UI" set_setting_value "$citraconf" "Paths\gamedirs\3\path" "$roms_folder/n3ds" "citra" "UI"
@ -344,14 +344,16 @@ prepare_component() {
cp -fr "$config/cemu/"* "$multi_user_data_folder/$SteamAppUser/config/Cemu/" cp -fr "$config/cemu/"* "$multi_user_data_folder/$SteamAppUser/config/Cemu/"
set_setting_value "$multi_user_data_folder/$SteamAppUser/config/Cemu/settings.ini" "mlc_path" "$bios_folder/cemu" "cemu" set_setting_value "$multi_user_data_folder/$SteamAppUser/config/Cemu/settings.ini" "mlc_path" "$bios_folder/cemu" "cemu"
set_setting_value "$multi_user_data_folder/$SteamAppUser/config/Cemu/settings.ini" "Entry" "$roms_folder/wiiu" "cemu" "GamePaths" set_setting_value "$multi_user_data_folder/$SteamAppUser/config/Cemu/settings.ini" "Entry" "$roms_folder/wiiu" "cemu" "GamePaths"
dir_prep "$multi_user_data_folder/$SteamAppUser/config/Cemu" "/var/config/Cemu" dir_prep "$multi_user_data_folder/$SteamAppUser/config/Cemu" "$XDG_CONFIG_HOME/Cemu"
else else
create_dir -d /var/config/Cemu/ create_dir -d "$XDG_CONFIG_HOME/Cemu/"
cp -fr "$config/cemu/"* /var/config/Cemu/ cp -fr "$config/cemu/"* "$XDG_CONFIG_HOME/Cemu/"
set_setting_value "$cemuconf" "mlc_path" "$bios_folder/cemu" "cemu" set_setting_value "$cemuconf" "mlc_path" "$bios_folder/cemu" "cemu"
set_setting_value "$cemuconf" "Entry" "$roms_folder/wiiu" "cemu" "GamePaths" set_setting_value "$cemuconf" "Entry" "$roms_folder/wiiu" "cemu" "GamePaths"
if [[ -e "$bios_folder/cemu/keys.txt" ]]; then
rm -rf "$XDG_DATA_HOME/Cemu/keys.txt" && ln -s "$bios_folder/cemu/keys.txt" "$XDG_DATA_HOME/Cemu/keys.txt" && log d "Linked $bios_folder/cemu/keys.txt to $XDG_DATA_HOME/Cemu/keys.txt" rm -rf "$XDG_DATA_HOME/Cemu/keys.txt" && ln -s "$bios_folder/cemu/keys.txt" "$XDG_DATA_HOME/Cemu/keys.txt" && log d "Linked $bios_folder/cemu/keys.txt to $XDG_DATA_HOME/Cemu/keys.txt"
fi fi
fi
# Shared actions # Shared actions
dir_prep "$saves_folder/wiiu/cemu" "$bios_folder/cemu/usr/save" dir_prep "$saves_folder/wiiu/cemu" "$bios_folder/cemu/usr/save"
fi fi
@ -376,10 +378,10 @@ prepare_component() {
set_setting_value "$multi_user_data_folder/$SteamAppUser/config/dolphin-emu/Dolphin.ini" "ISOPath0" "$roms_folder/wii" "dolphin" "General" set_setting_value "$multi_user_data_folder/$SteamAppUser/config/dolphin-emu/Dolphin.ini" "ISOPath0" "$roms_folder/wii" "dolphin" "General"
set_setting_value "$multi_user_data_folder/$SteamAppUser/config/dolphin-emu/Dolphin.ini" "ISOPath1" "$roms_folder/gc" "dolphin" "General" set_setting_value "$multi_user_data_folder/$SteamAppUser/config/dolphin-emu/Dolphin.ini" "ISOPath1" "$roms_folder/gc" "dolphin" "General"
set_setting_value "$multi_user_data_folder/$SteamAppUser/config/dolphin-emu/Dolphin.ini" "WiiSDCardPath" "$saves_folder/wii/dolphin/sd.raw" "dolphin" "General" set_setting_value "$multi_user_data_folder/$SteamAppUser/config/dolphin-emu/Dolphin.ini" "WiiSDCardPath" "$saves_folder/wii/dolphin/sd.raw" "dolphin" "General"
dir_prep "$multi_user_data_folder/$SteamAppUser/config/dolphin-emu" "/var/config/dolphin-emu" dir_prep "$multi_user_data_folder/$SteamAppUser/config/dolphin-emu" "$XDG_CONFIG_HOME/dolphin-emu"
else # Single-user actions else # Single-user actions
create_dir -d /var/config/dolphin-emu/ create_dir -d "$XDG_CONFIG_HOME/dolphin-emu/"
cp -fvr "$config/dolphin/"* /var/config/dolphin-emu/ cp -fvr "$config/dolphin/"* "$XDG_CONFIG_HOME/dolphin-emu/"
set_setting_value "$dolphinconf" "BIOS" "$bios_folder" "dolphin" "GBA" set_setting_value "$dolphinconf" "BIOS" "$bios_folder" "dolphin" "GBA"
set_setting_value "$dolphinconf" "SavesPath" "$saves_folder/gba" "dolphin" "GBA" set_setting_value "$dolphinconf" "SavesPath" "$saves_folder/gba" "dolphin" "GBA"
set_setting_value "$dolphinconf" "ISOPath0" "$roms_folder/wii" "dolphin" "General" set_setting_value "$dolphinconf" "ISOPath0" "$roms_folder/wii" "dolphin" "General"
@ -387,27 +389,27 @@ prepare_component() {
set_setting_value "$dolphinconf" "WiiSDCardPath" "$saves_folder/wii/dolphin/sd.raw" "dolphin" "General" set_setting_value "$dolphinconf" "WiiSDCardPath" "$saves_folder/wii/dolphin/sd.raw" "dolphin" "General"
fi fi
# Shared actions # Shared actions
dir_prep "$saves_folder/gc/dolphin/EU" "/var/data/dolphin-emu/GC/EUR" # TODO: Multi-user one-off dir_prep "$saves_folder/gc/dolphin/EU" "$XDG_DATA_HOME/dolphin-emu/GC/EUR" # TODO: Multi-user one-off
dir_prep "$saves_folder/gc/dolphin/US" "/var/data/dolphin-emu/GC/USA" # TODO: Multi-user one-off dir_prep "$saves_folder/gc/dolphin/US" "$XDG_DATA_HOME/dolphin-emu/GC/USA" # TODO: Multi-user one-off
dir_prep "$saves_folder/gc/dolphin/JP" "/var/data/dolphin-emu/GC/JAP" # TODO: Multi-user one-off dir_prep "$saves_folder/gc/dolphin/JP" "$XDG_DATA_HOME/dolphin-emu/GC/JAP" # TODO: Multi-user one-off
dir_prep "$screenshots_folder" "/var/data/dolphin-emu/ScreenShots" dir_prep "$screenshots_folder" "$XDG_DATA_HOME/dolphin-emu/ScreenShots"
dir_prep "$states_folder/dolphin" "/var/data/dolphin-emu/StateSaves" dir_prep "$states_folder/dolphin" "$XDG_DATA_HOME/dolphin-emu/StateSaves"
dir_prep "$saves_folder/wii/dolphin" "/var/data/dolphin-emu/Wii" dir_prep "$saves_folder/wii/dolphin" "$XDG_DATA_HOME/dolphin-emu/Wii"
dir_prep "$mods_folder/Dolphin" "/var/data/dolphin-emu/Load/GraphicMods" dir_prep "$mods_folder/Dolphin" "$XDG_DATA_HOME/dolphin-emu/Load/GraphicMods"
dir_prep "$texture_packs_folder/Dolphin" "/var/data/dolphin-emu/Load/Textures" dir_prep "$texture_packs_folder/Dolphin" "$XDG_DATA_HOME/dolphin-emu/Load/Textures"
# Reset default preset settings # Reset default preset settings
set_setting_value "$rd_conf" "dolphin" "$(get_setting_value "$rd_defaults" "dolphin" "retrodeck" "ask_to_exit")" "retrodeck" "ask_to_exit" set_setting_value "$rd_conf" "dolphin" "$(get_setting_value "$rd_defaults" "dolphin" "retrodeck" "ask_to_exit")" "retrodeck" "ask_to_exit"
fi fi
if [[ "$action" == "postmove" ]]; then # Run only post-move commands if [[ "$action" == "postmove" ]]; then # Run only post-move commands
dir_prep "$saves_folder/gc/dolphin/EU" "/var/data/dolphin-emu/GC/EUR" dir_prep "$saves_folder/gc/dolphin/EU" "$XDG_DATA_HOME/dolphin-emu/GC/EUR"
dir_prep "$saves_folder/gc/dolphin/US" "/var/data/dolphin-emu/GC/USA" dir_prep "$saves_folder/gc/dolphin/US" "$XDG_DATA_HOME/dolphin-emu/GC/USA"
dir_prep "$saves_folder/gc/dolphin/JP" "/var/data/dolphin-emu/GC/JAP" dir_prep "$saves_folder/gc/dolphin/JP" "$XDG_DATA_HOME/dolphin-emu/GC/JAP"
dir_prep "$screenshots_folder" "/var/data/dolphin-emu/ScreenShots" dir_prep "$screenshots_folder" "$XDG_DATA_HOME/dolphin-emu/ScreenShots"
dir_prep "$states_folder/dolphin" "/var/data/dolphin-emu/StateSaves" dir_prep "$states_folder/dolphin" "$XDG_DATA_HOME/dolphin-emu/StateSaves"
dir_prep "$saves_folder/wii/dolphin" "/var/data/dolphin-emu/Wii" dir_prep "$saves_folder/wii/dolphin" "$XDG_DATA_HOME/dolphin-emu/Wii"
dir_prep "$mods_folder/Dolphin" "/var/data/dolphin-emu/Load/GraphicMods" dir_prep "$mods_folder/Dolphin" "$XDG_DATA_HOME/dolphin-emu/Load/GraphicMods"
dir_prep "$texture_packs_folder/Dolphin" "/var/data/dolphin-emu/Load/Textures" dir_prep "$texture_packs_folder/Dolphin" "$XDG_DATA_HOME/dolphin-emu/Load/Textures"
set_setting_value "$dolphinconf" "BIOS" "$bios_folder" "dolphin" "GBA" set_setting_value "$dolphinconf" "BIOS" "$bios_folder" "dolphin" "GBA"
set_setting_value "$dolphinconf" "SavesPath" "$saves_folder/gba" "dolphin" "GBA" set_setting_value "$dolphinconf" "SavesPath" "$saves_folder/gba" "dolphin" "GBA"
set_setting_value "$dolphinconf" "ISOPath0" "$roms_folder/wii" "dolphin" "General" set_setting_value "$dolphinconf" "ISOPath0" "$roms_folder/wii" "dolphin" "General"
@ -430,11 +432,11 @@ prepare_component() {
set_setting_value "$multi_user_data_folder/$SteamAppUser/data/duckstation/settings.ini" "Card2Path" "$saves_folder/psx/duckstation/memcards/shared_card_2.mcd" "duckstation" "MemoryCards" set_setting_value "$multi_user_data_folder/$SteamAppUser/data/duckstation/settings.ini" "Card2Path" "$saves_folder/psx/duckstation/memcards/shared_card_2.mcd" "duckstation" "MemoryCards"
set_setting_value "$multi_user_data_folder/$SteamAppUser/data/duckstation/settings.ini" "Directory" "$saves_folder/psx/duckstation/memcards" "duckstation" "MemoryCards" set_setting_value "$multi_user_data_folder/$SteamAppUser/data/duckstation/settings.ini" "Directory" "$saves_folder/psx/duckstation/memcards" "duckstation" "MemoryCards"
set_setting_value "$multi_user_data_folder/$SteamAppUser/data/duckstation/settings.ini" "RecursivePaths" "$roms_folder/psx" "duckstation" "GameList" set_setting_value "$multi_user_data_folder/$SteamAppUser/data/duckstation/settings.ini" "RecursivePaths" "$roms_folder/psx" "duckstation" "GameList"
dir_prep "$multi_user_data_folder/$SteamAppUser/config/duckstation" "/var/config/duckstation" dir_prep "$multi_user_data_folder/$SteamAppUser/config/duckstation" "$XDG_CONFIG_HOME/duckstation"
else # Single-user actions else # Single-user actions
create_dir -d "/var/config/duckstation/" create_dir -d "$XDG_CONFIG_HOME/duckstation/"
create_dir "$saves_folder/psx/duckstation/memcards" create_dir "$saves_folder/psx/duckstation/memcards"
cp -fv "$config/duckstation/"* /var/config/duckstation cp -fv "$config/duckstation/"* "$XDG_CONFIG_HOME/duckstation"
set_setting_value "$duckstationconf" "SearchDirectory" "$bios_folder" "duckstation" "BIOS" set_setting_value "$duckstationconf" "SearchDirectory" "$bios_folder" "duckstation" "BIOS"
set_setting_value "$duckstationconf" "Card1Path" "$saves_folder/psx/duckstation/memcards/shared_card_1.mcd" "duckstation" "MemoryCards" set_setting_value "$duckstationconf" "Card1Path" "$saves_folder/psx/duckstation/memcards/shared_card_1.mcd" "duckstation" "MemoryCards"
set_setting_value "$duckstationconf" "Card2Path" "$saves_folder/psx/duckstation/memcards/shared_card_2.mcd" "duckstation" "MemoryCards" set_setting_value "$duckstationconf" "Card2Path" "$saves_folder/psx/duckstation/memcards/shared_card_2.mcd" "duckstation" "MemoryCards"
@ -442,8 +444,8 @@ prepare_component() {
set_setting_value "$duckstationconf" "RecursivePaths" "$roms_folder/psx" "duckstation" "GameList" set_setting_value "$duckstationconf" "RecursivePaths" "$roms_folder/psx" "duckstation" "GameList"
fi fi
# Shared actions # Shared actions
dir_prep "$states_folder/psx/duckstation" "/var/config/duckstation/savestates" # This is hard-coded in Duckstation, always needed dir_prep "$states_folder/psx/duckstation" "$XDG_CONFIG_HOME/duckstation/savestates" # This is hard-coded in Duckstation, always needed
dir_prep "$texture_packs_folder/Duckstation" "/var/config/duckstation/textures" dir_prep "$texture_packs_folder/Duckstation" "$XDG_CONFIG_HOME/duckstation/textures"
# Reset default preset settings # Reset default preset settings
set_setting_value "$rd_conf" "duckstation" "$(get_setting_value "$rd_defaults" "duckstation" "retrodeck" "cheevos")" "retrodeck" "cheevos" set_setting_value "$rd_conf" "duckstation" "$(get_setting_value "$rd_defaults" "duckstation" "retrodeck" "cheevos")" "retrodeck" "cheevos"
@ -457,8 +459,8 @@ prepare_component() {
set_setting_value "$duckstationconf" "Card2Path" "$saves_folder/psx/duckstation/memcards/shared_card_2.mcd" "duckstation" "MemoryCards" set_setting_value "$duckstationconf" "Card2Path" "$saves_folder/psx/duckstation/memcards/shared_card_2.mcd" "duckstation" "MemoryCards"
set_setting_value "$duckstationconf" "Directory" "$saves_folder/psx/duckstation/memcards" "duckstation" "MemoryCards" set_setting_value "$duckstationconf" "Directory" "$saves_folder/psx/duckstation/memcards" "duckstation" "MemoryCards"
set_setting_value "$duckstationconf" "RecursivePaths" "$roms_folder/psx" "duckstation" "GameList" set_setting_value "$duckstationconf" "RecursivePaths" "$roms_folder/psx" "duckstation" "GameList"
dir_prep "$states_folder/psx/duckstation" "/var/config/duckstation/savestates" # This is hard-coded in Duckstation, always needed dir_prep "$states_folder/psx/duckstation" "$XDG_CONFIG_HOME/duckstation/savestates" # This is hard-coded in Duckstation, always needed
dir_prep "$texture_packs_folder/Duckstation" "/var/config/duckstation/textures" dir_prep "$texture_packs_folder/Duckstation" "$XDG_CONFIG_HOME/duckstation/textures"
fi fi
fi fi
@ -470,16 +472,16 @@ prepare_component() {
log i "----------------------" log i "----------------------"
if [[ $multi_user_mode == "true" ]]; then # Multi-user actions if [[ $multi_user_mode == "true" ]]; then # Multi-user actions
create_dir -d "$multi_user_data_folder/$SteamAppUser/config/melonDS/" create_dir -d "$multi_user_data_folder/$SteamAppUser/config/melonDS/"
cp -fvr $config/melonds/melonDS.ini "$multi_user_data_folder/$SteamAppUser/config/melonDS/" cp -fvr "$config/melonds/melonDS.ini" "$multi_user_data_folder/$SteamAppUser/config/melonDS/"
set_setting_value "$multi_user_data_folder/$SteamAppUser/config/melonDS/melonDS.ini" "BIOS9Path" "$bios_folder/bios9.bin" "melonds" set_setting_value "$multi_user_data_folder/$SteamAppUser/config/melonDS/melonDS.ini" "BIOS9Path" "$bios_folder/bios9.bin" "melonds"
set_setting_value "$multi_user_data_folder/$SteamAppUser/config/melonDS/melonDS.ini" "BIOS7Path" "$bios_folder/bios7.bin" "melonds" set_setting_value "$multi_user_data_folder/$SteamAppUser/config/melonDS/melonDS.ini" "BIOS7Path" "$bios_folder/bios7.bin" "melonds"
set_setting_value "$multi_user_data_folder/$SteamAppUser/config/melonDS/melonDS.ini" "FirmwarePath" "$bios_folder/firmware.bin" "melonds" set_setting_value "$multi_user_data_folder/$SteamAppUser/config/melonDS/melonDS.ini" "FirmwarePath" "$bios_folder/firmware.bin" "melonds"
set_setting_value "$multi_user_data_folder/$SteamAppUser/config/melonDS/melonDS.ini" "SaveFilePath" "$saves_folder/nds/melonds" "melonds" set_setting_value "$multi_user_data_folder/$SteamAppUser/config/melonDS/melonDS.ini" "SaveFilePath" "$saves_folder/nds/melonds" "melonds"
set_setting_value "$multi_user_data_folder/$SteamAppUser/config/melonDS/melonDS.ini" "SavestatePath" "$states_folder/nds/melonds" "melonds" set_setting_value "$multi_user_data_folder/$SteamAppUser/config/melonDS/melonDS.ini" "SavestatePath" "$states_folder/nds/melonds" "melonds"
dir_prep "$multi_user_data_folder/$SteamAppUser/config/melonDS" "/var/config/melonDS" dir_prep "$multi_user_data_folder/$SteamAppUser/config/melonDS" "$XDG_CONFIG_HOME/melonDS"
else # Single-user actions else # Single-user actions
create_dir -d /var/config/melonDS/ create_dir -d "$XDG_CONFIG_HOME/melonDS/"
cp -fvr $config/melonds/melonDS.ini /var/config/melonDS/ cp -fvr "$config/melonds/melonDS.ini" "$XDG_CONFIG_HOME/melonDS/"
set_setting_value "$melondsconf" "BIOS9Path" "$bios_folder/bios9.bin" "melonds" set_setting_value "$melondsconf" "BIOS9Path" "$bios_folder/bios9.bin" "melonds"
set_setting_value "$melondsconf" "BIOS7Path" "$bios_folder/bios7.bin" "melonds" set_setting_value "$melondsconf" "BIOS7Path" "$bios_folder/bios7.bin" "melonds"
set_setting_value "$melondsconf" "FirmwarePath" "$bios_folder/firmware.bin" "melonds" set_setting_value "$melondsconf" "FirmwarePath" "$bios_folder/firmware.bin" "melonds"
@ -489,10 +491,10 @@ prepare_component() {
# Shared actions # Shared actions
create_dir "$saves_folder/nds/melonds" create_dir "$saves_folder/nds/melonds"
create_dir "$states_folder/nds/melonds" create_dir "$states_folder/nds/melonds"
dir_prep "$bios_folder" "/var/config/melonDS/bios" dir_prep "$bios_folder" "$XDG_CONFIG_HOME/melonDS/bios"
fi fi
if [[ "$action" == "postmove" ]]; then # Run only post-move commands if [[ "$action" == "postmove" ]]; then # Run only post-move commands
dir_prep "$bios_folder" "/var/config/melonDS/bios" dir_prep "$bios_folder" "$XDG_CONFIG_HOME/melonDS/bios"
set_setting_value "$melondsconf" "BIOS9Path" "$bios_folder/bios9.bin" "melonds" set_setting_value "$melondsconf" "BIOS9Path" "$bios_folder/bios9.bin" "melonds"
set_setting_value "$melondsconf" "BIOS7Path" "$bios_folder/bios7.bin" "melonds" set_setting_value "$melondsconf" "BIOS7Path" "$bios_folder/bios7.bin" "melonds"
set_setting_value "$melondsconf" "FirmwarePath" "$bios_folder/firmware.bin" "melonds" set_setting_value "$melondsconf" "FirmwarePath" "$bios_folder/firmware.bin" "melonds"
@ -515,29 +517,29 @@ prepare_component() {
set_setting_value "$multi_user_data_folder/$SteamAppUser/config/PCSX2/inis/PCSX2.ini" "SaveStates" "$states_folder/ps2/pcsx2" "pcsx2" "Folders" set_setting_value "$multi_user_data_folder/$SteamAppUser/config/PCSX2/inis/PCSX2.ini" "SaveStates" "$states_folder/ps2/pcsx2" "pcsx2" "Folders"
set_setting_value "$multi_user_data_folder/$SteamAppUser/config/PCSX2/inis/PCSX2.ini" "MemoryCards" "$saves_folder/ps2/pcsx2/memcards" "pcsx2" "Folders" set_setting_value "$multi_user_data_folder/$SteamAppUser/config/PCSX2/inis/PCSX2.ini" "MemoryCards" "$saves_folder/ps2/pcsx2/memcards" "pcsx2" "Folders"
set_setting_value "$multi_user_data_folder/$SteamAppUser/config/PCSX2/inis/PCSX2.ini" "RecursivePaths" "$roms_folder/ps2" "pcsx2" "GameList" set_setting_value "$multi_user_data_folder/$SteamAppUser/config/PCSX2/inis/PCSX2.ini" "RecursivePaths" "$roms_folder/ps2" "pcsx2" "GameList"
dir_prep "$multi_user_data_folder/$SteamAppUser/config/PCSX2" "/var/config/PCSX2" dir_prep "$multi_user_data_folder/$SteamAppUser/config/PCSX2" "$XDG_CONFIG_HOME/PCSX2"
else # Single-user actions else # Single-user actions
create_dir -d "/var/config/PCSX2/inis" create_dir -d "$XDG_CONFIG_HOME/PCSX2/inis"
cp -fvr "$config/PCSX2/"* /var/config/PCSX2/inis/ cp -fvr "$config/PCSX2/"* "$XDG_CONFIG_HOME/PCSX2/inis/"
set_setting_value "$pcsx2conf" "Bios" "$bios_folder" "pcsx2" "Folders" set_setting_value "$pcsx2conf" "Bios" "$bios_folder" "pcsx2" "Folders"
set_setting_value "$pcsx2conf" "Snapshots" "$screenshots_folder" "pcsx2" "Folders" set_setting_value "$pcsx2conf" "Snapshots" "$screenshots_folder" "pcsx2" "Folders"
set_setting_value "$pcsx2conf" "SaveStates" "$states_folder/ps2/pcsx2" "pcsx2" "Folders" set_setting_value "$pcsx2conf" "SaveStates" "$states_folder/ps2/pcsx2" "pcsx2" "Folders"
set_setting_value "$pcsx2conf" "MemoryCards" "$saves_folder/ps2/pcsx2/memcards" "pcsx2" "Folders" set_setting_value "$pcsx2conf" "MemoryCards" "$saves_folder/ps2/pcsx2/memcards" "pcsx2" "Folders"
set_setting_value "$pcsx2conf" "RecursivePaths" "$roms_folder/ps2" "pcsx2" "GameList" set_setting_value "$pcsx2conf" "RecursivePaths" "$roms_folder/ps2" "pcsx2" "GameList"
set_setting_value "$pcsx2conf" "Cheats" "$cheats_folder/pcsx2" "Folders" set_setting_value "$pcsx2conf" "Cheats" "$cheats_folder/pcsx2" "Folders"
if [[ -d "$cheats_folder/pcsx2" && "$(ls -A $cheats_folder/pcsx2)" ]]; then if [[ -d "$cheats_folder/pcsx2" && "$(ls -A "$cheats_folder/pcsx2")" ]]; then
backup_file="$backups_folder/cheats/pcsx2-$(date +%y%m%d).tar.gz" backup_file="$backups_folder/cheats/pcsx2-$(date +%y%m%d).tar.gz"
create_dir "$(dirname $backup_file)" create_dir "$(dirname "$backup_file")"
tar -czf "$backup_file" -C "$cheats_folder" pcsx2 tar -czf "$backup_file" -C "$cheats_folder" pcsx2
log i "PCSX2 cheats backed up to $backup_file" log i "PCSX2 cheats backed up to $backup_file"
fi fi
create_dir -d "$cheats_folder/pcsx2" create_dir -d "$cheats_folder/pcsx2"
tar --strip-components=1 -xzf /app/retrodeck/cheats/pcsx2.tar.gz -C "$cheats_folder/pcsx2" --overwrite tar --strip-components=1 -xzf "/app/retrodeck/cheats/pcsx2.tar.gz" -C "$cheats_folder/pcsx2" --overwrite
fi fi
# Shared actions # Shared actions
create_dir "$saves_folder/ps2/pcsx2/memcards" create_dir "$saves_folder/ps2/pcsx2/memcards"
create_dir "$states_folder/ps2/pcsx2" create_dir "$states_folder/ps2/pcsx2"
dir_prep "$texture_packs_folder/PCSX2" "/var/config/PCSX2/textures" dir_prep "$texture_packs_folder/PCSX2" "$XDG_CONFIG_HOME/PCSX2/textures"
# Reset default preset settings # Reset default preset settings
set_setting_value "$rd_conf" "pcsx2" "$(get_setting_value "$rd_defaults" "pcsx2" "retrodeck" "cheevos")" "retrodeck" "cheevos" set_setting_value "$rd_conf" "pcsx2" "$(get_setting_value "$rd_defaults" "pcsx2" "retrodeck" "cheevos")" "retrodeck" "cheevos"
@ -552,7 +554,7 @@ prepare_component() {
set_setting_value "$pcsx2conf" "MemoryCards" "$saves_folder/ps2/pcsx2/memcards" "pcsx2" "Folders" set_setting_value "$pcsx2conf" "MemoryCards" "$saves_folder/ps2/pcsx2/memcards" "pcsx2" "Folders"
set_setting_value "$pcsx2conf" "RecursivePaths" "$roms_folder/ps2" "pcsx2" "GameList" set_setting_value "$pcsx2conf" "RecursivePaths" "$roms_folder/ps2" "pcsx2" "GameList"
set_setting_value "$pcsx2conf" "Cheats" "$cheats_folder/pcsx2" "Folders" set_setting_value "$pcsx2conf" "Cheats" "$cheats_folder/pcsx2" "Folders"
dir_prep "$texture_packs_folder/PCSX2" "/var/config/PCSX2/textures" dir_prep "$texture_packs_folder/PCSX2" "$XDG_CONFIG_HOME/PCSX2/textures"
fi fi
fi fi
@ -579,25 +581,25 @@ prepare_component() {
create_dir -d "$multi_user_data_folder/$SteamAppUser/config/ppsspp/PSP/SYSTEM/" create_dir -d "$multi_user_data_folder/$SteamAppUser/config/ppsspp/PSP/SYSTEM/"
cp -fv "$config/ppssppsdl/"* "$multi_user_data_folder/$SteamAppUser/config/ppsspp/PSP/SYSTEM/" cp -fv "$config/ppssppsdl/"* "$multi_user_data_folder/$SteamAppUser/config/ppsspp/PSP/SYSTEM/"
set_setting_value "$multi_user_data_folder/$SteamAppUser/config/ppsspp/PSP/SYSTEM/ppsspp.ini" "CurrentDirectory" "$roms_folder/psp" "ppsspp" "General" set_setting_value "$multi_user_data_folder/$SteamAppUser/config/ppsspp/PSP/SYSTEM/ppsspp.ini" "CurrentDirectory" "$roms_folder/psp" "ppsspp" "General"
dir_prep "$multi_user_data_folder/$SteamAppUser/config/ppsspp" "/var/config/ppsspp" dir_prep "$multi_user_data_folder/$SteamAppUser/config/ppsspp" "$XDG_CONFIG_HOME/ppsspp"
else # Single-user actions else # Single-user actions
create_dir -d /var/config/ppsspp/PSP/SYSTEM/ create_dir -d "$XDG_CONFIG_HOME/ppsspp/PSP/SYSTEM/"
cp -fv "$config/ppssppsdl/"* /var/config/ppsspp/PSP/SYSTEM/ cp -fv "$config/ppssppsdl/"* "$XDG_CONFIG_HOME/ppsspp/PSP/SYSTEM/"
set_setting_value "$ppssppconf" "CurrentDirectory" "$roms_folder/psp" "ppsspp" "General" set_setting_value "$ppssppconf" "CurrentDirectory" "$roms_folder/psp" "ppsspp" "General"
fi fi
# Shared actions # Shared actions
dir_prep "$saves_folder/PSP/PPSSPP-SA" "/var/config/ppsspp/PSP/SAVEDATA" dir_prep "$saves_folder/PSP/PPSSPP-SA" "$XDG_CONFIG_HOME/ppsspp/PSP/SAVEDATA"
dir_prep "$states_folder/PSP/PPSSPP-SA" "/var/config/ppsspp/PSP/PPSSPP_STATE" dir_prep "$states_folder/PSP/PPSSPP-SA" "$XDG_CONFIG_HOME/ppsspp/PSP/PPSSPP_STATE"
dir_prep "$texture_packs_folder/PPSSPP" "/var/config/ppsspp/PSP/TEXTURES" dir_prep "$texture_packs_folder/PPSSPP" "$XDG_CONFIG_HOME/ppsspp/PSP/TEXTURES"
create_dir -d "$cheats_folder/PPSSPP" create_dir -d "$cheats_folder/PPSSPP"
dir_prep "$cheats_folder/PPSSPP" "/var/config/ppsspp/PSP/Cheats" dir_prep "$cheats_folder/PPSSPP" "$XDG_CONFIG_HOME/ppsspp/PSP/Cheats"
if [[ -d "$cheats_folder/PPSSPP" && "$(ls -A $cheats_folder/PPSSPP)" ]]; then if [[ -d "$cheats_folder/PPSSPP" && "$(ls -A "$cheats_folder"/PPSSPP)" ]]; then
backup_file="$backups_folder/cheats/PPSSPP-$(date +%y%m%d).tar.gz" backup_file="$backups_folder/cheats/PPSSPP-$(date +%y%m%d).tar.gz"
create_dir "$(dirname "$backup_file")" create_dir "$(dirname "$backup_file")"
tar -czf "$backup_file" -C "$cheats_folder" PPSSPP tar -czf "$backup_file" -C "$cheats_folder" PPSSPP
log i "PPSSPP cheats backed up to $backup_file" log i "PPSSPP cheats backed up to $backup_file"
fi fi
tar -xzf /app/retrodeck/cheats/ppsspp.tar.gz -C "$cheats_folder/PPSSPP" --overwrite tar -xzf "/app/retrodeck/cheats/ppsspp.tar.gz" -C "$cheats_folder/PPSSPP" --overwrite
# Reset default preset settings # Reset default preset settings
set_setting_value "$rd_conf" "ppsspp" "$(get_setting_value "$rd_defaults" "ppsspp" "retrodeck" "cheevos")" "retrodeck" "cheevos" set_setting_value "$rd_conf" "ppsspp" "$(get_setting_value "$rd_defaults" "ppsspp" "retrodeck" "cheevos")" "retrodeck" "cheevos"
@ -605,10 +607,10 @@ prepare_component() {
fi fi
if [[ "$action" == "postmove" ]]; then # Run only post-move commands if [[ "$action" == "postmove" ]]; then # Run only post-move commands
set_setting_value "$ppssppconf" "CurrentDirectory" "$roms_folder/psp" "ppsspp" "General" set_setting_value "$ppssppconf" "CurrentDirectory" "$roms_folder/psp" "ppsspp" "General"
dir_prep "$saves_folder/PSP/PPSSPP-SA" "/var/config/ppsspp/PSP/SAVEDATA" dir_prep "$saves_folder/PSP/PPSSPP-SA" "$XDG_CONFIG_HOME/ppsspp/PSP/SAVEDATA"
dir_prep "$states_folder/PSP/PPSSPP-SA" "/var/config/ppsspp/PSP/PPSSPP_STATE" dir_prep "$states_folder/PSP/PPSSPP-SA" "$XDG_CONFIG_HOME/ppsspp/PSP/PPSSPP_STATE"
dir_prep "$texture_packs_folder/PPSSPP" "/var/config/ppsspp/PSP/TEXTURES" dir_prep "$texture_packs_folder/PPSSPP" "$XDG_CONFIG_HOME/ppsspp/PSP/TEXTURES"
dir_prep "$cheats_folder/PPSSPP" "/var/config/ppsspp/PSP/Cheats" dir_prep "$cheats_folder/PPSSPP" "$XDG_CONFIG_HOME/ppsspp/PSP/Cheats"
fi fi
fi fi
@ -621,39 +623,41 @@ prepare_component() {
if [[ $multi_user_mode == "true" ]]; then # Multi-user actions if [[ $multi_user_mode == "true" ]]; then # Multi-user actions
create_dir -d "$multi_user_data_folder/$SteamAppUser/config/primehack" create_dir -d "$multi_user_data_folder/$SteamAppUser/config/primehack"
cp -fvr "$config/primehack/config/"* "$multi_user_data_folder/$SteamAppUser/config/primehack/" cp -fvr "$config/primehack/config/"* "$multi_user_data_folder/$SteamAppUser/config/primehack/"
set_setting_value ""$multi_user_data_folder/$SteamAppUser/config/primehack/Dolphin.ini"" "ISOPath0" "$roms_folder/wii" "primehack" "General" set_setting_value "$multi_user_data_folder/$SteamAppUser/config/primehack/Dolphin.ini" "ISOPath0" "$roms_folder/wii" "primehack" "General"
set_setting_value ""$multi_user_data_folder/$SteamAppUser/config/primehack/Dolphin.ini"" "ISOPath1" "$roms_folder/gc" "primehack" "General" set_setting_value "$multi_user_data_folder/$SteamAppUser/config/primehack/Dolphin.ini" "ISOPath1" "$roms_folder/gc" "primehack" "General"
dir_prep "$multi_user_data_folder/$SteamAppUser/config/primehack" "/var/config/primehack" dir_prep "$multi_user_data_folder/$SteamAppUser/config/primehack" "$XDG_CONFIG_HOME/primehack"
else # Single-user actions else # Single-user actions
create_dir -d /var/config/primehack/ create_dir -d "$XDG_CONFIG_HOME/primehack/"
cp -fvr "$config/primehack/config/"* /var/config/primehack/ cp -fvr "$config/primehack/config/"* "$XDG_CONFIG_HOME/primehack/"
set_setting_value "$primehackconf" "ISOPath0" "$roms_folder/wii" "primehack" "General" set_setting_value "$primehackconf" "ISOPath0" "$roms_folder/wii" "primehack" "General"
set_setting_value "$primehackconf" "ISOPath1" "$roms_folder/gc" "primehack" "General" set_setting_value "$primehackconf" "ISOPath1" "$roms_folder/gc" "primehack" "General"
fi fi
# Shared actions # Shared actions
dir_prep "$saves_folder/gc/primehack/EU" "/var/data/primehack/GC/EUR" dir_prep "$saves_folder/gc/primehack/EU" "$XDG_DATA_HOME/primehack/GC/EUR"
dir_prep "$saves_folder/gc/primehack/US" "/var/data/primehack/GC/USA" dir_prep "$saves_folder/gc/primehack/US" "$XDG_DATA_HOME/primehack/GC/USA"
dir_prep "$saves_folder/gc/primehack/JP" "/var/data/primehack/GC/JAP" dir_prep "$saves_folder/gc/primehack/JP" "$XDG_DATA_HOME/primehack/GC/JAP"
dir_prep "$screenshots_folder" "/var/data/primehack/ScreenShots" dir_prep "$screenshots_folder" "$XDG_DATA_HOME/primehack/ScreenShots"
dir_prep "$states_folder/primehack" "/var/data/primehack/StateSaves" dir_prep "$states_folder/primehack" "$XDG_DATA_HOME/primehack/StateSaves"
create_dir /var/data/primehack/Wii/ create_dir "$XDG_DATA_HOME/primehack/Wii/"
dir_prep "$saves_folder/wii/primehack" "/var/data/primehack/Wii" dir_prep "$saves_folder/wii/primehack" "$XDG_DATA_HOME/primehack/Wii"
dir_prep "$mods_folder/Primehack" "/var/data/primehack/Load/GraphicMods" dir_prep "$mods_folder/Primehack" "$XDG_DATA_HOME/primehack/Load/GraphicMods"
dir_prep "$texture_packs_folder/Primehack" "/var/data/primehack/Load/Textures" dir_prep "$texture_packs_folder/Primehack" "$XDG_DATA_HOME/primehack/Load/Textures"
if [[ $multi_user_mode == "true" ]]; then # Multi-user actions
cp -fvr "$config/primehack/data/"* "$multi_user_data_folder/$SteamAppUser/data/primehack/" # this must be done after the dirs are prepared as it copying some "mods" cp -fvr "$config/primehack/data/"* "$multi_user_data_folder/$SteamAppUser/data/primehack/" # this must be done after the dirs are prepared as it copying some "mods"
fi
# Reset default preset settings # Reset default preset settings
set_setting_value "$rd_conf" "primehack" "$(get_setting_value "$rd_defaults" "primehack" "retrodeck" "ask_to_exit")" "retrodeck" "ask_to_exit" set_setting_value "$rd_conf" "primehack" "$(get_setting_value "$rd_defaults" "primehack" "retrodeck" "ask_to_exit")" "retrodeck" "ask_to_exit"
fi fi
if [[ "$action" == "postmove" ]]; then # Run only post-move commands if [[ "$action" == "postmove" ]]; then # Run only post-move commands
dir_prep "$saves_folder/gc/primehack/EU" "/var/data/primehack/GC/EUR" dir_prep "$saves_folder/gc/primehack/EU" "$XDG_DATA_HOME/primehack/GC/EUR"
dir_prep "$saves_folder/gc/primehack/US" "/var/data/primehack/GC/USA" dir_prep "$saves_folder/gc/primehack/US" "$XDG_DATA_HOME/primehack/GC/USA"
dir_prep "$saves_folder/gc/primehack/JP" "/var/data/primehack/GC/JAP" dir_prep "$saves_folder/gc/primehack/JP" "$XDG_DATA_HOME/primehack/GC/JAP"
dir_prep "$screenshots_folder" "/var/data/primehack/ScreenShots" dir_prep "$screenshots_folder" "$XDG_DATA_HOME/primehack/ScreenShots"
dir_prep "$states_folder/primehack" "/var/data/primehack/StateSaves" dir_prep "$states_folder/primehack" "$XDG_DATA_HOME/primehack/StateSaves"
dir_prep "$saves_folder/wii/primehack" "/var/data/primehack/Wii/" dir_prep "$saves_folder/wii/primehack" "$XDG_DATA_HOME/primehack/Wii/"
dir_prep "$mods_folder/Primehack" "/var/data/primehack/Load/GraphicMods" dir_prep "$mods_folder/Primehack" "$XDG_DATA_HOME/primehack/Load/GraphicMods"
dir_prep "$texture_packs_folder/Primehack" "/var/data/primehack/Load/Textures" dir_prep "$texture_packs_folder/Primehack" "$XDG_DATA_HOME/primehack/Load/Textures"
set_setting_value "$primehackconf" "ISOPath0" "$roms_folder/gc" "primehack" "General" set_setting_value "$primehackconf" "ISOPath0" "$roms_folder/gc" "primehack" "General"
fi fi
fi fi
@ -670,15 +674,15 @@ prepare_component() {
# This is an unfortunate one-off because set_setting_value does not currently support settings with $ in the name. # This is an unfortunate one-off because set_setting_value does not currently support settings with $ in the name.
sed -i 's^\^$(EmulatorDir): .*^$(EmulatorDir): '"$bios_folder/rpcs3/"'^' "$multi_user_data_folder/$SteamAppUser/config/rpcs3/vfs.yml" sed -i 's^\^$(EmulatorDir): .*^$(EmulatorDir): '"$bios_folder/rpcs3/"'^' "$multi_user_data_folder/$SteamAppUser/config/rpcs3/vfs.yml"
set_setting_value "$multi_user_data_folder/$SteamAppUser/config/rpcs3/vfs.yml" "/games/" "$roms_folder/ps3/" "rpcs3" set_setting_value "$multi_user_data_folder/$SteamAppUser/config/rpcs3/vfs.yml" "/games/" "$roms_folder/ps3/" "rpcs3"
dir_prep "$multi_user_data_folder/$SteamAppUser/config/rpcs3" "/var/config/rpcs3" dir_prep "$multi_user_data_folder/$SteamAppUser/config/rpcs3" "$XDG_CONFIG_HOME/rpcs3"
else # Single-user actions else # Single-user actions
create_dir -d /var/config/rpcs3/ create_dir -d "$XDG_CONFIG_HOME/rpcs3/"
cp -fr "$config/rpcs3/"* /var/config/rpcs3/ cp -fr "$config/rpcs3/"* "$XDG_CONFIG_HOME/rpcs3/"
# This is an unfortunate one-off because set_setting_value does not currently support settings with $ in the name. # This is an unfortunate one-off because set_setting_value does not currently support settings with $ in the name.
sed -i 's^\^$(EmulatorDir): .*^$(EmulatorDir): '"$bios_folder/rpcs3/"'^' "$rpcs3vfsconf" sed -i 's^\^$(EmulatorDir): .*^$(EmulatorDir): '"$bios_folder/rpcs3/"'^' "$rpcs3vfsconf"
set_setting_value "$rpcs3vfsconf" "/games/" "$roms_folder/ps3/" "rpcs3" set_setting_value "$rpcs3vfsconf" "/games/" "$roms_folder/ps3/" "rpcs3"
dir_prep "$saves_folder/ps3/rpcs3" "$bios_folder/rpcs3/dev_hdd0/home/00000001/savedata" dir_prep "$saves_folder/ps3/rpcs3" "$bios_folder/rpcs3/dev_hdd0/home/00000001/savedata"
dir_prep "$states_folder/ps3/rpcs3" "/var/config/rpcs3/savestates" dir_prep "$states_folder/ps3/rpcs3" "$XDG_CONFIG_HOME/rpcs3/savestates"
fi fi
# Shared actions # Shared actions
create_dir "$bios_folder/rpcs3/dev_hdd0" create_dir "$bios_folder/rpcs3/dev_hdd0"
@ -707,29 +711,29 @@ prepare_component() {
if [[ $multi_user_mode == "true" ]]; then if [[ $multi_user_mode == "true" ]]; then
rm -rf "$multi_user_data_folder/$SteamAppUser/config/Ryujinx" rm -rf "$multi_user_data_folder/$SteamAppUser/config/Ryujinx"
#create_dir "$multi_user_data_folder/$SteamAppUser/config/Ryujinx/system" #create_dir "$multi_user_data_folder/$SteamAppUser/config/Ryujinx/system"
cp -fv $config/ryujinx/* "$multi_user_data_folder/$SteamAppUser/config/Ryujinx" cp -fv "$config/ryujinx/"* "$multi_user_data_folder/$SteamAppUser/config/Ryujinx"
sed -i 's#RETRODECKHOMEDIR#'$rdhome'#g' "$multi_user_data_folder/$SteamAppUser/config/Ryujinx/Config.json" sed -i 's#RETRODECKHOMEDIR#'"$rdhome"'#g' "$multi_user_data_folder/$SteamAppUser/config/Ryujinx/Config.json"
dir_prep "$multi_user_data_folder/$SteamAppUser/config/Ryujinx" "/var/config/Ryujinx" dir_prep "$multi_user_data_folder/$SteamAppUser/config/Ryujinx" "$XDG_CONFIG_HOME/Ryujinx"
else else
# removing config directory to wipe legacy files # removing config directory to wipe legacy files
log d "Removing \"/var/config/Ryujinx\"" log d "Removing \"$XDG_CONFIG_HOME/Ryujinx\""
rm -rf /var/config/Ryujinx rm -rf "$XDG_CONFIG_HOME/Ryujinx"
create_dir /var/config/Ryujinx/system create_dir "$XDG_CONFIG_HOME/Ryujinx/system"
cp -fv $config/ryujinx/Config.json $ryujinxconf cp -fv "$config/ryujinx/Config.json" "$ryujinxconf"
cp -fvr $config/ryujinx/profiles /var/config/Ryujinx/ cp -fvr "$config/ryujinx/profiles" "$XDG_CONFIG_HOME/Ryujinx/"
log d "Replacing placeholders in \"$ryujinxconf\"" log d "Replacing placeholders in \"$ryujinxconf\""
sed -i 's#RETRODECKHOMEDIR#'$rdhome'#g' "$ryujinxconf" sed -i 's#RETRODECKHOMEDIR#'"$rdhome"'#g' "$ryujinxconf"
create_dir "$logs_folder/ryujinx" create_dir "$logs_folder/ryujinx"
create_dir "$mods_folder/ryujinx" create_dir "$mods_folder/ryujinx"
create_dir "$screenshots_folder/ryujinx" create_dir "$screenshots_folder/ryujinx"
fi fi
fi fi
# if [[ "$action" == "reset" ]] || [[ "$action" == "postmove" ]]; then # Run commands that apply to both resets and moves # if [[ "$action" == "reset" ]] || [[ "$action" == "postmove" ]]; then # Run commands that apply to both resets and moves
# dir_prep "$bios_folder/switch/keys" "/var/config/Ryujinx/system" # dir_prep "$bios_folder/switch/keys" "$XDG_CONFIG_HOME/Ryujinx/system"
# fi # fi
if [[ "$action" == "postmove" ]]; then # Run only post-move commands if [[ "$action" == "postmove" ]]; then # Run only post-move commands
log d "Replacing placeholders in \"$ryujinxconf\"" log d "Replacing placeholders in \"$ryujinxconf\""
sed -i 's#RETRODECKHOMEDIR#'$rdhome'#g' "$ryujinxconf" # This is an unfortunate one-off because set_setting_value does not currently support JSON sed -i 's#RETRODECKHOMEDIR#'"$rdhome"'#g' "$ryujinxconf" # This is an unfortunate one-off because set_setting_value does not currently support JSON
fi fi
fi fi
@ -747,26 +751,26 @@ prepare_component() {
set_setting_value "$multi_user_data_folder/$SteamAppUser/config/yuzu/qt-config.ini" "sdmc_directory" "$saves_folder/switch/yuzu/sdmc" "yuzu" "Data%20Storage" set_setting_value "$multi_user_data_folder/$SteamAppUser/config/yuzu/qt-config.ini" "sdmc_directory" "$saves_folder/switch/yuzu/sdmc" "yuzu" "Data%20Storage"
set_setting_value "$multi_user_data_folder/$SteamAppUser/config/yuzu/qt-config.ini" "Paths\gamedirs\4\path" "$roms_folder/switch" "yuzu" "UI" set_setting_value "$multi_user_data_folder/$SteamAppUser/config/yuzu/qt-config.ini" "Paths\gamedirs\4\path" "$roms_folder/switch" "yuzu" "UI"
set_setting_value "$multi_user_data_folder/$SteamAppUser/config/yuzu/qt-config.ini" "Screenshots\screenshot_path" "$screenshots_folder" "yuzu" "UI" set_setting_value "$multi_user_data_folder/$SteamAppUser/config/yuzu/qt-config.ini" "Screenshots\screenshot_path" "$screenshots_folder" "yuzu" "UI"
dir_prep "$multi_user_data_folder/$SteamAppUser/config/yuzu" "/var/config/yuzu" dir_prep "$multi_user_data_folder/$SteamAppUser/config/yuzu" "$XDG_CONFIG_HOME/yuzu"
else # Single-user actions else # Single-user actions
create_dir -d /var/config/yuzu/ create_dir -d "$XDG_CONFIG_HOME/yuzu/"
cp -fvr "$config/yuzu/"* /var/config/yuzu/ cp -fvr "$config/yuzu/"* "$XDG_CONFIG_HOME/yuzu/"
set_setting_value "$yuzuconf" "nand_directory" "$saves_folder/switch/yuzu/nand" "yuzu" "Data%20Storage" set_setting_value "$yuzuconf" "nand_directory" "$saves_folder/switch/yuzu/nand" "yuzu" "Data%20Storage"
set_setting_value "$yuzuconf" "sdmc_directory" "$saves_folder/switch/yuzu/sdmc" "yuzu" "Data%20Storage" set_setting_value "$yuzuconf" "sdmc_directory" "$saves_folder/switch/yuzu/sdmc" "yuzu" "Data%20Storage"
set_setting_value "$yuzuconf" "Paths\gamedirs\4\path" "$roms_folder/switch" "yuzu" "UI" set_setting_value "$yuzuconf" "Paths\gamedirs\4\path" "$roms_folder/switch" "yuzu" "UI"
set_setting_value "$yuzuconf" "Screenshots\screenshot_path" "$screenshots_folder" "yuzu" "UI" set_setting_value "$yuzuconf" "Screenshots\screenshot_path" "$screenshots_folder" "yuzu" "UI"
fi fi
# Shared actions # Shared actions
dir_prep "$saves_folder/switch/yuzu/nand" "/var/data/yuzu/nand" dir_prep "$saves_folder/switch/yuzu/nand" "$XDG_DATA_HOME/yuzu/nand"
dir_prep "$saves_folder/switch/yuzu/sdmc" "/var/data/yuzu/sdmc" dir_prep "$saves_folder/switch/yuzu/sdmc" "$XDG_DATA_HOME/yuzu/sdmc"
dir_prep "$bios_folder/switch/keys" "/var/data/yuzu/keys" dir_prep "$bios_folder/switch/keys" "$XDG_DATA_HOME/yuzu/keys"
dir_prep "$bios_folder/switch/firmware" "/var/data/yuzu/nand/system/Contents/registered" dir_prep "$bios_folder/switch/firmware" "$XDG_DATA_HOME/yuzu/nand/system/Contents/registered"
dir_prep "$logs_folder/yuzu" "/var/data/yuzu/log" dir_prep "$logs_folder/yuzu" "$XDG_DATA_HOME/yuzu/log"
dir_prep "$screenshots_folder" "/var/data/yuzu/screenshots" dir_prep "$screenshots_folder" "$XDG_DATA_HOME/yuzu/screenshots"
dir_prep "$mods_folder/Yuzu" "/var/data/yuzu/load" dir_prep "$mods_folder/Yuzu" "$XDG_DATA_HOME/yuzu/load"
# removing dead symlinks as they were present in a past version # removing dead symlinks as they were present in a past version
if [ -d $bios_folder/switch ]; then if [ -d "$bios_folder/switch" ]; then
find $bios_folder/switch -xtype l -exec rm {} \; find "$bios_folder/switch" -xtype l -exec rm {} \;
fi fi
# Reset default preset settings # Reset default preset settings
@ -774,13 +778,13 @@ prepare_component() {
set_setting_value "$rd_conf" "yuzu" "$(get_setting_value "$rd_defaults" "yuzu" "retrodeck" "ask_to_exit")" "retrodeck" "ask_to_exit" set_setting_value "$rd_conf" "yuzu" "$(get_setting_value "$rd_defaults" "yuzu" "retrodeck" "ask_to_exit")" "retrodeck" "ask_to_exit"
fi fi
if [[ "$action" == "postmove" ]]; then # Run only post-move commands if [[ "$action" == "postmove" ]]; then # Run only post-move commands
dir_prep "$bios_folder/switch/keys" "/var/data/yuzu/keys" dir_prep "$bios_folder/switch/keys" "$XDG_DATA_HOME/yuzu/keys"
dir_prep "$bios_folder/switch/firmware" "/var/data/yuzu/nand/system/Contents/registered" dir_prep "$bios_folder/switch/firmware" "$XDG_DATA_HOME/yuzu/nand/system/Contents/registered"
dir_prep "$saves_folder/switch/yuzu/nand" "/var/data/yuzu/nand" dir_prep "$saves_folder/switch/yuzu/nand" "$XDG_DATA_HOME/yuzu/nand"
dir_prep "$saves_folder/switch/yuzu/sdmc" "/var/data/yuzu/sdmc" dir_prep "$saves_folder/switch/yuzu/sdmc" "$XDG_DATA_HOME/yuzu/sdmc"
dir_prep "$logs_folder/yuzu" "/var/data/yuzu/log" dir_prep "$logs_folder/yuzu" "$XDG_DATA_HOME/yuzu/log"
dir_prep "$screenshots_folder" "/var/data/yuzu/screenshots" dir_prep "$screenshots_folder" "$XDG_DATA_HOME/yuzu/screenshots"
dir_prep "$mods_folder/Yuzu" "/var/data/yuzu/load" dir_prep "$mods_folder/Yuzu" "$XDG_DATA_HOME/yuzu/load"
set_setting_value "$yuzuconf" "nand_directory" "$saves_folder/switch/yuzu/nand" "yuzu" "Data%20Storage" set_setting_value "$yuzuconf" "nand_directory" "$saves_folder/switch/yuzu/nand" "yuzu" "Data%20Storage"
set_setting_value "$yuzuconf" "sdmc_directory" "$saves_folder/switch/yuzu/sdmc" "yuzu" "Data%20Storage" set_setting_value "$yuzuconf" "sdmc_directory" "$saves_folder/switch/yuzu/sdmc" "yuzu" "Data%20Storage"
set_setting_value "$yuzuconf" "Paths\gamedirs\4\path" "$roms_folder/switch" "yuzu" "UI" set_setting_value "$yuzuconf" "Paths\gamedirs\4\path" "$roms_folder/switch" "yuzu" "UI"
@ -796,31 +800,31 @@ prepare_component() {
log i "Prepearing XEMU" log i "Prepearing XEMU"
log i "------------------------" log i "------------------------"
if [[ $multi_user_mode == "true" ]]; then # Multi-user actions if [[ $multi_user_mode == "true" ]]; then # Multi-user actions
rm -rf /var/config/xemu rm -rf "$XDG_CONFIG_HOME/xemu"
rm -rf /var/data/xemu rm -rf "$XDG_DATA_HOME/xemu"
create_dir -d "$multi_user_data_folder/$SteamAppUser/config/xemu/" create_dir -d "$multi_user_data_folder/$SteamAppUser/config/xemu/"
cp -fv $config/xemu/xemu.toml "$multi_user_data_folder/$SteamAppUser/config/xemu/xemu.toml" cp -fv "$config/xemu/xemu.toml" "$multi_user_data_folder/$SteamAppUser/config/xemu/xemu.toml"
set_setting_value "$multi_user_data_folder/$SteamAppUser/config/xemu/xemu.toml" "screenshot_dir" "'$screenshots_folder'" "xemu" "General" set_setting_value "$multi_user_data_folder/$SteamAppUser/config/xemu/xemu.toml" "screenshot_dir" "'$screenshots_folder'" "xemu" "General"
set_setting_value "$multi_user_data_folder/$SteamAppUser/config/xemu/xemu.toml" "bootrom_path" "'$bios_folder/mcpx_1.0.bin'" "xemu" "sys.files" set_setting_value "$multi_user_data_folder/$SteamAppUser/config/xemu/xemu.toml" "bootrom_path" "'$bios_folder/mcpx_1.0.bin'" "xemu" "sys.files"
set_setting_value "$multi_user_data_folder/$SteamAppUser/config/xemu/xemu.toml" "flashrom_path" "'$bios_folder/Complex.bin'" "xemu" "sys.files" set_setting_value "$multi_user_data_folder/$SteamAppUser/config/xemu/xemu.toml" "flashrom_path" "'$bios_folder/Complex.bin'" "xemu" "sys.files"
set_setting_value "$multi_user_data_folder/$SteamAppUser/config/xemu/xemu.toml" "eeprom_path" "'$saves_folder/xbox/xemu/xbox-eeprom.bin'" "xemu" "sys.files" set_setting_value "$multi_user_data_folder/$SteamAppUser/config/xemu/xemu.toml" "eeprom_path" "'$saves_folder/xbox/xemu/xbox-eeprom.bin'" "xemu" "sys.files"
set_setting_value "$multi_user_data_folder/$SteamAppUser/config/xemu/xemu.toml" "hdd_path" "'$bios_folder/xbox_hdd.qcow2'" "xemu" "sys.files" set_setting_value "$multi_user_data_folder/$SteamAppUser/config/xemu/xemu.toml" "hdd_path" "'$bios_folder/xbox_hdd.qcow2'" "xemu" "sys.files"
dir_prep "$multi_user_data_folder/$SteamAppUser/config/xemu" "/var/config/xemu" # Creating config folder in /var/config for consistentcy and linking back to original location where component will look dir_prep "$multi_user_data_folder/$SteamAppUser/config/xemu" "$XDG_CONFIG_HOME/xemu" # Creating config folder in $XDG_CONFIG_HOME for consistentcy and linking back to original location where component will look
dir_prep "$multi_user_data_folder/$SteamAppUser/config/xemu" "/var/data/xemu/xemu" dir_prep "$multi_user_data_folder/$SteamAppUser/config/xemu" "$XDG_DATA_HOME/xemu/xemu"
else # Single-user actions else # Single-user actions
rm -rf /var/config/xemu rm -rf "$XDG_CONFIG_HOME/xemu"
rm -rf /var/data/xemu rm -rf "$XDG_DATA_HOME/xemu"
dir_prep "/var/config/xemu" "/var/data/xemu/xemu" # Creating config folder in /var/config for consistentcy and linking back to original location where component will look dir_prep "$XDG_CONFIG_HOME/xemu" "$XDG_DATA_HOME/xemu/xemu" # Creating config folder in $XDG_CONFIG_HOME for consistentcy and linking back to original location where component will look
cp -fv $config/xemu/xemu.toml "$xemuconf" cp -fv "$config/xemu/xemu.toml" "$xemuconf"
set_setting_value "$xemuconf" "screenshot_dir" "'$screenshots_folder'" "xemu" "General" set_setting_value "$xemuconf" "screenshot_dir" "'$screenshots_folder'" "xemu" "General"
set_setting_value "$xemuconf" "bootrom_path" "'$bios_folder/mcpx_1.0.bin'" "xemu" "sys.files" set_setting_value "$xemuconf" "bootrom_path" "'$bios_folder/mcpx_1.0.bin'" "xemu" "sys.files"
set_setting_value "$xemuconf" "flashrom_path" "'$bios_folder/Complex.bin'" "xemu" "sys.files" set_setting_value "$xemuconf" "flashrom_path" "'$bios_folder/Complex.bin'" "xemu" "sys.files"
set_setting_value "$xemuconf" "eeprom_path" "'$saves_folder/xbox/xemu/xbox-eeprom.bin'" "xemu" "sys.files" set_setting_value "$xemuconf" "eeprom_path" "'$saves_folder/xbox/xemu/xbox-eeprom.bin'" "xemu" "sys.files"
set_setting_value "$xemuconf" "hdd_path" "'$bios_folder/xbox_hdd.qcow2'" "xemu" "sys.files" set_setting_value "$xemuconf" "hdd_path" "'$bios_folder/xbox_hdd.qcow2'" "xemu" "sys.files"
fi # Shared actions fi # Shared actions
create_dir $saves_folder/xbox/xemu/ create_dir "$saves_folder/xbox/xemu/"
# Preparing HD dummy Image if the image is not found # Preparing HD dummy Image if the image is not found
if [ ! -f $bios_folder/xbox_hdd.qcow2 ] if [ ! -f "$bios_folder/xbox_hdd.qcow2" ]
then then
cp -f "/app/retrodeck/extras/XEMU/xbox_hdd.qcow2" "$bios_folder/xbox_hdd.qcow2" cp -f "/app/retrodeck/extras/XEMU/xbox_hdd.qcow2" "$bios_folder/xbox_hdd.qcow2"
fi fi
@ -844,8 +848,8 @@ prepare_component() {
log d "Figure out what Vita3k needs for multi-user" log d "Figure out what Vita3k needs for multi-user"
else # Single-user actions else # Single-user actions
# NOTE: the component is writing in "." so it must be placed in the rw filesystem. A symlink of the binary is already placed in /app/bin/Vita3K # NOTE: the component is writing in "." so it must be placed in the rw filesystem. A symlink of the binary is already placed in /app/bin/Vita3K
rm -rf "/var/config/Vita3K" rm -rf "$XDG_CONFIG_HOME/Vita3K"
create_dir "/var/config/Vita3K" create_dir "$XDG_CONFIG_HOME/Vita3K"
cp -fvr "$config/vita3k/config.yml" "$vita3kconf" # component config cp -fvr "$config/vita3k/config.yml" "$vita3kconf" # component config
cp -fvr "$config/vita3k/ux0" "$bios_folder/Vita3K/" # User config cp -fvr "$config/vita3k/ux0" "$bios_folder/Vita3K/" # User config
set_setting_value "$vita3kconf" "pref-path" "$bios_folder/Vita3K/" "vita3k" set_setting_value "$vita3kconf" "pref-path" "$bios_folder/Vita3K/" "vita3k"
@ -874,51 +878,51 @@ prepare_component() {
create_dir "$rdhome/screenshots/mame-sa" create_dir "$rdhome/screenshots/mame-sa"
create_dir "$saves_folder/mame-sa/diff" create_dir "$saves_folder/mame-sa/diff"
create_dir "/var/config/ctrlr" create_dir "$XDG_CONFIG_HOME/ctrlr"
create_dir "/var/config/mame/ini" create_dir "$XDG_CONFIG_HOME/mame/ini"
create_dir "/var/config/mame/cfg" create_dir "$XDG_CONFIG_HOME/mame/cfg"
create_dir "/var/config/mame/inp" create_dir "$XDG_CONFIG_HOME/mame/inp"
create_dir "/var/data/mame/plugin-data" create_dir "$XDG_DATA_HOME/mame/plugin-data"
create_dir "/var/data/mame/hash" create_dir "$XDG_DATA_HOME/mame/hash"
create_dir "$bios_folder/mame-sa/samples" create_dir "$bios_folder/mame-sa/samples"
create_dir "/var/data/mame/assets/artwork" create_dir "$XDG_DATA_HOME/mame/assets/artwork"
create_dir "/var/data/mame/assets/fonts" create_dir "$XDG_DATA_HOME/mame/assets/fonts"
create_dir "/var/data/mame/assets/crosshair" create_dir "$XDG_DATA_HOME/mame/assets/crosshair"
create_dir "/var/data/mame/plugins" create_dir "$XDG_DATA_HOME/mame/plugins"
create_dir "/var/data/mame/assets/language" create_dir "$XDG_DATA_HOME/mame/assets/language"
create_dir "/var/data/mame/assets/software" create_dir "$XDG_DATA_HOME/mame/assets/software"
create_dir "/var/data/mame/assets/comments" create_dir "$XDG_DATA_HOME/mame/assets/comments"
create_dir "/var/data/mame/assets/share" create_dir "$XDG_DATA_HOME/mame/assets/share"
create_dir "/var/data/mame/dats" create_dir "$XDG_DATA_HOME/mame/dats"
create_dir "/var/data/mame/folders" create_dir "$XDG_DATA_HOME/mame/folders"
create_dir "/var/data/mame/assets/cabinets" create_dir "$XDG_DATA_HOME/mame/assets/cabinets"
create_dir "/var/data/mame/assets/cpanel" create_dir "$XDG_DATA_HOME/mame/assets/cpanel"
create_dir "/var/data/mame/assets/pcb" create_dir "$XDG_DATA_HOME/mame/assets/pcb"
create_dir "/var/data/mame/assets/flyers" create_dir "$XDG_DATA_HOME/mame/assets/flyers"
create_dir "/var/data/mame/assets/titles" create_dir "$XDG_DATA_HOME/mame/assets/titles"
create_dir "/var/data/mame/assets/ends" create_dir "$XDG_DATA_HOME/mame/assets/ends"
create_dir "/var/data/mame/assets/marquees" create_dir "$XDG_DATA_HOME/mame/assets/marquees"
create_dir "/var/data/mame/assets/artwork-preview" create_dir "$XDG_DATA_HOME/mame/assets/artwork-preview"
create_dir "/var/data/mame/assets/bosses" create_dir "$XDG_DATA_HOME/mame/assets/bosses"
create_dir "/var/data/mame/assets/logo" create_dir "$XDG_DATA_HOME/mame/assets/logo"
create_dir "/var/data/mame/assets/scores" create_dir "$XDG_DATA_HOME/mame/assets/scores"
create_dir "/var/data/mame/assets/versus" create_dir "$XDG_DATA_HOME/mame/assets/versus"
create_dir "/var/data/mame/assets/gameover" create_dir "$XDG_DATA_HOME/mame/assets/gameover"
create_dir "/var/data/mame/assets/howto" create_dir "$XDG_DATA_HOME/mame/assets/howto"
create_dir "/var/data/mame/assets/select" create_dir "$XDG_DATA_HOME/mame/assets/select"
create_dir "/var/data/mame/assets/icons" create_dir "$XDG_DATA_HOME/mame/assets/icons"
create_dir "/var/data/mame/assets/covers" create_dir "$XDG_DATA_HOME/mame/assets/covers"
create_dir "/var/data/mame/assets/ui" create_dir "$XDG_DATA_HOME/mame/assets/ui"
create_dir "$shaders_folder/mame/bgfx/" create_dir "$shaders_folder/mame/bgfx/"
dir_prep "$saves_folder/mame-sa/hiscore" "/var/config/mame/hiscore" dir_prep "$saves_folder/mame-sa/hiscore" "$XDG_CONFIG_HOME/mame/hiscore"
cp -fvr "$config/mame/mame.ini" "$mameconf" cp -fvr "$config/mame/mame.ini" "$mameconf"
cp -fvr "$config/mame/ui.ini" "$mameuiconf" cp -fvr "$config/mame/ui.ini" "$mameuiconf"
cp -fvr "$config/mame/default.cfg" "$mamedefconf" cp -fvr "$config/mame/default.cfg" "$mamedefconf"
cp -fvr "/app/share/mame/bgfx/"* "$shaders_folder/mame/bgfx" cp -fvr "/app/share/mame/bgfx/"* "$shaders_folder/mame/bgfx"
sed -i 's#RETRODECKROMSDIR#'$roms_folder'#g' "$mameconf" # one-off as roms folders are a lot sed -i 's#RETRODECKROMSDIR#'"$roms_folder"'#g' "$mameconf" # one-off as roms folders are a lot
set_setting_value "$mameconf" "nvram_directory" "$saves_folder/mame-sa/nvram" "mame" set_setting_value "$mameconf" "nvram_directory" "$saves_folder/mame-sa/nvram" "mame"
set_setting_value "$mameconf" "state_directory" "$states_folder/mame-sa" "mame" set_setting_value "$mameconf" "state_directory" "$states_folder/mame-sa" "mame"
set_setting_value "$mameconf" "snapshot_directory" "$screenshots_folder/mame-sa" "mame" set_setting_value "$mameconf" "snapshot_directory" "$screenshots_folder/mame-sa" "mame"
@ -940,17 +944,17 @@ prepare_component() {
log i "Prepearing GZDOOM" log i "Prepearing GZDOOM"
log i "----------------------" log i "----------------------"
create_dir "/var/config/gzdoom" create_dir "$XDG_CONFIG_HOME/gzdoom"
create_dir "/var/data/gzdoom/audio/midi" create_dir "$XDG_DATA_HOME/gzdoom/audio/midi"
create_dir "/var/data/gzdoom/audio/fm_banks" create_dir "$XDG_DATA_HOME/gzdoom/audio/fm_banks"
create_dir "/var/data/gzdoom/audio/soundfonts" create_dir "$XDG_DATA_HOME/gzdoom/audio/soundfonts"
create_dir "$bios_folder/gzdoom" create_dir "$bios_folder/gzdoom"
cp -fvr "$config/gzdoom/gzdoom.ini" "/var/config/gzdoom" cp -fvr "$config/gzdoom/gzdoom.ini" "$XDG_CONFIG_HOME/gzdoom"
sed -i 's#RETRODECKHOMEDIR#'$rdhome'#g' "/var/config/gzdoom/gzdoom.ini" # This is an unfortunate one-off because set_setting_value does not currently support JSON sed -i 's#RETRODECKHOMEDIR#'"$rdhome"'#g' "$XDG_CONFIG_HOME/gzdoom/gzdoom.ini" # This is an unfortunate one-off because set_setting_value does not currently support JSON
sed -i 's#RETRODECKROMSDIR#'$roms_folder'#g' "/var/config/gzdoom/gzdoom.ini" # This is an unfortunate one-off because set_setting_value does not currently support JSON sed -i 's#RETRODECKROMSDIR#'"$roms_folder"'#g' "$XDG_CONFIG_HOME/gzdoom/gzdoom.ini" # This is an unfortunate one-off because set_setting_value does not currently support JSON
sed -i 's#RETRODECKSAVESDIR#'$saves_folder'#g' "/var/config/gzdoom/gzdoom.ini" # This is an unfortunate one-off because set_setting_value does not currently support JSON sed -i 's#RETRODECKSAVESDIR#'"$saves_folder"'#g' "$XDG_CONFIG_HOME/gzdoom/gzdoom.ini" # This is an unfortunate one-off because set_setting_value does not currently support JSON
fi fi
if [[ "$component" =~ ^(portmaster|all)$ ]]; then if [[ "$component" =~ ^(portmaster|all)$ ]]; then
@ -960,14 +964,14 @@ prepare_component() {
log i "Prepearing PortMaster" log i "Prepearing PortMaster"
log i "----------------------" log i "----------------------"
rm -rf "/var/data/PortMaster" rm -rf "$XDG_DATA_HOME/PortMaster"
unzip "/app/retrodeck/PortMaster.zip" -d "/var/data/" unzip "/app/retrodeck/PortMaster.zip" -d "$XDG_DATA_HOME/"
cp -f "/var/data/PortMaster/retrodeck/PortMaster.txt" "/var/data/PortMaster/PortMaster.sh" cp -f "$XDG_DATA_HOME/PortMaster/retrodeck/PortMaster.txt" "$XDG_DATA_HOME/PortMaster/PortMaster.sh"
chmod +x "/var/data/PortMaster/PortMaster.sh" chmod +x "$XDG_DATA_HOME/PortMaster/PortMaster.sh"
rm -f "$roms_folder/portmaster/PortMaster.sh" rm -f "$roms_folder/portmaster/PortMaster.sh"
install -Dm755 "/var/data/PortMaster/PortMaster.sh" "$roms_folder/portmaster/PortMaster.sh" install -Dm755 "$XDG_DATA_HOME/PortMaster/PortMaster.sh" "$roms_folder/portmaster/PortMaster.sh"
create_dir "/var/data/PortMaster/config/" create_dir "$XDG_DATA_HOME/PortMaster/config/"
cp "$config/portmaster/config.json" "/var/data/PortMaster/config/config.json" cp "$config/portmaster/config.json" "$XDG_DATA_HOME/PortMaster/config/config.json"
fi fi
@ -977,14 +981,14 @@ prepare_component() {
log i "Prepearing Ruffle" log i "Prepearing Ruffle"
log i "----------------------" log i "----------------------"
rm -rf "/var/config/ruffle" rm -rf "$XDG_CONFIG_HOME/ruffle"
# Ruffle creates a directory with the full rom paths in it, so this is necessary # Ruffle creates a directory with the full rom paths in it, so this is necessary
# TODO: be aware of this when multi user support will be integrated for this component # TODO: be aware of this when multi user support will be integrated for this component
dir_prep "$saves_folder/flash" "/var/data/ruffle/SharedObjects/localhost/$roms_folder/flash" dir_prep "$saves_folder/flash" "$XDG_DATA_HOME/ruffle/SharedObjects/localhost/$roms_folder/flash"
if [[ "$action" == "postmove" ]]; then # Run only post-move commands if [[ "$action" == "postmove" ]]; then # Run only post-move commands
dir_prep "$saves_folder/flash" "/var/data/ruffle/SharedObjects/localhost/$roms_folder/flash" dir_prep "$saves_folder/flash" "$XDG_DATA_HOME/ruffle/SharedObjects/localhost/$roms_folder/flash"
fi fi
fi fi

View file

@ -114,14 +114,14 @@ build_preset_list_options() {
preset="$1" preset="$1"
pretty_preset_name=${preset//_/ } # Preset name prettification pretty_preset_name=${preset//_/ } # Preset name prettification
pretty_preset_name=$(echo $pretty_preset_name | awk '{for(i=1;i<=NF;i++){$i=toupper(substr($i,1,1))substr($i,2)}}1') # Preset name prettification pretty_preset_name=$(echo "$pretty_preset_name" | awk '{for(i=1;i<=NF;i++){$i=toupper(substr($i,1,1))substr($i,2)}}1') # Preset name prettification
current_preset_settings=() current_preset_settings=()
current_enabled_systems=() current_enabled_systems=()
current_disabled_systems=() current_disabled_systems=()
changed_systems=() changed_systems=()
changed_presets=() changed_presets=()
all_systems=() all_systems=()
local section_results=$(sed -n '/\['"$preset"'\]/, /\[/{ /\['"$preset"'\]/! { /\[/! p } }' $rd_conf | sed '/^$/d') local section_results=$(sed -n '/\['"$preset"'\]/, /\[/{ /\['"$preset"'\]/! { /\[/! p } }' "$rd_conf" | sed '/^$/d')
while IFS= read -r config_line while IFS= read -r config_line
do do
@ -133,8 +133,8 @@ build_preset_list_options() {
elif [[ "$system_value" == "false" ]]; then elif [[ "$system_value" == "false" ]]; then
current_disabled_systems=("${current_disabled_systems[@]}" "$system_name") current_disabled_systems=("${current_disabled_systems[@]}" "$system_name")
fi fi
current_preset_settings=("${current_preset_settings[@]}" "$system_value" "$(make_name_pretty $system_name)" "$system_name") current_preset_settings=("${current_preset_settings[@]}" "$system_value" "$(make_name_pretty "$system_name")" "$system_name")
echo "$system_value"^"$(make_name_pretty $system_name)"^"$system_name" >> "$godot_current_preset_settings" echo "$system_value"^"$(make_name_pretty "$system_name")"^"$system_name" >> "$godot_current_preset_settings"
done < <(printf '%s\n' "$section_results") done < <(printf '%s\n' "$section_results")
} }
@ -252,7 +252,7 @@ build_preset_config() {
log d "Applying presets: $presets_being_changed for system: $system_being_changed" log d "Applying presets: $presets_being_changed for system: $system_being_changed"
for current_preset in $presets_being_changed for current_preset in $presets_being_changed
do do
local preset_section=$(sed -n '/\['"$current_preset"'\]/, /\[/{ /\['"$current_preset"'\]/! { /\[/! p } }' $rd_conf | sed '/^$/d') local preset_section=$(sed -n '/\['"$current_preset"'\]/, /\[/{ /\['"$current_preset"'\]/! { /\[/! p } }' "$rd_conf" | sed '/^$/d')
while IFS= read -r system_line while IFS= read -r system_line
do do
local read_system_name=$(get_setting_name "$system_line") local read_system_name=$(get_setting_name "$system_line")
@ -376,7 +376,7 @@ build_retrodeck_current_presets() {
do do
if [[ (! -z "$current_setting_line") && (! "$current_setting_line" == "#"*) && (! "$current_setting_line" == "[]") ]]; then # If the line has a valid entry in it if [[ (! -z "$current_setting_line") && (! "$current_setting_line" == "#"*) && (! "$current_setting_line" == "[]") ]]; then # If the line has a valid entry in it
if [[ ! -z $(grep -o -P "^\[.+?\]$" <<< "$current_setting_line") ]]; then # If the line is a section header if [[ ! -z $(grep -o -P "^\[.+?\]$" <<< "$current_setting_line") ]]; then # If the line is a section header
local current_section=$(sed 's^[][]^^g' <<< $current_setting_line) # Remove brackets from section name local current_section=$(sed 's^[][]^^g' <<< "$current_setting_line") # Remove brackets from section name
else else
if [[ ! ("$current_section" == "" || "$current_section" == "paths" || "$current_section" == "options" || "$current_section" == "cheevos" || "$current_section" == "cheevos_hardcore") ]]; then if [[ ! ("$current_section" == "" || "$current_section" == "paths" || "$current_section" == "options" || "$current_section" == "cheevos" || "$current_section" == "cheevos_hardcore") ]]; then
local system_name=$(get_setting_name "$current_setting_line" "retrodeck") # Read the variable name from the current line local system_name=$(get_setting_name "$current_setting_line" "retrodeck") # Read the variable name from the current line
@ -387,7 +387,7 @@ build_retrodeck_current_presets() {
fi fi
fi fi
fi fi
done < $rd_conf done < "$rd_conf"
} }
fetch_all_presets() { fetch_all_presets() {
@ -417,7 +417,7 @@ fetch_all_presets() {
presets+=("$preset") presets+=("$preset")
if $pretty_output; then if $pretty_output; then
pretty_preset_name=${preset//_/ } # Preset name prettification pretty_preset_name=${preset//_/ } # Preset name prettification
pretty_preset_name=$(echo $pretty_preset_name | awk '{for(i=1;i<=NF;i++){$i=toupper(substr($i,1,1))substr($i,2)}}1') # Preset name prettification pretty_preset_name=$(echo "$pretty_preset_name" | awk '{for(i=1;i<=NF;i++){$i=toupper(substr($i,1,1))substr($i,2)}}1') # Preset name prettification
pretty_presets+=("$pretty_preset_name") pretty_presets+=("$pretty_preset_name")
fi fi
fi fi
@ -433,7 +433,7 @@ fetch_all_presets() {
presets+=("$preset") presets+=("$preset")
if $pretty_output; then if $pretty_output; then
pretty_preset_name=${preset//_/ } # Preset name prettification pretty_preset_name=${preset//_/ } # Preset name prettification
pretty_preset_name=$(echo $pretty_preset_name | awk '{for(i=1;i<=NF;i++){$i=toupper(substr($i,1,1))substr($i,2)}}1') # Preset name prettification pretty_preset_name=$(echo "$pretty_preset_name" | awk '{for(i=1;i<=NF;i++){$i=toupper(substr($i,1,1))substr($i,2)}}1') # Preset name prettification
pretty_presets+=("$pretty_preset_name") pretty_presets+=("$pretty_preset_name")
fi fi
fi fi

View file

@ -389,8 +389,8 @@ find_emulator() {
while IFS= read -r line; do while IFS= read -r line; do
command_path=$(echo "$line" | sed -n 's/.*<entry>\(.*\)<\/entry>.*/\1/p') command_path=$(echo "$line" | sed -n 's/.*<entry>\(.*\)<\/entry>.*/\1/p')
# Check if the command specified by the variable 'command_path' exists and is executable # Check if the command specified by the variable 'command_path' exists and is executable
if [ -x "$(command -v $command_path)" ]; then if [ -x "$(command -v "$command_path")" ]; then
found_path=$command_path found_path="$command_path"
break break
fi fi
done <<< "$(echo "$emulator_section" | xmllint --xpath "//rule[@type='systempath']/entry" - 2>/dev/null)" done <<< "$(echo "$emulator_section" | xmllint --xpath "//rule[@type='systempath']/entry" - 2>/dev/null)"
@ -400,7 +400,7 @@ find_emulator() {
while IFS= read -r line; do while IFS= read -r line; do
command_path=$(echo "$line" | sed -n 's/.*<entry>\(.*\)<\/entry>.*/\1/p') command_path=$(echo "$line" | sed -n 's/.*<entry>\(.*\)<\/entry>.*/\1/p')
if [ -x "$command_path" ]; then if [ -x "$command_path" ]; then
found_path=$command_path found_path="$command_path"
break break
fi fi
done <<< "$(echo "$emulator_section" | xmllint --xpath "//rule[@type='staticpath']/entry" - 2>/dev/null)" done <<< "$(echo "$emulator_section" | xmllint --xpath "//rule[@type='staticpath']/entry" - 2>/dev/null)"

View file

@ -9,7 +9,7 @@ steam_sync() {
# USAGE: steam_sync # USAGE: steam_sync
log "i" "Starting Steam Sync" log "i" "Starting Steam Sync"
create_dir $steamsync_folder create_dir "$steamsync_folder"
if [ ! -f "$srm_path" ]; then if [ ! -f "$srm_path" ]; then
log "e" "Steam ROM Manager configuration not initialized! Initializing now." log "e" "Steam ROM Manager configuration not initialized! Initializing now."
@ -61,34 +61,31 @@ steam_sync() {
'[$source[0][] | select(. as $item | ($target[0] | map(. == $item) | any | not))]') '[$source[0][] | select(. as $item | ($target[0] | map(. == $item) | any | not))]')
fi fi
if [[ -f "$retrodeck_favorites_file" && -f "${retrodeck_favorites_file}.new" ]]; then
# Look for new favorites added between steam_sync runs, if any
added_items=$(jq -n \
--slurpfile source "${retrodeck_favorites_file}.new" \
--slurpfile target "$retrodeck_favorites_file" \
'[$source[0][] | select(. as $item | ($target[0] | map(. == $item) | any | not))]')
fi
# Check if there are any missing objects # Check if there are any missing objects
if [[ "$(echo "$removed_items" | jq 'length')" -gt 0 ]]; then if [[ "$(echo "$removed_items" | jq 'length')" -gt 0 ]]; then
log d "Some favorites were removed between sync, writing to $retrodeck_removed_favorites" log d "Some favorites were removed between sync, writing to $retrodeck_removed_favorites"
echo "$removed_items" > "$retrodeck_removed_favorites" echo "$removed_items" > "$retrodeck_removed_favorites"
fi fi
# Check if any new favorites were added
if [[ "$(echo "$added_items" | jq 'length')" -gt 0 ]]; then
log d "Some new favorites were added between sync, writing to $retrodeck_added_favorites"
echo "$added_items" > "$retrodeck_added_favorites"
fi
# Decide if sync needs to happen # Decide if sync needs to happen
if [[ -f "$retrodeck_favorites_file" ]]; then # If an existing favorites manifest exists if [[ -f "$retrodeck_favorites_file" ]]; then # If an existing favorites manifest exists
if [[ ! "$(cat "${retrodeck_favorites_file}.new" | jq 'length')" -gt 0 ]]; then # If all favorites were removed from all gamelists, meaning new manifest is empty if [[ ! "$(cat "${retrodeck_favorites_file}.new" | jq 'length')" -gt 0 ]]; then # If all favorites were removed from all gamelists, meaning new manifest is empty
log i "No favorites were found in current ES-DE gamelists, removing old entries" log i "No favorites were found in current ES-DE gamelists, removing old entries"
if [[ "$CONFIGURATOR_GUI" == "zenity" ]]; then steam_sync_remove
(
# Remove old entries
steam-rom-manager disable --names "RetroDECK Launcher" >> "$srm_log" 2>&1
steam-rom-manager enable --names "RetroDECK Steam Sync" >> "$srm_log" 2>&1
steam-rom-manager remove >> "$srm_log" 2>&1
) |
rd_zenity --progress \
--title="Syncing with Steam" \
--window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \
--text="<span foreground='$purple'><b>\t\t\t\tRemoving unfavorited games from Steam</b></span>\n\n<b>NOTE: </b>This operation may take some time depending on the size of your library.\nFeel free to leave this in the background and switch to another application.\n\n" \
--pulsate --width=500 --height=150 --auto-close --no-cancel
else
# Remove old entries
steam-rom-manager disable --names "RetroDECK Launcher" >> "$srm_log" 2>&1
steam-rom-manager enable --names "RetroDECK Steam Sync" >> "$srm_log" 2>&1
steam-rom-manager remove >> "$srm_log" 2>&1
fi
# Old manifest cleanup # Old manifest cleanup
rm "$retrodeck_favorites_file" rm "$retrodeck_favorites_file"
rm "${retrodeck_favorites_file}.new" rm "${retrodeck_favorites_file}.new"
@ -102,6 +99,46 @@ steam_sync() {
log d "Some favorites removed between syncs, removing unfavorited games" log d "Some favorites removed between syncs, removing unfavorited games"
# Load removed favorites as manifest and run SRM remove # Load removed favorites as manifest and run SRM remove
mv "$retrodeck_removed_favorites" "$retrodeck_favorites_file" mv "$retrodeck_removed_favorites" "$retrodeck_favorites_file"
steam_sync_remove
fi
if [[ -f "$retrodeck_added_favorites" ]]; then # If some new favorites were added between syncs
log d "Some new favorites added between syncs, adding new favorited games"
# Load added favorites as manifest and run SRM add
mv "$retrodeck_added_favorites" "$retrodeck_favorites_file"
steam_sync_add
fi
# Make new favorites manifest the current one
mv "${retrodeck_favorites_file}.new" "$retrodeck_favorites_file"
fi
fi
elif [[ "$(cat "${retrodeck_favorites_file}.new" | jq 'length')" -gt 0 ]]; then # No existing favorites manifest was found, so check if new manifest has entries
log d "First time building favorites manifest, running sync"
mv "${retrodeck_favorites_file}.new" "$retrodeck_favorites_file"
steam_sync_add
fi
}
steam_sync_add() {
if [[ "$CONFIGURATOR_GUI" == "zenity" ]]; then
(
steam-rom-manager disable --names "RetroDECK Launcher" >> "$srm_log" 2>&1
steam-rom-manager enable --names "RetroDECK Steam Sync" >> "$srm_log" 2>&1
steam-rom-manager add >> "$srm_log" 2>&1
) |
rd_zenity --progress \
--title="Syncing with Steam" \
--window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \
--text="<span foreground='$purple'><b>\t\t\t\tAdding new favorited games to Steam</b></span>\n\n<b>NOTE: </b>This operation may take some time depending on the size of your library.\nFeel free to leave this in the background and switch to another application.\n\n" \
--pulsate --width=500 --height=150 --auto-close --no-cancel
else
steam-rom-manager disable --names "RetroDECK Launcher" >> "$srm_log" 2>&1
steam-rom-manager enable --names "RetroDECK Steam Sync" >> "$srm_log" 2>&1
steam-rom-manager add >> "$srm_log" 2>&1
fi
}
steam_sync_remove() {
if [[ "$CONFIGURATOR_GUI" == "zenity" ]]; then if [[ "$CONFIGURATOR_GUI" == "zenity" ]]; then
( (
steam-rom-manager disable --names "RetroDECK Launcher" >> "$srm_log" 2>&1 steam-rom-manager disable --names "RetroDECK Launcher" >> "$srm_log" 2>&1
@ -118,50 +155,4 @@ steam_sync() {
steam-rom-manager enable --names "RetroDECK Steam Sync" >> "$srm_log" 2>&1 steam-rom-manager enable --names "RetroDECK Steam Sync" >> "$srm_log" 2>&1
steam-rom-manager remove >> "$srm_log" 2>&1 steam-rom-manager remove >> "$srm_log" 2>&1
fi fi
fi
# Load new favorites manifest as games to add during sync
mv "${retrodeck_favorites_file}.new" "$retrodeck_favorites_file"
if [[ "$CONFIGURATOR_GUI" == "zenity" ]]; then
(
# Add new favorites manifest
steam-rom-manager disable --names "RetroDECK Launcher" >> "$srm_log" 2>&1
steam-rom-manager enable --names "RetroDECK Steam Sync" >> "$srm_log" 2>&1
steam-rom-manager add >> "$srm_log" 2>&1
) |
rd_zenity --progress \
--title="Syncing with Steam" \
--window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \
--text="<span foreground='$purple'><b>\t\t\t\tSyncing favorite games with Steam</b></span>\n\n<b>NOTE: </b>This operation may take some time depending on the size of your library.\nFeel free to leave this in the background and switch to another application.\n\n" \
--pulsate --width=500 --height=150 --auto-close --no-cancel
else
steam-rom-manager disable --names "RetroDECK Launcher" >> "$srm_log" 2>&1
steam-rom-manager enable --names "RetroDECK Steam Sync" >> "$srm_log" 2>&1
steam-rom-manager add >> "$srm_log" 2>&1
fi
fi
fi
elif [[ "$(cat "${retrodeck_favorites_file}.new" | jq 'length')" -gt 0 ]]; then # No existing favorites manifest was found, so check if new manifest has entries
log d "First time building favorites manifest, running sync"
mv "${retrodeck_favorites_file}.new" "$retrodeck_favorites_file"
if [[ "$CONFIGURATOR_GUI" == "zenity" ]]; then
(
# Add new favorites manifest
steam-rom-manager disable --names "RetroDECK Launcher" >> "$srm_log" 2>&1
steam-rom-manager enable --names "RetroDECK Steam Sync" >> "$srm_log" 2>&1
steam-rom-manager add >> "$srm_log" 2>&1
) |
rd_zenity --progress \
--title="Syncing with Steam" \
--window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \
--text="<span foreground='$purple'><b>\t\t\t\tSyncing favorite games with Steam</b></span>\n\n<b>NOTE: </b>This operation may take some time depending on the size of your library.\nFeel free to leave this in the background and switch to another application.\n\n" \
--pulsate --width=500 --height=150 --auto-close --no-cancel
else
# Add new favorites manifest
steam-rom-manager disable --names "RetroDECK Launcher" >> "$srm_log" 2>&1
steam-rom-manager enable --names "RetroDECK Steam Sync" >> "$srm_log" 2>&1
steam-rom-manager add >> "$srm_log" 2>&1
fi
fi
} }

View file

@ -73,7 +73,7 @@
<project_license>GPL-3.0</project_license> <project_license>GPL-3.0</project_license>
<metadata_license>CC0-1.0</metadata_license> <metadata_license>CC0-1.0</metadata_license>
<releases> <releases>
<release version="0.9.2b" date="2025-03-26"> <release version="0.9.2b" date="2025-03-29">
<url>https://github.com/RetroDECK/RetroDECK/releases/tag/0.9.2b</url> <url>https://github.com/RetroDECK/RetroDECK/releases/tag/0.9.2b</url>
<description> <description>
<p>New Additions:</p> <p>New Additions:</p>

View file

@ -14,6 +14,8 @@ Arguments:
--configurator \t Starts the RetroDECK Configurator --configurator \t Starts the RetroDECK Configurator
--compress-one <file> \t Compresses target file to a compatible format --compress-one <file> \t Compresses target file to a compatible format
--compress-all <format> \t Compresses all supported games into a compatible format.\n\t\t\t\t\t\t Available formats are \"chd\", \"zip\", \"rvz\" and \"all\" --compress-all <format> \t Compresses all supported games into a compatible format.\n\t\t\t\t\t\t Available formats are \"chd\", \"zip\", \"rvz\" and \"all\"
--steam-sync \t Run the Steam ROM Manager sync process to update all ES-DE favorites in Steam
--repair-paths \t Reconfigure broken folder locations in RetroDECK without a full reset
--reset <component> \t Reset RetroDECK or one or more component/emulator configurations to default values. WARNING: no confirmation prompt --reset <component> \t Reset RetroDECK or one or more component/emulator configurations to default values. WARNING: no confirmation prompt
--factory-reset \t Factory Reset, triggers the initial setup WARNING: no confirmation prompt --factory-reset \t Factory Reset, triggers the initial setup WARNING: no confirmation prompt
--test-upgrade <version> \t Test upgrading RetroDECK to a specific version, developer use only --test-upgrade <version> \t Test upgrading RetroDECK to a specific version, developer use only
@ -109,6 +111,10 @@ while [[ $# -gt 0 ]]; do
cli_compress_all_games "$2" cli_compress_all_games "$2"
shift 2 shift 2
;; ;;
--steam-sync)
steam_sync
exit 0
;;
--repair-paths) --repair-paths)
repair_paths repair_paths
exit 0 exit 0

View file

@ -77,6 +77,7 @@ rd_zenity --progress --no-cancel --pulsate --auto-close \
# - Add RetroDECK to Steam # - Add RetroDECK to Steam
# - M3U Multi-File Validator # - M3U Multi-File Validator
# - Repair RetroDECK paths # - Repair RetroDECK paths
# - Change logging level
# - Ponzu: Remove Yuzu # - Ponzu: Remove Yuzu
# - Ponzu: Remove Citra # - Ponzu: Remove Citra
# - Steam Sync # - Steam Sync
@ -156,7 +157,7 @@ configurator_welcome_dialog() {
;; ;;
"Steam Sync" ) "Steam Sync" )
configurator_steam_sync configurator_steam_sync_dialog
;; ;;
"Developer Options" ) "Developer Options" )
@ -444,6 +445,7 @@ configurator_tools_dialog() {
"Add RetroDECK to Steam" "Add RetroDECK shortcut to Steam. Steam restart required." "Add RetroDECK to Steam" "Add RetroDECK shortcut to Steam. Steam restart required."
"M3U Multi-File Validator" "Verify the proper structure of multi-file or multi-disc games." "M3U Multi-File Validator" "Verify the proper structure of multi-file or multi-disc games."
"Repair RetroDECK Paths" "Repair RetroDECK folder path configs for unexpectedly missing folders." "Repair RetroDECK Paths" "Repair RetroDECK folder path configs for unexpectedly missing folders."
"Change Logging Level" "Change the RetroDECK logging level, for debugging purposes"
) )
if [[ $(get_setting_value "$rd_conf" "kiroi_ponzu" "retrodeck" "options") == "true" ]]; then if [[ $(get_setting_value "$rd_conf" "kiroi_ponzu" "retrodeck" "options") == "true" ]]; then
@ -608,6 +610,46 @@ configurator_tools_dialog() {
configurator_tools_dialog configurator_tools_dialog
;; ;;
"Change Logging Level" )
log i "Configurator: opening \"$choice\" menu"
choice=$(rd_zenity --list --title="RetroDECK Configurator Utility - RetroDECK: Change Logging Level" --cancel-label="Back" \
--window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" --width=1200 --height=720 \
--column="Choice" --column="Action" \
"Informational" "The default, only logs important information." \
"Warnings" "Additionally log warnings." \
"Errors" "Additionally log warnings and errors." \
"Debug" "Log everything, may generate a lot of logs!." \)
case $choice in
"Informational" )
log i "Configurator: Changing logging level to \"$choice\""
set_setting_value "$rd_conf" "logging_level" "info" "retrodeck" "options"
;;
"Warnings" )
log i "Configurator: Changing logging level to \"$choice\""
set_setting_value "$rd_conf" "logging_level" "warn" "retrodeck" "options"
;;
"Errors" )
log i "Configurator: Changing logging level to \"$choice\""
set_setting_value "$rd_conf" "logging_level" "error" "retrodeck" "options"
;;
"Debug" )
log i "Configurator: Changing logging level to \"$choice\""
set_setting_value "$rd_conf" "logging_level" "debug" "retrodeck" "options"
;;
"" ) # No selection made or Back button clicked
log i "Configurator: going back"
;;
esac
configurator_tools_dialog
;;
"Ponzu: Remove Yuzu" ) "Ponzu: Remove Yuzu" )
ponzu_remove "yuzu" ponzu_remove "yuzu"
;; ;;
@ -980,7 +1022,7 @@ configurator_portmaster_toggle_dialog(){
--title "RetroDECK Configurator - PortMaster Visibility" \ --title "RetroDECK Configurator - PortMaster Visibility" \
--text="PortMaster is now <span foreground='$purple'><b>hidden</b></span> in ES-DE.\nPlease refresh your game list or restart RetroDECK to see the changes.\n\nIn order to launch PortMaster, you can access it from:\n<span foreground='$purple'><b>Configurator -> Open Component -> PortMaster</b></span>." --text="PortMaster is now <span foreground='$purple'><b>hidden</b></span> in ES-DE.\nPlease refresh your game list or restart RetroDECK to see the changes.\n\nIn order to launch PortMaster, you can access it from:\n<span foreground='$purple'><b>Configurator -> Open Component -> PortMaster</b></span>."
else # User clicked "Cancel" else # User clicked "Cancel"
configurator_tools_dialog configurator_global_presets_and_settings_dialog
fi fi
else else
rd_zenity --question \ rd_zenity --question \
@ -996,10 +1038,10 @@ configurator_portmaster_toggle_dialog(){
--title "RetroDECK Configurator - PortMaster Visibility" \ --title "RetroDECK Configurator - PortMaster Visibility" \
--text="PortMaster is now <span foreground='$purple'><b>visible</b></span> in ES-DE.\nPlease refresh your game list or restart RetroDECK to see the changes." --text="PortMaster is now <span foreground='$purple'><b>visible</b></span> in ES-DE.\nPlease refresh your game list or restart RetroDECK to see the changes."
else # User clicked "Cancel" else # User clicked "Cancel"
configurator_tools_dialog configurator_global_presets_and_settings_dialog
fi fi
fi fi
configurator_tools_dialog configurator_global_presets_and_settings_dialog
} }
# This function checks and verifies BIOS files for RetroDECK. # This function checks and verifies BIOS files for RetroDECK.
@ -1217,7 +1259,19 @@ configurator_about_retrodeck_dialog() {
esac esac
} }
configurator_steam_sync() { configurator_steam_sync_dialog() {
choice=$(rd_zenity --list --title="RetroDECK Configurator Utility - Steam Sync" --cancel-label="Back" \
--window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" --width=1200 --height=720 \
--column="Choice" --column="Description" \
"Enable/Disable Automatic Steam Sync" "Enable or disable automatic Steam Sync, where ES-DE favorites will be synced to Steam when RetroDECK quits." \
"Manual Steam Sync" "Perform a one-time manual sync of ES-DE favorites to Steam." \
"Purge Steam Sync Shortcuts" "Perform a full Steam ROM Manager purge of all favorites, in case things have gotten messed up." )
case $choice in
"Enable/Disable Automatic Steam Sync" )
log i "Configurator: opening \"$choice\" menu"
if [[ $(get_setting_value "$rd_conf" "steam_sync" retrodeck "options") == "true" ]]; then if [[ $(get_setting_value "$rd_conf" "steam_sync" retrodeck "options") == "true" ]]; then
zenity --question \ zenity --question \
--no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ --no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \
@ -1227,8 +1281,6 @@ configurator_steam_sync() {
if [ $? == 0 ] # User clicked "Yes" if [ $? == 0 ] # User clicked "Yes"
then then
configurator_disable_steam_sync configurator_disable_steam_sync
else # User clicked "Cancel"
configurator_welcome_dialog
fi fi
else else
zenity --question \ zenity --question \
@ -1239,10 +1291,39 @@ configurator_steam_sync() {
if [ $? == 0 ] if [ $? == 0 ]
then then
configurator_enable_steam_sync configurator_enable_steam_sync
else fi
fi
configurator_steam_sync_dialog
;;
"Manual Steam Sync" )
log i "Configurator: opening \"$choice\" menu"
export CONFIGURATOR_GUI="zenity"
steam_sync
configurator_steam_sync_dialog
;;
"Purge Steam Sync Shortcuts" )
log i "Configurator: opening \"$choice\" menu"
if [[ $(configurator_generic_question_dialog "RetroDECK Configurator - Steam Sync" "Are you sure you want to remove all Steam ROM Manager changes, including all RetroDECK shortcuts from Steam?" ) == "true" ]]; then
(
steam-rom-manager nuke
) |
rd_zenity --progress \
--title="Removing all RetroDECK Steam Sync information" \
--window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \
--text="<span foreground='$purple'><b>\t\t\t\tRemoving all RetroDECK-related data from Steam</b></span>\n\nPlease wait..." \
--pulsate --width=500 --height=150 --auto-close --no-cancel
fi
configurator_steam_sync_dialog
;;
"" ) # No selection made or Back button clicked
log i "Configurator: going back"
configurator_welcome_dialog configurator_welcome_dialog
fi ;;
fi
esac
} }
configurator_enable_steam_sync() { configurator_enable_steam_sync() {
@ -1253,7 +1334,6 @@ configurator_enable_steam_sync() {
--window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \
--title "RetroDECK Configurator - RetroDECK Steam Syncronization" \ --title "RetroDECK Configurator - RetroDECK Steam Syncronization" \
--text="Steam syncronization enabled." --text="Steam syncronization enabled."
configurator_welcome_dialog
} }
configurator_disable_steam_sync() { configurator_disable_steam_sync() {
@ -1276,7 +1356,6 @@ configurator_disable_steam_sync() {
--window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \
--title "RetroDECK Configurator - RetroDECK Steam Syncronization" \ --title "RetroDECK Configurator - RetroDECK Steam Syncronization" \
--text="Steam syncronization disabled and shortcuts removed, restart Steam to apply the changes." --text="Steam syncronization disabled and shortcuts removed, restart Steam to apply the changes."
configurator_welcome_dialog
} }
configurator_version_history_dialog() { configurator_version_history_dialog() {