104 lines
1.9 KiB
Bash
Executable File
104 lines
1.9 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
CACHE_DIR="/tmp/qs_launcher"
|
|
|
|
DRUN_CACHE="$CACHE_DIR/drun.txt"
|
|
RUN_CACHE="$CACHE_DIR/run.txt"
|
|
|
|
mkdir -p "$CACHE_DIR"
|
|
|
|
|
|
get_desktop_files() {
|
|
IFS=':' read -ra DIRS <<< \
|
|
"${XDG_DATA_DIRS:-/usr/local/share:/usr/share}"
|
|
|
|
for dir in "${DIRS[@]}"; do
|
|
APP_DIR="$dir/applications"
|
|
|
|
[ -d "$APP_DIR" ] || continue
|
|
|
|
find "$APP_DIR" \
|
|
-maxdepth 1 \
|
|
-name "*.desktop" \
|
|
2>/dev/null
|
|
done | while read -r f; do
|
|
|
|
name=$(
|
|
grep -m1 '^Name=' "$f" \
|
|
| cut -d= -f2-
|
|
)
|
|
|
|
exec=$(
|
|
grep -m1 '^Exec=' "$f" \
|
|
| cut -d= -f2- \
|
|
| sed 's/%[fFuUik]//g'
|
|
)
|
|
|
|
type=$(
|
|
grep -m1 '^Type=' "$f" \
|
|
| cut -d= -f2-
|
|
)
|
|
|
|
nodisplay=$(
|
|
grep -m1 '^NoDisplay=' "$f" \
|
|
| cut -d= -f2- \
|
|
| tr '[:upper:]' '[:lower:]'
|
|
)
|
|
|
|
icon=$(
|
|
grep -m1 '^Icon=' "$f" \
|
|
| cut -d= -f2-
|
|
)
|
|
|
|
[[ "$type" == "Application" ]] || continue
|
|
[[ "$nodisplay" != "true" ]] || continue
|
|
[[ -n "$name" ]] || continue
|
|
|
|
printf "%s\t%s\t%s\t%s\n" \
|
|
"$name" \
|
|
"$exec" \
|
|
"$(basename "$f" .desktop)" \
|
|
"$icon"
|
|
done
|
|
}
|
|
|
|
|
|
get_binaries() {
|
|
compgen -c \
|
|
| sort -u \
|
|
| head -600 \
|
|
| awk '{
|
|
print $1 "\t" $1 "\t" $1
|
|
}'
|
|
}
|
|
|
|
|
|
sort_and_dedup() {
|
|
sort -f -t$'\t' -k1,1 \
|
|
| awk -F'\t' '!seen[$1]++'
|
|
}
|
|
|
|
|
|
build_drun() {
|
|
get_desktop_files | sort_and_dedup
|
|
}
|
|
|
|
build_run() {
|
|
{ get_desktop_files; get_binaries; } | sort_and_dedup
|
|
}
|
|
|
|
|
|
update_cache() {
|
|
build_drun > "$DRUN_CACHE.tmp"
|
|
build_run > "$RUN_CACHE.tmp"
|
|
|
|
mv "$DRUN_CACHE.tmp" "$DRUN_CACHE"
|
|
mv "$RUN_CACHE.tmp" "$RUN_CACHE"
|
|
}
|
|
|
|
|
|
if [ "$1" == "--update-only" ]; then
|
|
update_cache
|
|
exit 0
|
|
fi
|