Version 0 of A little bar graph

Updated 2004-10-06 18:55:30

Here is a small app which sits on the root window and displays a bar graph and numerical percentage. The default display is my usage: displaying percentage of swap space used on FreeBSD.

 #!/bin/sh
 # \
 exec wish "$0" -- "$@"

 set orient h
 set geom 150x25+[expr {[winfo vrootwidth .] - 150}]+[expr {[winfo vrootheight .] - 25}]
 array set colors "0 white"
 set interval 5000
 set command {[string trimright [lindex [exec pstat -s] 10] %]}
 set from 0
 set to 100
 set background black
 set foreground white
 set label 1
 set font ""

 proc ref {} {
    global tag rect orient interval command to from geom
    eval set data $command
    if {$orient == "h"} {set w [winfo width .c]} elseif {$orient == "v"} {set w [winfo height .c]}
    set size [expr ($data - $from.00) / ($to.00 - $from.00)]
    set per [expr {round($size * 100)}]
    set size [expr $size * $w.00]
    .l configure -text ${per}%
    .c itemconfigure $tag -fill [getcolor $per]
    eval .c coords $tag $rect
    after $interval ref
 }

 proc getcolor {num} {
    global colors colorn
    foreach x $colorn {
        if {$x <= $num} {break}
        set ret $x
    }
    return $colors($x)
 }

 proc ParseCommandline { } {
    global argv argc
    set num 0
    while {[set tmp [lrange $argv $num end]] != ""} {
        switch -glob -- [lindex $tmp 0] {
            -geometry {
                global geom
                set geom [lindex $tmp 1]
                incr num 2
            }
            -colors {
                global colors
                array set colors [lindex $tmp 1]
                incr num 2
            }
            -orient {
                global orient
                set orient [lindex $tmp 1]
                incr num 2
            }
            -from {
                global from
                set from [lindex $tmp 1]
                incr num 2
            }
            -to {
                global to
                set to [lindex $tmp 1]
                incr num 2
            }
            -foreground {
                global foreground
                set foreground [lindex $tmp 1]
                incr num 2
            }
            -background {
                global background
                set background [lindex $tmp 1]
                incr num 2
            }
            -command {
                global command
                eval set command \"[lindex $tmp 1]\"
                incr num 2
            }
            -interval {
                global interval
                set interval [lindex $tmp 1]
                incr num 2
            }
            -label {
                global label
                set label 0
                incr num 1
            }
            -font {
                global font
                set font [lindex $tmp 1]
                incr num 2
            }
            -* {
                puts stderr "Unknown option [lindex $tmp 0]"
                exit
            }
            default {
                puts stderr "Too many arguments"
                exit
            }
        }
    }
 }

 ParseCommandline

 wm withdraw .
 . configure -borderwidth 0 -highlightthickness 0 -takefocus 0 -background ""
 wm title . xswapinfo
 wm geometry . $geom
 wm overrideredirect . 1
 update idletasks
 canvas .c -bg $background -borderwidth 0 -highlightthickness 0
 label .l -bg $background -fg $foreground -text 0%
 if {$font != ""} {
    .l configure -font $font
 }
 if {$orient == "h"} {
    if $label {pack .l -side left -fill both}
    pack .c -side right -expand 1 -fill both
    set rect "-1 -1 \$size \[winfo height .c\]"
 } elseif {$orient == "v"} {
    if $label {pack .l -side bottom -fill both}
    pack .c -side top -expand 1 -fill both
    set rect "-1 \[winfo height .c\] \[winfo width .c\] \[expr \[winfo height .c\] - \$size\]"
 }
 set colorn [lsort -integer -decreasing [array names colors]]
 set size 0
 update idletasks
 wm deiconify .
 set tag [eval .c create rectangle $rect]
 ref