From 8f2dde5892e7cd54f723ad476b2d6768552421c7 Mon Sep 17 00:00:00 2001 From: kawaiipunk Date: Thu, 14 May 2026 16:57:30 +0100 Subject: [PATCH] initial commit --- flatpak-launcher.sh | 140 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 140 insertions(+) create mode 100755 flatpak-launcher.sh diff --git a/flatpak-launcher.sh b/flatpak-launcher.sh new file mode 100755 index 0000000..837bae7 --- /dev/null +++ b/flatpak-launcher.sh @@ -0,0 +1,140 @@ +#!/bin/bash + +# Compact Flatpak TUI launcher + +# Get installed apps: use only application ID, then extract readable name +readarray -t app_ids < <(flatpak list --app --columns=application 2>/dev/null | tail -n +1 | sort) + +# Check if flatpak is available +if ! command -v flatpak &> /dev/null; then + echo "flatpak not found. Please install flatpak." + exit 1 +fi + +# Check for installed apps +if [ ${#app_ids[@]} -eq 0 ]; then + echo "No Flatpak apps installed." + exit 0 +fi + +show_menu() { + local input="" selection=0 max_display=8 + + while true; do + # Clear screen + printf "\033[2J\033[H" + + # Header + echo "+----------------------------------+" + echo "| Flatpak App Launcher |" + echo "+----------------------------------+" + + # Search bar + if [ -z "$input" ]; then + echo "| Search: (type to filter) |" + else + printf "| Search: %-28s |\n" "$input" + fi + + # Filter apps + local filtered=() results_count=0 + for app_id in "${app_ids[@]}"; do + # Extract a readable name from the app ID (e.g. org.gimp.GIMP -> GIMP) + local readable_name="${app_id##*.}" + if [[ "${readable_name,,}" == *"${input,,}"* ]] || [[ "${app_id,,}" == *"${input,,}"* ]]; then + filtered+=("$app_id") + fi + done + + results_count=${#filtered[@]} + + # Results header + if [ $results_count -eq 0 ]; then + echo "+----------------------------------+" + echo "| No matches. Press ESC to clear. |" + else + echo "+----------------------------------+" + printf "| %d app(s) found |\n" "$results_count" + + # Calculate display range + local start=$selection + local end=$((start + max_display)) + [ $end -gt $results_count ] && end=$results_count + + # Show apps (compact list) + for i in "${!filtered[@]}"; do + if [ $i -ge $start ] && [ $i -lt $end ]; then + local app_id="${filtered[i]}" + # Extract readable name from app ID (last segment) + local app_name="${app_id##*.}" + local display_name=$(echo "$app_name" | cut -c1-30) + + if [ $i -eq $selection ]; then + printf "| > %-30s |\n" "$display_name" + else + printf "| %-30s |\n" "$display_name" + fi + fi + done + + # Fill empty space + while [ $((end - start)) -lt $max_display ]; do + echo "| |" + end=$((end + 1)) + done + + # Scroll indicator + if [ $results_count -gt $max_display ]; then + local percent=$((selection * 100 / (results_count - max_display + 1))) + printf "| Scroll: %3d%% (%d-%d of %d) |\n" "$percent" "$((start+1))" "$end" "$results_count" + fi + fi + + # Footer + echo "+----------------------------------+" + echo "| Enter:Launch ESC:Quit |" + echo "+----------------------------------+" + + # Handle input + local key="" + read -rn1 key 2>/dev/null || break + + case "$key" in + "") # Enter - launch + if [ $results_count -gt 0 ] && [ $selection -lt $results_count ]; then + local app_id="${filtered[selection]}" + printf "\033[2J\033[H" + echo "Launching ${app_id##*.}..." + flatpak run "$app_id" & + disown + break + fi + ;; + $'\x7f') # Backspace + input="${input%?}" + selection=0 + ;; + $'\x1b') # Escape sequence + local seq="" + read -rn1 -t 0.1 seq 2>/dev/null || { break; } # ESC pressed + if [ "$seq" = "[" ]; then + read -rn1 -t 0.1 seq 2>/dev/null || continue + case "$seq" in + "A") # Up + [ $selection -gt 0 ] && selection=$((selection-1)) + ;; + "B") # Down + [ $selection -lt $((results_count - 1)) ] && selection=$((selection+1)) + ;; + esac + fi + ;; + *) # Regular input + input+="$key" + selection=0 + ;; + esac + done +} + +show_menu