mirror of
https://github.com/scummvm/scummvm.git
synced 2026-06-20 05:45:29 +00:00
Warning: These scripts are for reference only and not meant for production use on a modern Raspberry Pi system. It will very likely brick your system.
292 lines
10 KiB
Bash
292 lines
10 KiB
Bash
#!/bin/bash
|
|
#
|
|
# SOURCE: https://github.com/aferrero2707/gimp-appimage/blob/master/appimage-helper-scripts/app.wrapper
|
|
#
|
|
# The purpose of this script is to provide lightweight desktop integration
|
|
# into the host system without special help from the host system.
|
|
# If you want to use it, then place this in usr/bin/$APPNAME.wrapper
|
|
# and set it as the Exec= line of the .desktop file in the AppImage.
|
|
#
|
|
# For example, to install the appropriate icons for Scribus,
|
|
# put them into the AppDir at the following locations:
|
|
#
|
|
# ./usr/share/icons/default/128x128/apps/scribus.png
|
|
# ./usr/share/icons/default/128x128/mimetypes/application-vnd.scribus.png
|
|
#
|
|
# Note that the filename application-vnd.scribus.png is derived from
|
|
# and must be match MimeType=application/vnd.scribus; in scribus.desktop
|
|
# (with "/" characters replaced by "-").
|
|
#
|
|
# Then, change Exec=scribus to Exec=scribus.wrapper and place the script
|
|
# below in usr/bin/scribus.wrapper and make it executable.
|
|
# When you run AppRun, then AppRun runs the wrapper script below
|
|
# which in turn will run the main application.
|
|
#
|
|
# TODO:
|
|
# Handle multiple versions of the same AppImage?
|
|
# Handle removed AppImages? Currently we are just setting TryExec=
|
|
# See http://specifications.freedesktop.org/thumbnail-spec/thumbnail-spec-latest.html#DELETE
|
|
# Possibly move this to the C runtime that is part of every AppImage?
|
|
|
|
# Exit on errors
|
|
set -e
|
|
|
|
# Be verbose if $DEBUG=1 is set
|
|
if [ ! -z "$DEBUG" ] ; then
|
|
env
|
|
set -x
|
|
fi
|
|
|
|
THIS="$0"
|
|
args=("$@") # http://stackoverflow.com/questions/3190818/
|
|
NUMBER_OF_ARGS="$#"
|
|
|
|
# Please do not change $VENDORPREFIX as it will allow for desktop files
|
|
# belonging to AppImages to be recognized by future AppImageKit components
|
|
# such as desktop integration daemons
|
|
VENDORPREFIX=appimagekit
|
|
|
|
log () {
|
|
echo "$@" 1>&2
|
|
}
|
|
|
|
find-up () {
|
|
path="$(dirname "$(readlink -f "${THIS}")")"
|
|
while [[ "$path" != "" && ! -e "$path/$1" ]]; do
|
|
path=${path%/*}
|
|
done
|
|
echo -n "$path" # Needs to return something
|
|
}
|
|
|
|
if [ -z $APPDIR ] ; then
|
|
# Find the AppDir. It is the directory that contains AppRun.
|
|
# This assumes that this script resides inside the AppDir or a subdirectory.
|
|
# If this script is run inside an AppImage, then the AppImage runtime
|
|
# likely has already set $APPDIR
|
|
APPDIR=$(find-up "AppRun")
|
|
fi
|
|
export PATH="$PATH:$APPDIR/bin/:$APPDIR/share/:$APPDIR/share/scummvm/:$APPDIR/share/zenity/"
|
|
FILENAME="$(readlink -f "${THIS}")"
|
|
DIRNAME=$(dirname $FILENAME)
|
|
|
|
DESKTOPFILE=$(find "$APPDIR" -maxdepth 1 -name "*.desktop" | head -n 1)
|
|
DESKTOPFILE_NAME=$(basename "${DESKTOPFILE}")
|
|
|
|
APP_FULL=$(sed -n -e 's/^Name=//p' "${DESKTOPFILE}" | head -n 1)
|
|
APP=$(echo "$APP_FULL" | tr -c -d '[:alnum:]')
|
|
if [ -z "$APP" ] || [ -z "$APP_FULL" ] ; then
|
|
APP=$(echo "$DESKTOPFILE_NAME" | sed -e 's/.desktop//g')
|
|
APP_FULL="$APP"
|
|
fi
|
|
|
|
RETURN="yes"
|
|
|
|
BIN=$(echo "$FILENAME" | sed -e 's|.wrapper|.bin|g')
|
|
if [[ ! -f "$BIN" ]] ; then
|
|
log "$BIN not found"
|
|
exit 0
|
|
fi
|
|
|
|
trap atexit EXIT
|
|
|
|
# Note that the following handles 0, 1 or more arguments (file paths)
|
|
# which can include blanks but uses a bashism; can the same be achieved
|
|
# in POSIX-shell? (FIXME)
|
|
# http://stackoverflow.com/questions/3190818
|
|
atexit()
|
|
{
|
|
if [ -z "$SKIP" ] ; then
|
|
# Export library paths and environment
|
|
HERE="$(dirname "$(readlink -f "${0}")")"
|
|
export PATH="${HERE}"/usr/bin/:"${HERE}"/usr/sbin/:"${HERE}"/usr/games/:"${HERE}"/bin/:"${HERE}"/sbin/:"${PATH}"
|
|
export LD_LIBRARY_PATH="${HERE}"/usr/lib/:"${HERE}"/usr/lib/arm-linux-gnueabihf/:"${HERE}"/usr/lib/aarch64-linux-gnu/:"${HERE}"/usr/lib32/:"${HERE}"/usr/lib64/:"${HERE}"/lib/:"${HERE}"/lib/arm-linux-gnueabihf/:"${HERE}"/lib/aarch64-linux-gnu/:"${HERE}"/lib32/:"${HERE}"/lib64/:"${LD_LIBRARY_PATH}"
|
|
export XDG_DATA_DIRS="${HERE}"/usr/share/:"${XDG_DATA_DIRS}"
|
|
export GSETTINGS_SCHEMA_DIR="${HERE}"/usr/share/glib-2.0/schemas/:"${GSETTINGS_SCHEMA_DIR}"
|
|
|
|
if [ $NUMBER_OF_ARGS -eq 0 ] ; then
|
|
# This is pretty ugly - I need to think about a better way
|
|
# regarding extending the PATH variable, so we don't have
|
|
# to enter ./share/scummvm/ first if we want the bundled resources
|
|
# to be available...
|
|
cd $APPDIR/share/scummvm/
|
|
EXEC=$APPDIR/bin/scummvm
|
|
exec "${EXEC}"
|
|
else
|
|
cd $APPDIR/share/scummvm/
|
|
EXEC=$APPDIR/bin/scummvm
|
|
exec "${EXEC}" "${args[@]}"
|
|
fi
|
|
fi
|
|
}
|
|
|
|
error()
|
|
{
|
|
$APPDIR/bin/zenity --error --text "${1}" --no-wrap 2>/dev/null
|
|
exit 1
|
|
}
|
|
|
|
yesno()
|
|
{
|
|
TITLE=$1
|
|
TEXT=$2
|
|
# This is ugly again - see comment above.
|
|
cd $APPDIR/bin/
|
|
./zenity --question --title="$TITLE" --text="$TEXT" --no-wrap && RETURN="yes" || RETURN="no"
|
|
}
|
|
|
|
check_prevent()
|
|
{
|
|
FILE=$1
|
|
if [ -e "$FILE" ] ; then
|
|
echo "File \"$FILE\" is exiting - skipping desktop integration"
|
|
exit 0
|
|
fi
|
|
}
|
|
|
|
check_dep()
|
|
{
|
|
if [ -z "$(command -v $1)" ]; then
|
|
log "$1 is missing. Skipping ${THIS}."
|
|
exit
|
|
fi
|
|
}
|
|
|
|
# Determine where the desktop file should be installed
|
|
if [[ $EUID -ne 0 ]]; then
|
|
DESTINATION_DIR_DESKTOP="$HOME/.local/share/applications"
|
|
STAMP_DIR="$HOME/.local/share/$VENDORPREFIX"
|
|
SYSTEM_WIDE=""
|
|
else
|
|
# TODO: Check $XDG_DATA_DIRS
|
|
DESTINATION_DIR_DESKTOP="/usr/local/share/applications"
|
|
STAMP_DIR="/etc/$VENDORPREFIX"
|
|
SYSTEM_WIDE="--mode system" # for xdg-mime and xdg-icon-resource
|
|
fi
|
|
|
|
# Remove desktop integration for this AppImage
|
|
if [ "x$1" = "x--remove-appimage-desktop-integration" ] ; then
|
|
SKIP="yes"
|
|
rm -f "$STAMP_DIR/${APP}_no_desktopintegration" "$DESTINATION_DIR_DESKTOP/$VENDORPREFIX-$DESKTOPFILE_NAME"
|
|
check_dep xdg-desktop-menu
|
|
xdg-desktop-menu forceupdate
|
|
exit 0
|
|
fi
|
|
|
|
# Exit immediately if one of these files is present
|
|
# (e.g., because the desktop environment wants to handle desktop integration itself)
|
|
check_prevent "$HOME/.local/share/$VENDORPREFIX/no_desktopintegration"
|
|
check_prevent "/usr/share/$VENDORPREFIX/no_desktopintegration"
|
|
check_prevent "/etc/$VENDORPREFIX/no_desktopintegration"
|
|
|
|
# Exit immediately if appimaged is running
|
|
pidof appimaged >/dev/null 2>&1 && exit 0
|
|
|
|
#echo "DESKTOPINTEGRATION: $DESKTOPINTEGRATION"
|
|
# Exit immediately if $DESKTOPINTEGRATION is not empty
|
|
if [ ! -z "$DESKTOPINTEGRATION" ] ; then
|
|
exit 0
|
|
fi
|
|
|
|
# Check whether dependencies are present in base system (we do not bundle these)
|
|
# http://cgit.freedesktop.org/xdg/desktop-file-utils/
|
|
check_dep desktop-file-validate
|
|
check_dep update-desktop-database
|
|
check_dep desktop-file-install
|
|
check_dep xdg-icon-resource
|
|
check_dep xdg-mime
|
|
check_dep xdg-desktop-menu
|
|
|
|
# Exit immediately if one of these files is present (disabled per app)
|
|
check_prevent "$HOME/.local/share/$VENDORPREFIX/${APP}_no_desktopintegration"
|
|
check_prevent "/usr/share/$VENDORPREFIX/${APP}_no_desktopintegration"
|
|
check_prevent "/etc/$VENDORPREFIX/${APP}_no_desktopintegration"
|
|
|
|
if [ ! -f "$DESKTOPFILE" ] ; then
|
|
log "Desktop file is missing. Please run ${THIS} from within an AppImage."
|
|
exit 0
|
|
fi
|
|
|
|
if [ -z "$APPIMAGE" ] ; then
|
|
APPIMAGE="$APPDIR/AppRun"
|
|
# Not running from within an AppImage; hence using the AppRun for Exec=
|
|
fi
|
|
|
|
ICONFILE="$APPDIR/.DirIcon"
|
|
|
|
# $XDG_DATA_DIRS contains the default paths /usr/local/share:/usr/share
|
|
# desktop file has to be installed in an applications subdirectory
|
|
# of one of the $XDG_DATA_DIRS components
|
|
if [ -z "$XDG_DATA_DIRS" ] ; then
|
|
log "\$XDG_DATA_DIRS is missing. Please run ${THIS} from within an AppImage."
|
|
exit 0
|
|
fi
|
|
|
|
# Check if the desktop file is already there
|
|
# and if so, whether it points to the same AppImage
|
|
if [ -e "$DESTINATION_DIR_DESKTOP/$VENDORPREFIX-$DESKTOPFILE_NAME" ] ; then
|
|
# echo "$DESTINATION_DIR_DESKTOP/$VENDORPREFIX-$DESKTOPFILE_NAME already there"
|
|
EXEC=$(grep "^Exec=" "$DESTINATION_DIR_DESKTOP/$VENDORPREFIX-$DESKTOPFILE_NAME" | head -n 1 | cut -d " " -f 1)
|
|
# echo $EXEC
|
|
if [ "Exec=\"$APPIMAGE\"" == "$EXEC" ] ; then
|
|
exit 0
|
|
fi
|
|
fi
|
|
|
|
# We ask the user only if we have found no reason to skip until here
|
|
if [ -z "$SKIP" ] ; then
|
|
yesno "Install" "Would you like to integrate $APP with your system?\n\nThis will add it to your applications menu and install icons.\nIf you don't do this you can still launch the application by double-clicking on the AppImage."
|
|
fi
|
|
|
|
if [ "$RETURN" = "no" ] ; then
|
|
yesno "Disable question?" "Should this question be permanently disabled for $APP?\n"
|
|
if [ "$RETURN" = "yes" ] ; then
|
|
mkdir -p "$STAMP_DIR"
|
|
touch "$STAMP_DIR/${APP}_no_desktopintegration"
|
|
fi
|
|
exit 0
|
|
fi
|
|
|
|
ZENITY_PID=$!
|
|
# If the user has agreed, rewrite and install the desktop file, and the MIME information
|
|
if [ -z "$SKIP" ] ; then
|
|
# desktop-file-install is supposed to install .desktop files to the user's
|
|
# applications directory when run as a non-root user,
|
|
# and to /usr/share/applications if run as root
|
|
# but that does not really work for me...
|
|
#
|
|
# For Exec we must use quotes
|
|
# For TryExec quotes is not supported, so, space must be replaced to \s
|
|
# https://askubuntu.com/questions/175404/how-to-add-space-to-exec-path-in-a-thumbnailer-descrption/175567
|
|
RESOURCE_NAME=$(echo "$VENDORPREFIX-$DESKTOPFILE_NAME" | sed -e 's/\.desktop//g')
|
|
desktop-file-install --rebuild-mime-info-cache \
|
|
--vendor=$VENDORPREFIX --set-key=Exec --set-value="\"${APPIMAGE}\" %U" \
|
|
--set-key=X-AppImage-Comment --set-value="Generated by ${THIS}" \
|
|
--set-key=TryExec --set-value=${APPIMAGE// /\\s} "$DESKTOPFILE" \
|
|
--set-key=Icon --set-value=appimagekit-scummvm \
|
|
--dir "$DESTINATION_DIR_DESKTOP"
|
|
chmod a+x "$DESTINATION_DIR_DESKTOP/"*
|
|
|
|
# delete "Actions" entry and add an "Uninstall" action
|
|
sed -i -e '/^Actions=/d' "$DESTINATION_DIR_DESKTOP/$VENDORPREFIX-$DESKTOPFILE_NAME"
|
|
cat >> "$DESTINATION_DIR_DESKTOP/$VENDORPREFIX-$DESKTOPFILE_NAME" << EOF
|
|
|
|
Actions=Uninstall;
|
|
|
|
[Uninstall]
|
|
Name=Remove desktop integration for $APP_FULL
|
|
Exec="$APPIMAGE" --remove-appimage-desktop-integration
|
|
|
|
EOF
|
|
|
|
# Install the icon files for the application; TODO: scalable
|
|
ICONS=$(find "${APPDIR}/usr/share/icons/" -iwholename "*/apps/${APP}.png" 2>/dev/null || true)
|
|
for ICON in $ICONS ; do
|
|
ICON_SIZE=$(echo "${ICON}" | rev | cut -d "/" -f 3 | rev | cut -d "x" -f 1)
|
|
xdg-icon-resource install --context apps --size ${ICON_SIZE} "${ICON}" "${RESOURCE_NAME}"
|
|
done
|
|
|
|
xdg-desktop-menu forceupdate
|
|
gtk-update-icon-cache # for MIME
|
|
fi
|
|
kill -9 $ZENITY_PID
|