aboutsummaryrefslogtreecommitdiffstats
path: root/sway-launcher-desktop.sh
diff options
context:
space:
mode:
authorMoritz Meißelbach <m.meisselbach@inpsyde.com>2019-10-15 09:54:54 +0200
committerMoritz Meißelbach <m.meisselbach@inpsyde.com>2019-10-15 09:54:54 +0200
commit6badc8ab9645783dabcb64e8cd6756e7c77311cd (patch)
tree55b14a5726d8e33b61002c933097f0bfabd2a703 /sway-launcher-desktop.sh
parentecead8260f51d73d8a66214f7a65f41f3d13eacf (diff)
downloadsway-launcher-desktop-6badc8ab9645783dabcb64e8cd6756e7c77311cd.tar.gz
sway-launcher-desktop-6badc8ab9645783dabcb64e8cd6756e7c77311cd.zip
Incorporate changes from @xPMo. Thanks a lot!
Diffstat (limited to 'sway-launcher-desktop.sh')
-rwxr-xr-xsway-launcher-desktop.sh146
1 files changed, 73 insertions, 73 deletions
diff --git a/sway-launcher-desktop.sh b/sway-launcher-desktop.sh
index 118fc8e..3e91540 100755
--- a/sway-launcher-desktop.sh
+++ b/sway-launcher-desktop.sh
@@ -2,103 +2,103 @@
# terminal application launcher for sway, using fzf
# Based on: https://gitlab.com/FlyingWombat/my-scripts/blob/master/sway-launcher
+shopt -s nullglob
+if [[ "$1" = 'describe' ]]; then
+ shift
+ if [[ $2 == 'command' ]]; then
+ title=$1
+ readarray arr < <(whatis -l "$1" 2>/dev/null)
+ description="${arr[0]}"
+ description="${description%*-}"
+ else
+ title=$(sed -ne '/^Name=/{s/^Name=//;p;q}' "$1")
+ description=$(sed -ne '/^Comment=/{s/^Comment=//;p;q}' "$1")
+ fi
+ echo -e "\033[33m $title \033[0m"
+ echo "${description:-No description}"
+ exit
+fi
+
HIST_FILE="${XDG_CACHE_HOME:-$HOME/.cache}/${0##*/}-history.txt"
DIRS=(
-/usr/share/applications
-~/.local/share/applications
-/usr/local/share/applications
+ /usr/share/applications
+ "$HOME/.local/share/applications"
+ /usr/local/share/applications
)
GLYPH_COMMAND=" "
GLYPH_DESKTOP=" "
touch "$HIST_FILE"
-# Filter DIRS array for directories that actually exist. Append *.desktop to remaining elements
-for i in "${!DIRS[@]}" ; do
- if [[ ! -d "${DIRS[i]}" ]]; then
- unset -v 'DIRS[$i]'
- else
- DIRS[$i]="${DIRS[i]}/*.desktop"
- fi
-done
-DIRS=("${DIRS[@]}")
-
-HIST_FILE_CONTENT=$(< "$HIST_FILE")
-
-function createPreview(){
- DESCRIPTION='No description'
- if [[ $2 == 'command' ]]; then
- TITLE=$1
- DESCRIPTION=$(whatis -l "$1" 2>/dev/null | head -n1 | sed -n -e 's/^.*\(.*\).*\-//p')
- else
- TITLE=$(grep ^Name= "$1" | head -n1 | awk -F= '{print $2}')
- DESCRIPTION=$(grep Comment= "$1" | awk -F= '{print $2}')
- fi
- echo -e "\033[33m $TITLE \033[0m"
- echo "$DESCRIPTION"
-}
-export -f createPreview
-
+readarray HIST_LINES < "$HIST_FILE"
FZFPIPE=$(mktemp)
+PIDFILE=$(mktemp)
+trap 'rm "$FZFPIPE" "$PIDFILE"' EXIT INT
# Append Launcher History, removing usage count
-(echo "$HIST_FILE_CONTENT" | sed -n -e 's/^[0-9]* //p' >> "$FZFPIPE" )&
+( printf '%s' "${HIST_LINES[@]#* }" >> "$FZFPIPE" ) &
# Load and append Desktop entries
-# shellcheck disable=2068
-(grep -roP "Type=Application" ${DIRS[@]} |
- awk -F : '{print $1}' |
- sort -u |
- xargs -d "\n" grep -oP "(?<=Name=).*" |
- awk -F : -v pre="$GLYPH_DESKTOP" '{print $1 "|desktop|\033[33m" pre "\033[0m" $2}' >> "$FZFPIPE" )&
+(
+ for dir in "${DIRS[@]}"; do
+ [[ -d "$dir" ]] || continue
+ awk -v pre="$GLYPH_DESKTOP" -F= '
+ BEGINFILE{p=0;}
+ /^Type=Application/{p=1;}
+ /^Name=/{name=$2;}
+ ENDFILE{if (p) print FILENAME "|desktop|\033[33m" pre name "\033[0m";}' \
+ "$dir/"*.desktop < /dev/null >> "$FZFPIPE"
+ # the empty stdin is needed in case no *.desktop files
+ done
+) &
# Load and append command list
-# shellcheck disable=2086
-({ IFS=:; ls -H $PATH; } | grep -v '/.*' | sort -u | awk -v pre="$GLYPH_COMMAND" '{print $1 "|command|\033[31m" pre "\033[0m" $1 }' >> "$FZFPIPE" )&
-
-COMMAND_STR=$( (tail -f "$FZFPIPE" & echo $! > pid) |
- fzf +x +s -d '\|' --nth ..3 --with-nth 3.. --preview 'createPreview {1} {2}' --preview-window=up:3:wrap --ansi ; kill -9 "$(<pid)" |
- tail -n1) || exit 1
-
+(
+ IFS=:
+ read -ra path <<< "$PATH"
+ for dir in "${path[@]}"; do
+ printf '%s\n' "$dir/"* |
+ awk -F / -v pre="$GLYPH_COMMAND" '{print $NF "|command|\033[31m" pre "\033[0m" $NF;}'
+ done | sort -u >> "$FZFPIPE"
+) &
+
+COMMAND_STR=$(
+ (tail -n +0 -f "$FZFPIPE" & echo $! > "$PIDFILE") |
+ fzf +s -x -d '\|' --nth ..3 --with-nth 3.. \
+ --preview "$0 describe {1} {2}" \
+ --preview-window=up:3:wrap --ansi
+ kill -9 "$(<"$PIDFILE")" | tail -n1
+) || exit 1
[ -z "$COMMAND_STR" ] && exit 1
-
-# get full line from history (with count number)
-HIST_LINE=$(echo "$HIST_FILE_CONTENT" | grep -Pe "^[0-9]+ \Q$COMMAND_STR\E$")
-# echo "Hist Line: $HIST_LINE"
-
-
-
-if [ "$HIST_LINE" == "" ]; then
- HIST_COUNT=1
-else
- # Increment usage count
- HIST_COUNT=$(echo "$HIST_LINE" | sed -E 's/^([0-9]+) .+$/\1/')
- ((HIST_COUNT++))
- # delete line, to add updated later
- HIST_FILE_CONTENT=$(echo "$HIST_FILE_CONTENT" | \
- grep --invert-match -Pe "^[0-9]+ \Q$COMMAND_STR\E$")
+# update history
+for i in "${!HIST_LINES[@]}"; do
+ if [[ "${HIST_LINES[i]}" == *" $COMMAND_STR"$'\n' ]]; then
+ HIST_COUNT=${HIST_LINES[i]%% *}
+ HIST_LINES[$i]="$((HIST_COUNT + 1)) $COMMAND_STR"
+ match=1
+ break
+ fi
+done
+if ! (( match )); then
+ HIST_LINES+=("1 $COMMAND_STR"$'\n')
fi
-# update history
-update_line="${HIST_COUNT} ${COMMAND_STR}"
-echo -e "${update_line}\n${HIST_FILE_CONTENT}" | \
- sort --numeric-sort --reverse > "$HIST_FILE"
+printf '%s' "${HIST_LINES[@]}" | sort -nr > "$HIST_FILE"
command='echo "nope"'
-case $(echo "$COMMAND_STR" | awk -F'|' '{print $2}') in
-desktop)
- file=$(echo "$COMMAND_STR" | awk -F '|' '{print $1}')
- command=$(grep Exec "$file" | awk -F'=' '{print $2}')
- ;;
-
-command)
- command=$(echo "$COMMAND_STR" | awk -F '|' '{print $1}')
- ;;
-
+# COMMAND_STR is "<string>|<type>"
+case ${COMMAND_STR#*|} in
+desktop*)
+ # .desktop files use "%f", "%d" as placeholders for "Open with..."
+ command=$(sed -ne 's/%.//; /^Exec/{s/^Exec=//;p;q}' "${COMMAND_STR%%|*}")
+ ;;
+command*)
+ command="${COMMAND_STR%%|*}"
+ ;;
esac
swaymsg -t command exec "$command"