Fork the desktop off Omarchy as a self-contained system
This commit is contained in:
Executable
+99
@@ -0,0 +1,99 @@
|
||||
#!/bin/bash
|
||||
|
||||
# blob:summary=Pick one option from a menu
|
||||
# blob:group=menu
|
||||
# blob:name=select
|
||||
# blob:args=prompt [option...] [-- menu args...]
|
||||
# blob:examples=blob menu select Format jpg png|blob-menu-select Resolution 4k 1080p 720p -- --width 400
|
||||
|
||||
# An option may lead with an icon, as "<glyph><TAB><label>", and may trail a
|
||||
# subtext shown under the label, as "<glyph><TAB><label><TAB><subtext>". The
|
||||
# menu shows the glyph but never returns it. A plain option returns the label
|
||||
# alone; an option with a subtext returns "<label><TAB><subtext>", so callers
|
||||
# with same-named rows get the subtext back as the stable key.
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
if (( $# < 1 )); then
|
||||
echo "Usage: blob-menu-select <prompt> [option...] [-- menu args...]" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
prompt="$1"
|
||||
shift
|
||||
|
||||
options=()
|
||||
menu_width=""
|
||||
menu_maxheight=""
|
||||
|
||||
while (( $# > 0 )); do
|
||||
if [[ $1 == "--" ]]; then
|
||||
shift
|
||||
while (( $# > 0 )); do
|
||||
case "$1" in
|
||||
--width)
|
||||
shift
|
||||
if (( $# == 0 )); then
|
||||
echo "blob-menu-select: --width requires a value" >&2
|
||||
exit 1
|
||||
fi
|
||||
menu_width="$1"
|
||||
;;
|
||||
--height|--maxheight)
|
||||
arg="$1"
|
||||
shift
|
||||
if (( $# == 0 )); then
|
||||
echo "blob-menu-select: $arg requires a value" >&2
|
||||
exit 1
|
||||
fi
|
||||
menu_maxheight="$1"
|
||||
;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
break
|
||||
fi
|
||||
|
||||
options+=("$1")
|
||||
shift
|
||||
done
|
||||
|
||||
if (( ${#options[@]} == 0 )) && [[ ! -t 0 ]]; then
|
||||
mapfile -t options
|
||||
fi
|
||||
|
||||
if (( ${#options[@]} == 0 )); then
|
||||
echo "Usage: blob-menu-select <prompt> [option...] [-- menu args...]" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
selection_file=$(mktemp)
|
||||
done_file=$(mktemp)
|
||||
rm -f "$done_file"
|
||||
trap 'rm -f "$selection_file" "$done_file"' EXIT
|
||||
|
||||
options_json=$(perl -MEncode=decode -MJSON::PP=encode_json -e 'print encode_json([map { decode("UTF-8", $_) } @ARGV])' "${options[@]}")
|
||||
payload=$(perl -MEncode=decode -MJSON::PP=encode_json,decode_json -e '
|
||||
my $payload = {
|
||||
mode => "select",
|
||||
prompt => decode("UTF-8", $ARGV[0]),
|
||||
options => decode_json($ARGV[1]),
|
||||
selectionFile => decode("UTF-8", $ARGV[2]),
|
||||
doneFile => decode("UTF-8", $ARGV[3])
|
||||
};
|
||||
$payload->{width} = int($ARGV[4]) if length($ARGV[4] // "");
|
||||
$payload->{maxHeight} = int($ARGV[5]) if length($ARGV[5] // "");
|
||||
print encode_json($payload)
|
||||
' "$prompt" "$options_json" "$selection_file" "$done_file" "$menu_width" "$menu_maxheight")
|
||||
|
||||
blob-shell shell summon blob.menu "$payload" >/dev/null
|
||||
|
||||
while [[ ! -e $done_file ]]; do
|
||||
sleep 0.05
|
||||
done
|
||||
|
||||
if [[ -s $selection_file ]]; then
|
||||
cat "$selection_file"
|
||||
else
|
||||
exit 1
|
||||
fi
|
||||
Reference in New Issue
Block a user