Skip to content

Commit 5ec46f6

Browse files
hyperpolymathclaude
andcommitted
Add .desktop file and install script for Linux desktop integration
Registers the application in the Linux application menu with icon, launcher wrapper, and freedesktop.org-compliant .desktop entry. Supports Gossamer and browser launch modes. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 6c880e6 commit 5ec46f6

2 files changed

Lines changed: 172 additions & 0 deletions

File tree

game-server-admin.desktop

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
[Desktop Entry]
2+
Type=Application
3+
Name=Game Server Admin
4+
GenericName=Game Server Administration
5+
Comment=Manage game servers with health monitoring and live configuration
6+
Exec=gsa-launcher %u
7+
Icon=game-server-admin
8+
Categories=Game;Utility;Network;
9+
Terminal=false
10+
StartupWMClass=game-server-admin
11+
Keywords=gameserver;admin;monitoring;dedicated;multiplayer;
12+
MimeType=x-scheme-handler/gsa;
13+
Actions=gossamer;web;
14+
15+
[Desktop Action gossamer]
16+
Name=Launch Desktop App (Gossamer)
17+
Exec=gsa-launcher --gossamer
18+
19+
[Desktop Action web]
20+
Name=Launch in Browser
21+
Exec=gsa-launcher --web

scripts/install-desktop.sh

Lines changed: 151 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,151 @@
1+
#!/usr/bin/env bash
2+
# SPDX-License-Identifier: PMPL-1.0-or-later
3+
#
4+
# install-desktop.sh — Install Stapeln desktop entry, icon, and launcher on Linux.
5+
#
6+
# Usage:
7+
# ./scripts/install-desktop.sh # Install
8+
# ./scripts/install-desktop.sh --remove # Remove
9+
#
10+
# Author: Jonathan D.A. Jewell
11+
12+
set -euo pipefail
13+
14+
APP_NAME="gsa"
15+
APP_DISPLAY="Game Server Admin"
16+
APP_PORT="8080"
17+
APP_DESC="Game Server Administration"
18+
19+
REPO_DIR="$(cd "$(dirname "$0")/.." && pwd)"
20+
DESKTOP_FILE="$REPO_DIR/${APP_NAME}.desktop"
21+
ICON_DIR="$HOME/.local/share/icons/hicolor/256x256/apps"
22+
APPS_DIR="$HOME/.local/share/applications"
23+
BIN_DIR="$HOME/.local/bin"
24+
LAUNCHER="$BIN_DIR/${APP_NAME}-launcher"
25+
CONFIG_DIR="${XDG_CONFIG_HOME:-$HOME/.config}/${APP_NAME}"
26+
CONFIG_FILE="$CONFIG_DIR/install.conf"
27+
28+
# --- Remove mode ---
29+
if [[ "${1:-}" == "--remove" ]]; then
30+
echo "Removing ${APP_DISPLAY} desktop entry..."
31+
rm -f "$APPS_DIR/${APP_NAME}.desktop"
32+
rm -f "$ICON_DIR/${APP_NAME}.png"
33+
rm -f "$LAUNCHER"
34+
rm -f "$CONFIG_FILE"
35+
update-desktop-database "$APPS_DIR" 2>/dev/null || true
36+
echo "Done. ${APP_DISPLAY} desktop entry removed."
37+
exit 0
38+
fi
39+
40+
# --- Install mode ---
41+
echo "Installing ${APP_DISPLAY}..."
42+
43+
mkdir -p "$APPS_DIR" "$ICON_DIR" "$BIN_DIR"
44+
45+
# Copy desktop file
46+
cp "$DESKTOP_FILE" "$APPS_DIR/${APP_NAME}.desktop"
47+
echo " + Desktop entry -> $APPS_DIR/${APP_NAME}.desktop"
48+
49+
# Copy icon if available
50+
if [[ -f "$REPO_DIR/assets/icon-256.png" ]]; then
51+
cp "$REPO_DIR/assets/icon-256.png" "$ICON_DIR/${APP_NAME}.png"
52+
echo " + Icon -> $ICON_DIR/${APP_NAME}.png"
53+
elif [[ -f "$REPO_DIR/raw-assets/main/icon-256.png" ]]; then
54+
cp "$REPO_DIR/raw-assets/main/icon-256.png" "$ICON_DIR/${APP_NAME}.png"
55+
echo " + Icon -> $ICON_DIR/${APP_NAME}.png"
56+
else
57+
echo " ! No icon found (place icon-256.png in assets/)"
58+
fi
59+
60+
# Create launcher wrapper
61+
cat > "$LAUNCHER" << LAUNCHER_EOF
62+
#!/usr/bin/env bash
63+
# SPDX-License-Identifier: PMPL-1.0-or-later
64+
# ${APP_DISPLAY} Launcher
65+
set -euo pipefail
66+
67+
REPO_DIR="$REPO_DIR"
68+
MODE="\${1:---auto}"
69+
70+
start_server() {
71+
if ! curl -s http://localhost:${APP_PORT} >/dev/null 2>&1; then
72+
echo "Starting ${APP_DISPLAY} server..."
73+
cd "\$REPO_DIR"
74+
nohup deno task dev > /tmp/${APP_NAME}-server.log 2>&1 &
75+
echo \$! > /tmp/${APP_NAME}-server.pid
76+
for i in {1..30}; do
77+
curl -s http://localhost:${APP_PORT} >/dev/null 2>&1 && break
78+
sleep 0.5
79+
done
80+
fi
81+
}
82+
83+
open_client() {
84+
xdg-open "http://localhost:${APP_PORT}" 2>/dev/null || \
85+
echo "Open http://localhost:${APP_PORT} in your browser"
86+
}
87+
88+
stop_server() {
89+
if [[ -f /tmp/${APP_NAME}-server.pid ]]; then
90+
kill "\$(cat /tmp/${APP_NAME}-server.pid)" 2>/dev/null || true
91+
rm -f /tmp/${APP_NAME}-server.pid
92+
echo "${APP_DISPLAY} server stopped."
93+
fi
94+
}
95+
96+
case "\$MODE" in
97+
--gossamer)
98+
start_server
99+
if command -v gossamer &>/dev/null; then
100+
exec gossamer --url "http://localhost:${APP_PORT}" --title "${APP_DISPLAY}"
101+
else
102+
open_client
103+
fi
104+
;;
105+
--web)
106+
start_server
107+
open_client
108+
;;
109+
--stop)
110+
stop_server
111+
;;
112+
--auto|*)
113+
start_server
114+
if command -v gossamer &>/dev/null; then
115+
exec gossamer --url "http://localhost:${APP_PORT}" --title "${APP_DISPLAY}"
116+
else
117+
open_client
118+
fi
119+
;;
120+
esac
121+
LAUNCHER_EOF
122+
123+
chmod +x "$LAUNCHER"
124+
echo " + Launcher -> $LAUNCHER"
125+
126+
# Write install config
127+
mkdir -p "$CONFIG_DIR"
128+
cat > "$CONFIG_FILE" << CONF_EOF
129+
# ${APP_DISPLAY} install configuration
130+
# Generated by install-desktop.sh — $(date -Iseconds)
131+
install_dir=$REPO_DIR
132+
install_type=user
133+
os=linux
134+
installed_at=$(date -Iseconds)
135+
CONF_EOF
136+
echo " + Config -> $CONFIG_FILE"
137+
138+
# Update desktop database
139+
update-desktop-database "$APPS_DIR" 2>/dev/null || true
140+
gtk-update-icon-cache "$HOME/.local/share/icons/hicolor/" 2>/dev/null || true
141+
142+
echo ""
143+
echo "Done! ${APP_DISPLAY} is now available in your application menu."
144+
echo ""
145+
echo "Commands:"
146+
echo " ${APP_NAME}-launcher # Start (auto-detect Gossamer/browser)"
147+
echo " ${APP_NAME}-launcher --web # Force browser mode"
148+
echo " ${APP_NAME}-launcher --gossamer # Force Gossamer mode"
149+
echo " ${APP_NAME}-launcher --stop # Stop server"
150+
echo ""
151+
echo "To remove: $0 --remove"

0 commit comments

Comments
 (0)