cp /usr/share/sxmo/default_hooks/sxmo_hook_statusbar.sh ~/.config/sxmo/hooks/
authorDobrica Pavlinušić <dpavlin@rot13.org>
Thu, 29 Jun 2023 10:43:55 +0000 (12:43 +0200)
committerDobrica Pavlinušić <dpavlin@rot13.org>
Sun, 2 Jul 2023 11:12:08 +0000 (13:12 +0200)
.config/sxmo/hooks/sxmo_hook_statusbar.sh [new file with mode: 0755]

diff --git a/.config/sxmo/hooks/sxmo_hook_statusbar.sh b/.config/sxmo/hooks/sxmo_hook_statusbar.sh
new file mode 100755 (executable)
index 0000000..f8976e2
--- /dev/null
@@ -0,0 +1,451 @@
+#!/bin/sh
+# configversion: ef09861c083e9642d0dffc2e436e307a
+# SPDX-License-Identifier: AGPL-3.0-only
+# Copyright 2022 Sxmo Contributors
+
+# we disable shellcheck SC2154 (unreferenced variable used)
+# shellcheck disable=SC2154
+
+# 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
+
+# You can modify the statusbar ordering and feel here.
+# Note that order number runs from 0 (far left) to 100 (far
+# right). Our preference is to have "static" icons on the
+# right and "variable" icons (that come and go) on the left.
+
+set_time() {
+       date "+${SXMO_STATUS_DATE_FORMAT:-%H:%M}" | while read -r date; do
+               sxmobar -a time 99 "$date"
+       done
+}
+
+set_state() {
+       if [ ! -f "$SXMO_STATE" ]; then
+               return
+       fi
+
+       STATE_LABEL="$(cat "$SXMO_STATE")"
+       case "$STATE_LABEL" in
+               proximity*)
+                       sxmobar -a -e bold -f orange state 90 "$icon_state_proximity" # circle with dot
+                       ;;
+               screenoff)
+                       sxmobar -a -e bold -f red state 90 "$icon_state_screenoff" # filled circle
+                       ;;
+               lock)
+                       sxmobar -a -e bold -f red state 90 "$icon_state_lock" # open circle with slash
+                       ;;
+               unlock)
+                       sxmobar -a -e bold state 90 "$icon_state_unlock" # open circle
+                       ;;
+       esac
+}
+
+# from right to left: indicate signal, technologies, mm state
+set_modem() {
+       MMCLI="$(mmcli -m any -J 2>/dev/null)"
+
+       bgcolor=default
+       fgcolor=default
+       style=normal
+
+       if [ -z "$MMCLI" ]; then
+               MODEMSTATE="nomodem"
+       else
+               MODEMSTATE="$(printf %s "$MMCLI" | jq -r .modem.generic.state)"
+       fi
+
+       case "$MODEMSTATE" in
+               nomodem)
+                       fgcolor=red
+                       MODEMSTATECMP="$icon_modem_nomodem"
+                       ;;
+               locked)
+                       fgcolor=red
+                       MODEMSTATECMP="$icon_modem_locked"
+                       ;;
+               initializing)
+                       fgcolor=red
+                       MODEMSTATECMP="$icon_modem_initializing"
+                       ;;
+               disabled) # low power state
+                       fgcolor=red
+                       MODEMSTATECMP="$icon_modem_disabled"
+                       ;;
+               disabling)
+                       fgcolor=red
+                       MODEMSTATECMP="$icon_modem_disabling"
+                       ;;
+               enabling) # modem enabled but neither registered (cell) nor connected (data)
+                       fgcolor=red
+                       MODEMSTATECMP="$icon_modem_enabling"
+                       ;;
+               enabled)
+                       fgcolor=red
+                       MODEMSTATECMP="$icon_modem_enabled"
+                       ;;
+               searching) # i.e. registering
+                       fgcolor=red
+                       MODEMSTATECMP="$icon_modem_searching"
+                       ;;
+               registered) # i.e. phone but no data
+                       fgcolor=orange
+                       MODEMSTATECMP="$icon_modem_registered"
+                       ;;
+               connecting)
+                       fgcolor=orange
+                       MODEMSTATECMP="$icon_modem_connecting"
+                       ;;
+               disconnecting) # i.e., going back to registered state
+                       fgcolor=orange
+                       MODEMSTATECMP="$icon_modem_disconnecting"
+                       ;;
+               connected)
+                       MODEMSTATECMP="$icon_modem_connected"
+                       ;;
+               *)
+                       # FAILED, UNKNOWN
+                       # see https://www.freedesktop.org/software/ModemManager/doc/latest/ModemManager/ModemManager-Flags-and-Enumerations.html#MMModemState
+                       fgcolor=red
+                       MODEMSTATECMP="$icon_modem_failed" # cell with !
+                       sxmo_log "WARNING: MODEMSTATE: $MODEMSTATE"
+                       ;;
+       esac
+
+       sxmobar -a -f "$fgcolor" -b "$bgcolor" -t "$style" \
+               modem-state 10 "$MODEMSTATECMP"
+
+       if [ "$MODEMSTATE" = nomodem ]; then
+               sxmobar -d modem-tech
+               sxmobar -d modem-signal
+               return
+       fi
+
+       MODEMTECHCMP="$icon_modem_notech"
+       bgcolor=default
+       fgcolor=default
+       style=normal
+
+       # see https://www.freedesktop.org/software/ModemManager/api/latest/ModemManager-Flags-and-Enumerations.html#MMModemAccessTechnology
+       USEDTECHS="$(printf %s "$MMCLI" | jq -r '.modem.generic."access-technologies"[]')"
+               case "$USEDTECHS" in
+                       *5gnr*)
+                               MODEMTECHCMP="$icon_modem_fiveg"
+                               ;;
+                       *lte*) # lte, lte_nb_iot, lte_cat_m
+                               MODEMTECHCMP="$icon_modem_fourg"
+                               ;;
+                       *umts*)
+                               MODEMTECHCMP="$icon_modem_threeg"
+                               ;;
+                       *hsupa*)
+                               MODEMTECHCMP="$USEDTECHS" # 3g
+                               ;;
+                       *hsdpa*)
+                               MODEMTECHCMP="$USEDTECHS" # 3g
+                               ;;
+                       *1xrtt*)
+                               MODEMTECHCMP="$USEDTECHS" # 3g
+                               ;;
+                       *evdo*) # evdo0, evdoa, evdob
+                               MODEMTECHCMP="$USEDTECHS" # 3g
+                               ;;
+                       *hspa_plus*)
+                               MODEMTECHCMP="$icon_modem_hspa_plus" # 3g
+                               ;;
+                       *hspa*)
+                               MODEMTECHCMP="$icon_modem_hspa" # 3g
+                               ;;
+                       *edge*)
+                               MODEMTECHCMP="E" # 2G+
+                               ;;
+                       *pots*)
+                               MODEMTECHCMP="P" # 0G
+                               ;;
+                       *gsm*) # gsm, gsm_compact
+                               MODEMTECHCMP="$icon_modem_twog"
+                               ;;
+                       *gprs*)
+                               MODEMTECHCMP="G" # 2G
+                               ;;
+                       *)
+                               sxmo_log "WARNING: USEDTECHS: $USEDTECHS"
+                               fgcolor=red
+                               ;;
+               esac
+
+       sxmobar -a -f "$fgcolor" -b "$bgcolor" -t "$style" \
+               modem-tech 11 "$MODEMTECHCMP"
+
+       MODEMSIGNALCMP="$icon_modem_signal_0"
+       bgcolor=default
+       fgcolor=default
+       style=normal
+
+       case "$MODEMSTATE" in
+               registered|connected|connecting|disconnecting)
+                       MODEMSIGNAL="$(printf %s "$MMCLI" | jq -r '.modem.generic."signal-quality".value')"
+                       if [ "$MODEMSIGNAL" -lt 33 ]; then
+                               MODEMSIGNALCMP="$icon_modem_signal_1"
+                       elif [ "$MODEMSIGNAL" -lt 66 ]; then
+                               MODEMSIGNALCMP="$icon_modem_signal_2"
+                       else
+                               MODEMSIGNALCMP="$icon_modem_signal_3"
+                       fi
+               ;;
+       esac
+
+       sxmobar -a -f "$fgcolor" -b "$bgcolor" -t "$style" \
+               modem-signal 12 "$MODEMSIGNALCMP"
+}
+
+# $1 = type (wifi, tun)
+# $2 = interface name (wlan0, tun0)
+set_wifi() {
+
+       if rfkill list wifi | grep -q "yes"; then
+               sxmobar -d wifi-status
+               return
+       fi
+
+       CONN="$(nmcli -t con show --active)"
+
+       if ! printf %b "$CONN" | cut -d':' -f3 | grep -q wireless; then
+               sxmobar -a -f red wifi-status 30 "$icon_wifi_disconnected"
+               return
+       fi
+
+       # we simply assume Hotspot as first bit of name
+       # for hotspot as this is what we create.
+       if printf %b "$CONN" | grep -q ^Hotspot; then
+               sxmobar -a wifi-status 30 "$icon_wfh"
+               return
+       fi
+
+       # if they have a vpn nmcli c shown --active should also list:
+       # tun0              ef5fcce9-fdae-4ffe-a540-b16fc7b42852  tun   tun0   
+       if printf %b "$CONN" | cut -d':' -f3 | grep -q ^tun$; then
+               wifivpn=1
+       else
+               wifivpn=0
+       fi
+
+       wifi_signal="$(nmcli -f IN-USE,SIGNAL,SSID device wifi | awk '/^\*/{if (NR!=1) {print $2}}')"
+       if [ -z "$wifi_signal" ]; then
+               icon_wif="$icon_wifi_signal_exclam"
+       elif [ "$wifi_signal" -lt 20 ]; then
+               if [ "$wifivpn" -eq 1 ]; then
+                       icon_wif="$icon_wifi_key_signal_0"
+               else
+                       icon_wif="$icon_wifi_signal_0"
+               fi
+       elif [ "$wifi_signal" -lt 40 ]; then
+               if [ "$wifivpn" -eq 1 ]; then
+                       icon_wif="$icon_wifi_key_signal_1"
+               else
+                       icon_wif="$icon_wifi_signal_1"
+               fi
+       elif [ "$wifi_signal" -lt 60 ]; then
+               if [ "$wifivpn" -eq 1 ]; then
+                       icon_wif="$icon_wifi_key_signal_2"
+               else
+                       icon_wif="$icon_wifi_signal_2"
+               fi
+       elif [ "$wifi_signal" -lt 80 ]; then
+               if [ "$wifivpn" -eq 1 ]; then
+                       icon_wif="$icon_wifi_key_signal_3"
+               else
+                       icon_wif="$icon_wifi_signal_3"
+               fi
+       else
+               if [ "$wifivpn" -eq 1 ]; then
+                       icon_wif="$icon_wifi_key_signal_4"
+               else
+                       icon_wif="$icon_wifi_signal_4"
+               fi
+       fi
+
+       sxmobar -a wifi-status 30 "$icon_wif"
+}
+
+# $1: type (reported by nmcli, e.g., wifi, tun)
+# $2: interface name (reported by nmcli, e.g., wlan0, tun0)
+set_network() {
+       case "$1" in
+               wifi|tun) set_wifi "$@" ;;
+       esac
+}
+
+set_battery() {
+       count=0 # handle multiple batteries
+       for power_supply in /sys/class/power_supply/*; do
+               fgcolor=default
+               bgcolor=default
+               style=normal
+               BATCMP=
+
+
+               if [ "$(cat "$power_supply"/type)" = "Battery" ]; then
+                       if [ -e "$power_supply"/capacity ]; then
+                               PCT="$(cat "$power_supply"/capacity)"
+                       elif [ -e "$power_supply"/charge_now ]; then
+                               CHARGE_NOW="$(cat "$power_supply"/charge_now)"
+                               CHARGE_FULL="$(cat "$power_supply"/charge_full_design)"
+                               PCT="$(printf "scale=2; %s / %s * 100\n" "$CHARGE_NOW" "$CHARGE_FULL" | bc | cut -d'.' -f1)"
+                       else
+                               continue
+                       fi
+
+                       count=$((count+1))
+
+                       if [ -e "$power_supply"/status ]; then
+                               # The status is not always given for the battery device.
+                               # (sometimes it's linked to the charger device).
+                               BATSTATUS="$(cut -c1 "$power_supply"/status)"
+                       fi
+
+                       # fixes a bug with keyboard case where
+                       # /sys/class/power_supply/ip5xxx-charger/capacity
+                       # exists but returns 'Not a tty'
+                       if [ -z "$PCT" ]; then
+                               BATCMP="ERR"
+                       elif [ "$BATSTATUS" = "C" ] || [ "$BATSTATUS" = "F" ]; then
+                               if [ "$PCT" -lt 25 ]; then
+                                       BATCMP="$icon_bat_c_0"
+                               elif [ "$PCT" -lt 50 ]; then
+                                       BATCMP="$icon_bat_c_1"
+                               elif [ "$PCT" -lt 75 ]; then
+                                       BATCMP="$icon_bat_c_2"
+                               else
+                                       # Treat 'Full' status as same as 'Charging'
+                                       BATCMP="$icon_bat_c_3"
+                               fi
+                       else
+                               if [ "$PCT" -lt 25 ]; then
+                                       fgcolor=red
+                                       if [ "$PCT" -lt 5 ]; then
+                                               BATCMP="$icon_bat_0"
+                                       elif [ "$PCT" -lt 10 ]; then
+                                               BATCMP="$icon_bat_1"
+                                       elif [ "$PCT" -lt 15 ]; then
+                                               BATCMP="$icon_bat_2"
+                                       else
+                                               BATCMP="$icon_bat_3"
+                                       fi
+                               elif [ "$PCT" -lt 50 ]; then
+                                       fgcolor=orange
+                                       BATCMP="$icon_bat_1"
+                               elif [ "$PCT" -lt 75 ]; then
+                                       BATCMP="$icon_bat_2"
+                               else
+                                       BATCMP="$icon_bat_3"
+                               fi
+                       fi
+
+                       sxmobar -a -t "$style" -b "$bgcolor" -f "$fgcolor" \
+                               battery-icon 40 "$BATCMP"
+
+                       if [ -z "$SXMO_BAR_SHOW_BAT_PER" ]; then
+                                sxmobar -d battery-status
+                       else
+                                sxmobar -a battery-status 41 "$PCT%"
+                       fi
+               fi
+       done
+}
+
+set_notifications() {
+       [ -z "$SXMO_DISABLE_LEDS" ] && return
+       NNOTIFICATIONS="$(find "$SXMO_NOTIFDIR" -type f | wc -l)"
+       if [ "$NNOTIFICATIONS" = 0 ]; then
+               sxmobar -d notifs
+       else
+               sxmobar -a -f red notifs 5 "!: $NNOTIFICATIONS"
+       fi
+}
+
+set_volume() {
+       VOLCMP=""
+
+       if sxmo_modemaudio.sh is_call_audio_mode; then
+               if sxmo_modemaudio.sh is_muted_mic; then
+                       VOLCMP="$icon_mmc"
+               else
+                       VOLCMP="$icon_mic"
+               fi
+               if sxmo_modemaudio.sh is_enabled_speaker; then
+                       VOLCMP="$VOLCMP $icon_spk"
+               else
+                       VOLCMP="$VOLCMP $icon_ear"
+               fi
+               sxmobar -a -f green volume 50 "$VOLCMP"
+               return;
+       fi
+
+       if sxmo_audio.sh mic ismuted; then
+               VOLCMP="$icon_mmc"
+       else
+               VOLCMP="$icon_mic"
+       fi
+
+       case "$(sxmo_audio.sh device get 2>/dev/null)" in
+               Speaker|"")
+                       # nothing for default or pulse devices
+                       ;;
+               Headphones|Headphone)
+                       VOLCMP="$VOLCMP $icon_hdp"
+                       ;;
+               Earpiece)
+                       VOLCMP="$VOLCMP $icon_ear"
+                       ;;
+       esac
+
+       VOL="$(sxmo_audio.sh vol get)"
+       if [ -z "$VOL" ] || [ "$VOL" = "muted" ]; then
+               VOLCMP="$VOLCMP $icon_mut"
+       elif [ "$VOL" -gt 66 ]; then
+               VOLCMP="$VOLCMP $icon_spk"
+       elif [ "$VOL" -gt 33 ]; then
+               VOLCMP="$VOLCMP $icon_spm"
+       elif [ "$VOL" -ge 0 ]; then
+               VOLCMP="$VOLCMP $icon_spl"
+       fi
+
+       sxmobar -a volume 50 "$VOLCMP"
+}
+
+sxmo_debug "$@"
+case "$1" in
+       network)
+               shift
+               set_network "$@"
+               ;;
+       time|modem|battery|volume|state|notifications)
+               set_"$1"
+               ;;
+       periodics|state_change) # 55 s loop and screenlock triggers
+               set_time
+               set_modem
+               set_battery
+               set_state
+               set_network wifi wlan0
+               ;;
+       all)
+               sxmobar -r
+               set_time
+               set_modem
+               set_battery
+               set_volume
+               set_state
+               set_notifications
+               set_network wifi wlan0
+               ;;
+       *)
+               exit # swallow it !
+               ;;
+esac
+