RetroPie-Setup/scriptmodules/supplementary/emulationstation.sh
2024-05-08 15:28:33 -04:00

389 lines
14 KiB
Bash

#!/usr/bin/env bash
# This file is part of The RetroPie Project
#
# The RetroPie Project is the legal property of its developers, whose names are
# too numerous to list here. Please refer to the COPYRIGHT.md file distributed with this source.
#
# See the LICENSE.md file at the top-level directory of this distribution and
# at https://raw.githubusercontent.com/RetroPie/RetroPie-Setup/master/LICENSE.md
#
rp_module_id="emulationstation"
rp_module_desc="EmulationStation - Frontend used by RetroPie for launching emulators"
rp_module_licence="MIT https://raw.githubusercontent.com/RetroPie/EmulationStation/master/LICENSE.md"
rp_module_repo="git https://github.com/RetroPie/EmulationStation :_get_branch_emulationstation"
rp_module_section="core"
rp_module_flags="frontend"
function _get_input_cfg_emulationstation() {
echo "$configdir/all/emulationstation/es_input.cfg"
}
function _update_hook_emulationstation() {
# make sure the input configuration scripts and launch script are always up to date
if rp_isInstalled "$md_id"; then
copy_inputscripts_emulationstation
install_launch_emulationstation
fi
}
function _sort_systems_emulationstation() {
local field="$1"
cp "/etc/emulationstation/es_systems.cfg" "/etc/emulationstation/es_systems.cfg.bak"
xmlstarlet sel -D -I \
-t -m "/" -e "systemList" \
-m "//system" -s A:T:U "$1" -c "." \
"/etc/emulationstation/es_systems.cfg.bak" >"/etc/emulationstation/es_systems.cfg"
}
function _add_system_emulationstation() {
local fullname="$1"
local name="$2"
local path="$3"
local extension="$4"
local command="$5"
local platform="$6"
local theme="$7"
local conf="/etc/emulationstation/es_systems.cfg"
mkdir -p "/etc/emulationstation"
if [[ ! -f "$conf" ]]; then
echo "<systemList />" >"$conf"
fi
cp "$conf" "$conf.bak"
if [[ $(xmlstarlet sel -t -v "count(/systemList/system[name='$name'])" "$conf") -eq 0 ]]; then
xmlstarlet ed -L -s "/systemList" -t elem -n "system" -v "" \
-s "/systemList/system[last()]" -t elem -n "name" -v "$name" \
-s "/systemList/system[last()]" -t elem -n "fullname" -v "$fullname" \
-s "/systemList/system[last()]" -t elem -n "path" -v "$path" \
-s "/systemList/system[last()]" -t elem -n "extension" -v "$extension" \
-s "/systemList/system[last()]" -t elem -n "command" -v "$command" \
-s "/systemList/system[last()]" -t elem -n "platform" -v "$platform" \
-s "/systemList/system[last()]" -t elem -n "theme" -v "$theme" \
"$conf"
else
xmlstarlet ed -L \
-u "/systemList/system[name='$name']/fullname" -v "$fullname" \
-u "/systemList/system[name='$name']/path" -v "$path" \
-u "/systemList/system[name='$name']/extension" -v "$extension" \
-u "/systemList/system[name='$name']/command" -v "$command" \
-u "/systemList/system[name='$name']/platform" -v "$platform" \
-u "/systemList/system[name='$name']/theme" -v "$theme" \
"$conf"
fi
# alert the user if they have a custom es_systems.cfg which doesn't contain the system we are adding
local conf_local="$configdir/all/emulationstation/es_systems.cfg"
if [[ -f "$conf_local" ]] && [[ "$(xmlstarlet sel -t -v "count(/systemList/system[name='$name'])" "$conf_local")" -eq 0 ]]; then
md_ret_info+=("You have a custom override of the EmulationStation system config in:\n\n$conf_local\n\nYou will need to copy the updated $system config from $conf to your custom config for $system to show up in EmulationStation.")
fi
_sort_systems_emulationstation "name"
}
function _del_system_emulationstation() {
local fullname="$1"
local name="$2"
if [[ -f /etc/emulationstation/es_systems.cfg ]]; then
xmlstarlet ed -L -P -d "/systemList/system[name='$name']" /etc/emulationstation/es_systems.cfg
fi
}
function _add_rom_emulationstation() {
local system_name="$1"
local system_fullname="$2"
local path="./$3"
local name="$4"
local desc="$5"
local image="$6"
local config_dir="$configdir/all/emulationstation"
mkUserDir "$config_dir"
mkUserDir "$config_dir/gamelists"
mkUserDir "$config_dir/gamelists/$system_name"
local config="$config_dir/gamelists/$system_name/gamelist.xml"
if [[ ! -f "$config" ]]; then
echo "<gameList />" >"$config"
fi
if [[ $(xmlstarlet sel -t -v "count(/gameList/game[path='$path'])" "$config") -eq 0 ]]; then
xmlstarlet ed -L -s "/gameList" -t elem -n "game" -v "" \
-s "/gameList/game[last()]" -t elem -n "path" -v "$path" \
-s "/gameList/game[last()]" -t elem -n "name" -v "$name" \
-s "/gameList/game[last()]" -t elem -n "desc" -v "$desc" \
-s "/gameList/game[last()]" -t elem -n "image" -v "$image" \
"$config"
else
xmlstarlet ed -L \
-u "/gameList/game[name='$name']/path" -v "$path" \
-u "/gameList/game[name='$name']/name" -v "$name" \
-u "/gameList/game[name='$name']/desc" -v "$desc" \
-u "/gameList/game[name='$name']/image" -v "$image" \
"$config"
fi
chown $user:$user "$config"
}
function depends_emulationstation() {
local depends=(
libfreeimage-dev libfreetype6-dev
libcurl4-openssl-dev libasound2-dev cmake libsdl2-dev libsm-dev
libvlc-dev libvlccore-dev vlc
)
[[ "$__os_debian_ver" -gt 8 ]] && depends+=(rapidjson-dev)
isPlatform "x11" && depends+=(gnome-terminal mesa-utils)
if isPlatform "dispmanx" && ! isPlatform "osmc"; then
depends+=(omxplayer)
fi
getDepends "${depends[@]}"
}
function _get_branch_emulationstation() {
if [[ -z "$branch" ]]; then
if [[ "$__os_debian_ver" -gt 8 ]]; then
branch="stable"
else
branch="v2.7.6"
fi
fi
echo "$branch"
}
function sources_emulationstation() {
gitPullOrClone
}
function build_emulationstation() {
local params=(-DFREETYPE_INCLUDE_DIRS=/usr/include/freetype2/)
if isPlatform "rpi"; then
params+=(-DRPI=On)
# use OpenGL on RPI/KMS for now
isPlatform "mesa" && params+=("-DGL=On" "-DUSE_GL21=On")
# force GLESv1 on videocore due to performance issue with GLESv2
isPlatform "videocore" && params+=(-DUSE_GLES1=On)
elif isPlatform "x11"; then
if isPlatform "gles"; then
params+=(-DGLES=On)
local gles_ver=$(sudo -u $user glxinfo -B | grep -oP 'Max GLES[23] profile version:\s\K.*')
compareVersions $gles_ver lt 2.0 && params+=(-DUSE_GLES1=On)
else
params+=(-DGL=On)
# mesa specific check of OpenGL version
local gl_ver=$(sudo -u $user glxinfo -B | grep -oP 'Max compat profile version:\s\K.*')
# generic fallback check of OpenGL version
[[ -z "$gl_ver" ]] && gl_ver=$(sudo -u $user glxinfo -B | grep -oP "OpenGL version string: \K[^ ]+")
compareVersions $gl_ver gt 2.0 && params+=(-DUSE_GL21=On)
fi
elif isPlatform "gles"; then
params+=(-DGLES=On)
elif isPlatform "gl"; then
params+=(-DGL=On)
fi
if isPlatform "dispmanx"; then
params+=(-DOMX=On)
fi
rpSwap on 1000
cmake . "${params[@]}"
make clean
make VERBOSE=1
rpSwap off
md_ret_require="$md_build/emulationstation"
}
function install_emulationstation() {
md_ret_files=(
'CREDITS.md'
'emulationstation'
'emulationstation.sh'
'GAMELISTS.md'
'README.md'
'THEMES.md'
)
# This folder is present only from 2.8.x, don't include it for older releases
if [[ "$__os_debian_ver" -gt 8 ]]; then
md_ret_files+=('resources')
fi
}
function init_input_emulationstation() {
local es_config="$(_get_input_cfg_emulationstation)"
# if there is no ES config (or empty file) create it with initial inputList element
if [[ ! -s "$es_config" ]]; then
echo "<inputList />" >"$es_config"
fi
# add/update our inputconfiguration.sh inputAction
if [[ $(xmlstarlet sel -t -v "count(/inputList/inputAction[@type='onfinish'])" "$es_config") -eq 0 ]]; then
xmlstarlet ed -L -S \
-s "/inputList" -t elem -n "inputActionTMP" -v "" \
-s "//inputActionTMP" -t attr -n "type" -v "onfinish" \
-s "//inputActionTMP" -t elem -n "command" -v "$md_inst/scripts/inputconfiguration.sh" \
-r "//inputActionTMP" -v "inputAction" "$es_config"
else
xmlstarlet ed -L \
-u "/inputList/inputAction[@type='onfinish']/command[1]" -v "$md_inst/scripts/inputconfiguration.sh" \
"$es_config"
fi
chown $user:$user "$es_config"
}
function copy_inputscripts_emulationstation() {
mkdir -p "$md_inst/scripts"
cp -r "$scriptdir/scriptmodules/$md_type/emulationstation/"* "$md_inst/scripts/"
chmod +x "$md_inst/scripts/inputconfiguration.sh"
}
function install_launch_emulationstation() {
cat > /usr/bin/emulationstation << _EOF_
#!/bin/bash
if [[ \$(id -u) -eq 0 ]]; then
echo "emulationstation should not be run as root. If you used 'sudo emulationstation' please run without sudo."
exit 1
fi
# use SDL2 wayland video driver if wayland session is detected, but...
# Emulationstation has focus problems under Ubuntu 22.04's GNOME on Wayland session, so don't use the SDL2's Wayland driver in that combination
if [[ "\$WAYLAND_DISPLAY" == wayland* ]]; then
[[ "\$XDG_CURRENT_DESKTOP" == *GNOME ]] || export SDL_VIDEODRIVER=wayland
fi
# save current tty/vt number for use with X so it can be launched on the correct tty
TTY=\$(tty)
export TTY="\${TTY:8:1}"
clear
tput civis
"$md_inst/emulationstation.sh" "\$@"
if [[ \$? -eq 139 ]]; then
dialog --cr-wrap --no-collapse --msgbox "Emulation Station crashed!\n\nIf this is your first boot of RetroPie - make sure you are using the correct image for your system.\n\\nCheck your rom file/folder permissions and if running on a Raspberry Pi, make sure your gpu_split is set high enough and/or switch back to using carbon theme.\n\nFor more help please use the RetroPie forum." 20 60 >/dev/tty
fi
tput cnorm
_EOF_
chmod +x /usr/bin/emulationstation
if isPlatform "x11"; then
mkdir -p /usr/local/share/{icons,applications}
cp "$scriptdir/scriptmodules/$md_type/emulationstation/retropie.svg" "/usr/local/share/icons/"
cat > /usr/local/share/applications/retropie.desktop << _EOF_
[Desktop Entry]
Type=Application
Exec=gnome-terminal --full-screen --hide-menubar -e emulationstation
Hidden=false
NoDisplay=false
X-GNOME-Autostart-enabled=true
Name[de_DE]=RetroPie
Name=rpie
Comment[de_DE]=RetroPie
Comment=retropie
Icon=/usr/local/share/icons/retropie.svg
Categories=Game
_EOF_
fi
}
function clear_input_emulationstation() {
rm "$(_get_input_cfg_emulationstation)"
init_input_emulationstation
}
function remove_emulationstation() {
rm -f "/usr/bin/emulationstation"
if isPlatform "x11"; then
rm -rfv "/usr/local/share/icons/retropie.svg" "/usr/local/share/applications/retropie.desktop"
fi
}
function configure_emulationstation() {
# move the $home/emulationstation configuration dir and symlink it
moveConfigDir "$home/.emulationstation" "$configdir/all/emulationstation"
[[ "$md_mode" == "remove" ]] && return
# remove other emulation station if it's installed, so we don't end up with
# both packages interfering - but leave configs alone so switching is easy
if [[ "$md_id" == "emulationstation-dev" ]]; then
rmDirExists "$rootdir/$md_type/emulationstation"
else
rmDirExists "$rootdir/$md_type/emulationstation-dev"
fi
init_input_emulationstation
copy_inputscripts_emulationstation
install_launch_emulationstation
mkdir -p "/etc/emulationstation"
# ensure we have a default theme
rp_callModule esthemes install_theme
addAutoConf "es_swap_a_b" 0
addAutoConf "disable" 0
}
function gui_emulationstation() {
local es_swap=0
getAutoConf "es_swap_a_b" && es_swap=1
local disable=0
getAutoConf "disable" && disable=1
local default
local options
while true; do
local options=(
1 "Clear/Reset Emulation Station input configuration"
)
if [[ "$disable" -eq 0 ]]; then
options+=(2 "Auto Configuration (Currently: Enabled)")
else
options+=(2 "Auto Configuration (Currently: Disabled)")
fi
if [[ "$es_swap" -eq 0 ]]; then
options+=(3 "Swap A/B Buttons in ES (Currently: Default)")
else
options+=(3 "Swap A/B Buttons in ES (Currently: Swapped)")
fi
local cmd=(dialog --backtitle "$__backtitle" --default-item "$default" --menu "Choose an option" 22 76 16)
local choice=$("${cmd[@]}" "${options[@]}" 2>&1 >/dev/tty)
[[ -z "$choice" ]] && break
default="$choice"
case "$choice" in
1)
if dialog --defaultno --yesno "Are you sure you want to reset the Emulation Station controller configuration ? This will wipe all controller configs for ES and it will prompt to reconfigure on next start" 22 76 2>&1 >/dev/tty; then
clear_input_emulationstation
printMsgs "dialog" "$(_get_input_cfg_emulationstation) has been reset to default values."
fi
;;
2)
disable="$((disable ^ 1))"
setAutoConf "disable" "$disable"
;;
3)
es_swap="$((es_swap ^ 1))"
setAutoConf "es_swap_a_b" "$es_swap"
local ra_swap="false"
getAutoConf "es_swap_a_b" && ra_swap="true"
iniSet "menu_swap_ok_cancel_buttons" "$ra_swap" "$configdir/all/retroarch.cfg"
printMsgs "dialog" "You will need to reconfigure you controller in Emulation Station for the changes to take effect."
;;
esac
done
}