Description: Remove Bash and OpenBSD assumptions
 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.
 .
 The patch is still awaiting for upstream approval.
Bug-Debian: http://bugs.debian.org/530990
Forwarded: yes
Author: Andrea Bolognani <eof@kiyuko.org>
Last-Update: 2009-10-03
Index: cvs/baraction.sh
===================================================================
--- cvs.orig/baraction.sh	2009-10-02 23:00:27.000000000 +0200
+++ cvs/baraction.sh	2009-10-02 23:13:14.000000000 +0200
@@ -2,6 +2,10 @@
 #
 # $scrotwm: baraction.sh,v 1.15 2009/09/30 02:50:11 marco Exp $
 
+ACPI=/usr/bin/acpi
+IOSTAT=/usr/bin/iostat
+TOP=/usr/bin/top
+
 print_date() {
 	# The date is printed to the status bar by default.
 	# To print the date through this script, set clock_enabled to 0
@@ -12,89 +16,63 @@
 }
 
 print_mem() {
-	MEM=`/usr/bin/top | grep Free: | cut -d " " -f7`
+	MEM=`${TOP} -b -n 1 | grep ^Mem: | cut -d " " -f13`
 	echo -n "Free mem: $MEM  "
 }
 
 _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
+		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
-	PID="$!"
-	APM_DATA=""
-	I=0
-	trap "kill $PID; exit" TERM
-	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_mem $MEM
-			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.
+PID="$!"
+ACPI_DATA=""
+I=0
+trap "kill $PID; exit" TERM
+${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_mem $MEM
+		print_cpu $IOSTAT_DATA
+		print_acpi $ACPI_DATA
+		echo ""
+	fi
+	I=$(( ${I} + 1 ));
 done
