blob: 6ca56e3c741fe7fa585aa501f9a13985bd932ebe (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
|
#!/usr/bin/env sh
# BASEDIR is used to treat this script as a portable application
BASEDIR="$(dirname "$0")"
SCRIPTNAME="$(basename "$0" .sh)"
DESKTOP_ENTRY_OUTPUT_DIR="$BASEDIR/output"
DESKTOP_ENTRY_INSTALL_DIR="$HOME/.local/share/applications"
ICON_INSTALL_DIR="$HOME/.local/share/icons/hicolor"
# Build an individual .desktop entry given a name, rompath, and system
build_desktop_file() {
NAME="$1"
ROMPATH="$2"
SYSTEM="$3"
OUTPUT="$DESKTOP_ENTRY_OUTPUT_DIR/${SCRIPTNAME}_${SYSTEM}_${NAME}.desktop"
echo "Building $NAME"
# Check validity
if [ -z "$NAME" ]; then
echo "Skipping: missing NAME"
return
fi
if [ -z "$ROMPATH" ]; then
echo "Skipping: missing PATH"
return
fi
if [ -z "$SYSTEM" ]; then
echo "Skipping: missing SYSTEM"
return
fi
if [ ! -r "$BASEDIR/config/systems/$SYSTEM" ]; then
echo "Skipping: No configuration exists for SYSTEM"
return
fi
# FIXME this warning can have false positives
if [ ! -e "$ROMPATH" ]; then
echo "Warning: PATH does not exist"
fi
# shellcheck source=/dev/null
. "$BASEDIR/config/systems/$SYSTEM"
mkdir -p "$DESKTOP_ENTRY_OUTPUT_DIR"
echo "[Desktop Entry]" > "$OUTPUT"
echo "Type=Application" >> "$OUTPUT"
echo "Name=$NAME" >> "$OUTPUT"
echo "Icon=${SCRIPTNAME}_${SYSTEM}_${NAME}" >> "$OUTPUT"
echo "Exec=$launcher $flags $ROMPATH" >> "$OUTPUT"
echo "Categories=Game" >> "$OUTPUT"
echo "Installing $NAME"
install_icon "$NAME" "$SYSTEM"
install_desktop_file "$OUTPUT"
}
# empty the output directory
clean() {
rm -rf "$BASEDIR/output"
}
install_desktop_file() {
OUTPUT="$1"
# TODO look into using xdg-desktop-menu for install and uninstall
install "$OUTPUT" "$DESKTOP_ENTRY_INSTALL_DIR"
}
install_icon() {
NAME="$1"
SYSTEM="$2"
ICON_SOURCE="$BASEDIR/icon/$SYSTEM/$NAME"
ICON_EXTENSION=""
# Try a number of file extensions for the icon source
for extension in ".png"; do
if [ -r "${ICON_SOURCE}${extension}" ]; then
ICON_EXTENSION="$extension"
break
fi
done
if [ -z "$ICON_EXTENSION" ]; then
echo "Icon does not exist or is not readable. Skipping icon installation"
return
fi
# Append the extension to the source variable to avoid too much typing
ICON_SOURCE="${ICON_SOURCE}${ICON_EXTENSION}"
for size in "16" "24" "32" "48" "64" "96" "128" "256"; do
convert "$ICON_SOURCE" -resize "${size}x${size}"\! "$ICON_INSTALL_DIR/${size}x${size}/apps/${SCRIPTNAME}_${SYSTEM}_$(basename "$ICON_SOURCE")"
done
}
parse_config() {
CONFIG_PATH="$1"
while read -r line; do
# Skip comments and empty lines
if echo "$line" | grep -q ^#; then
continue
fi
if [ -z "$line" ]; then
continue
fi
eval "build_desktop_file $line"
done < "$CONFIG_PATH"
# Workaround to refresh icons
touch "$ICON_INSTALL_DIR"
}
uninstall() {
#NAME="$1"
#ROMPATH="$2"
#SYSTEM="$3"
find "$BASEDIR/output/" -type f | while read -r file; do
echo "Removing $(basename "$file")"
# Remove icons
ICON="$(grep "^Icon=" "$file" | cut -d "=" -f 2)"
for size in "16" "24" "32" "48" "64" "96" "128" "256"; do
rm -f "$ICON_INSTALL_DIR/${size}x${size}/apps/$ICON"*
done
# Remove the desktop entry
rm -f "$DESKTOP_ENTRY_INSTALL_DIR/$(basename "$file")"
done
}
# TODO allow for building without also installing
MODE="build"
case "$1" in
clean)
MODE="clean"
eval $MODE
;;
uninstall)
MODE="uninstall"
eval $MODE
;;
*)
parse_config "$BASEDIR/config/romlist"
;;
esac
|