#!/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 unalias dmenu 2>/dev/null || true unalias bemenu 2>/dev/null || true confirm() { PICKED="$(printf "Yes\nNo\n" | run_dmenu -p "Confirm $1")" if [ "$PICKED" = "Yes" ]; then return 0 else return 1 fi } run_dmenu() { if [ "${SXMO_WM:-dwm}" = "dwm" ] && command -v dmenu >/dev/null 2>&1; then dmenu -c -l "${SXMO_DMENU_PORTRAIT_LINES:-9}" "$@" else sxmo_dmenu.sh "$@" 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_jobs.sh running "$1" -q; then sxmo_jobs.sh stop "$@" notify-send "$name Stopped" else sxmo_jobs.sh start "$@" & notify-send "$name Started" fi } sxmo_type() { sxmo_type.sh -s 200 "$@" } get_focused_window() { if [ -r "${XDG_RUNTIME_DIR:-/run/user/10000}/sxmo.focusedwin" ]; then { read -r WMCLASS || WMCLASS="" read -r WMNAME || WMNAME="" } < "${XDG_RUNTIME_DIR:-/run/user/10000}/sxmo.focusedwin" return fi exec 0</dev/null || continue if [ "$rtype" = "bluetooth" ]; then read -r soft < "$rfk/soft" 2>/dev/null || soft=0 read -r hard < "$rfk/hard" 2>/dev/null || hard=0 [ "$soft" = "0" ] && [ "$hard" = "0" ] && return 0 return 1 fi done return 1 } fast_sys_choices() { WINNAME="Sys" _bt_line="" if bt_is_unblocked_fast; then _bt_line="$icon_bth Bluetooth^1^sxmo_bluetoothmenu.sh " fi _flash_line="" _bl="" if [ -r /sys/class/leds/white:torch/brightness ]; then read -r _bl < /sys/class/leds/white:torch/brightness 2>/dev/null || _bl="" elif [ -r /sys/class/leds/white:flash/brightness ]; then read -r _bl < /sys/class/leds/white:flash/brightness 2>/dev/null || _bl="" fi if [ -n "$_bl" ]; then if [ "$_bl" -gt 0 ] 2>/dev/null; then _flash_line="$icon_fll Flashlight $icon_ton^1^sxmo_flashtoggle.sh " else _flash_line="$icon_fll Flashlight $icon_tof^1^sxmo_flashtoggle.sh " fi fi CHOICES="$icon_trm St^0^st -e ${SHELL:-/bin/sh} $icon_grd Apps^0^sxmo_appmenu.sh applications $icon_grd Scripts^0^sxmo_appmenu.sh scripts $icon_dir Files^0^sxmo_files.sh $icon_phn Dialer^0^sxmo_modemdial.sh $icon_msg Texts^0^sxmo_modemtext.sh $icon_usr Contacts^0^sxmo_contactmenu.sh ${_bt_line}$icon_cam Camera^0^bananarchy-photo --menu ${_flash_line}$icon_net Networks^0^sxmo_networks.sh $icon_mus Audio^0^sxmo_audio.sh $icon_phn Modem^0^sxmo_appmenu.sh modem $icon_win Windows^0^sxmo_wmmenu.sh $icon_cfg Config^0^sxmo_appmenu.sh config $icon_pwr Power^0^sxmo_appmenu.sh power" } getprogchoices() { case "$WMCLASS" in ""|sys) fast_sys_choices ;; applications) WINNAME="Apps" if [ -s "${XDG_RUNTIME_DIR:-/tmp}/sxmo_apps.cache" ]; then CHOICES="$(cat "${XDG_RUNTIME_DIR:-/tmp}/sxmo_apps.cache")" else CHOICES="$(sxmo_hook_apps.sh)" fi ;; scripts) WINNAME="Scripts" if [ -s "${XDG_RUNTIME_DIR:-/tmp}/sxmo_scripts.cache" ]; then CHOICES="$(cat "${XDG_RUNTIME_DIR:-/tmp}/sxmo_scripts.cache")" else CHOICES="$(sxmo_hook_scripts.sh)" fi ;; power) WINNAME="Power" CHOICES="$icon_lck Lock^0^sxmo_state.sh set lock $icon_lck Lock (Screen off)^0^sxmo_state.sh set screenoff $icon_out Logout^0^confirm Logout && sxmo_power.sh logout $icon_rld Reboot^0^confirm Reboot && sxmo_power.sh reboot $icon_pwr Poweroff^0^confirm Poweroff && sxmo_power.sh poweroff" ;; modem) WINNAME="Modem" CHOICES="$icon_plk Modem PIN^0^sxmo_unlocksim.sh $icon_inf Modem Info^0^sxmo_modeminfo.sh $icon_phl Modem Log^0^sxmo_modemlog.sh" ;; config) WINNAME="Config" _bt_icon="$icon_tof" bt_is_unblocked_fast && _bt_icon="$icon_ton" _susp_icon="$icon_ton" [ -e "${XDG_CACHE_HOME:-$HOME/.cache}/sxmo/sxmo.nosuspend" ] && _susp_icon="$icon_tof" _idle_icon="$icon_ton" [ -e "${XDG_CACHE_HOME:-$HOME/.cache}/sxmo/sxmo.noidle" ] && _idle_icon="$icon_tof" CHOICES="$icon_aru Brightness^1^sxmo_brightness.sh up $icon_ard Brightness^1^sxmo_brightness.sh down $icon_cfg Toggle Bar^0^sxmo_wm.sh togglebar $icon_bth Bluetooth $_bt_icon^1^doas sxmo_bluetoothtoggle.sh && sxmo_hook_statusbar.sh bluetooth $icon_clk Change Timezone^1^sxmo_timezonechange.sh $icon_zzz Auto-suspend $_susp_icon^1^(rm ${XDG_CACHE_HOME:-$HOME/.cache}/sxmo/sxmo.nosuspend 2>/dev/null || touch ${XDG_CACHE_HOME:-$HOME/.cache}/sxmo/sxmo.nosuspend) $icon_zzz Auto-screen-off $_idle_icon^1^(rm ${XDG_CACHE_HOME:-$HOME/.cache}/sxmo/sxmo.noidle 2>/dev/null || touch ${XDG_CACHE_HOME:-$HOME/.cache}/sxmo/sxmo.noidle) && sxmo_state.sh set unlock $icon_trm Hooks^0^sxmo_hookmenu.sh $icon_cfg Suspend Blockers^0^sxmo_terminal.sh sxmo_debug_suspend.sh $icon_inf Log^0^sxmo_terminal.sh tail -n 100 -f ${XDG_STATE_HOME:-$HOME}/sxmo.log $icon_inf Version^0^sxmo_terminal.sh sxmo_version.sh --block" ;; *) RES="$(sxmo_hook_contextmenu.sh "$WMCLASS" "$WMNAME")" if [ -n "$RES" ]; then nl=' ' WINNAME="${RES%%"$nl"*}" CHOICES="${RES#*"$nl"}" fi ;; esac if [ "$WINNAME" = "Sys" ]; then NNOTIFICATIONS="$(count_notifications)" if [ "$NNOTIFICATIONS" -gt 0 ]; then CHOICES="$icon_bel Notifications ($NNOTIFICATIONS)^0^sxmo_notifs.sh menu $CHOICES" fi fi if has_tracked_calls; then CHOICES="$(call_entries) $CHOICES" fi case "$WINNAME" in *Sys*) ;; *) CHOICES="$CHOICES $icon_mnu System Menu^0^sxmo_appmenu.sh sys" ;; esac CHOICES="$CHOICES $icon_cls Close Menu^0^quit" case "$WMCLASS" in ""|sys|applications|scripts|power|modem|config) ;; *) CHOICES="$(printf "%s\n" "$CHOICES" | awk 'NF {$1=$1; print}')" ;; esac } quit() { exit 0 } mainloop() { getprogchoices PICKED="$( printf "%s\n" "$CHOICES" | cut -d'^' -f1 | run_dmenu -i -p "$WINNAME" )" || quit CHOICE="$(printf "%s\n" "$CHOICES" | awk -F '^' -v picked="$PICKED" \ '$1 == picked || $1 == picked " " {print $2 "^" $3; exit}' )" LOOP="${CHOICE%%^*}" CMD="${CHOICE#*^}" CMD="${CMD#"${CMD%%[![:space:]]*}"}" if [ -z "$CHOICE" ] || [ -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 case "$CMD" in "sxmo_appmenu.sh "*) set -- ${CMD#sxmo_appmenu.sh } WMCLASS="$1" WMNAME="$2" return 0 ;; esac eval "$CMD" case "$LOOP" in *1*) ;; *) quit ;; esac } if [ -z "$SHELLSPEC_PATH" ]; then if [ $# -gt 0 ] ; then WMCLASS="$1" WMNAME="$2" else get_focused_window fi while true; do mainloop done fi