From 41c98e08bea4d103c552f0ad1f457de113332a41 Mon Sep 17 00:00:00 2001 From: icenine451 Date: Fri, 21 Apr 2023 11:03:16 -0400 Subject: [PATCH 1/6] Include UniversalDynamicInput --- net.retrodeck.retrodeck.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/net.retrodeck.retrodeck.yml b/net.retrodeck.retrodeck.yml index 8e55936f..c15c32e3 100644 --- a/net.retrodeck.retrodeck.yml +++ b/net.retrodeck.retrodeck.yml @@ -693,6 +693,16 @@ modules: dolphin-emu "$@" dest-filename: dolphin-emu-wrapper + - name: universal_dynamic_input + buildsystem: simple + build-commands: + - mkdir -p ${FLATPAKD_DEST}/retrodeck/extras/UniversalDynamicInput + - cp -r * ${FLATPAKD_DEST}/retrodeck/extras/UniversalDynamicInput/ + sources: + - type: git + url: https://github.com/Venomalia/UniversalDynamicInput.git + commit: UNIVERSALDYNAMICINPUTCOMMITPLACEHOLDER + # Dolphin - END # XEMU - START From dd834ab941f6defd58fb8a328ba473fc4640b3a9 Mon Sep 17 00:00:00 2001 From: icenine451 Date: Fri, 21 Apr 2023 11:46:20 -0400 Subject: [PATCH 2/6] More Dolphin input textures fixes --- automation_tools/automation_task_list.cfg | 1 + net.retrodeck.retrodeck.yml | 4 +- post_update.sh | 4 ++ tools/configurator.sh | 73 +++++++++++++++++++++-- 4 files changed, 75 insertions(+), 7 deletions(-) diff --git a/automation_tools/automation_task_list.cfg b/automation_tools/automation_task_list.cfg index 00497aff..f3001422 100644 --- a/automation_tools/automation_task_list.cfg +++ b/automation_tools/automation_task_list.cfg @@ -3,3 +3,4 @@ hash^DOOMSHAPLACEHOLDER^https://buildbot.libretro.com/assets/cores/DOOM/Doom%20%28Shareware%29.zip hash^VITASHAPLACEHOLDER^https://github.com/Vita3K/Vita3K/releases/download/continuous/ubuntu-latest.zip hash^DUCKSTATIONSHAPLACEHOLDER^https://github.com/stenzek/duckstation/releases/download/preview/DuckStation-x64.AppImage +latestcommit^UNIVERSALDYNAMICINPUTCOMMITPLACEHOLDER^https://github.com/Venomalia/UniversalDynamicInput^main diff --git a/net.retrodeck.retrodeck.yml b/net.retrodeck.retrodeck.yml index c15c32e3..373545df 100644 --- a/net.retrodeck.retrodeck.yml +++ b/net.retrodeck.retrodeck.yml @@ -696,8 +696,8 @@ modules: - name: universal_dynamic_input buildsystem: simple build-commands: - - mkdir -p ${FLATPAKD_DEST}/retrodeck/extras/UniversalDynamicInput - - cp -r * ${FLATPAKD_DEST}/retrodeck/extras/UniversalDynamicInput/ + - mkdir -p ${FLATPAK_DEST}/retrodeck/extras/DynamicInputTextures + - cp -r * ${FLATPAK_DEST}/retrodeck/extras/DynamicInputTextures/ sources: - type: git url: https://github.com/Venomalia/UniversalDynamicInput.git diff --git a/post_update.sh b/post_update.sh index 4ea9580d..18137821 100644 --- a/post_update.sh +++ b/post_update.sh @@ -114,6 +114,10 @@ post_update() { # The following commands are run every time. + if [[ -d "/var/data/dolphin-emu/Load/DynamicInputTextures" ]]; then # Refresh installed textures if they have been enabled + cp -rf "/app/retrodeck/extras/DynamicInputTextures/*" "/var/data/dolphin-emu/Load/DynamicInputTextures/" + fi + tools_init update_splashscreens update_rd_conf diff --git a/tools/configurator.sh b/tools/configurator.sh index e5e77be0..6845cc8d 100644 --- a/tools/configurator.sh +++ b/tools/configurator.sh @@ -15,6 +15,8 @@ source /app/libexec/functions.sh # - Enable/Disable Rewind # - RetroAchivement Login # - Login prompt +# - Dolphin Presets +# - Enable/Disable Custom Input Textures # - Emulator Options (Behind one-time power user warning dialog) # - Launch RetroArch # - Launch Cemu @@ -291,7 +293,7 @@ configurator_retroarch_rewind_dialog() { set_setting_value $raconf "rewind_enable" "false" retroarch configurator_process_complete_dialog "disabling Rewind" else - configurator_retroarch_options_dialog + configurator_retroarch_presets_dialog fi else zenity --question \ @@ -304,12 +306,12 @@ configurator_retroarch_rewind_dialog() { set_setting_value $raconf "rewind_enable" "true" retroarch configurator_process_complete_dialog "enabling Rewind" else - configurator_retroarch_options_dialog + configurator_retroarch_presets_dialog fi fi } -configurator_retroarch_options_dialog() { +configurator_retroarch_presets_dialog() { choice=$(zenity --list --title="RetroDECK Configurator Utility - RetroArch Options" --cancel-label="Back" \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" --width=1200 --height=720 \ --column="Choice" --column="Action" \ @@ -333,6 +335,63 @@ configurator_retroarch_options_dialog() { esac } +configurator_dolphin_presets_dialog() { + choice=$(zenity --list --title="RetroDECK Configurator Utility - Dolphin Options" --cancel-label="Back" \ + --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" --width=1200 --height=720 \ + --column="Choice" --column="Action" \ + "Change Custom Input Textures Setting" "Enable or disable custom input textures for supported games in Dolphin." ) + + case $choice in + + "Change Custom Input Textures Setting" ) + configurator_dolphin_input_textures_dialog + ;; + + "" ) # No selection made or Back button clicked + configurator_welcome_dialog + ;; + + esac +} + +configurator_dolphin_input_textures_dialog() { + if [[ -d "/var/data/dolphin-emu/Load/DynamicInputTextures" ]]; then + zenity --question \ + --no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ + --title "RetroDECK Configurator - Dolphin Custom Input Textures" \ + --text="Custom input textures are currently enabled. Do you want to disable them?." + + if [ $? == 0 ] + then + set_setting_value $dolphingfxconf "HiresTextures" "False" dolphin + rm -rf "/var/data/dolphin-emu/Load/DynamicInputTextures" + configurator_process_complete_dialog "disabling Dolphin custom input textures" + else + configurator_dolphin_presets_dialog + fi + else + zenity --question \ + --no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ + --title "RetroDECK Configurator - Dolphin Custom Input Textures" \ + --text="Custom input textures are currently disabled. Do you want to enable them?.\n\nThis process may take several minutes to complete." + + if [ $? == 0 ] + then + set_setting_value $dolphingfxconf "HiresTextures" "True" dolphin + ( + mkdir "/var/data/dolphin-emu/Load/DynamicInputTextures" + cp -rf "/app/retrodeck/extras/DynamicInputTextures/*" "/var/data/dolphin-emu/Load/DynamicInputTextures/" + ) | + zenity --icon-name=net.retrodeck.retrodeck --progress --no-cancel --pulsate --auto-close \ + --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ + --title "RetroDECK Configurator Utility - Dolphin Custom Input Textures Install" + configurator_process_complete_dialog "enabling Dolphin custom input textures" + else + configurator_dolphin_presets_dialog + fi + fi +} + configurator_compress_single_game_dialog() { local file=$(file_browse "Game to compress") if [[ ! -z "$file" ]]; then @@ -969,7 +1028,7 @@ configurator_move_retrodeck_dialog() { bios_folder="$rdhome/bios" media_folder="$rdhome/downloaded_media" themes_folder="$rdhome/themes" - emulator_post_move + prepare_emulator "all" "postmove" conf_write configurator_generic_dialog "RetroDECK data folder now configured at $rdhome. Please start the moving process again." configurator_move_retrodeck_dialog @@ -1115,7 +1174,11 @@ configurator_welcome_dialog() { case $choice in "RetroArch Presets" ) - configurator_retroarch_options_dialog + configurator_retroarch_presets_dialog + ;; + + "Dolphin Presets" ) + configurator_dolphin_presets_dialog ;; "Emulator Options" ) From cabc9bcfc7c90a40d187f5e96b41b3be125df272 Mon Sep 17 00:00:00 2001 From: icenine451 Date: Fri, 21 Apr 2023 12:09:09 -0400 Subject: [PATCH 3/6] Add rsync tool --- net.retrodeck.retrodeck.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/net.retrodeck.retrodeck.yml b/net.retrodeck.retrodeck.yml index 373545df..db053a88 100644 --- a/net.retrodeck.retrodeck.yml +++ b/net.retrodeck.retrodeck.yml @@ -213,6 +213,15 @@ modules: url: https://github.com/rclone/rclone/releases/download/v1.61.1/rclone-v1.61.1-linux-amd64.zip sha256: 6d6455e1cb69eb0615a52cc046a296395e44d50c0f32627ba8590c677ddf50a9 + - name: rsync + buildsystem: simple + build-commands: + - cp local/bin/rsync ${FLATPAK_DEST}/bin/ + sources: + - type: archive + url: https://download.samba.org/pub/rsync/binaries/ubuntu-22.04-x86_64/rsync-3.2.7.tar.gz + sha256: dd2b74396c6e8d6a2d7af94cd97fad5788d888e722bc9780de1590f37a1920d6 + - name: jq buildsystem: simple build-commands: From 576ad7556d7c9c530ecfcd0c5439fd234cc026db Mon Sep 17 00:00:00 2001 From: icenine451 Date: Tue, 25 Apr 2023 10:59:57 -0400 Subject: [PATCH 4/6] - New mover! - Updated init/postmoves for ES and RD - Disabled ES update checks for existing installs - Local'd vars in conf_read/write - Rebuilt finit to work with new conf_read/write and emu reset --- es-configs/es_settings.xml | 4 +- functions.sh | 280 +++++++++++++++++++++---------------- global.sh | 6 +- post_update.sh | 11 +- tools/configurator.sh | 197 +++++++------------------- 5 files changed, 221 insertions(+), 277 deletions(-) diff --git a/es-configs/es_settings.xml b/es-configs/es_settings.xml index fce3c315..0b8ab539 100644 --- a/es-configs/es_settings.xml +++ b/es-configs/es_settings.xml @@ -104,7 +104,7 @@ - + @@ -141,4 +141,4 @@ - \ No newline at end of file + diff --git a/functions.sh b/functions.sh index cbedf1a3..117ffdda 100644 --- a/functions.sh +++ b/functions.sh @@ -88,31 +88,23 @@ move() { # Function to move a directory from one parent to another # USAGE: move $source_dir $dest_dir - if [[ ! -d "$2/$(basename "$1")" ]]; then - if [[ $(verify_space "$1" "$2") ]]; then - ( - if [[ ! -d "$2" ]]; then # Create destination directory if it doesn't already exist - mkdir -pv "$2" - fi - mv -v -t "$2" "$1" - ) | - zenity --icon-name=net.retrodeck.retrodeck --progress --no-cancel --pulsate --auto-close \ - --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ - --title "RetroDECK Configurator Utility - Move in Progress" \ - --text="Moving directory $(basename "$1") to new location of $2, please wait." - else - zenity --icon-name=net.retrodeck.retrodeck --error --no-wrap \ - --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ - --title "RetroDECK Configurator Utility - Move Directories" \ - --text="The destination directory you have selected does not have enough free space for the files you are trying to move.\n\nPlease select a new destination or free up some space." + 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 - configurator_move_dialog - fi - else + ( + rsync -a --remove-source-files --ignore-existing --mkpath "$source_dir" "$dest_dir" # Copy files but don't overwrite conflicts + find "$source_dir" -type d -empty -delete # Cleanup empty folders that were left behind + ) | + zenity --icon-name=net.retrodeck.retrodeck --progress --no-cancel --pulsate --auto-close \ + --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ + --title "RetroDECK Configurator Utility - Move in Progress" \ + --text="Moving directory $(basename "$1") to new location of $2, please wait." + + if [[ -d "$source_dir" ]]; then # Some conflicting files remain zenity --icon-name=net.retrodeck.retrodeck --error --no-wrap \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ --title "RetroDECK Configurator Utility - Move Directories" \ - --text="The destination directory you have selected already exists.\n\nPlease select a new destination." + --text="There were some conflicting files that were not moved.\n\nAll files that could be moved are in the new location,\nany files that already existed at the new location have not been moved and will need to be handled manually." fi } @@ -1060,11 +1052,11 @@ conf_write() { do 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 - 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 - current_setting_name=$(get_setting_name "$current_setting_line" "retrodeck") # Read the variable name from the current line - current_setting_value=$(get_setting_value "$rd_conf" "$current_setting_name" "retrodeck" "$current_section") # Read the variables value from retrodeck.cfg - memory_setting_value=$(eval "echo \$${current_setting_name}") # Read the variable names' value from memory + local current_setting_name=$(get_setting_name "$current_setting_line" "retrodeck") # Read the variable name from the current line + local current_setting_value=$(get_setting_value "$rd_conf" "$current_setting_name" "retrodeck" "$current_section") # Read the variables value from retrodeck.cfg + local memory_setting_value=$(eval "echo \$${current_setting_name}") # Read the variable names' value from memory if [[ ! "$current_setting_value" == "$memory_setting_value" ]]; then # If the values are different... set_setting_value "$rd_conf" "$current_setting_name" "$memory_setting_value" "retrodeck" "$current_section" # Update the value in retrodeck.cfg fi @@ -1081,7 +1073,7 @@ conf_read() { do 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 - 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 local current_setting_name=$(get_setting_name "$current_setting_line" "retrodeck") # Read the variable name from the current line local current_setting_value=$(get_setting_value "$rd_conf" "$current_setting_name" "retrodeck" "$current_section") # Read the variables value from retrodeck.cfg @@ -1146,19 +1138,6 @@ dir_prep() { echo -e "$symlink is now $real\n" } -consolidate_retrodeck_folders() { - # This script will find folders that may have been moved out of the main RetroDECK folder individually and move them home - # USAGE: consolidate_retrodeck_folders - - while read -r path; do - if realpath "$path" | grep -q "^$main_path/"; then - echo "$path is a subfolder of $main_path" - else - echo "$path is not a subfolder of $main_path" - fi - done < <(grep -v '^\s*$' $rd_conf | awk '/^\[paths\]/{f=1;next} /^\[/{f=0} f') -} - update_splashscreens() { # This script will purge any existing ES graphics and reload them from RO space into somewhere ES will look for it # USAGE: update_splashscreens @@ -1195,19 +1174,52 @@ prepare_emulator() { emulator="$2" call_source="$3" - if [[ "$emulator" == "retrodeck" ]]; then # For use after RetroDECK is consolidated and moved + if [[ "$emulator" == "retrodeck" ]]; then + if [[ "$action" == "reset" ]]; then # Update the paths of all folders in retrodeck.cfg and create them + while read -r config_line; do + local current_setting_name=$(get_setting_name "$config_line" "retrodeck") + if [[ ! $current_setting_name =~ (rdhome|sdcard) ]]; then # Ignore these locations + eval "$current_setting_name=$rdhome/$(basename $current_setting_value)" + mkdir "$rdhome/$(basename $current_setting_value)" + fi + done < <(grep -v '^\s*$' $rd_conf | awk '/^\[paths\]/{f=1;next} /^\[/{f=0} f') + fi + if [[ "$action" == "postmove" ]]; then # Update the paths of any folders that came with the retrodeck folder during a move + while read -r config_line; do + local current_setting_name=$(get_setting_name "$config_line" "retrodeck") + if [[ ! $current_setting_name =~ (rdhome|sdcard) ]]; then # Ignore these locations + local current_setting_value=$(get_setting_value "$rd_conf" "$current_setting_name" "retrodeck" "paths") + if [[ -d "$rdhome/$(basename $current_setting_value)" ]]; then # If the folder exists at the new ~/retrodeck location + eval "$current_setting_name=$rdhome/$(basename $current_setting_value)" + fi + fi + done < <(grep -v '^\s*$' $rd_conf | awk '/^\[paths\]/{f=1;next} /^\[/{f=0} f') + fi + fi + + if [[ "$emulator" =~ ^(emulationstation|all)$ ]]; then # For use after ESDE-related folders are moved or a reset + if [[ "$action" == "reset" ]]; then + rm -rf /var/config/emulationstation/ + mkdir -p /var/config/emulationstation/ + emulationstation --home /var/config/emulationstation --create-system-dirs + update_splashscreens + dir_prep "$roms_folder" "/var/config/emulationstation/ROMs" + dir_prep "$media_folder" "/var/config/emulationstation/.emulationstation/downloaded_media" + dir_prep "$themes_folder" "/var/config/emulationstation/.emulationstation/themes" + dir_prep "$rdhome/gamelists" "/var/config/emulationstation/.emulationstation/gamelists" + cp -f /app/retrodeck/es_settings.xml /var/config/emulationstation/.emulationstation/es_settings.xml + + # RetroDECK prepack metadata + mkdir -p "/var/config/emulationstation/.emulationstation/gamelists/doom" + cp "/app/retrodeck/rd_prepacks/doom/gamelist.xml" "/var/config/emulationstation/.emulationstation/gamelists/doom/gamelist.xml" + mkdir -p "$media_folder/doom" + unzip -oq "/app/retrodeck/rd_prepacks/doom/doom.zip" -d "$media_folder/doom/" + fi if [[ "$action" == "postmove" ]]; then - roms_folder=$rdhome/roms - saves_folder=$rdhome/saves - states_folder=$rdhome/states - bios_folder=$rdhome/bios - media_folder=$rdhome/downloaded_media - themes_folder=$rdhome/themes - logs_folder=$rdhome/.logs - screenshots_folder=$rdhome/screenshots - mods_folder=$rdhome/mods - texture_packs_folder=$rdhome/texture_packs - borders_folder=$rdhome/borders + dir_prep "$roms_folder" "/var/config/emulationstation/ROMs" + dir_prep "$media_folder" "/var/config/emulationstation/.emulationstation/downloaded_media" + dir_prep "$themes_folder" "/var/config/emulationstation/.emulationstation/themes" + dir_prep "$rdhome/gamelists" "/var/config/emulationstation/.emulationstation/gamelists" fi fi @@ -1503,6 +1515,14 @@ prepare_emulator() { set_setting_value "$pcsx2conf" "RecursivePaths" "$roms_folder/ps2" "pcsx2" "GameList" fi fi + + if [[ "$emulator" =~ ^(pico8|pico-8|all)$ ]]; then + if [[ ("$action" == "reset") || ("$action" == "postmove") ]]; then + 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 "$roms_folder/pico8" "$bios_folder/pico-8/carts" # Symlink default game location to RD roms for cleanliness (this location is overridden anyway by the --root_path launch argument anyway) + dir_prep "$saves_folder/pico-8" "$bios_folder/pico-8/cdata" # PICO-8 saves folder + fi + fi if [[ "$emulator" =~ ^(ppsspp|PPSSPP|all)$ ]]; then if [[ "$action" == "reset" ]]; then # Run reset-only commands @@ -1782,8 +1802,7 @@ tools_init() { } start_retrodeck() { - echo "Checking to see if today has a surprise..." - easter_eggs + easter_eggs # Check if today has a surprise splashscreen and load it if so # normal startup echo "Starting RetroDECK v$version" emulationstation --home /var/config/emulationstation @@ -1844,12 +1863,6 @@ finit() { "Internal Storage" ) # Internal echo "Internal selected" rdhome="$HOME/retrodeck" - roms_folder="$rdhome/roms" - saves_folder="$rdhome/saves" - states_folder="$rdhome/states" - bios_folder="$rdhome/bios" - media_folder="$rdhome/downloaded_media" - themes_folder="$rdhome/themes" if [[ -L $rdhome ]]; then #Remove old symlink from existing install, if it exists unlink $rdhome fi @@ -1869,12 +1882,6 @@ finit() { if [[ -z $rdhome ]]; then # If user hit the cancel button exit 2 fi - roms_folder="$rdhome/roms" - saves_folder="$rdhome/saves" - states_folder="$rdhome/states" - bios_folder="$rdhome/bios" - media_folder="$rdhome/downloaded_media" - themes_folder="$rdhome/themes" elif [ ! -w "$sdcard" ] #SD card found but not writable then echo "Error: SD card found but not writable" @@ -1887,12 +1894,6 @@ finit() { exit 2 else rdhome="$sdcard/retrodeck" - roms_folder="$rdhome/roms" - saves_folder="$rdhome/saves" - states_folder="$rdhome/states" - bios_folder="$rdhome/bios" - media_folder="$rdhome/downloaded_media" - themes_folder="$rdhome/themes" fi ;; @@ -1907,22 +1908,13 @@ finit() { if [[ -z $rdhome ]]; then # If user hit the cancel button exit 2 fi - roms_folder="$rdhome/roms" - saves_folder="$rdhome/saves" - states_folder="$rdhome/states" - bios_folder="$rdhome/bios" - media_folder="$rdhome/downloaded_media" - themes_folder="$rdhome/themes" ;; esac - if [[ ! "$rdhome" == "$HOME/retrodeck" && ! -L $HOME/retrodeck ]]; then # If data stored on SD card, create /home/deck/retrodeck symlink to keep things working until configs can get modified - echo "Symlinking retrodeck directory to home directory" - dir_prep "$rdhome" "$HOME/retrodeck" - fi + prepare_emulator "reset" "retrodeck" # Parse the [paths] section of retrodeck.cfg and set the value of / create all needed folders - mkdir -pv $roms_folder + conf_write # Write the new values to retrodeck.cfg local rpcs_firmware_install=$(configurator_generic_question_dialog "RPCS3 Firmware Install" "Would you like to install the latest PS3 firmware for the RPCS3 emulator?\n\nThis process will take several minutes and requires network access.\nIf you do not plan to emulate PS3 games this can be skipped, and can always be done later through the Configurator.\n\nIf you click Yes, RPCS3 will be launched at the end of the RetroDECK setup process.\nOnce the firmware is installed, please close the emulator to finish the process.") @@ -1931,52 +1923,15 @@ finit() { --text="RetroDECK will now install the needed files, which can take up to one minute.\nRetroDECK will start once the process is completed.\n\nPress OK to continue." ( - # Recreating the folder - rm -rf /var/config/emulationstation/ - mkdir -p /var/config/emulationstation/ - - # Initializing ES-DE - # TODO: after the next update of ES-DE this will not be needed - let's test it - emulationstation --home /var/config/emulationstation --create-system-dirs - update_splashscreens - - # Initializing ROMs folder - Original in retrodeck home (or SD Card) - dir_prep $roms_folder "/var/config/emulationstation/ROMs" - - mkdir -pv $saves_folder - mkdir -pv $states_folder - mkdir -pv $screenshots_folder - mkdir -pv $logs_folder - mkdir -pv $mods_folder - mkdir -pv $texture_packs_folder - - # XMLSTARLET HERE - cp -fv /app/retrodeck/es_settings.xml /var/config/emulationstation/.emulationstation/es_settings.xml - - # ES-DE preparing user-exposed folders - dir_prep "$media_folder" "/var/config/emulationstation/.emulationstation/downloaded_media" - dir_prep "$themes_folder" "/var/config/emulationstation/.emulationstation/themes" - dir_prep "$rdhome/gamelists" "/var/config/emulationstation/.emulationstation/gamelists" - - # PICO-8 - 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 "$roms_folder/pico8" "$bios_folder/pico-8/carts" # Symlink default game location to RD roms for cleanliness (this location is overridden anyway by the --root_path launch argument anyway) - dir_prep "$saves_folder/pico-8" "$bios_folder/pico-8/cdata" # PICO-8 saves folder - - # Add packaged extras, after the ROMS folder has been initialized - cp /app/retrodeck/extras/doom1.wad "$roms_folder/doom/doom1.wad" # No -f in case the user already has it - - # RetroDECK prepack metadata - mkdir -p "/var/config/emulationstation/.emulationstation/gamelists/doom" - cp "/app/retrodeck/rd_prepacks/doom/gamelist.xml" "/var/config/emulationstation/.emulationstation/gamelists/doom/gamelist.xml" - mkdir -p "$media_folder/doom" - unzip -oq "/app/retrodeck/rd_prepacks/doom/doom.zip" -d "$media_folder/doom/" - - tools_init prepare_emulator "reset" "all" + tools_init + if [[ $rpcs_firmware_install == "true" ]]; then update_rpcs3_firmware fi + + # Add packaged extras, after the ROMS folder has been initialized + cp /app/retrodeck/extras/doom1.wad "$roms_folder/doom/doom1.wad" # No -f in case the user already has it ) | zenity --icon-name=net.retrodeck.retrodeck --progress --no-cancel --pulsate --auto-close \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ @@ -2237,3 +2192,80 @@ configurator_reset_confirmation_dialog() { echo "false" fi } + +configurator_move_folder_dialog() { + # This dialog will take a folder variable name from retrodeck.cfg and move it to a new location. The variable will be updated in retrodeck.cfg as well as any emulator configs where it occurs. + # USAGE: configurator_move_folder_dialog "folder_variable_name" + 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 source_root="$(echo $dir_to_move | sed -e 's/\(.*\)\/retrodeck\/.*/\1/')" # The root path of the folder, excluding retrodeck/. 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 + local rd_dir_path="$(echo "$dir_to_move" | sed "s/.*\(retrodeck\/.*\)/\1/; s/\/$//")" + else # Otherwise just set the retrodeck root folder + local rd_dir_path="$(basename $dir_to_move)" + fi + + if [[ -d "$dir_to_move" ]]; then # If the directory selected to move already exists at the expected location pulled from retrodeck.cfg + choice=$(configurator_destination_choice_dialog "RetroDECK Data" "Please choose a destination for the $(basename $dir_to_move) folder.") + case $choice in + + "Internal Storage" | "SD Card" | "Custom Location" ) # If the user picks a location + if [[ "$choice" == "Internal Storage" ]]; then # If the user wants to move the folder to internal storage, set the destination target as HOME + local dest_root="$HOME" + elif [[ "$choice" == "SD Card" ]]; then # If the user wants to move the folder to the predefined SD card location, set the target as sdcard from retrodeck.cfg + local dest_root="$sdcard" + else + configurator_generic_dialog "Select the parent folder you would like to store the $(basename $dir_to_move) folder in." + local dest_root=$(directory_browse "RetroDECK directory location") # Set the destination root as the selected custom location + fi + + if [[ (! -z "$dest_root") && ( -w "$dest_root") ]]; then # If user picked a destination and it is writable + if [[ (-d "$dest_root/$rd_dir_path") && (! -L "$dest_root/$rd_dir_path") && (! $rd_dir_name == "rdhome") ]] || [[ "$(realpath $dir_to_move)" == "$dest_root/$rd_dir_path" ]]; then # If the user is trying to move the folder to where it already is (excluding symlinks that will be unlinked) + configurator_generic_dialog "The $(basename $dir_to_move) folder is already at that location, please pick a new one." + configurator_move_folder_dialog "$rd_dir_name" + else + if [[ $(verify_space "$(echo $dir_to_move | sed 's/\/$//')" "$dest_root") ]]; then # Make sure there is enough space at the destination + configurator_generic_dialog "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 + move "$dir_to_move" "$dest_root/$rd_dir_path" + if [[ -d "$dest_root/$rd_dir_path" ]]; then # If the move succeeded + eval "$rd_dir_name"="$dest_root/$rd_dir_path" # Set the new path for that folder variable in retrodeck.cfg + if [[ "$rd_dir_name" == "rdhome" ]]; then # If the whole retrodeck folder was moved... + prepare_emulator "postmove" "retrodeck" + fi + prepare_emulator "postmove" "all" # Update all the appropriate emulator path settings + conf_write # Write the settings to retrodeck.cfg + if [[ -z $(ls -1 "$source_root/retrodeck") ]]; then # Cleanup empty old_path/retrodeck folder if it was left behind + rmdir "$source_root/retrodeck" + fi + configurator_process_complete_dialog "moving the RetroDECK data directory to internal storage" + else + configurator_generic_dialog "The moving process was not completed, please try again." + fi + else # If there isn't enough space in the picked destination + zenity --icon-name=net.retrodeck.retrodeck --error --no-wrap \ + --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ + --title "RetroDECK Configurator Utility - Move Directories" \ + --text="The destination directory you have selected does not have enough free space for the files you are trying to move.\n\nPlease select a new destination or free up some space." + fi + fi + else # If the user didn't pick any custom destination, or the destination picked is unwritable + if [[ ! -z "$dest_root" ]]; then + configurator_generic_dialog "No destination was chosen, so no files have been moved." + else + configurator_generic_dialog "The chosen destination is not writable.\nNo files have been moved.\n\nThis can happen when trying to select a location that RetroDECK does not have permission to write.\nThis can normally be fixed by adding the desired path to the RetroDECK permissions with Flatseal." + fi + fi + ;; + + esac + else # The folder to move was not found at the path pulled from retrodeck.cfg and it needs to be reconfigured manually. + configurator_generic_dialog "The $(basename $dir_to_move) folder was not found at the expected location.\n\nThis may have happened if the folder was moved manually.\n\nPlease select the current location of the folder." + dir_to_move=$(directory_browse "RetroDECK $(basename $dir_to_move) directory location") + eval "$rd_dir_name"="$dir_to_move" + prepare_emulator "postmove" "all" + conf_write + configurator_generic_dialog "RetroDECK $(basename $dir_to_move) folder now configured at\n$dir_to_move." + configurator_move_folder_dialog "$rd_dir_name" + fi +} diff --git a/global.sh b/global.sh index 67c73288..79d1ddcd 100755 --- a/global.sh +++ b/global.sh @@ -112,7 +112,7 @@ then default_sd=$(directory_browse "SD Card Location") fi - cp $rd_defaults $rd_conf # Load default settings + 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 "sdcard" "$default_sd" retrodeck "paths" # Set SD card location if default path has changed @@ -147,8 +147,10 @@ else prev_home_path=$rdhome configurator_generic_dialog "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") - sed -i 's#'$prev_home_path'#'$new_home_path'#g' $rd_conf + set_setting_value $rd_conf "rdhome" "$new_home_path" retrodeck "paths" conf_read + prepare_emulator "retrodeck" "postmove" prepare_emulator "all" "postmove" + conf_write fi fi diff --git a/post_update.sh b/post_update.sh index 18137821..ad3d6f3c 100644 --- a/post_update.sh +++ b/post_update.sh @@ -45,9 +45,9 @@ post_update() { 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. - cp -fv $emuconfigs/citra/qt-config.ini /var/config/citra-emu/qt-config.ini + cp -f $emuconfigs/citra/qt-config.ini /var/config/citra-emu/qt-config.ini sed -i 's#RETRODECKHOMEDIR#'$rdhome'#g' /var/config/citra-emu/qt-config.ini - cp -fvr $emuconfigs/yuzu/* /var/config/yuzu/ + cp -fr $emuconfigs/yuzu/* /var/config/yuzu/ sed -i 's#RETRODECKHOMEDIR#'$rdhome'#g' /var/config/yuzu/qt-config.ini # Remove unneeded tools folder, as location has changed to RO space @@ -74,6 +74,7 @@ post_update() { # - Add new sections [paths] and [options] headers to retrodeck.cfg # - Prepackaged DOOM! # - Update RPCS3 vfs file contents. migrate from old location if needed + # - Disable ESDE update checks for existing installs mkdir -p "$mods_folder" mkdir -p "$texture_packs_folder" @@ -87,7 +88,7 @@ post_update() { dir_prep "$rdhome/gamelists" "/var/config/emulationstation/.emulationstation/gamelists" - 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 mkdir -p "/var/config/emulationstation/.emulationstation/gamelists/doom" cp -f "/app/retrodeck/rd_prepacks/doom/gamelist.xml" "/var/config/emulationstation/.emulationstation/gamelists/doom/gamelist.xml" mkdir -p "$media_folder/doom" @@ -110,12 +111,14 @@ post_update() { mkdir -p "$bios_folder/rpcs3/dev_bdvd" mkdir -p "$bios_folder/rpcs3/dev_usb000" dir_prep "$bios_folder/rpcs3/dev_hdd0/home/00000001/savedata" "$saves_folder/ps3/rpcs3" + + set_setting_value $es_settings "ApplicationUpdaterFrequency" "never" "es_settings" fi # The following commands are run every time. if [[ -d "/var/data/dolphin-emu/Load/DynamicInputTextures" ]]; then # Refresh installed textures if they have been enabled - cp -rf "/app/retrodeck/extras/DynamicInputTextures/*" "/var/data/dolphin-emu/Load/DynamicInputTextures/" + rsync -a "/app/retrodeck/extras/DynamicInputTextures/" "/var/data/dolphin-emu/Load/DynamicInputTextures/" fi tools_init diff --git a/tools/configurator.sh b/tools/configurator.sh index 6845cc8d..b9cf5c31 100644 --- a/tools/configurator.sh +++ b/tools/configurator.sh @@ -31,7 +31,7 @@ source /app/libexec/functions.sh # - Launch XEMU # - Launch Yuzu # - Tools and Troubleshooting -# - Move RetroDECK +# - Move RetroDECK or subfolders # - Multi-file game check # - Basic BIOS file check # - Advanced BIOS file check @@ -807,7 +807,7 @@ configurator_tools_and_troubleshooting_dialog() { choice=$(zenity --list --title="RetroDECK Configurator Utility - Change Options" --cancel-label="Back" \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" --width=1200 --height=720 \ --column="Choice" --column="Action" \ - "Move RetroDECK" "Move RetroDECK files between internal/SD card or to a custom location" \ + "Move RetroDECK Folders" "Move RetroDECK folders between internal/SD card or to a custom location" \ "Multi-file game structure check" "Verify the proper structure of multi-file or multi-disc games" \ "Basic BIOS file check" "Show a list of systems that BIOS files are found for" \ "Advanced BIOS file check" "Show advanced information about common BIOS files" \ @@ -818,9 +818,8 @@ configurator_tools_and_troubleshooting_dialog() { case $choice in - "Move RetroDECK" ) - configurator_generic_dialog "This option will move the RetroDECK data folder (ROMs, saves, BIOS etc.) to a new location.\n\nPlease choose where to move the RetroDECK data folder." - configurator_move_retrodeck_dialog + "Move RetroDECK Folders" ) + configurator_move_dialog ;; "Multi-file game structure check" ) @@ -881,158 +880,66 @@ configurator_tools_and_troubleshooting_dialog() { esac } -configurator_move_retrodeck_dialog() { - if [[ -d $rdhome ]]; then - destination=$(configurator_destination_choice_dialog "RetroDECK Data" "Please choose a destination for the RetroDECK data folder.") - case $destination in +configurator_move_dialog() { + choice=$(zenity --list --title="RetroDECK Configurator Utility - Move RetroDECK Folders" --cancel-label="Back" \ + --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" --width=1200 --height=720 \ + --column="Choice" --column="Action" \ + "Move all of RetroDECK" "Move the entire retrodeck folder to a new location" \ + "Move ROMs folder" "Move only the ROMs folder to a new location" \ + "Move BIOS folder" "Move only the BIOS folder to a new location" \ + "Move Downloaded Media folder" "Move only the Downloaded Media folder to a new location" \ + "Move Saves folder" "Move only the Saves folder to a new location" \ + "Move States folder" "Move only the States folder to a new location" \ + "Move Themes folder" "Move only the Themes folder to a new location" \ + "Move Screenshots folder" "Move only the Screenshots folder to a new location" \ + "Move Mods folder" "Move only the Mods folder to a new location" \ + "Move Texture Packs folder" "Move only the Texture Packs folder to a new location" ) - "Back" ) - configurator_tools_and_troubleshooting_dialog - ;; + case $choice in - "Internal Storage" ) - if [[ ! -L "$HOME/retrodeck" && -d "$HOME/retrodeck" ]]; then - configurator_generic_dialog "The RetroDECK data folder is already at that location, please pick a new one." - configurator_move_retrodeck_dialog - else - configurator_generic_dialog "Moving RetroDECK data folder to $destination" - unlink $HOME/retrodeck # Remove symlink for $rdhome - #move $rdhome "$HOME" - if [[ ! -d $rdhome && -d $HOME/retrodeck ]]; then # If the move succeeded - rdhome="$HOME/retrodeck" - roms_folder="$rdhome/roms" - saves_folder="$rdhome/saves" - states_folder="$rdhome/states" - bios_folder="$rdhome/bios" - media_folder="$rdhome/downloaded_media" - themes_folder="$rdhome/themes" - prepare_emulator "all" "postmove" - conf_write + "Move all of RetroDECK" ) + configurator_move_folder_dialog "rdhome" + ;; - configurator_process_complete_dialog "moving the RetroDECK data directory to internal storage" - else - configurator_generic_dialog "The moving process was not completed, please try again." - fi - fi - ;; + "Move ROMs folder" ) + configurator_move_folder_dialog "roms_folder" + ;; - "SD Card" ) - if [[ -L "$HOME/retrodeck" && -d "$sdcard/retrodeck" && "$rdhome" == "$sdcard/retrodeck" ]]; then - configurator_generic_dialog "The RetroDECK data folder is already configured to that location, please pick a new one." - configurator_move_retrodeck_dialog - else - if [[ ! -w $sdcard ]]; then - configurator_generic_dialog "The SD card was found but is not writable\nThis can happen with cards formatted on PC or for other reasons.\nPlease format the SD card through the Steam Deck's Game Mode and try the moving process again." - configurator_welcome_dialog - else - if [[ $(verify_space $rdhome $sdcard) == "true" ]]; then - configurator_generic_dialog "Moving RetroDECK data folder to $destination" - if [[ -L "$HOME/retrodeck/roms" ]]; then # Check for ROMs symlink user may have created - unlink "$HOME/retrodeck/roms" - fi - unlink $HOME/retrodeck # Remove symlink for $rdhome + "Move BIOS folder" ) + configurator_move_folder_dialog "bios_folder" + ;; - ( - dir_prep "$sdcard/retrodeck" "$rdhome" - ) | - zenity --icon-name=net.retrodeck.retrodeck --progress --no-cancel --pulsate --auto-close \ - --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ - --title "RetroDECK Configurator Utility - Move in Progress" \ - --text="Moving directory $rdhome to new location of $sdcard/retrodeck, please wait." + "Move Downloaded Media folder" ) + configurator_move_folder_dialog "media_folder" + ;; - if [[ -L $rdhome && ! $rdhome == "$HOME/retrodeck" ]]; then # Clean up extraneus symlinks from previous moves - unlink $rdhome - fi + "Move Saves folder" ) + configurator_move_folder_dialog "saves_folder" + ;; - if [[ ! -L "$HOME/retrodeck" ]]; then # Always link back to original directory - ln -svf "$sdcard/retrodeck" "$HOME" - fi + "Move States folder" ) + configurator_move_folder_dialog "states_folder" + ;; - rdhome="$sdcard/retrodeck" - roms_folder="$rdhome/roms" - saves_folder="$rdhome/saves" - states_folder="$rdhome/states" - bios_folder="$rdhome/bios" - media_folder="$rdhome/downloaded_media" - themes_folder="$rdhome/themes" - prepare_emulator "all" "postmove" - conf_write - configurator_process_complete_dialog "moving the RetroDECK data directory to SD card" - else - zenity --icon-name=net.retrodeck.retrodeck --error --no-wrap \ - --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ - --title "RetroDECK Configurator Utility - Move Directories" \ - --text="The destination directory you have selected does not have enough free space for the files you are trying to move.\n\nPlease select a new destination or free up some space." - fi - fi - fi - ;; + "Move Themes folder" ) + configurator_move_folder_dialog "themes_folder" + ;; + + "Move Screenshots folder" ) + configurator_move_folder_dialog "screenshots_folder" + ;; - "Custom Location" ) - configurator_generic_dialog "Select the root folder you would like to store the RetroDECK data folder in.\n\nA new folder \"retrodeck\" will be created in the destination chosen." - custom_dest=$(directory_browse "RetroDECK directory location") - if [[ ! -w $custom_dest ]]; then - configurator_generic_dialog "The destination was found but is not writable\n\nThis can happen if RetroDECK does not have permission to write to this location.\n\nThis can typically be solved through the utility Flatseal, please make the needed changes and try the moving process again." - configurator_welcome_dialog - else - if [[ $(verify_space $rdhome $custom_dest) ]];then - configurator_generic_dialog "Moving RetroDECK data folder to $custom_dest/retrodeck" - if [[ -L $rdhome/roms ]]; then # Check for ROMs symlink user may have created - unlink $rdhome/roms - fi + "Move Mods folder" ) + configurator_move_folder_dialog "mods_folder" + ;; - unlink $HOME/retrodeck # Remove symlink for $rdhome if the previous location was not internal + "Move Texture Packs folder" ) + configurator_move_folder_dialog "texture_packs_folder" + ;; - ( - dir_prep "$custom_dest/retrodeck" "$rdhome" - ) | - zenity --icon-name=net.retrodeck.retrodeck --progress --no-cancel --pulsate --auto-close \ - --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ - --title "RetroDECK Configurator Utility - Move in Progress" \ - --text="Moving directory $rdhome to new location of $custom_dest/retrodeck, please wait." + esac - if [[ ! -L "$HOME/retrodeck" ]]; then - ln -svf "$custom_dest/retrodeck" "$HOME" - fi - - if [[ -L $rdhome && ! $rdhome == "$HOME/retrodeck" ]]; then # Clean up extraneus symlinks from previous moves - unlink $rdhome - fi - - rdhome="$custom_dest/retrodeck" - roms_folder="$rdhome/roms" - saves_folder="$rdhome/saves" - states_folder="$rdhome/states" - bios_folder="$rdhome/bios" - media_folder="$rdhome/downloaded_media" - themes_folder="$rdhome/themes" - prepare_emulator "all" "postmove" - conf_write - configurator_process_complete_dialog "moving the RetroDECK data directory to SD card" - else - zenity --icon-name=net.retrodeck.retrodeck --error --no-wrap \ - --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ - --title "RetroDECK Configurator Utility - Move Directories" \ - --text="The destination directory you have selected does not have enough free space for the files you are trying to move.\n\nPlease select a new destination or free up some space." - fi - fi - ;; - - esac - else - configurator_generic_dialog "The RetroDECK data folder was not found at the expected location.\n\nThis may have happened if the folder was moved manually.\n\nPlease select the current location of the RetroDECK data folder." - rdhome=$(directory_browse "RetroDECK directory location") - roms_folder="$rdhome/roms" - saves_folder="$rdhome/saves" - states_folder="$rdhome/states" - bios_folder="$rdhome/bios" - media_folder="$rdhome/downloaded_media" - themes_folder="$rdhome/themes" - prepare_emulator "all" "postmove" - conf_write - configurator_generic_dialog "RetroDECK data folder now configured at $rdhome. Please start the moving process again." - configurator_move_retrodeck_dialog - fi + configurator_tools_and_troubleshooting_dialog } configurator_online_update_setting_dialog() { From 1fc4418e9a2edcaad1d49c7f75590223a22bdefd Mon Sep 17 00:00:00 2001 From: icenine451 Date: Tue, 25 Apr 2023 11:06:38 -0400 Subject: [PATCH 5/6] Add default PSX emulator change notice on upgrade. --- post_update.sh | 3 +++ rd-submodules/retroarch | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/post_update.sh b/post_update.sh index ad3d6f3c..50b8b90b 100644 --- a/post_update.sh +++ b/post_update.sh @@ -75,6 +75,7 @@ post_update() { # - Prepackaged DOOM! # - Update RPCS3 vfs file contents. migrate from old location if needed # - Disable ESDE update checks for existing installs + # - Notify user of default PSX core change mkdir -p "$mods_folder" mkdir -p "$texture_packs_folder" @@ -113,6 +114,8 @@ post_update() { dir_prep "$bios_folder/rpcs3/dev_hdd0/home/00000001/savedata" "$saves_folder/ps3/rpcs3" set_setting_value $es_settings "ApplicationUpdaterFrequency" "never" "es_settings" + + configurator_generic_dialog "As part of this update, the default PSX emulator has changed!\n\nIf you are currently playing PSX games and have not changed the default emulator on your own, you will need to switch back to the previous default emulator (Swanstation) for your existing saves to work.\nIf you have changed the default emulator yourself, please change it again to your previous choice.\n\nSee the wiki or Discord if you have more questions on this change!" fi # The following commands are run every time. diff --git a/rd-submodules/retroarch b/rd-submodules/retroarch index 717b7809..0b1cfb79 160000 --- a/rd-submodules/retroarch +++ b/rd-submodules/retroarch @@ -1 +1 @@ -Subproject commit 717b78093797270877ec416e58082f1c71d435d8 +Subproject commit 0b1cfb79e591e10488a3262d6b38db843c39a409 From 5a244705c07855cc8ad3d7f143dbe3be9745cffb Mon Sep 17 00:00:00 2001 From: icenine451 Date: Tue, 25 Apr 2023 12:09:59 -0400 Subject: [PATCH 6/6] Add finit choices dialog and stage binding icons --- functions.sh | 29 +++++++++++++++--- global.sh | 6 ++++ net.retrodeck.retrodeck.yml | 3 +- .../RD-applets-screenshooter.png | Bin 0 -> 457 bytes res/binding-icons/RD-application-x-iso.png | Bin 0 -> 477 bytes .../RD-battery-full-charging.png | Bin 0 -> 477 bytes res/binding-icons/RD-battery-missing.png | Bin 0 -> 460 bytes res/binding-icons/RD-camera-photo.png | Bin 0 -> 512 bytes .../RD-distributor-logo-netbsd.png | Bin 0 -> 413 bytes res/binding-icons/RD-document-save.png | Bin 0 -> 422 bytes res/binding-icons/RD-edit-find.png | Bin 0 -> 364 bytes res/binding-icons/RD-edit-undo.png | Bin 0 -> 390 bytes res/binding-icons/RD-emblem-documents.png | Bin 0 -> 254 bytes res/binding-icons/RD-emblem-downloads.png | Bin 0 -> 274 bytes .../RD-emblem-encrypted-locked.png | Bin 0 -> 271 bytes res/binding-icons/RD-emblem-favorite.png | Bin 0 -> 285 bytes res/binding-icons/RD-emblem-generic.png | Bin 0 -> 309 bytes res/binding-icons/RD-emblem-new.png | Bin 0 -> 258 bytes res/binding-icons/RD-emblem-synchronizing.png | Bin 0 -> 308 bytes res/binding-icons/RD-emblem-unlocked.png | Bin 0 -> 278 bytes res/binding-icons/RD-emblem-unreadable.png | Bin 0 -> 293 bytes res/binding-icons/RD-folder-applications.png | Bin 0 -> 428 bytes res/binding-icons/RD-folder-blue-backup.png | Bin 0 -> 422 bytes res/binding-icons/RD-folder-blue-games.png | Bin 0 -> 427 bytes res/binding-icons/RD-go-next.png | Bin 0 -> 376 bytes res/binding-icons/RD-go-previous.png | Bin 0 -> 372 bytes res/binding-icons/RD-godot.png | Bin 0 -> 524 bytes .../RD-icon_circle_2_180x180.png | Bin 0 -> 8767 bytes .../RD-io.github.antimicrox.antimicrox.png | Bin 0 -> 439 bytes res/binding-icons/RD-list-add.png | Bin 0 -> 324 bytes res/binding-icons/RD-list-remove.png | Bin 0 -> 204 bytes res/binding-icons/RD-media-playback-pause.png | Bin 0 -> 260 bytes res/binding-icons/RD-media-playback-start.png | Bin 0 -> 320 bytes ...otification-network-ethernet-connected.png | Bin 0 -> 363 bytes .../RD-notification-network-wireless.png | Bin 0 -> 415 bytes res/binding-icons/RD-octopi.png | Bin 0 -> 459 bytes res/binding-icons/RD-org.xfce.session.png | Bin 0 -> 519 bytes res/binding-icons/RD-pcsxr-icon.png | Bin 0 -> 387 bytes res/binding-icons/RD-playonlinux.png | Bin 0 -> 519 bytes .../RD-preferences-desktop-accessibility.png | Bin 0 -> 570 bytes .../RD-preferences-desktop-display.png | Bin 0 -> 344 bytes .../RD-preferences-desktop-emoticons.png | Bin 0 -> 445 bytes .../RD-preferences-desktop-icons.png | Bin 0 -> 614 bytes .../RD-preferences-desktop-keyboard.png | Bin 0 -> 303 bytes .../RD-preferences-system-search.png | Bin 0 -> 475 bytes .../RD-preferences-system-windows-actions.png | Bin 0 -> 437 bytes .../RD-preferences-tweaks-shadows.png | Bin 0 -> 485 bytes res/binding-icons/RD-process-stop.png | Bin 0 -> 402 bytes res/binding-icons/RD-pvz.png | Bin 0 -> 568 bytes res/binding-icons/RD-retroarch.png | Bin 0 -> 468 bytes res/binding-icons/RD-security-low.png | Bin 0 -> 909 bytes res/binding-icons/RD-steam.png | Bin 0 -> 515 bytes res/binding-icons/RD-supertuxkart.png | Bin 0 -> 613 bytes res/binding-icons/RD-system-reboot.png | Bin 0 -> 504 bytes res/binding-icons/RD-system-switch-user.png | Bin 0 -> 459 bytes res/binding-icons/RD-tesseract.png | Bin 0 -> 711 bytes res/binding-icons/RD-text-x-generic.png | Bin 0 -> 414 bytes res/binding-icons/RD-tools-check-spelling.png | Bin 0 -> 308 bytes res/binding-icons/RD-urbanterror.png | Bin 0 -> 462 bytes res/binding-icons/RD-user-red-home.png | Bin 0 -> 405 bytes res/binding-icons/RD-utilities-terminal.png | Bin 0 -> 436 bytes res/binding-icons/RD-video-x-generic.png | Bin 0 -> 383 bytes res/binding-icons/RD-view-refresh.png | Bin 0 -> 402 bytes res/binding-icons/RD-zoom-fit-best.png | Bin 0 -> 413 bytes res/binding-icons/RD-zoom-in.png | Bin 0 -> 395 bytes res/binding-icons/RD-zoom-original.png | Bin 0 -> 417 bytes res/binding-icons/RD-zoom-out.png | Bin 0 -> 371 bytes 67 files changed, 32 insertions(+), 6 deletions(-) create mode 100644 res/binding-icons/RD-applets-screenshooter.png create mode 100644 res/binding-icons/RD-application-x-iso.png create mode 100644 res/binding-icons/RD-battery-full-charging.png create mode 100644 res/binding-icons/RD-battery-missing.png create mode 100644 res/binding-icons/RD-camera-photo.png create mode 100644 res/binding-icons/RD-distributor-logo-netbsd.png create mode 100644 res/binding-icons/RD-document-save.png create mode 100644 res/binding-icons/RD-edit-find.png create mode 100644 res/binding-icons/RD-edit-undo.png create mode 100644 res/binding-icons/RD-emblem-documents.png create mode 100644 res/binding-icons/RD-emblem-downloads.png create mode 100644 res/binding-icons/RD-emblem-encrypted-locked.png create mode 100644 res/binding-icons/RD-emblem-favorite.png create mode 100644 res/binding-icons/RD-emblem-generic.png create mode 100644 res/binding-icons/RD-emblem-new.png create mode 100644 res/binding-icons/RD-emblem-synchronizing.png create mode 100644 res/binding-icons/RD-emblem-unlocked.png create mode 100644 res/binding-icons/RD-emblem-unreadable.png create mode 100644 res/binding-icons/RD-folder-applications.png create mode 100644 res/binding-icons/RD-folder-blue-backup.png create mode 100644 res/binding-icons/RD-folder-blue-games.png create mode 100644 res/binding-icons/RD-go-next.png create mode 100644 res/binding-icons/RD-go-previous.png create mode 100644 res/binding-icons/RD-godot.png create mode 100644 res/binding-icons/RD-icon_circle_2_180x180.png create mode 100644 res/binding-icons/RD-io.github.antimicrox.antimicrox.png create mode 100644 res/binding-icons/RD-list-add.png create mode 100644 res/binding-icons/RD-list-remove.png create mode 100644 res/binding-icons/RD-media-playback-pause.png create mode 100644 res/binding-icons/RD-media-playback-start.png create mode 100644 res/binding-icons/RD-notification-network-ethernet-connected.png create mode 100644 res/binding-icons/RD-notification-network-wireless.png create mode 100644 res/binding-icons/RD-octopi.png create mode 100644 res/binding-icons/RD-org.xfce.session.png create mode 100644 res/binding-icons/RD-pcsxr-icon.png create mode 100644 res/binding-icons/RD-playonlinux.png create mode 100644 res/binding-icons/RD-preferences-desktop-accessibility.png create mode 100644 res/binding-icons/RD-preferences-desktop-display.png create mode 100644 res/binding-icons/RD-preferences-desktop-emoticons.png create mode 100644 res/binding-icons/RD-preferences-desktop-icons.png create mode 100644 res/binding-icons/RD-preferences-desktop-keyboard.png create mode 100644 res/binding-icons/RD-preferences-system-search.png create mode 100644 res/binding-icons/RD-preferences-system-windows-actions.png create mode 100644 res/binding-icons/RD-preferences-tweaks-shadows.png create mode 100644 res/binding-icons/RD-process-stop.png create mode 100644 res/binding-icons/RD-pvz.png create mode 100644 res/binding-icons/RD-retroarch.png create mode 100644 res/binding-icons/RD-security-low.png create mode 100644 res/binding-icons/RD-steam.png create mode 100644 res/binding-icons/RD-supertuxkart.png create mode 100644 res/binding-icons/RD-system-reboot.png create mode 100644 res/binding-icons/RD-system-switch-user.png create mode 100644 res/binding-icons/RD-tesseract.png create mode 100644 res/binding-icons/RD-text-x-generic.png create mode 100644 res/binding-icons/RD-tools-check-spelling.png create mode 100644 res/binding-icons/RD-urbanterror.png create mode 100644 res/binding-icons/RD-user-red-home.png create mode 100644 res/binding-icons/RD-utilities-terminal.png create mode 100644 res/binding-icons/RD-video-x-generic.png create mode 100644 res/binding-icons/RD-view-refresh.png create mode 100644 res/binding-icons/RD-zoom-fit-best.png create mode 100644 res/binding-icons/RD-zoom-in.png create mode 100644 res/binding-icons/RD-zoom-original.png create mode 100644 res/binding-icons/RD-zoom-out.png diff --git a/functions.sh b/functions.sh index 00348f35..26a242fe 100644 --- a/functions.sh +++ b/functions.sh @@ -1850,10 +1850,10 @@ finit() { echo "Executing finit" # Internal or SD Card? - choice=$(configurator_destination_choice_dialog "RetroDECK data" "Welcome to the first configuration of RetroDECK.\nThe setup will be quick but please READ CAREFULLY each message in order to avoid misconfigurations.\n\nWhere do you want your RetroDECK data folder to be located?\n\nThis folder will contain all ROMs, BIOSs and scraped data." ) - echo "Choice is $choice" + local finit_dest_choice=$(configurator_destination_choice_dialog "RetroDECK data" "Welcome to the first configuration of RetroDECK.\nThe setup will be quick but please READ CAREFULLY each message in order to avoid misconfigurations.\n\nWhere do you want your RetroDECK data folder to be located?\n\nThis folder will contain all ROMs, BIOSs and scraped data." ) + echo "Choice is $finit_dest_choice" - case $choice in + case $finit_dest_choice in "" ) # Cancel or X button quits echo "Now quitting" @@ -1916,7 +1916,20 @@ finit() { conf_write # Write the new values to retrodeck.cfg - local rpcs_firmware_install=$(configurator_generic_question_dialog "RPCS3 Firmware Install" "Would you like to install the latest PS3 firmware for the RPCS3 emulator?\n\nThis process will take several minutes and requires network access.\nIf you do not plan to emulate PS3 games this can be skipped, and can always be done later through the Configurator.\n\nIf you click Yes, RPCS3 will be launched at the end of the RetroDECK setup process.\nOnce the firmware is installed, please close the emulator to finish the process.") + local finit_options_choices=$(zenity \ + --list --width=1200 --height=720 \ + --checklist --hide-column=4 --ok-label="Confirm Selections" --extra-button="Enable All" \ + --separator=" " --print-column=4 \ + --text="Choose which options to enable:" \ + --column "Enabled?" \ + --column "Option" \ + --column "Description" \ + --column "option_flag" \ + "${finit_options_list[@]}") + + if [[ "$finit_options_choices" =~ (rpcs3_firmware|Enable All) ]]; then # Additional information on the firmware install process, as the emulator needs to be manually closed + configurator_generic_dialog "RPCS3 Firmware Install" "You have chosen to install the RPCS3 firmware during the RetroDECK first setup.\n\nThis process will take several minutes and requires network access.\n\nRPCS3 will be launched automatically at the end of the RetroDECK setup process.\nOnce the firmware is installed, please close the emulator to finish the process.") + fi zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" --title "RetroDECK" \ @@ -1926,12 +1939,18 @@ finit() { prepare_emulator "reset" "all" tools_init - if [[ $rpcs_firmware_install == "true" ]]; then + # Optional actions based on user choices + if [[ "$finit_options_choices" =~ (rpcs3_firmware|Enable All) ]]; then update_rpcs3_firmware fi + if [[ "$finit_options_choices" =~ (rd_controller_profile|Enable All) ]]; then + rsync -a "/app/retrodeck/binding-icons/" "$HOME/.steam/steam/tenfoot/resource/images/library/controller/binding_icons/" + # TODO move controller profile file to where it needs to go + fi # Add packaged extras, after the ROMS folder has been initialized cp /app/retrodeck/extras/doom1.wad "$roms_folder/doom/doom1.wad" # No -f in case the user already has it + ) | zenity --icon-name=net.retrodeck.retrodeck --progress --no-cancel --pulsate --auto-close \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ diff --git a/global.sh b/global.sh index 79d1ddcd..88696114 100755 --- a/global.sh +++ b/global.sh @@ -32,6 +32,12 @@ helper_files_folder="$emuconfigs/defaults/retrodeck/helper_files" helper_files_list="$emuconfigs/defaults/retrodeck/reference_lists/helper_files_list.cfg" # The list of files to be deployed and where they go rpcs3_firmware="http://dus01.ps3.update.playstation.net/update/ps3/image/us/2023_0228_05fe32f5dc8c78acbcd84d36ee7fdc5b/PS3UPDAT.PUP" +# Options list for users to pick from during finit +# Syntax is "enabled_by_default" "Option name" "Option description" "option_flag_to_be_checked_for" + +finit_options_list=("false" "RPCS3 Firmware Install" "Install firmware needed for PS3 emulation during first install" "rpcs3_firmware" \ + "false" "RetroDECK Controller Profile" "Install custom RetroDECK controller profile (stored in shared Steam directory)" "rd_controller_profile") + # Config files for emulators with single config files cemuconf="/var/config/Cemu/settings.xml" diff --git a/net.retrodeck.retrodeck.yml b/net.retrodeck.retrodeck.yml index b9d01b4b..72e0358c 100644 --- a/net.retrodeck.retrodeck.yml +++ b/net.retrodeck.retrodeck.yml @@ -1074,6 +1074,7 @@ modules: - cp -f res/splash.svg ${FLATPAK_DEST}/retrodeck/graphics/splash-orig.svg - cp -rf res/extra-splashes/ ${FLATPAK_DEST}/retrodeck/graphics - cp -f res/icon.svg /app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg + - mv -f -t ${FLATPAK_DEST}/retrodeck res/binding-icons # RetroDECK core script - cp retrodeck.sh /app/bin/retrodeck.sh @@ -1116,4 +1117,4 @@ modules: sources: - type: git url: https://github.com/XargonWan/RetroDECK.git - branch: cooker-0.7.0b \ No newline at end of file + branch: cooker-0.7.0b diff --git a/res/binding-icons/RD-applets-screenshooter.png b/res/binding-icons/RD-applets-screenshooter.png new file mode 100644 index 0000000000000000000000000000000000000000..23b8e8e5ba2385bb31776a2c0ea35ef63c6db17f GIT binary patch literal 457 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrV4UFT;uunK>+PL`y-f}x4T*+d z3>J1-1~uhIG?r_B$Yb4>$SJe3DWG-Uo+i$j2hP;ozj}AgB>VmkWl6%xf99;Xc2iY= zfyse^gMm?jA?wn*zX!h7Mb`ZNS`l8$_jvu|AZ#WC0ilu=;fWf}^ zGlLof6I3IMgK5}#<};t)Xr=13Brqv3fYktH|LkSA*p)e}?CobwGe`8>;^gI9e z^U{09GZ^w1!L|eSY+yfe^4|ac^R?#_nRc+kj5#2;V9E0zYtO&TexLvP_x zp4no1K9XOiY-TUWyN_hViFAGer-G?I3@o4!VFK!JFsfnP+hJHTbP0 Hl+XkKYv+}J literal 0 HcmV?d00001 diff --git a/res/binding-icons/RD-application-x-iso.png b/res/binding-icons/RD-application-x-iso.png new file mode 100644 index 0000000000000000000000000000000000000000..cd7cb42323130f3db2c4c630071da00f13fc2899 GIT binary patch literal 477 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrU|izq;uunK>+PL`xy=p&4uKnj zI8$>tr#LiDap0WdsD1M2_o=4$-tg@y?@LnuCAB5_unq4!oAdWIHwK-u`SiQm*Jc(2 zO9O)d1Cs-TjqhjUtZ&6N`D?#(s5N+lgg6)&6&T(y&iVYg;~l3D!*m7~sM;IM7SHdy z=lUlw?O;)WiarRe+w`CD_rCJlzqz-4;7U0fbe>(bf4_e2=k>2&{rWd8)pM`90b>jk z*iN7Y3H$}ii~kkMEd2fadMWSUdbj(+GZ^$3!BzvUtC;fTJFCn2pBL}T-vvs*gkid& zmh&$8Z|Cs#^N)MqS&`K+f1Gnb;XLONRR%_=!kOO~w#uK_r=F4frMONr)r=8g(7j9d z#SMO0-eH0I8)&(N$B)S0i|gYbyvv&ZeKwNi_wO)Yxgq?;_BpcP|DEg|r}nvL)b^Pp c8Ef}}ovkYP|9|$NeGEY0>FVdQ&MBb@0CKFLhX4Qo literal 0 HcmV?d00001 diff --git a/res/binding-icons/RD-battery-full-charging.png b/res/binding-icons/RD-battery-full-charging.png new file mode 100644 index 0000000000000000000000000000000000000000..c0558ae3dc41bdca6578b4a0f7a6c5e7cbb8c39a GIT binary patch literal 477 zcmeAS@N?(olHy`uVBq!ia0vp^89>~?!3HFsbL;pqFfcChba4!+xb^n#LchZf5(hrY zIVNy8eiUIjto-2o!orMK%Rjh2URL;(Bd+m{rkXg%`R}LC zy#IfS#qtpgMDN@ia$CO4+gx({>_LQJ=r;DJ`|LAzXI7s#bnLSL+s)$f`gZfC`|?|? zL;f;8y|+2&`rVmucP{x<9q{(--um>HwkHtA+-#1@em5_zNv06w3!sIk-aG!>Z~x-Q z=SxB71tWgX`~2lqWg*afpvQnJTDez>ACXu->wm+o?@M0)UY`Kc2=X$=gjKKjJ0IG# UGB58v3yd}fPgg&ebxsLQ0CBm)g8%>k literal 0 HcmV?d00001 diff --git a/res/binding-icons/RD-battery-missing.png b/res/binding-icons/RD-battery-missing.png new file mode 100644 index 0000000000000000000000000000000000000000..2953acb84989b93b869c430b6b029b473e12a35e GIT binary patch literal 460 zcmeAS@N?(olHy`uVBq!ia0vp^89>~?!3HFsbL;pqFfdN`ba4!+xb^n-#@s^=A`OZ0 zQ^XXPezSO)&#GefLE#=lr|7!#7VDH1*$T`~h(42T|M^eMMaOP$@VpI|1@73Kf4$-H zvP`du^Zy&Jc+J2lq~O4$;;=sAYyFQopI>Ent)4Q;XM(a{0|Vy-2F9S`||3iE!@>_bNRdO1<%{7J`>@T_UT3Evd@cG-2L$<;Qib_cO=~v v{HyjJoF}sT`IMkZoJB`Kfdceu)-8FF4IWC99%XF+#u9_4tDnm{r-UW|04%tq literal 0 HcmV?d00001 diff --git a/res/binding-icons/RD-camera-photo.png b/res/binding-icons/RD-camera-photo.png new file mode 100644 index 0000000000000000000000000000000000000000..64c16ab10ea6de2e533e92dee95db2854f57cd13 GIT binary patch literal 512 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrU_9>W;uunK>+M~`yk-N5hKmAU z8FJRFnRDn)!{#DJ6~BY0P95XDwKT~1YEbNHwLRw3SGdO4rwC7aHZhXp;pc<%*S@~> zq~`DP;F^3U0R|=q1`Y?N&-vH>y{<2u8TQY9zS9uN-TP`8&0mG~@dk6xWB>wBS3j3^ HP6I zn-#mOPZTUdWSygMm?jfu(^#;&_T| zyrtvm|MQiFp+W)-Ob_;+Icr%T<8D7s^&97kHJ=yT>nAYnU;*m@N*}O0Ab0UQ=PdsZ zC+DjhFvc(e#T?*9!Z-p!U*k%@d}mv<|9?IcOsfM!&Y89BJK~G2KHD99@wx`d(uCbU zdA1JkpR=xc?90H?zyLD`p_QZI?z4OH0oC~nraY?K&xue{(DN?)!?pjaTl^D{Y=Zd_ vi$M&G2vh(3v;X<0t^vt7gdEU_52gCkH)#D`Q0SG)@{an^LB{Ts5i`8~u literal 0 HcmV?d00001 diff --git a/res/binding-icons/RD-document-save.png b/res/binding-icons/RD-document-save.png new file mode 100644 index 0000000000000000000000000000000000000000..b6980cbef1082971c134a43b24ce9e03cbff4f1b GIT binary patch literal 422 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrV9fP&aSW-r_4ckIAETp4!^6lz z_PyFGwp8=Z4STF1wbt)W((Sb|j_+ji5+ztQ#`aJ)S@6V-?6&kSrIFhqZ z;}>J``ICqF&@@6UXJGuWAj%vSoN4G0K!GZ?HOjXF3BAc)I$ztaD0e0ssRbd>jA( literal 0 HcmV?d00001 diff --git a/res/binding-icons/RD-edit-find.png b/res/binding-icons/RD-edit-find.png new file mode 100644 index 0000000000000000000000000000000000000000..2583ab2193f0d6c8e0ddbb7dbd271b8bbcb963e7 GIT binary patch literal 364 zcmeAS@N?(olHy`uVBq!ia0vp^4M3d0!3HF+R#ka2FfbZ>x;TbZ+k(P-`BAA4CRT$sLi#;P~BpH#h{f98Dt+PAk4=}9l;bYS3M zU{qjWaWHMaU%2@DkK@1R{bIGvU%&J_i&}#+SgL_RfZ-cM`a8x=?|)uJ6hp z3rGbM$fRn9I^$c#J>OJrp68yy(1#?$2($yLOy}fh2FH8+NTyHy#;~}0-FNmGP{)82 zUiSFE*6MdXtNZ@v@@IcD7O=n!Sa3;BL2H+L$GyXg=g;4(ZonwR2=PJ#!v^*T^=bEo sk!`-gTrls=b4ectcLpY?U%h@Z&ET@G%ljg8g#idWUHx3vIVCg!02n=WuK)l5 literal 0 HcmV?d00001 diff --git a/res/binding-icons/RD-edit-undo.png b/res/binding-icons/RD-edit-undo.png new file mode 100644 index 0000000000000000000000000000000000000000..b37a65291f9327b5acdd9c3c2665ab542eb92243 GIT binary patch literal 390 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrVD$BLaSW-r_4ckKSF;0;L!f&V zZ+X*q`@RS3*faevu(=#md7pb%iA_sPHi?B2KL_lzHzW!x+c3<3;H4h$R( zesMR?|D3_V!N91%zycDj{KjzZry2tjP?CWWDCRKNwxM_*CrkqaV?a9pgE{$3P~|{% zO9bnj&s*MSf$3;qSh1PC;G8)l#0sz}2<-|Cr!@b^9oY0v`SbhzzyHlzmvv4FO#p3jXm|hs literal 0 HcmV?d00001 diff --git a/res/binding-icons/RD-emblem-documents.png b/res/binding-icons/RD-emblem-documents.png new file mode 100644 index 0000000000000000000000000000000000000000..2596501a2fbfe11bbc3e177651778167d34fe724 GIT binary patch literal 254 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=M?GB}Ln>~)z3s@?q9DK;IO7cC zPQiz6cM9(8HWUuHQn%MkCG3~@f(e(OyxRN!QfH{wN#oe3>FV!Xa2v=sl?#$;a4ADKz8gernRQBKwFskDt_;&-*Qfnkzvt$)M z>7<|_9+80=u_+QG52N~w+>gTe~DWM4fTJ=^8 literal 0 HcmV?d00001 diff --git a/res/binding-icons/RD-emblem-downloads.png b/res/binding-icons/RD-emblem-downloads.png new file mode 100644 index 0000000000000000000000000000000000000000..dde0658b2070376d30b49b689ed98881eea6699c GIT binary patch literal 274 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=H$7b(Ln>~)y&cWhtia$Bn6b;D z%;kolbsN?C@POJV!Z literal 0 HcmV?d00001 diff --git a/res/binding-icons/RD-emblem-encrypted-locked.png b/res/binding-icons/RD-emblem-encrypted-locked.png new file mode 100644 index 0000000000000000000000000000000000000000..1c1f7b51edd0ea4bcb979b7989258dfb67a48b0d GIT binary patch literal 271 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=*F0SuLn>~)z3s@?q9DK;IO7cC zUcrxUcM8(pw@FBeR_-lnTyp8_ONo=3JF?d9H`%Z)_w>ZqwU-{T9(cv@>9WjzD`gFa z2A&zWf8O(1z`$ViAokq+vn(JRfndWYnG4nLrUyBhZ+X9)kAb1#^(*UNtnSMf8#}Wz zFdW$YtYP!>A1{0|-nKI_%wSGhJ(W}UdGxt&>((;^Wxq4X0*xq?Tma-GyyLO3`%uro z3O1G@qMWbdcFcqLL@tI4(-}9XHd#B1FeK!#-I*)+jxU&@;leLwTVFS$^HNcBK^i<= L{an^LB{Ts5S9oTJ literal 0 HcmV?d00001 diff --git a/res/binding-icons/RD-emblem-favorite.png b/res/binding-icons/RD-emblem-favorite.png new file mode 100644 index 0000000000000000000000000000000000000000..a850c5b01822157beb1edddb290e8446ccff3afa GIT binary patch literal 285 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=Pdr^5Ln>~)z3s@?tRUhVn6t~F z+~vkZ>zw0OD-1sfp00HEHQ4#kj`PtZsr1|1{JGBTTIYTGV_fDZ1_SGcRFmV?L;v~uGA34_$v`lpQa0fCz4Mm;_r!a7D);*{GL#(H%4bphNhkfB zTYo;#83**<-{W6XdWQ$1fuZ5~8+MoDbquTwJGL`dl{>BdoCcJ6WBs5aaf@HZ+dZEd zMHmvMf3Q8c`0&O1zs>;VRz$PAtmm#e9+}9+5OAH*|24~hogp00i_>zopr0Pt&SzW@LL literal 0 HcmV?d00001 diff --git a/res/binding-icons/RD-emblem-generic.png b/res/binding-icons/RD-emblem-generic.png new file mode 100644 index 0000000000000000000000000000000000000000..475bfcb70dc0767a3133d6e8462ae989d8002772 GIT binary patch literal 309 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=e>`0rLn>~)z3s@?Y{0`BxT4A- zuVsgzdCv6>86r2?R@vw~W-S%`oa}7me{$>l-|1RwQX`+8xnJ$uEY7f)dB*y(n%L{} zzi-doZKABfaNxn$ebuq+-#JIkbYNsiahU)4>g$R!`HQDmxEK_evt)bIoK9Ez18qHW zk3Ho4_p733B|s8I&;P#iIWf;vgQ0=PBJIH4*T1gTGP44e0l@|K8LS}jie;a#f(&&# z-|)Hh#lMDWi}&9DzW9H+-fw20y$dgWXHWV5>Y~pF7NGy) literal 0 HcmV?d00001 diff --git a/res/binding-icons/RD-emblem-new.png b/res/binding-icons/RD-emblem-new.png new file mode 100644 index 0000000000000000000000000000000000000000..f0d591675d6ef7cf2af0d25c9484370b9a85bf9e GIT binary patch literal 258 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=Cp}#pLn>~)y&cHaq9DQ=ARD#7 zTB!U9-}3VcGg2hnjn4n&{bf<|b)u;A^D9yJANG4{9-a5Sy7ee?LTN+A_P+i&(3Z$IOoPy0M;0Ta*;28M*EmJc$2|Jz>N2yzSqLqn@@ zbg{#0*?V^{R~=sgQFB1XKyUGRHd{up3Wfv6bDn?xw0yqs4?71|u+RZR_ATE|-h9q< upKCQk!|5OC9;^%z%)5^5Kdi-&u3T-G@yGywp#Ut)~_ literal 0 HcmV?d00001 diff --git a/res/binding-icons/RD-emblem-synchronizing.png b/res/binding-icons/RD-emblem-synchronizing.png new file mode 100644 index 0000000000000000000000000000000000000000..812ac1842b4ddbd72d7b9425909a7ccd7e77bbc6 GIT binary patch literal 308 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=zdc~)z3s@?cW#*(KQy558V<@u>TeYI?|`B|Y}~^$Uf|GNmRTujVnAXL!e#@W=f4_j4Rv z3<}KW-qx53YcMqM?3ng>?Mw$ohCI9T_ta-R-}&WlYGe!}1H*-l>`Usu*IV9y_2pZ| zOP>V{3`Ps4F=jshevXBUAwm3vU;gvUAbnpN-rFwNb$)x=k$cY~)z3s@?q9DQ&IJ3eb z&t;FG`JBkpZ4wS`AF9$9>1c)hUM$gf?xbaXe`BX%+q~DceP@{uykj`D-|}CXdjJE2 z?1pWh*UoidWGFch@jTee_j>$w(=Eap36d_nfPa{$t=`D0ts+ zjWz5y-vd4dhKA@jqRSWhrtHJ}iChd9Ozq_;XYq|gc literal 0 HcmV?d00001 diff --git a/res/binding-icons/RD-emblem-unreadable.png b/res/binding-icons/RD-emblem-unreadable.png new file mode 100644 index 0000000000000000000000000000000000000000..0cd3cdfef4aa7d43b71a78a98d3a59b1c1294ca9 GIT binary patch literal 293 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=Z#-QbLn>~)z3s@?tRUc)m}{e8 zZgj6hdfV$wD-4Yzrshw}@~Cu#sm+w3>yn3nS3f j1N)5+-Av?Sm=GoZq$c#(wny1bAmcq<{an^LB{Ts5CmVD# literal 0 HcmV?d00001 diff --git a/res/binding-icons/RD-folder-applications.png b/res/binding-icons/RD-folder-applications.png new file mode 100644 index 0000000000000000000000000000000000000000..0e1215e1e16ef52036643082c74fe8e13738bf5c GIT binary patch literal 428 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrU@Z1@aSW-r_4bb8I>tbehKG`Z z)f*V!xMXu$l__Xht?gT}MJuX%1J~&Z3j(E$)Qr#l-FK~f&(5Fs_s;y>ro#+02Lu+K z?5<1LC1d;VC)4}8+0XC3-hJ}vv?2!Gdge^w1_l8JCIhJR-9Gk%R!P@ov&Cv6ltLowo@IByw+hxhHf4Bel voeVOJFv~kk*gO8&R$aV)97!Dm5IA`F8$0T?ME#o#;xTx-`njxgN@xNAtG|rW literal 0 HcmV?d00001 diff --git a/res/binding-icons/RD-folder-blue-backup.png b/res/binding-icons/RD-folder-blue-backup.png new file mode 100644 index 0000000000000000000000000000000000000000..f173f08a993c85efa01433c85aae12ea599a8b60 GIT binary patch literal 422 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrV9fP&aSW-r_4ckUA7h|M!$nEK zrKf~UrY%?y63N;sy290a{e+0-dvaUeIIax6u)|z3%0|F;} zXYO*&-?#h!XKtAi^R?mI^V5$h5SKxK zfysfv#&mye)8(v38rLFr&YJ~O3X$V*VBl+nFpo_BW9P8kzOM3jL4Bc!FI+oEgU>gH z(A|3O3-2%Z_9y|#;Fg=rA+>Y=WQV@D^kG;I*KmXR&*jpBS07i}9^Bq<&Ion`*nMvp z?>)D=%K~>TL&s)zkCnfy?7!Q#a6S-$I+uf?y1`>n{rm$g1zd2YwhnV${_kfHW?+Q* nOW~5-f%pHBoXG$L4gIzZ^-fxoE`4)f2;zIX`njxgN@xNAH*SNc literal 0 HcmV?d00001 diff --git a/res/binding-icons/RD-folder-blue-games.png b/res/binding-icons/RD-folder-blue-games.png new file mode 100644 index 0000000000000000000000000000000000000000..67507a69cfde311e96247d07057bf9800bd663eb GIT binary patch literal 427 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrU@Y=~f4u0`~C2ixYya^V~cV*YyIhbL(VaDx;{;%`@KacbjKKnZRSLUMY%s`Vs zV3*qJs>3DK|F-;OKBs;>@#gF0XWz~(VyL~}xP{Y!frEijfq|vL*5UX!hLzPKm1#^M zE`tCAlLNya9w+_+`!#cqcBH!IA&GnI&=AC-Zcx-d%%h%nfFGrd%g0+H` zSZ!io@#&WS+@tnVZ`Y}TOoZ6xkX+rc>wR!=`1g57SqhLHG5cNfTS*@V7N`R_8os?@ zbgF;9uG(Lq>d%eu5^4?JaAV#u&Jy`uTk_&#a(&!ERAYQ>zUL#kcS}0|ga0hZ#=d*Q h_$Llo2?G$gJm21 literal 0 HcmV?d00001 diff --git a/res/binding-icons/RD-go-next.png b/res/binding-icons/RD-go-next.png new file mode 100644 index 0000000000000000000000000000000000000000..279b8b2e724faac53812468d8aa3e759c4e62a39 GIT binary patch literal 376 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrV6^viaSW-r_4e*Y-ew0Lhd_s$ zt(h7#rZi>FV2jeyVR`c4Pu%Rjnx7?MO0z(^PAvM$(brqNU#`}U_w@4liO;pq`7$s$ zFmNz1DloiZwAjktv8UEQfyshN04kiof1tLy!Q-WEBj*DSs6v(oTZaF)nO)}H6Q04) z$H3CS09O6v7W0&S&x_7pMOXW^;~R@wgE9l70z~aMh8YkWVLHLqgE{lRedc)etez3s z0TZ6j%V&aWWpZG6Q<0x=pqjam1tzpWsg6J3#^vud!VHWsu>*1n=WXw^z#Yu6f&E1B id2>dXw-gwFpkazx*{ssQ18U1~)%q(xV|ti1BjC(%EGO)l^RFyHjuMr1HLBt-I=lw6cXMLX) zs2wW0BAxxixpE{!UZEKRRR^{6)sNT)ZkYKDj0x;J&iFlGf|>8Yuw^r|%f5S@pSGyQ zZ$?u0;T)epWtI8{<{fa01sML{WK=3IXR<~%FaW5qvkX;?0SHVo*v%N!bmyitc!0Q` Lu6{1-oD!M+M}bzrzL$4i_a# z6H`*(NiI^lSbR}=O7T{qz;g%AoH~)Ac5TL~jWXBYuXPPA+?R9H_qIVunMM4gOOG$V zlxS9cmmIej^1||oFFUx+&nQY}xi+owkWZa<2z^K5$0+Nco`Sji6;NMsN zUVi-f(&PE}?c;6Z8?OBDX-)E{ zxM|x?c?NF=pa2I0BTQDHK@n_oN#^w5Eb{s5UE?2|{=M}j|^MGYT z?G8zV8y@JX)|(p~+q6Gn{%(K$zqU1N_x}@Uy3gwZcj%ArmIofzoU~%!;J^O&ujQ97 zS~4)f>^?C6(R}WVzx)1F|Bq=z35}LJ>L>QbH`uKF{`)N4C;^7-dCX5<{gqKHm(OQ| e8PdS8~hyYH>Kx9a=x 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 YV@QTaesw{<90L$|y85}Sb4q9e04^Gy_W%F@ literal 0 HcmV?d00001 diff --git a/res/binding-icons/RD-list-add.png b/res/binding-icons/RD-list-add.png new file mode 100644 index 0000000000000000000000000000000000000000..fa48ad3b6dccd84cc138f99840fe90bff4f739af GIT binary patch literal 324 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrVC436aSW-r_4dw2-UbB$hrj~K za&txuzg@5(U=7-akb1hKXWho|Nbrot^m0l1mxMS WU*NgtvZH+}i0A3*=d#Wzp$Pzm`9@>_ literal 0 HcmV?d00001 diff --git a/res/binding-icons/RD-list-remove.png b/res/binding-icons/RD-list-remove.png new file mode 100644 index 0000000000000000000000000000000000000000..724e8514027656e830ef42d577b6431d914196f0 GIT binary patch literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSlRaG=Ln>~)y>w8JL4e2Av1GyG zDeII~0~qttdhQnc+3TwU6=4Gpw$)g@5IpSje%0FC`WT-t=8PN+j0y}a4GaPdOb!f$ dISe>J#LRO-EDkUBxLbe}c)I$ztaD0e0sw#|C!_!X literal 0 HcmV?d00001 diff --git a/res/binding-icons/RD-media-playback-pause.png b/res/binding-icons/RD-media-playback-pause.png new file mode 100644 index 0000000000000000000000000000000000000000..3480a713b944323a9eee18cdd9d371f046271e56 GIT binary patch literal 260 zcmeAS@N?(olHy`uVBq!ia0vp^2|(Py!3HG1+{xJmq)vOfIEGZ*dV6UjCxZfy>p}VN z^Kb5G>}_rO{)&S$UCDEj%FFGmCf(yb^X@cvnC#yAKl>i?1GO_UC@?UvFf=eQ2rw`( rF*qli8&6FR6HlibP0l+XkK{hu=1 literal 0 HcmV?d00001 diff --git a/res/binding-icons/RD-media-playback-start.png b/res/binding-icons/RD-media-playback-start.png new file mode 100644 index 0000000000000000000000000000000000000000..375801a7578315261ad7bcc461325955880c38bd GIT binary patch literal 320 zcmeAS@N?(olHy`uVBq!ia0vp^9zfi{!3HE(gz3*?U|?kTba4!+xb^m?H`ieU9@jw4 zl>gCXWdi&?AKl$A^Uacrd*EcO6!j-2d%wJUT3SqvzlB2s10xg5i%X|3^1Z4%_;7BD zBUpfA0^h7}471B8u>xf|1QZ;sGHx>Ky;I?a@ES@kY_m@&QjY}6fYdK(?)%%=jHG#& z*n-QRVoyYwA(~G#$v_mca7=&*HLTmQ-KydL(LG6E`#jh~-^y@*>VnuN8?v=n2V^Ty n?vi7u_3EaktaqI03N3JFZk%q*n z3i;x4$u|C0#|2&%ZM#@@@l?~K#98lebMf)m^FO=#x#spN+1Izf3h##W9@6bt(*uO rC!CghF!$1T7We(1eHq{`X%Oeva93eDE_y_T0SG)@{an^LB{Ts5M!I3H literal 0 HcmV?d00001 diff --git a/res/binding-icons/RD-notification-network-wireless.png b/res/binding-icons/RD-notification-network-wireless.png new file mode 100644 index 0000000000000000000000000000000000000000..7bc8975e15139663eb011f4dfd25670fe67227f9 GIT binary patch literal 415 zcmeAS@N?(olHy`uVBq!ia0vp^4M3d0!3HF+R#ka2FfgWhx;TbZ+^QRCNFrTq?0UpK6KeQs64XPb8Q`2Win zWiSaaFgY-AFfazpdLp^yOL5h^plUYZ1L06n1%^|%n7`D@+diNFd~!S=WJBLD{yRSJ!Q1^P%Hw~q9)4lx5`N&y4+bFcboFyt=akR{0B!1yxc~qF literal 0 HcmV?d00001 diff --git a/res/binding-icons/RD-octopi.png b/res/binding-icons/RD-octopi.png new file mode 100644 index 0000000000000000000000000000000000000000..746c1bb9b70feec25020242e1d33fe37bcf61ae8 GIT binary patch literal 459 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrV4URX;uunK>+Ri*y@w1$8XmG3 zGAv%ABDy8VMNL83fN$l3Gj1CgHFc6_f3MZ;`Y^Z7_VhK)>*Z6eZP&kFmw4LZyXpG; z>w>cwSQ;1v7?>OwT!R1f-1=o{ANsPIN%(*mRFs3^JHxr3Ur*HfCotV$0xRTTV0<8V zz;eIr%I_>{4Y~}B3JfeD)$bUyte)HVZC~>I{Q8yMd;YCOF{dHoJHy)fpM#gq+Z-Lg zpEH5mfdOa`P^*K+?`!o9i4v3M+27G$cs(D<8mPfcV5J|X&-!28P#QaVp8nr|4VPY< zGv+WtOlV->Si1gi?f-ki7BiuSg4~n%j?sV-=3*41@Nqu<-`|ir=Xd`6=XLf6uYJ$g z+`I42ePl;Hkb5xw`I}46AKc0M|91w%HU<`GP_=wwY|jozI`jVCJO&`}boFyt=akR{ E0K2J}$N&HU literal 0 HcmV?d00001 diff --git a/res/binding-icons/RD-org.xfce.session.png b/res/binding-icons/RD-org.xfce.session.png new file mode 100644 index 0000000000000000000000000000000000000000..1b5febd8a283d002e84afce8e4242c9689a01db2 GIT binary patch literal 519 zcmeAS@N?(olHy`uVBq!ia0vp^5kTC)!3HGzf2=EGU|>Aw>EaktaqI0}M?L053AP84 zv$(i_8=Xr?eaOU@bWm32fS`(p%o6bef!=qz9m|g1d-VT^|Fi7pmD?|uEc4%2Q)#{M zvf0VcHDzBSt?CSFvy9{ahbcEOawi;UU@bWG<(}f=dC{}?Rd3>CwZZ?{@j|Z&PA1NI1YGu|aOmy60u(-JgEyA6p63 zzD`jI1h{EeJG-0cf+?M)v%<^Tqn> zZER*GXge_gRWvZ3p8x&9hw}5+_AY0;9{*d0UpU8=0VK}-V2-WD@Atpc{GX&Zt>pkZ z#vp-l&Sv)O`y5N`ODcCfwzT%$2SIbvectW;<`8KAui$v&WTlPUa_?)# z@7Fo)d2#W=`hA&>*H{!7SQ;1v7?>2yFIJzq@;l*B(s@oFhJL811A_(ohV%0M>x!9# z4=6J*LRDAJWxnxzHUkG-;O2~_b8rv7EVGi~>SU%v{?7=h+GKveBh{blEH z-OfJjx~1c*;fO{F?Lm T8Eqoz3_#%N>gTe~DWM4fNUwy< literal 0 HcmV?d00001 diff --git a/res/binding-icons/RD-playonlinux.png b/res/binding-icons/RD-playonlinux.png new file mode 100644 index 0000000000000000000000000000000000000000..e7b383abd53a3058fe37c236ad64d2b891b9a188 GIT binary patch literal 519 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrU_9sP;uunK>+PM5zRZpS4uSGY zOBk5i`BpUZX*4i6scd)TY*7($VDt!aN}KMm&xK==bmVHw`|tKmmr6VkUp?#KzD(mC zMccJ!-mkCvKkM3`-|;yTvlv(!7z7xY92k1kYTfSciwQk@^Z4@jtL7V4pYyM8ob;W; zk6}7o%?)N9%jeg-zOk%*&$#J33$hf?)1tSg6re^7r>eXg7drqzMr2J@N|b^ji2TEF}J!;;tk z;Q9p^>XVbcu=7rv{rkG6y6y1c&B9RIfZhYTVxpy8^!sWi^#*SS zCa6o=gzm{N_-?ts{2f1%sNYTI8H=AkfAMLjwjTovG;}x`;=VB)-+uh2<&EF0=d^DH zTQGt{4eX*v-;veWJ`UpaM8`O3MU$i}t(VMu!IslJ?z R&5;2JJYD@<);T3K0RSaXwG#jU literal 0 HcmV?d00001 diff --git a/res/binding-icons/RD-preferences-desktop-accessibility.png b/res/binding-icons/RD-preferences-desktop-accessibility.png new file mode 100644 index 0000000000000000000000000000000000000000..577cd8034ec70b14c5701f1ad65b9e0548566332 GIT binary patch literal 570 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrU}E%iaSW-r_4e*wufqWn4G)*> zzYr?$-to>IuF`c;YntQcOkd!xyUSWRpM3E~(w=d}a{ge_5-7oLESC}wzFfb}Gurx5Nm}T*v^Vi?mWw&1I zzkNFU^q=a@&$3^At=(l&YtAUZz~sOHR{1YWR^iLUOHj5;LZ1+mFMHXSRFjJ$oRa4iW!pju-6PTe}7(lB$O+n+~6LvjNQ?_4?|bx ze>uHR{{RcrGL{C04SWrp4Gb{*KlC2kRex~T_xIE9?wapzz*xfqwU=o@P*c6!f)}N2 z7ryh(V6bC?>43>2OoYh@Y;gky#eVaGnJ)c``w#9p|F-?#f8I$;o>emoGB82a@4LpR zw)k-7EyleMr>+*+u>17ibYTWYn4t+<`6iSeSo8CiUv+Kr#hJT%j#l2hlQk0(QY;{6 z+lxH6J^1ZpQgoef{;~e{5C19J|R2z-JS>cs*x3mO$@J3 k&^)TY6XXS`qyJYhC`EBS6cM;|j{yigUHx3vIVCg!0LZLEs{jB1 literal 0 HcmV?d00001 diff --git a/res/binding-icons/RD-preferences-desktop-emoticons.png b/res/binding-icons/RD-preferences-desktop-emoticons.png new file mode 100644 index 0000000000000000000000000000000000000000..279d8c1a10541abdec6e8b4cce8a034e8888640d GIT binary patch literal 445 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrU~KVpaSW-r_4e-V-a`fg4uR53 zXPGd*4G?_mAiPD`OTzWo$JcY-Pc_qyzxk=b%(C>|k7dfdI`1{V|Ebx2DBiu7Tr^dG!ApO56Cgte9qU+R9|``@4Ny1MMk@96Gp*ZCfBzzjPORP=>;@p;Cm z?7x-!EgAY4SfC!9Gn2W;PJKolD&E8eQAB}D}Vn>BWP7Y?}W6HLBM3|GS%!*M7!NSt`l^SMI>T!NACIKozJH$ZWW1{O&!| z8ju*wJg@>N=eyshpA2*Tj)zJmZH+q11-1_?f8nd0!@5|Ut=j-RsAMTlHVRwDCy#C>z z%hl)q{>43O=G;w82xst|wR3p&`%l`lzYNKpzZrvm{k6Q0WY7nB)&KDg&zX75&$A=k zykqh6@63Dd#q&IuH?M2^oRw)cNBnsGp`X8|x6a$Q|JgHFi~Q}kAO87xFw5fq*Ea@p zuD>qT28RSV01g~@!@MNKI{YK|zO(6b|6e>=lK-6%Idr};?h1Qj)AOBkTH9}?=XLkz zTh(1ca?=Id^XxmG+sGqA^FiN}zd-*^j9`QWI6?;MX0~&>J=24YRGv;OW&i?DS3j3^ HP6rH?%%@@4!7H gV;=?FVdQ&MBb@08vy@TmS$7 literal 0 HcmV?d00001 diff --git a/res/binding-icons/RD-preferences-system-search.png b/res/binding-icons/RD-preferences-system-search.png new file mode 100644 index 0000000000000000000000000000000000000000..e7c60acbf3f30430552da059ee3bd873457755eb GIT binary patch literal 475 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrU|i(s;uunK>+RixYnvQI90Co? z9$b@KaZG7Nhti6)s)B6ZU8&y{l+W=LpZoPcYz$OCc-{V#t1 zyLJ92ig66lTkG~Wa6S+M+Y5FQ%n?9NLvWG3!?J7hl{1hW2R3QW?uxnwPK2g_?!)!w z20_2dSr@3`j%v8S64jjxwC4#|Yzmvv4F FO#n9ZqWJ&- literal 0 HcmV?d00001 diff --git a/res/binding-icons/RD-preferences-system-windows-actions.png b/res/binding-icons/RD-preferences-system-windows-actions.png new file mode 100644 index 0000000000000000000000000000000000000000..f4dd7342b3908e3a5e5f66203866491410d130b0 GIT binary patch literal 437 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrV65?UaSW-r_4e*w!6pNShQP-g znUj~Kuv{x(s#f1n&UC$ikzI~K845GLNBw!a&)ZM$h(L19{ERR!%_}v3HwWJ_ zXXIdDRA69fV0dvhpz6R=v-E!Z_v@GKe_-N!^YQ6TA+`UMm%jO!-QxyQBEZ1pz`)V4 zmgP0$tu$MPWpJ@S0fn{)cC9-XoWfl+~B)=s{HFZXx4hga`y6FeXSGlAhc zp8vr+PM5zK0z|8WNi} zF>TtukPO!&@6-^0S5Eu5_=EYoS&EE78*JeNzwmp{2R9QZ(o1( zwZA_9!r$L(<*RD1m#QIYu5Hj>`*`u|Kbf<{)^E?ig3 zU;kOLYn}OD?h-vDS$?y6y@dC#|7<;PitM!NTkJP}S=oQziELDY|8Ius|MhhxvhV*g z{1AruvtiOV#%=q~#n1lE471dMVagW%4c|-mAO%K({Dbf>pI;d=qIsMN8Vc*)u?w%T VxA%HC^(q4pc)I$ztaD0e0st78pr8N% literal 0 HcmV?d00001 diff --git a/res/binding-icons/RD-process-stop.png b/res/binding-icons/RD-process-stop.png new file mode 100644 index 0000000000000000000000000000000000000000..d827b1341fd3081188848f795f82704834533c69 GIT binary patch literal 402 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrV2t#1aSW-r_4dv~&O-(Q4HsQv z7WiF>wF)mk>0;H?C!lid%cSph-kP5ZRl^OJcUQmtZOyuE>ZJ8G_1lkJVo_jVXV2EbHaA+BR}N5Cm&> zV1OwHngrxDXr{jZ?aROdlWa)66RrQj#{d2!hyKR~j1WZ(j4->=wWISJe*T>AAdFC- zu+Y}wE%P^)jk!xxkc7e7U=E4!%iG&=d#Wzp$Pz5)pDHx literal 0 HcmV?d00001 diff --git a/res/binding-icons/RD-pvz.png b/res/binding-icons/RD-pvz.png new file mode 100644 index 0000000000000000000000000000000000000000..2c64757dc196debc836f046509a5f7443365c5c2 GIT binary patch literal 568 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrVEpgt;uunK>+Ri*eylK+`(aa< z#U#MMYHzSt z6!6(@+4@=EllPmTmu47ThNB_<9kWYu&UJH%vj=Z}=jK@u#RxNAf#KUN_7i$4vp!eH z>(6Ji|L5`LX9VLMxb+G02`U$5et-RG_vQELeesFgm=xgV-s#;K{QUVx_eJebQqTX4 z-n*}M$vfd4@(heHB@fQ2?ppnCmd)}cR+Rixg@+Xc90DI& zt?+JLArQLK?#XKZV^S^RN2;$sQAq!H;Eh%1;QK$|MhUy0Eo5DxV{q$pCfr&Mow{>_ay~y7Gz;o6sCoR?08JJ)` za?r1CxcFbb{{8y%atz^c@pW$)7ky{Bau&rD>+cMz-&i&l?-OQVggN}d{OX3N#qR~9 e&VNL=d#Wzp$Pz1fS-H- literal 0 HcmV?d00001 diff --git a/res/binding-icons/RD-security-low.png b/res/binding-icons/RD-security-low.png new file mode 100644 index 0000000000000000000000000000000000000000..fd686adb2062fe63ec3e12b043148a3cfeebe3cd GIT binary patch literal 909 zcmeAS@N?(olHy`uVBq!ia0vp^1wh=u!3HER7rg}vFg9m8I|q0=J1Z0v<)>xlq%tsQ zOst(~>v7mY=4kxoE+tWR;}sSuEBwSM}a>Kg(XEnB@>1IPZx?dm_X!7-rYSf#b!mBN9Cn-%)+{2ed8@zt1Aleh%owem zUI|Yk99XSH&h!6c-@kk7=ite8K^A-^dw0A$u5n>6w@KEz-?eXc^$IKe;E9pctzXJ_ zre;!HcIHIo1@+Q9cI0Kgk}KHB%wspRYiUK$gk=-XGrv#&;v1RpK4uk z@Q5r1M&NZ2W^~e+T>%tiFY)wsWq-!PBqAsHZJx$gU_^F%x;TbZ+;d{E4Bi@?UK@1!E6<;?eEnxZ&8DT=MxK#Pcm3MW8*P03IaX=^|GdO3Ca#VK z4h;pSPt{j>jeq;ij?GQCYFrn<;^M$4D8QI`w{da#y{8{v{rdC!r^GMjQ~!R=bqLpB zQd-c!(a~UXE4{vPtL(Mio2$y_33oIwDJg(te3rTVzxVu&wa%}BTxQgT6|x>=U%1X0&Nkf rgSTyCc7K25jrDnmouKeIacWgTe~DWM4fJa~X* literal 0 HcmV?d00001 diff --git a/res/binding-icons/RD-steam.png b/res/binding-icons/RD-steam.png new file mode 100644 index 0000000000000000000000000000000000000000..c0dc9b16ae5ad5fc5fbee685c710999cc405c7f5 GIT binary patch literal 515 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrU_9mN;uunK>+Ky!ze5fp4G;NV zi1s{K8MDP&|M;ff>slXqv`RHsYkJN+$MbieZp(t7#*@D@wJa-W-!^|%*W7l!DS!Tz z@y=FbU{qjWXIwzjtKyzW=IgPaez92httQnn42`{lg9v-mNDGcZ9#-!Pu} z`Ty8H-(SCu=bhN4Ucj`2NdPLjVJ%35uhnw>yUI)M30pA6FhUJt*uZY^e7*Vc=cuAE zjbLX~cwDWQTkz%m``>X4>lj!-?qYIan6ia^#V`?r5{mZ;GcZEE!t|i7y5aiw;1Yg=y1FCr3Qztr@2l6lczpi+OJ;Gu=DcTtdyZj; z+~eT?b`CH1Z~y-S)rcy7gYPYuzO(F~{^R!T_lK4}|MU3*t2)Rz5dR!lTitM{nrYhE zpMDH1Ft;>RzhiuML-@(u&vRkn2lPVrJI1^ZLe(EGe2brY{$sweza+A(_D^QXnzYHC S4!hVHfWXt$&t;ucLK6V?rnpxC literal 0 HcmV?d00001 diff --git a/res/binding-icons/RD-supertuxkart.png b/res/binding-icons/RD-supertuxkart.png new file mode 100644 index 0000000000000000000000000000000000000000..417e433dd14a48635b239a4ebfa9e43eba86242c GIT binary patch literal 613 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrVAAn)aSW-r_4clzm$9Qn!^6nV z1))jFFQYojy45}OZ@kgWv2|Ma!1IyhB~GqQ>IJzhvsttcDs2nfd}7DDS2q6IZ3dP9 zC7=B^mtX>#IiWl0g?YfVr)6ijuWZZxIG_2($9#o+CIJQ}2L=uX#st0zH*M{&#?KeN z!6?HB6i{GbX<#^UO65Ci#w@j8pI5DV15ySS6<~PA&?4aUqr$$&?)`?{-=l6Y!i-U1 zIKy~s;rsvZ<$upP!1sUyY&J-fL_{+RoUw=PmXZQU6;b+ai_4W-% zlLXu5pt{@Z`DcdG*yI1--9PNSKHuQGWuq(uBh>Ls56qu4tdzU{`o;PCRr7?upbf%kCpZvabAyN)|#Gw@7eC%yYuI*=)Qe&Uw_?1iH!&MxifBWJMoiQqU!G(hCT)s ds2ftA3h(#JTR-h$+hYbG@O1TaS?83{1OOeg_6-04 literal 0 HcmV?d00001 diff --git a/res/binding-icons/RD-system-reboot.png b/res/binding-icons/RD-system-reboot.png new file mode 100644 index 0000000000000000000000000000000000000000..f3d4b35fe298416bfbc597c1639906f7069e1207 GIT binary patch literal 504 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrVBGKN;uunK>+PM5eolrW4G*Iq zOFz)FS?ag$RIpRb)Qd+MW9MZ0ynndm%kMDWm=p8OYzs8KpY!?8o}Zeq`|rvxHMQm3 z!NLs;0t`$J3>*zNTjmG4+aFKwo~Inan8V1yz^K5$(!gNAUT{v{{q>v!TnXGjWe`!z z1G;lRZ_l5<@_cGBOl&w&uHFVFw3oqs%i{^Z5+ z@!wu=XS%@zv6_J~f$zd)%ZhK7jg|~dFiQ?}t@_TIGXHb*`t{!}8$}@&gB<&y>yEfU z&EK0@@8^pi5QDpa<&U`sjun4-@!b{K`7^x!d}oZa*9s4qC0GCDKD$MIee9p#zfUhl zGB9DQrNdkKs{Q#2w_fbm-*9_=7n0-y|6jF?d+Xodzopr0Ihwo!T+Rixy@w1094<;M zwOYZ@)ez+&7{HjxuXjh+#NzRZ_j3iM7wNmp9a`oy*E&A_edh6br&oTdscG+A$mzhq z!N91%z;YmC*89Nk`})sctLjT&Er5$RSRR=6`_J*e62E>=zdfspX>-55mHGyz9V|dS z4GaPdOb28ZEU&E#d2Q+VzPRVsoC91BguvoJgBuo}x%vCSwXEaQYwa6F!PbDK5}Z|k zfB#)4z9EVcXaLLwFkJ|BM9DNT%wb{#J4V8P<=zEfKeKH5f4}bidE1`4f6t4w!WdX! z1~;s){30B1+dcg}XOw;T1r&!)c_HocUi`#9c?GTCKeF$Ck4AFYKTGxuTXl)plKJ_p r2q)br;uF~V-O}lG?H(krJz$q#6W~?e=(s150SG)@{an^LB{Ts5?n03= literal 0 HcmV?d00001 diff --git a/res/binding-icons/RD-tesseract.png b/res/binding-icons/RD-tesseract.png new file mode 100644 index 0000000000000000000000000000000000000000..72ccbb57a6d85bea7ae6c4dac95b5b56ab1c51a1 GIT binary patch literal 711 zcmeAS@N?(olHy`uVBq!ia0vp^4M1GM!3HF){{Py~z`)e!>EaktaqI2f)%jNgWDb1% z_KZz}O-&&}g`3-hN%*m5fVamq2M6B|9yjC5$&R){pQm>LK0uy6})oG2;7Wav19 z!R>)q^Nv?@4(g|F`CF5-y>$Ec*_XfExqNREM^(Y=tk4hFr-j+6ZMUC0U;p);`t#8j za+w4em>d{57#J^@{@qpnA?JK!nEZj0{HIU8&A-21k`X4Wz#wJJU+}){*XMs(7v4Q( zNWUI7`Sx_9>px$spKtkQA1iW_SteFLfu(>8Y?uNAOG9OY{l}X35ih=%_xS(2@19Y3 zm7{?HX5NLFl?`zp9{+n$`tQw=inZ(ssqdnSs^9(l+k128lW%Wl{;iL$6aDpn`SN8> zuUUH-{1|~Q1R2Wk;+l=aJInge(D%Fkzdp_KmAMZ>+vwr_8_vbH79S zGe)-CZkOx}-Z^EkNB@;Mpl_~MIlUJYR$!M1Fzna=Tz!B4wqLC8_WZWk`8POiUc#4$ zbDw;BQOjJq{`dDe4s+n4YoJp7`TtAh_DkpacT`w@;qU43&3VaqVy(CY?>+Mgv(-Ul;8I{{6Z5f>|I=f5J@l8x`NJYX4N#B0Dkp8RMcwuOAsQK^+8id`{F4 zZ^q*9yeZr^_LpBUN7zzm3{btz}pA_piCFtJiBSq)z?eBlDt^M@9TGz*y zfyse^gMm?jA+7kA{Tf+?_+LNol{2X~XoJL98W;o^${4H<)LJ{dw{8?ZAPN#-0_m`B zkbO{Z?eKc;0nP_pP$O6xWDoFNIL{YQtzN*ig9)mVF@b#pvrRhtj$OhQj4_O0%YX)N zV7|e4OwefqGt?TOsWrK4>l-B=U#V}HGD(<$5g`H712pkL-aS^HbGsQ323dU2TVVJe zZX22|tq*z$1@~AHZamOf&e&Ti4)+MEH32}`=FfTz;S5YrPx0B!o$LHJWN$+y0}yz+ L`njxgN@xNAgw$~p literal 0 HcmV?d00001 diff --git a/res/binding-icons/RD-tools-check-spelling.png b/res/binding-icons/RD-tools-check-spelling.png new file mode 100644 index 0000000000000000000000000000000000000000..4d71789103f145aad84ac85cd9d15c713d95dcaf GIT binary patch literal 308 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!3HERU8}DLQolW2978H@y}h%M_mF{r!$k>0 zA!h^j=2X761ohycsEbca`0CcH@Ay$v;9Z_WibvCX5^m zj0y}a4Ga-yZLOB4oj-W-b@=(0SD&ktfdmB@m>d{58kC9&2s~Z=T-G@yGywo7=y6K` literal 0 HcmV?d00001 diff --git a/res/binding-icons/RD-urbanterror.png b/res/binding-icons/RD-urbanterror.png new file mode 100644 index 0000000000000000000000000000000000000000..4efb05aab7deb2fa8b587d03a6dfe3fc027f00d5 GIT binary patch literal 462 zcmeAS@N?(olHy`uVBq!ia0vp^4M3d0!3HF+R#ka2FfdN_ba4!+xb^nVM&H8@A`OYs z8##RvFQy8H%PGo+?&@)P>UwG6Y^F3$-Kq00bX(s3UYpBQv?f0NZui`M-E-D`@2kpt zUU#*xM3Jg)7_k8CM(92)BU;du`T8J1+1A_p=GX{3U^PeBRerlw* zFRt1zz$85k89fLcLT|JS_L z?tcFL`@cII))bt3xDz7I1T>+6_blVG>FX2xE-ZbvsFz{1vNH7nlxL^T%=j z*Zb@p-yX`}Umxn9@a@N<=Ukh9*Jv|<^fNF5EjjSs(&0zn<*)BduFe)N*}mBlN$T)3 zhRY^vcb#AVxAyP5naofp0kzr`@CocY{1@oD9V{@>2O4z@3?WI+E-`QW%>V?Ru6{1- HoD!M!Ai3whWD)~I?%ShZNSM`yfYDc{)9J3&vgX~Lg!KWR>hb^1><#aMxcfWU;=SH3nC zZC-c$58G?!SzBfIPrIsK#2`Gs@dk?m14{#g00YwjIfc!(4kgo%8_#6mU|@s_+h5+N zZgF2byzoSI!xSH=QU|C41%~NR=A)N?Y!8$f=G)fYejnp14A;)2FxmFN4cYkj*B&pw zdWi+5v4LR&JIALv^0od6OgmVST(JE4AH9p;S=1V$8JM7o-!K+coqMnS-L{eQff(4O z2vdO0267s7e$IFJFWdq01z0YD-(c4B9}DN-N3k%&<-grMBoPK6_|dG-rKQ(sb5!pv Oi0kR<=d#Wzp$P!AA$E5F literal 0 HcmV?d00001 diff --git a/res/binding-icons/RD-utilities-terminal.png b/res/binding-icons/RD-utilities-terminal.png new file mode 100644 index 0000000000000000000000000000000000000000..c19c8d166d10503db80cae511aeb3dc432353438 GIT binary patch literal 436 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrV666ZaSW-r_4bZqUz3A?L*T6n zc?&5{@rM~-8awi0BUN0vPgLIyG`=|BC|1a8`jzj0S3fq`dTmnWzr)cL`Ah-~Ob!ej z42%Wl4<#>I{=c=zwvqFJHUpyq14{#g0K@lN%ofjQgA_mon82#Bai)Jgv+uwrot4k| z4?hStV1ya0z@WE@{Y2L{j&Ce#3~=2C@@CyvH>lq0aAe*A7KD)&=j9ZV{1ccE=Knb_ zmoRJD`uh0mreA-3w)rjM%fJG17|5iC+)LltC5~@=X+OjE`SyMH7HqwC-FODWKDeh6 z_%|$n@x5+8iVy6IfBa=cb|2h421W&jvhYRhJK`SP%36CA$z3;gv3J}Mp7VQ7K9bXF ZDwuU{n1e*XswA zoa=vPa&gWft^{re1`Y;BkTS~y9*ZoU-WNB$vAoX(H4`WmkjZ!9_nZY^(FF^>%t`q2 zTs?v@hY@N3g8};rm1=v3Zd{5 z7#Iy^KPs=g|Lz>;8is8QEDa1WaRoSsC$sxs(~IA?HlMEB-zs`Q44WE`2E|;zgFD|` z|NLHVKC+r(hPtftrYZAVmtJn{lvdGTWz=xVzTKjbK`FJ;x*$gZV z3<3;H4h$}n*VjFlKc48tzir)WQ3gf@1{SCc2LmI=0S*XHVcyes%x`|*`^uEPcH#N^ zTnHr)^$iR?4h%pI0+)<_ao+oD^XJ{;@Bi!@(alp}V3cSC*{h)Po7LxB9V1W+Rtpt* z_s2WD|IU1-?r#{wb_R$ez&0S1`(*z3%T#6WFaNjpe;9Tp91Zqw#0@Nevm$gsY*b)S x2K&BcO0d`Mo8n%Y`N>u5uH8ywMcDDGZf@UjA0t>2< z=!P^zF!c>abRA@Sp{yh6){xqBxR*GXR9leKoXFasmZ!w+6Ff4r?KdDf$HEdvmE My85}Sb4q9e08*A}b^rhX literal 0 HcmV?d00001 diff --git a/res/binding-icons/RD-zoom-original.png b/res/binding-icons/RD-zoom-original.png new file mode 100644 index 0000000000000000000000000000000000000000..1be8ca80f8b01cbd76f62681425152195b8b8db6 GIT binary patch literal 417 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrV9fAzaSW-r_4e*T-X;T)hKJWI z9K;jbwsS4s=oMZtDX&4?blwApo+)+rLzA}r{OlurWlovPky$Uo)|%$q)@^o47H(h= zU|@1!;Apt`WN&R<_F1jcHB*w96c|{b5_|5h|Hn2x_2-FL0l_w{^fi22NK_z5k9S%&%9*HvbEewj}mA8 i3eBGD!@vR$oaySVF&ZAZ2i;aN0D-5gpUXO@geCy|*>|Y` literal 0 HcmV?d00001 diff --git a/res/binding-icons/RD-zoom-out.png b/res/binding-icons/RD-zoom-out.png new file mode 100644 index 0000000000000000000000000000000000000000..fe98a7fda18911e4afc6143c270d7e26b3b8be8d GIT binary patch literal 371 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrV6^gdaSW-r_4c|U?_mRhw!qz5 z48ojki<2^zC2_eXvAw)>Q_?Er`kw7-r#`&C?78x(lgpgeEzjnZe*crWs9LyzL4bkD zfq|o8_sa19KeKhURj)-AGeX1|7!?>;fC?HId>{-4CZI|NMuMD5oBe+eNF466zfxU} zW)`Lq=tegD4_AJ4XYYn