summaryrefslogtreecommitdiff
path: root/rom-desktop-entry-generator.sh
blob: d4eea49a9e261ac43490241cb85825c83b2d89f6 (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
149
150
#!/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

	unset launcher
	unset flags
	# 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