#!/usr/bin/env bash # SPDX-FileCopyrightText: 2026 branderson # SPDX-License-Identifier: GPL-3.0-or-later # # install.sh - install the Insta360 Link Joystick applet into Plasma. # # Usage: # ./install.sh install, or upgrade if already present # ./install.sh --uninstall remove it # ./install.sh --restart also restart plasmashell (needed to pick up # changes to an already-running applet) # # After installing: right-click the desktop or panel, Add Widgets, and search # for "Insta360". set -euo pipefail readonly APPLET_ID="com.github.insta360linktools.joystick" SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd) readonly SCRIPT_DIR readonly PKG="$SCRIPT_DIR/package" RESTART=0 MODE=install die() { printf 'error: %s\n' "$*" >&2; exit 1; } while [[ $# -gt 0 ]]; do case $1 in --uninstall) MODE=uninstall; shift ;; --restart) RESTART=1; shift ;; -h|--help) awk 'NR>1 { if (!/^#/) exit; sub(/^# ?/, ""); print }' \ "${BASH_SOURCE[0]}" exit 0 ;; *) die "unknown option: $1" ;; esac done if command -v kpackagetool6 >/dev/null 2>&1; then KPT=kpackagetool6 elif command -v kpackagetool5 >/dev/null 2>&1; then KPT=kpackagetool5 else die "neither kpackagetool6 nor kpackagetool5 found; is this a KDE Plasma session?" fi # Qt caches compiled QML and JS on disk. Replacing the applet's files does not # invalidate that cache reliably, and a stale compiled logic.js missing a # newer helper function is enough to break bindings that reference it. Clearing # it costs only a slower first load. clear_qml_cache() { local cleared=0 d for d in "${XDG_CACHE_HOME:-$HOME/.cache}"/plasmashell/qmlcache \ "${XDG_CACHE_HOME:-$HOME/.cache}"/org.kde.plasmashell/qmlcache \ "${XDG_CACHE_HOME:-$HOME/.cache}"/qmlcache; do if [[ -d $d ]]; then rm -rf -- "$d" && echo " cleared $d" && cleared=1 fi done (( cleared )) || echo " no QML cache to clear" } restart_shell() { (( RESTART )) || return 0 echo "Restarting plasmashell:" if systemctl --user restart plasma-plasmashell.service 2>/dev/null; then echo " restarted via systemd" elif command -v kquitapp6 >/dev/null 2>&1; then kquitapp6 plasmashell 2>/dev/null || true sleep 2 (setsid plasmashell >/dev/null 2>&1 &) echo " restarted" else echo " could not restart; log out and back in to pick up changes" fi } case $MODE in install) [[ -f $PKG/metadata.json ]] || die "no package found at $PKG" # Fail early on malformed metadata rather than leaving a half-installed # applet that Plasma silently refuses to load. python3 -c "import json,sys; json.load(open('$PKG/metadata.json'))" \ 2>/dev/null || die "metadata.json is not valid JSON" if "$KPT" --type Plasma/Applet --list 2>/dev/null | grep -qx "$APPLET_ID"; then echo "Already installed; upgrading:" "$KPT" --type Plasma/Applet --upgrade "$PKG" else echo "Installing:" "$KPT" --type Plasma/Applet --install "$PKG" fi echo "Clearing the compiled QML cache:" clear_qml_cache restart_shell echo echo "Done. Right-click a panel or the desktop, Add Widgets, search 'Insta360'." ;; uninstall) echo "Removing:" "$KPT" --type Plasma/Applet --remove "$APPLET_ID" restart_shell echo "Done." ;; esac