By the way, I've been using the module interface for a similar
task. One of the buttons in FvwmButtons displays the time and
date, another one current memory usage and a third one the top
cpu using process. This is updated every fifteen seconds.
Because I don't like processes (FvwmCommand) to be started all the
time I wrote the ModuleListenOnly fvwm command and implemented the
module as a zsh script (attached). Note that the module interface
uses the "long" C type, and the script is written for systems
where sizeof(long) is four. It needs to be adapted of eight byte
longs, i.e. 64-bit systems.
The command to start the script is
+ I ModuleListenOnly fvwm_periodic -u 15 -d 3 -c clock -t topproc -M mempct
in the InitFunction and the RestartFunction. The ModuleListenOnly
allows to write one way modules. They can send packets to fvwm,
but fvwm does not send them any packets.
Ciao
Dominik ^_^ ^_^
--
Dominik Vogt
#!/usr/bin/zsh
emulate zsh
setopt HUP
zmodload zsh/zselect
LC_ALL=de_DE@euro
MODULE="FvwmButtons"
IDCLOCK=""
IDMEM=""
IDPROC=""
SECS="15"
ISECS="3"
usage () {
echo "usage: module-args $0 [-c id] [-t id] [-M id] [-m module] [-u
secs] [-d delay]"
echo "Update certain button titles in FvwmButtons"
echo " module-args: filled out by fvwm when started as a module"
echo " -h: display this help message"
echo " -c buttonid: update clock at the given button id"
echo " -M buttonid: update used memory at the given button id"
echo " -t buttonid: update topproc at the given button id"
echo " -m module: name of the module [$MODULE]"
echo " -u secs: update buttons every secs seconds [$SECS]"
echo " -d secs: initial delay [$ISECS]"
}
send () {
printf \\00\\00\\00\\00\\xa0\\00\\00\\00%159s\\00\\00\\00\\00\\n "$1" \
>&$OF || exit 1
}
changebutton () {
send "SendToModule '$MODULE' ChangeButton $1"
}
update_proc () {
CM='?'
PM='?'
NM='?'
ps -A --format "%C %P %c" | {
# skip header
read
while read C P N; do
test $[CM < C] = 1 && CM="$C" && PM="$P" && NM="$N"
done
}
changebutton "'$IDPROC' Title '$PM $CM% $NM'"
}
update_mem () {
TOTAL=1
FREE=0
while read T V R; do
test x"$T" = x"MemTotal:" && TOTAL="$V" && break
done < /proc/meminfo
while read T V R; do
test x"$T" = x"MemFree:" && FREE="$V" && break
done < /proc/meminfo
PCTM="$[(100 * (TOTAL - FREE)) / TOTAL]"
changebutton "'$IDMEM' Title 'mem: ${PCTM}%'"
}
update_clock () {
T=`strftime '%R %a %d.%m.' $EPOCHSECONDS`
changebutton "'$IDCLOCK' Title '$T'"
}
#
# parse options
#
test $# -le 4 && echo "fvwm_periodic must be started by fvwm" 1>&2 && exit 1
OF="$1"
IF="$2"
shift 5
while test ! $# = 0; do
case "$1" in
-h|-\?|--help)
usage
exit 0
;;
-c|--clock)
test $# = 1 && usage && exit 1
shift
IDCLOCK="$1"
test ! x"$IDCLOCK" = x && zmodload zsh/datetime
;;
-M|--mem)
test $# = 1 && usage && exit 1
shift
IDMEM="$1"
;;
-t|--topproc)
test $# = 1 && usage && exit 1
shift
IDPROC="$1"
;;
-m|--module-name)
test $# = 1 && usage && exit 1
shift
MODULE="$1"
test x"$MODULE" = x && usage && exit 1
;;
-u|--update-secs)
test $# = 1 && usage && exit 1
shift
SECS="$1"
SECS="$[SECS]"
test "$[SECS]" -le 0 && usage && exit 1
;;
-d|--delay-secs)
test $# = 1 && usage && exit 1
shift
ISECS="$1"
ISECS="$[ISECS]"
test "$[ISECS]" -lt 0 && usage && exit 1
;;
**)
break
;;
esac
shift
done
test $# -gt 1 && usage && echo "error: unknown option $1" && exit 1
#
# main body
#
trap exit HUP INT QUIT KILL PIPE TERM
# sleep is not a builtin, so prefer zselect
test "$[ISECS > 0]" = 1 && zselect -t ${ISECS}00
while true; do
test ! x"$IDCLOCK" = x && update_clock
test ! x"$IDMEM" = x && update_mem
test ! x"$IDPROC" = x && update_proc
zselect -t ${SECS}00
done