151 lines
3.3 KiB
Bash
Executable File
151 lines
3.3 KiB
Bash
Executable File
#!/bin/sh
|
|
# SPDX-License-Identifier: AGPL-3.0-only
|
|
# Copyright 2022 Sxmo Contributors
|
|
|
|
# include common definitions
|
|
# shellcheck source=configs/default_hooks/sxmo_hook_icons.sh
|
|
. sxmo_hook_icons.sh
|
|
# shellcheck source=scripts/core/sxmo_common.sh
|
|
. sxmo_common.sh
|
|
|
|
confirm() {
|
|
PICKED="$(printf "Yes\nNo\n" | sxmo_dmenu.sh -p "Confirm $1")"
|
|
|
|
if [ "$PICKED" = "Yes" ]; then
|
|
return 0
|
|
else
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
supertoggle_daemon() {
|
|
if superctl status "$1" | grep -q started; then
|
|
superctl stop "$1"
|
|
sxmo_notify_user.sh "$1 Stopped"
|
|
else
|
|
superctl start "$1"
|
|
sxmo_notify_user.sh "$1 Started"
|
|
fi
|
|
|
|
}
|
|
|
|
toggle_daemon() {
|
|
name="$1"
|
|
shift
|
|
|
|
if sxmo_daemons.sh running "$1" -q; then
|
|
sxmo_daemons.sh stop "$@"
|
|
notify-send "$name Stopped"
|
|
else
|
|
sxmo_daemons.sh start "$@" &
|
|
notify-send "$name Started"
|
|
fi
|
|
}
|
|
|
|
sxmo_type() {
|
|
sxmo_type.sh -s 200 "$@" # dunno why this is necessary but it sucks without
|
|
}
|
|
|
|
call_entries() {
|
|
shown_incall_menu=
|
|
sxmo_modemcall.sh list_active_calls | while read -r line; do
|
|
case "$line" in
|
|
*"(ringing-in)")
|
|
CALLID="$(printf %s "$line" | cut -d" " -f1 | xargs basename)"
|
|
NUMBER="$(sxmo_modemcall.sh vid_to_number "$CALLID")"
|
|
CONTACT="$(sxmo_contacts.sh --name "$NUMBER")"
|
|
|
|
printf "%s Incoming call %s ^ 0 ^ sxmo_daemons.sh start incall_menu sxmo_modemcall.sh incoming_call_menu %s\n" \
|
|
"$icon_phn" "$CONTACT" "$CALLID"
|
|
;;
|
|
*)
|
|
[ -n "$shown_incall_menu" ] && continue
|
|
shown_incall_menu=1
|
|
printf "%s Incall Menu ^ 0 ^ sxmo_daemons.sh start incall_menu sxmo_modemcall.sh incall_menu\n" \
|
|
"$icon_phn"
|
|
;;
|
|
esac
|
|
done
|
|
|
|
}
|
|
|
|
getprogchoices() {
|
|
RES="$(sxmo_hook_contextmenu.sh "$1")"
|
|
if [ -n "$RES" ]; then
|
|
WINNAME="$(printf %s "$RES" | head -n1)"
|
|
CHOICES="$(printf %s "$RES" | tail -n+2)"
|
|
fi
|
|
|
|
# For the Sys menu decorate at top with notifications if >1 notification
|
|
if [ "$WINNAME" = "Sys" ]; then
|
|
NNOTIFICATIONS="$(find "$SXMO_NOTIFDIR" -type f | wc -l)"
|
|
if [ "$NNOTIFICATIONS" -gt 0 ]; then
|
|
CHOICES="
|
|
$icon_bel Notifications ($NNOTIFICATIONS) ^ 0 ^ sxmo_notificationsmenu.sh
|
|
$CHOICES
|
|
"
|
|
fi
|
|
fi
|
|
|
|
CHOICES="
|
|
$(call_entries)
|
|
$CHOICES
|
|
"
|
|
|
|
# Decorate menu at bottom w/ system menu entry if not system menu
|
|
echo "$WINNAME" | grep -qv Sys && CHOICES="
|
|
$CHOICES
|
|
$icon_mnu System Menu ^ 0 ^ sxmo_appmenu.sh sys
|
|
"
|
|
|
|
# Decorate menu at bottom w/ close menu entry
|
|
CHOICES="
|
|
$CHOICES
|
|
$icon_cls Close Menu ^ 0 ^ quit
|
|
"
|
|
|
|
CHOICES="$(printf "%s\n" "$CHOICES" | xargs -0 echo | sed '/^[[:space:]]*$/d' | awk '{$1=$1};1')"
|
|
}
|
|
|
|
quit() {
|
|
exit 0
|
|
}
|
|
|
|
mainloop() {
|
|
getprogchoices "$@"
|
|
PICKED="$(
|
|
printf "%s\n" "$CHOICES" |
|
|
cut -d'^' -f1 |
|
|
sxmo_dmenu.sh -i -p "$WINNAME"
|
|
)" || quit
|
|
|
|
CHOICE="$(echo "$CHOICES" | awk -F '^' -v picked="$PICKED" \
|
|
'$1 == picked {print $2 "^" $3}'
|
|
)"
|
|
|
|
LOOP="$(echo "$CHOICE" | cut -d '^' -f1)"
|
|
CMD="$(echo "$CHOICE" | cut -d '^' -f2)"
|
|
|
|
if [ -z "$CMD" ]; then
|
|
printf "%s\n" "sxmo_appmenu: Fallback: unknown choice <$PICKED> to contextmenu_fallback hook">&2
|
|
sxmo_hook_contextmenu_fallback.sh "$WINNAME" "$PICKED"
|
|
quit
|
|
fi
|
|
|
|
printf 'sxmo_appmenu: Eval: <%s> from picked <%s> with loop <%s>\n' \
|
|
"$CMD" "$PICKED" "$LOOP" >&2
|
|
|
|
if printf %s "$LOOP" | grep -q 1; then
|
|
eval "$CMD"
|
|
mainloop "$@"
|
|
else
|
|
eval "$CMD"
|
|
quit
|
|
fi
|
|
}
|
|
|
|
# Allow loading from shellspec
|
|
if [ -z "$SHELLSPEC_PATH" ]; then
|
|
mainloop "$@"
|
|
fi
|