From 92c75a10e96e66514acd244a0a066c563a664cc2 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Dobrica=20Pavlinu=C5=A1i=C4=87?= Date: Thu, 29 Jun 2023 12:43:55 +0200 Subject: [PATCH] cp /usr/share/sxmo/default_hooks/sxmo_hook_statusbar.sh ~/.config/sxmo/hooks/ --- .config/sxmo/hooks/sxmo_hook_statusbar.sh | 451 ++++++++++++++++++++++ 1 file changed, 451 insertions(+) create mode 100755 .config/sxmo/hooks/sxmo_hook_statusbar.sh diff --git a/.config/sxmo/hooks/sxmo_hook_statusbar.sh b/.config/sxmo/hooks/sxmo_hook_statusbar.sh new file mode 100755 index 0000000..f8976e2 --- /dev/null +++ b/.config/sxmo/hooks/sxmo_hook_statusbar.sh @@ -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 + -- 2.20.1