The example baraction.sh script shipped in Scrotwm's release relies on the behaviour of the OpenBSD versions of iostat, apm and typeset, as well as some non-POSIX Bash features. This patch modifies the script so it is possible to run it unmodified on a Debian system, provided the called commands are available. It uses acpi instead of apm, which is the best choice for virtually all modern systems. Index: scrotwm/baraction.sh =================================================================== --- scrotwm.orig/baraction.sh 2009-05-31 19:17:46.000000000 +0200 +++ scrotwm/baraction.sh 2009-05-31 19:18:05.000000000 +0200 @@ -1,5 +1,8 @@ #!/bin/sh +ACPI=/usr/bin/acpi +IOSTAT=/usr/bin/iostat + print_date() { # The date is printed to the status bar by default. # To print the date through this script, set clock_enabled to 0 @@ -10,81 +13,55 @@ } _print_cpu() { - typeset -R4 _1=${1} _2=${2} _3=${3} _4=${4} _5=${5} - echo -n "CPU:${_1}% User${_2}% Nice${_3}% Sys${_4}% Int${_5}% Idle " + echo -n "CPU: ${1}% User ${2}% Nice ${3}% Sys ${6}% Idle " } print_cpu() { OUT="" - # iostat prints each column justified to 3 chars, so if one counter - # is 100, it jams up agains the preceeding one. sort this out. + # Remove the decimal part from all the percentages while [ "${1}x" != "x" ]; do - if [ ${1} -gt 99 ]; then - OUT="$OUT ${1%100} 100" - else - OUT="$OUT ${1}" - fi - shift; + OUT="$OUT `echo $1 | cut -d '.' -f 1`" + shift done _print_cpu $OUT } -print_apm() { - BAT_STATUS=$1 - BAT_LEVEL=$2 - AC_STATUS=$3 - - if [ $AC_STATUS -ne 255 -o $BAT_STATUS -lt 4 ]; then - if [ $AC_STATUS -eq 0 ]; then - echo -n "on battery (${BAT_LEVEL}%)" - else - case $AC_STATUS in - 1) - AC_STRING="on AC: " - ;; - 2) - AC_STRING="on backup AC: " - ;; - *) - AC_STRING="" - ;; - esac; - case $BAT_STATUS in - 4) - BAT_STRING="(no battery)" - ;; - [0-3]) - BAT_STRING="(battery ${BAT_LEVEL}%)" - ;; - *) - BAT_STRING="(battery unknown)" - ;; - esac; - - FULL="${AC_STRING}${BAT_STRING}" - if [ "$FULL" != "" ]; then - echo -n "$FULL" - fi - fi - fi +print_acpi() { + BAT_STATUS=$3 + BAT_LEVEL=`echo $4 | tr -d ','` + + case $BAT_STATUS in + "Charging,") + FULL="on AC: (battery ${BAT_LEVEL})" + ;; + "Discharging,") + FULL="on battery (${BAT_LEVEL})" + ;; + "") + FULL="on AC (no battery)" + ;; + *) + FULL="(battery unknown)" + ;; + esac; + + echo -n "$FULL" } -while :; do - # instead of sleeping, use iostat as the update timer. - # cache the output of apm(8), no need to call that every second. - /usr/sbin/iostat -C -c 3600 |& # wish infinity was an option - APM_DATA="" - I=0 - while read -p; do - if [ $(( ${I} % 1 )) -eq 0 ]; then - APM_DATA=`/usr/sbin/apm -alb` - fi - if [ $I -gt 2 ]; then - # print_date - print_cpu $REPLY - print_apm $APM_DATA - echo "" - fi - I=$(( ${I} + 1 )); - done +# instead of sleeping, use iostat as the update timer. +# cache the output of acpi(1), no need to call that every second. +ACPI_DATA="" +I=0 +$IOSTAT -c 3 2>&1 | +while read IOSTAT_DATA; do + if [ $(( ${I} % 10 )) -eq 0 ]; then + ACPI_DATA=`$ACPI -b` + fi + if [ $(( ${I} % 3 )) -eq 0 ] && [ $I -gt 2 ]; then + # print_date + print_cpu $IOSTAT_DATA + print_acpi $ACPI_DATA + echo "" + fi + I=$(( ${I} + 1 )); done