#!/bin/bash # omarchy:summary=Create a desktop launcher for a RetroArch game # omarchy:args=[core path-to-game] # omarchy:examples=omarchy games retro install snes9x ~/Games/roms/snes/game.sfc | omarchy-games-retro-install /usr/lib/libretro/mgba_libretro.so ~/Games/roms/gba/game.gba set -e if (( $# == 0 )); then mapfile -t cores < <(omarchy-games-retro-cores) if (( ${#cores[@]} == 0 )); then omarchy-notification-send -g "󰯉" "No RetroArch cores found" "/usr/lib/libretro" exit 1 fi core=$(omarchy-menu-select "RetroArch core" "${cores[@]}") || exit 0 [[ -n $core ]] || exit 0 core="${core##*(}" core="${core%)}" game_path=$(omarchy-menu-file "Retro game" "$HOME/Games/roms" "7z bin ccd chd cue dmg elf fds gb gba gbc iso lha m3u md n64 nds nes pbp sfc smc swc zip z64") || exit 0 [[ -n $game_path ]] || exit 0 elif (( $# == 2 )); then core="$1" game_path="$2" else echo "Usage: omarchy-games-retro-install [core path-to-game]" echo "Example: omarchy-games-retro-install snes9x ~/Games/roms/snes/game.sfc" exit 1 fi if [[ ! -f $game_path ]]; then echo "Game not found: $game_path" exit 1 fi if [[ $core == */* ]]; then core_path="$core" else core_path="/usr/lib/libretro/${core}_libretro.so" fi if [[ ! -f $core_path ]]; then echo "Core not found: $core_path" exit 1 fi game_name=$(printf '%s' "${game_path##*/}" | sed 's/\.[^.]*$//; s/[[:space:]]*([^)]*)//g; s/[[:space:]]\+/ /g; s/^ //; s/ $//' | perl -Mopen=locale -pe 's/(^|[[:space:]])([^[:space:]])/$1\U$2/g') desktop_name="$game_name" desktop_id=$(printf '%s' "$desktop_name" | tr '[:upper:]' '[:lower:]' | tr -cs '[:alnum:]' '-' | sed 's/^-//; s/-$//') desktop_dir="$HOME/.local/share/applications" desktop_file="$desktop_dir/$desktop_id.desktop" icon_dir="$desktop_dir/icons" icon_path="$icon_dir/Retro Gaming.png" mkdir -p "$desktop_dir" "$icon_dir" [[ -f $icon_path ]] || cp "$HOME/.local/share/omarchy/applications/icons/Retro Gaming.png" "$icon_path" cat >"$desktop_file" </dev/null || true omarchy-notification-send -g "󰯉" "$game_name installed" "Start it with Super + Space"