initial commit of bin scripts into git

This commit is contained in:
2023-11-08 13:38:19 +11:00
commit 3735eea3c6
113 changed files with 11631 additions and 0 deletions

786
blp Executable file
View File

@@ -0,0 +1,786 @@
#!/bin/sh
# The next line restarts using wish \
exec wish $0 ${1+"$@"}
proc biffUpdateBLP {} {
global no_mail_im opt
killAfters checkMail
.l conf -image $no_mail_im
after $opt(biff_interval) checkMail
}
proc biffErr {} {
global dead_mail_im opt
.l conf -image $dead_mail_im
after [expr {5*$opt(biff_interval)}] checkMail
return
}
proc killAfters {cmd} {
foreach afters [after info] {
foreach a $afters {
if { [lindex [after info $a] 0] == $cmd } { after cancel $a }
}
}
}
proc checkMail {} {
global no_mail_im new_mail_im opt beeped_at old_interval
killAfters checkMail
if { [catch {exec $opt(biff_ping) $opt(biff_mailhost) $opt(biff_pingopts)} err] } { biffErr ; return }
# if msgchk returns 1, then no mail is unread
if { [catch {exec $opt(biff_msgchk)} ret] } {
.l conf -image $no_mail_im
set opt(biff_interval) $old_interval
set sz 0
set beeped_at 0
} else {
scan $ret "You have %d messages" sz
if { $opt(beep_always) } {
if { $sz > $beeped_at } {
bell
after 200 bell
set beeped_at $sz
}
}
if { [.l cget -image ] != "$new_mail_im" } {
bell
after 200 bell
.l conf -image $new_mail_im
}
}
after $opt(biff_interval) checkMail
}
proc startExmh cmd {
global Biff opt CMD
set CMD $cmd
set Exmh_exists 0
foreach app_name [winfo interps] { if {$app_name == "exmh"} { set Exmh_exists 1 } }
if { $Exmh_exists == 0 } {
.l conf -cursor watch
update
if { [ catch { eval exec $opt(biff_exmh) & } errtxt ] } {
BlpError $errtxt ; return
}
after 1000 {
global CMD
set Exmh_isup 0
while { ! $Exmh_isup } {
foreach app_name [winfo interps] { if {$app_name == "exmh-bg"} { set Exmh_isup 1 } }
after 1000
}
.l conf -cursor ""
eval $CMD
}
return
}
eval $cmd
}
proc blpUsage {op} {
puts "invalid option: $op"
puts "Usage: blp \[+biff\] \[+load\] \[+printQ\] \[+sensor\]"
# Every 120 seconds (2 minutes)
puts " -biff_i/-biff_interval <interval between checks> \[120000\]"
puts " -biff_bg/-biff_background <bg color> \[mediumblue\]"
puts " -biff_ping <ping command> \[/usr/sbin/ping\]"
puts " -biff_pingopts <options to ping> \[5\]"
puts " -biff_exmh <exmh command> \[/home/ddp/bin/exmh\]"
puts " -biff_msgchk <msgchk command> \[/opt/local/mh/msgchk\]"
puts " -biff_mailhost <pop mail host> \[mail-g.deakin.edu.au\]"
puts " -whoami <whoami command> \[/opt/gnu/bin/whoami\]"
puts " -beep_always <boolean> \[0\]"
# Every 20 seconds
puts " -load_i/-load_interval <interval between checks> \[20000\]"
puts " -load_bg/-load_background <bg color> \[white\]"
puts " -load_w/-load_width <width of load window> \[56\]"
puts " -load_uptime <uptime command> \[/opt/gnu/bin/uptime\]"
puts " -load_xterm <xterm command> \[/opt/X11/bin/xterm\]"
puts " -load_line <color of load lines> \[black\]"
puts " -load_sl/load_scale_lines <color of scale lines> \[red\]"
puts " -load_text_bg/-load_text_background <bg color behind text> \[white\]"
puts " -load_text_col <color of text> \[black\>"
puts " -print_fg/-print_foreground <bg color> \[white\>"
puts " -print_bg/-print_background <bg color> \[mediumblue\>"
puts " -print_play <play command> \[/home/ddp/bin/play\]"
puts " -print_lpq <lpq command> \[/usr/ucb/lpq\]"
puts " -print_printersfile <printersfile> \[/etc/printers.conf\]"
puts " -sensor_bg/-sensor_background <bg color> \[white\]"
puts " -sensor_text_bg/-sensor_text_background <bg color behind text> \[white\]"
puts " -sensor_text_col <color of text> \[black\]"
puts " -sensor_cpu_temp_num <temp file number> \[1\]"
puts " -sensor_mb_temp_num <temp file number> \[2\]"
puts " -sensor_line <color of temp lines> \[black\]"
puts " -sensor_sl/sensor_scale_lines <color of scale lines> \[red\]"
# Every 20 seconds
puts " -sensor_i/-sensor_interval <interval between checks> \[20000\]"
puts " -sensor_w/-sensor_width <width of sensor window> \[56\]"
exit 1
}
proc blpInit {} {
global no_mail_im new_mail_im opt beeped_at old_interval auto_path
global argc argv opt env W
global sensor
wm withdraw .
wm geometry . 48x48
set W 56
set sensor(W) $W
set opt(biff_interval) 120000
set opt(biff_bg) mediumblue
set opt(biff_ping) /usr/sbin/ping
set opt(biff_exmh) /home/ddp/bin/exmh
set opt(biff_mailhost) mail-g.deakin.edu.au
set opt(biff_pingopts) 5
set opt(biff_msgchk) /opt/local/mh/msgchk
set opt(biff_uptime) /opt/gnu/bin/uptime
set opt(whoami) /opt/gnu/bin/whoami
set opt(load_interval) 20000
set opt(load_bg) white
set opt(load_line) black
set opt(load_scale_line) red
set opt(load_text_bg) white
set opt(load_text_col) black
set opt(load_uptime) /opt/gnu/bin/uptime
set opt(load_xterm) /opt/X11/bin/xterm
set opt(print_fg) white
set opt(print_bg) mediumblue
set opt(print_play) /home/ddp/bin/play
set opt(print_lpq) /usr/ucb/lpq
set opt(print_printersfile) /etc/printers.conf
set opt(use_biff) 0
set opt(use_load) 0
set opt(use_printQ) 0
set opt(use_sensor) 0
set opt(beep_always) 0
set opt(sensor_bg) white
set opt(sensor_text_bg) white
set opt(sensor_text_col) black
set opt(sensor_cpu_temp_num) 1
set opt(sensor_mb_temp_num) 2
set opt(sensor_line) black
set opt(sensor_scale_line) red
set opt(sensor_interval) 20000
set beeped_at 0
for { set arg_cnt 0 } { $arg_cnt < $argc } { incr arg_cnt 1 } {
switch -- "[lindex $argv $arg_cnt]" {
"+biff" {set opt(use_biff) 1 }
"+load" {set opt(use_load) 1}
"+rload" {incr arg_cnt ; set rload([lindex $argv $arg_cnt]) "" }
"+printQ" {set opt(use_printQ) 1}
"+sensor" {set opt(use_sensor) 1}
"-biff_interval" -
"-biff_i" { incr arg_cnt ; set opt(biff_interval) [lindex $argv $arg_cnt] }
"-biff_bg" -
"-biff_background" { incr arg_cnt ; set opt(biff_bg) [lindex $argv $arg_cnt] }
"-biff_ping" { incr arg_cnt ; set opt(biff_ping) [lindex $argv $arg_cnt] }
"-biff_pingopts" { incr arg_cnt ; set opt(biff_pingopts) [lindex $argv $arg_cnt] }
"-biff_exmh" { incr arg_cnt ; set opt(biff_exmh) [lindex $argv $arg_cnt] }
"-biff_mailhost" { incr arg_cnt ; set opt(biff_mailhost) [lindex $argv $arg_cnt] }
"-biff_msgchk" { incr arg_cnt ; set opt(biff_msgchk) [lindex $argv $arg_cnt] }
"-whoami" { incr arg_cnt ; set opt(whoami) [lindex $argv $arg_cnt] }
"-beep_always" { incr arg_cnt ; set opt(beep_always) [lindex $argv $arg_cnt] }
"-load_interval" -
"-load_i" { incr arg_cnt ; set opt(load_interval) [lindex $argv $arg_cnt] }
"-load_width" -
"-load_w" { incr arg_cnt ; set W [lindex $argv $arg_cnt] }
"-load_bg" -
"-load_background" { incr arg_cnt ; set opt(load_bg) [lindex $argv $arg_cnt] }
"-load_line" { incr arg_cnt ; set opt(load_line) [lindex $argv $arg_cnt] }
"-load_sl" -
"-load_scale_line" { incr arg_cnt ; set opt(load_scale_line) [lindex $argv $arg_cnt] }
"-load_text_bg" -
"-load_text_background" { incr arg_cnt ; set opt(load_text_bg) [lindex $argv $arg_cnt] }
"-load_text_col" { incr arg_cnt ; set opt(load_text_col) [lindex $argv $arg_cnt] }
"-load_uptime" { incr arg_cnt ; set opt(load_uptime) [lindex $argv $arg_cnt] }
"-load_xterm" { incr arg_cnt ; set opt(load_xterm) [lindex $argv $arg_cnt] }
"-print_fg" -
"-print_foreground" { incr arg_cnt ; set opt(print_fg) [lindex $argv $arg_cnt] }
"-print_bg" -
"-print_background" { incr arg_cnt ; set opt(print_bg) [lindex $argv $arg_cnt] }
"-print_play" { incr arg_cnt ; set opt(print_play) [lindex $argv $arg_cnt] }
"-print_lpq" { incr arg_cnt ; set opt(print_lpq) [lindex $argv $arg_cnt] }
"-print_printersfile" { incr arg_cnt ; set opt(print_printersfile) [lindex $argv $arg_cnt] }
"-sensor_bg" -
"-sensor_background" { incr arg_cnt ; set opt(sensor_bg) [lindex $argv $arg_cnt] }
"-sensor_text_bg" -
"-sensor_text_background" { incr arg_cnt; set opt(sensor_text_bg) [lindex $argv $arg_cnt] }
"-sensor_text_col" { incr arg_cnt; set opt(sensor_text_col) [lindex $argv $arg_cnt] }
"-sensor_cpu_temp_num" { incr arg_cnt; set opt(sensor_cpu_temp_num) [lindex $argv $arg_cnt] }
"-sensor_mb_temp_num" { incr arg_cnt; set opt(sensor_mb_temp_num) [lindex $argv $arg_cnt] }
"-sensor_line" { incr arg_cnt ; set opt(sensor_line) [lindex $argv $arg_cnt] }
"-sensor_scale_line" { incr arg_cnt ; set opt(sensor_scale_line) [lindex $argv $arg_cnt] }
"-sensor_interval" -
"-sensor_i" { incr arg_cnt ; set opt(sensor_interval) [lindex $argv $arg_cnt] }
"-sensor_width" -
"-sensor_w" { incr arg_cnt ; set sensor(W) [lindex $argv $arg_cnt] }
default { blpUsage [lindex $argv $arg_cnt] }
}
}
foreach a [array names rload] {
puts "rload - $a"
}
if { [expr {$opt(use_biff) + $opt(use_load) + $opt(use_printQ) + $opt(use_sensor)}] == 0} {
blpUsage "No component loaded - must +biff/+load/+printQ/+sensor"
}
if { $opt(use_biff) || $opt(use_printQ) } {
package require Img
}
# Setting up vars to validate (NB: Usually external commands to exec)
set vars "whoami"
if { $opt(use_biff) } {
append vars " biff_ping biff_exmh biff_msgchk"
}
if { $opt(use_load) } {
append vars " load_uptime load_xterm"
}
if { $opt(use_printQ) } {
append vars " print_play print_lpq"
}
foreach var $vars {
if { ! [file exists $opt($var)] } {
puts stderr "FATAL: the option -$var points to an invalid executable file: '$opt($var)'"
exit -1
}
}
if { [catch { exec $opt(whoami) } opt(user) ] } {
puts stderr "FATAL: Failed to find out who you are: $opt(user)"
exit -1
}
if { $opt(use_printQ) } { wm title . printQ }
if { $opt(use_load) } { wm title . load }
if { $opt(use_sensor) } { wm title . sensor }
if { $opt(use_biff) } { wm title . biff }
}
proc biffInit {} {
global no_mail_im new_mail_im opt dead_mail_im beeped_at old_interval auto_path
global argc argv opt env
if { [wm title .] != "biff" } {
set print_win_ ".biff."
set print_win ".biff"
toplevel $biff_win
wm withdraw $biff_win
} else {
set biff_win "."
set biff_win_ "."
}
set job_on ""
set old_interval $opt(biff_interval)
set no_mail_im [image create pixmap -file /home/chrismc/lib/blp/biffno.xpm]
set new_mail_im [image create pixmap -file /home/chrismc/lib/blp/biffnew.xpm]
set dead_mail_im [image create pixmap -file /home/chrismc/lib/blp/biffdead.xpm]
. conf -bg $opt(biff_bg)
label .l -image $no_mail_im -bd 0 -bg $opt(biff_bg)
grid .l -sticky nsew
bind . <1> { startExmh checkMail }
bind . <2> { startExmh "send exmh Msg_Compose" }
bind . <3> { startExmh {send exmh Inc_Show ; send exmh "wm deiconify ." ; set old_interval $opt(biff_interval) ; set opt(biff_interval) 30000 ; after 20000 checkMail} }
checkMail
wm deiconify $biff_win
}
proc recalc_max_load {} {
global max_load load_val W
set max_load $load_val(0)
for {set i 1} {$i <= $W} {incr i} {
if { ! [info exists load_val($i) ] } {
return
}
if { $max_load < $load_val($i) } {
set max_load $load_val($i)
}
set load_val([expr {$i-1}]) $load_val($i)
}
}
proc newLimit {dir} {
global top H W opt max_load load_win_
${load_win_}c delete load_limits
if { $dir == 2 } {
${load_win_}c scale load_line 0 $H 1 0.5
} else {
${load_win_}c scale load_line 0 $H 1 2
}
set top [expr {$top*$dir}]
for { set i 1 } {$i < $top } {incr i } {
${load_win_}c create line 0 [expr {$H/$top*$i}] $W [expr {$H/$top*$i}] \
-tag load_limits -fill $opt(load_scale_line)
}
recalc_max_load
}
proc drawLoad {} {
global x top H W opt max_load load_val load_win_ crud
if { [catch {exec $opt(load_uptime)} s] } { return }
set load [string trim [lindex $s [expr {[llength $s] - 3}]] ,]
# incr crud
# if { $x < $W-2 } {
# set load 0.3
# } else {
# if { $crud < 80 } {
# set load 1.5
# } else {
# set load 0.5
# }
# }
set load_val($x) $load
${load_win_}l conf -text $load
while { $load > $top } { newLimit 2 }
while { $top > 1 && $max_load < [expr {$top/2}] } {newLimit 0.5}
if { $x == $W } {
${load_win_}c move load_line -1 0
set old_line [${load_win_}c find closest -1 $H 0 load_line]
${load_win_}c delete $old_line
incr x -1
recalc_max_load
}
${load_win_}c create line $x $H $x [expr {$H - ($load/$top*$H)}] -tags load_line -fill $opt(load_line) -fill $opt(load_line)
${load_win_}c raise load_limits
incr x
update
after $opt(load_interval) drawLoad
# puts "crud=$crud, x=$x, load=$load, top=$top"
# gets stdin
# drawLoad
}
proc loadInit {} {
global W H top x opt argc argv max_load load_win_ crud
set crud 0
if { [wm title .] != "load" } {
set load_win_ ".load."
set load_win ".load"
toplevel $load_win
wm withdraw $load_win
} else {
set load_win_ "."
set load_win "."
}
set H 40
wm geometry $load_win [expr {$W+2}]x[expr {$H+20}]
set top 1.0
set x 0
$load_win conf -bd 0 -highlightthickness 0 -bg $opt(load_bg)
canvas ${load_win_}c -bg $opt(load_bg) -bd 0 -width $W -height $H -highlightthickness 0
label ${load_win_}l -bd 1 -font fixed -highlightthickness 1 -relief sunken \
-bg $opt(load_text_bg) -highlightbackground $opt(load_text_bg) -fg $opt(load_text_col)
grid ${load_win_}c
grid ${load_win_}l
set max_load 0
bind $load_win <1> {
if { [catch {eval exec $opt(load_xterm) -T top -n top -e top & } err] } {
puts stderr "Failed to start an xterm: $err"
}
}
drawLoad
wm deiconify $load_win
}
proc sensorInit {} {
global opt sensor W
# Only create a toplevel window if there isn't one already with the correct title
if { [wm title .] != "sensor" } {
set sensor(win_) ".sensor."
set sensor(win) ".sensor"
toplevel $sensor(win)
wm withdraw $sensor(win)
} else {
set sensor(win_) "."
set sensor(win) "."
}
set sensor(H) 40
wm geometry $sensor(win) [expr {$sensor(W)+2}]x[expr {$sensor(H)+20}]
set sensor(cpu_x) 0
set sensor(cpu_top) 50.0
set sensor(mb_x) 0
set sensor(mb_top) 50.0
$sensor(win) conf -bd 0 -highlightthickness 0 -bg $opt(sensor_bg)
canvas ${sensor(win_)}c -bg $opt(sensor_bg) -bd 0 -width $sensor(W) -height $sensor(H) -highlightthickness 0
label ${sensor(win_)}l -bd 1 -highlightthickness 1 -relief sunken \
-bg $opt(sensor_text_bg) -highlightbackground $opt(sensor_text_bg) \
-fg $opt(sensor_text_col) -font {-adobe-helvetica-medium-r-normal-*-8-*-*-*-p-*-iso8859-1}
grid ${sensor(win_)}c -sticky ew
grid ${sensor(win_)}l -sticky ew
set sensor(max_cpu_temp) 0
set sensor(max_mb_temp) 0
bind $sensor(win) <1> {
tk_dialog .dialog {Meaning of lines} {The left hand number is the CPU temperature and the right hand number is the MB temperature. Generally the top line will be the CPU temperature and the bottom the MB temperature, but wierder things have been known to happen!} info 0 OK
}
# Now find the sensor chip!
set sensor(sensor_dir) [file join /proc sys dev sensors]
if { [file exists $sensor(sensor_dir)] } {
set sensor(sensor_cpu_temp_file) [glob -join /proc sys dev sensors * temp$opt(sensor_cpu_temp_num)]
set sensor(sensor_mb_temp_file) [glob -join /proc sys dev sensors * temp$opt(sensor_mb_temp_num)]
} else {
BlpError "Can't find sensors directory in /proc file system"
destroy $sensor(win)
return
}
# Draw the 15, 20, 25, 30, 35 and 40 degree lines
# NB: Lines are in reverse. 0,0 is the top left, so the lines are going down!
set dash_pat .
set y [expr {$sensor(H) - (15/$sensor(cpu_top)*$sensor(H))}]
${sensor(win_)}c create line 0 $y $sensor(W) $y -tag sensor_limits -fill $opt(sensor_scale_line) -dash $dash_pat
# set y [expr {$sensor(H) - (20/$sensor(cpu_top)*$sensor(H))}]
# ${sensor(win_)}c create line 0 $y $sensor(W) $y -tag sensor_limits -fill $opt(sensor_scale_line) -dash $dash_pat
set y [expr {$sensor(H) - (25/$sensor(cpu_top)*$sensor(H))}]
${sensor(win_)}c create line 0 $y $sensor(W) $y -tag sensor_limits -fill $opt(sensor_scale_line) -dash $dash_pat
# set y [expr {$sensor(H) - (30/$sensor(cpu_top)*$sensor(H))}]
# ${sensor(win_)}c create line 0 $y $sensor(W) $y -tag sensor_limits -fill $opt(sensor_scale_line) -dash $dash_pat
set y [expr {$sensor(H) - (35/$sensor(cpu_top)*$sensor(H))}]
${sensor(win_)}c create line 0 $y $sensor(W) $y -tag sensor_limits -fill $opt(sensor_scale_line) -dash $dash_pat
# set y [expr {$sensor(H) - (40/$sensor(cpu_top)*$sensor(H))}]
# ${sensor(win_)}c create line 0 $y $sensor(W) $y -tag sensor_limits -fill $opt(sensor_scale_line) -dash $dash_pat
set opt(sensor_line,41) red
set opt(sensor_line,40) orange
set opt(sensor_line,39) yellow
set opt(sensor_line,35) green
set opt(sensor_line,30) blue
drawTemp
wm deiconify $sensor(win)
}
proc sensor_read { sensor_file } {
if { [catch {open $sensor_file r} f] } {
BlpError $f
return
}
set val [read $f]
close $f
return $val
}
proc drawTemp {} {
global opt sensor
set cpu_temp [sensor_read $sensor(sensor_cpu_temp_file)]
set mb_temp [sensor_read $sensor(sensor_mb_temp_file)]
if { ![regexp {[0-9]+\.[0-9]\s([0-9]+\.[0-9])\s([0-9]+\.[0-9])} $cpu_temp m sensor(cpu_top) sensor(curr_cpu_temp)] } {
BlpError "regexp for temperature didn't work :("
return
}
if { ![regexp {[0-9]+\.[0-9]\s([0-9]+\.[0-9])\s([0-9]+\.[0-9])} $mb_temp m sensor(mb_top) sensor(curr_mb_temp)] } {
BlpError "regexp for temperature didn't work :("
return
}
set sensor(cpu_val,$sensor(cpu_x)) $sensor(curr_cpu_temp)
set sensor(mb_val,$sensor(mb_x)) $sensor(curr_mb_temp)
${sensor(win_)}l conf -text "$sensor(curr_cpu_temp)<29> $sensor(curr_mb_temp)<29>"
set sensor(curr_cpu_temp) [format %.1f [expr ($sensor(curr_cpu_temp)-30)*3 ]]
set sensor(curr_mb_temp) [format %.1f [expr ($sensor(curr_mb_temp)-30)*3 ]]
# while { $sensor(curr_cpu_temp) > $sensor(cpu_top) } { newSensorLimit 2 cpu }
# while { $sensor(cpu_top) > 1 && $sensor(max_temp) < [expr {$sensor(cpu_top)/2}] } {newSensorLimit 0.5 cpu }
# If we have reached the RHS then move the lines to the left by 1 pixel.
if { $sensor(cpu_x) == $sensor(W) } {
move_line cpu
}
if { $sensor(mb_x) == $sensor(W) } {
move_line mb
}
draw_line cpu
draw_line mb
${sensor(win_)}c raise sensor_limits
incr sensor(cpu_x)
incr sensor(mb_x)
update
after $opt(sensor_interval) drawTemp
}
proc move_line { what } {
global sensor
${sensor(win_)}c move sensor_${what}_line -1 0
# Didn't seem to find the correct "line" to select
# set old_line [${sensor(win_)}c find closest -1 $sensor(H) 0 sensor_${what}_line]
set old_line [${sensor(win_)}c find overlapping -1 $sensor(H) -1 [expr {$sensor(H) - ($sensor(curr_${what}_temp)/$sensor(${what}_top)*$sensor(H))}]]
${sensor(win_)}c delete $old_line
incr sensor(${what}_x) -1
recalc_max_temp ${what}
}
proc draw_line { what } {
global opt sensor
# Changed to draw a horizontal line
set x $sensor(${what}_x)
set y [expr {$sensor(H) - ($sensor(curr_${what}_temp)/$sensor(${what}_top)*$sensor(H))}]
if { $x > 0 } {
if { $sensor(${what}_val,$sensor(${what}_x)) > 40 } {
set col $opt(sensor_line,40)
} elseif { $sensor(${what}_val,$sensor(${what}_x)) > 35 } {
set col $opt(sensor_line,35)
} elseif { $sensor(${what}_val,$sensor(${what}_x)) > 30 } {
set col $opt(sensor_line,30)
} elseif { $sensor(${what}_val,$sensor(${what}_x)) > 25 } {
set col $opt(sensor_line,25)
} elseif { $sensor(${what}_val,$sensor(${what}_x)) > 20 } {
set col $opt(sensor_line,20)
} else {
set col $opt(sensor_line)
}
${sensor(win_)}c create line [expr $x - 1] $sensor(y_${what}_prev) $x $y -tags sensor_${what}_line -fill $opt(sensor_line) -fill $col
}
set sensor(y_${what}_prev) [expr {$sensor(H) - ($sensor(curr_${what}_temp)/$sensor(${what}_top)*$sensor(H))}]
}
proc newSensorLimit {dir what} {
global opt sensor
${sensor(win_)}c delete sensor_limits
if { $dir == 2 } {
${sensor(win_)}c scale sensor_${what}_line 0 $sensor(H) 1 0.5
} else {
${sensor(win_)}c scale sensor_${what}_line 0 $sensor(H) 1 2
}
set sensor(${what}_top) [expr {$sensor(${what}_top)*$dir}]
# Scale lines
for { set i 1 } { $i < $sensor(${what}_top) } { incr i } {
${sensor(win_)}c create line 0 [expr {$sensor(H)/$sensor(${what}_top)*$i}] $sensor(W) [expr {$sensor(H)/$sensor(${what}_top)*$i}] \
-tag sensor_limits -fill $opt(sensor_scale_line)
}
recalc_max_temp $what
}
proc recalc_max_temp { what } {
global sensor
set sensor(max_${what}_temp) $sensor(${what}_val,0)
for {set i 1} {$i <= $sensor(W)} {incr i} {
if { ! [info exists sensor(${what}_val,$i) ] } {
return
}
if { $sensor(max_${what}_temp) < $sensor(${what}_val,$i) } {
set sensor(max_${what}_temp) $sensor(${what}_val,$i)
}
set sensor(${what}_val,[expr {$i-1}]) $sensor(${what}_val,$i)
}
}
proc printSuccess {} {
global opt printer job_on tries checks
global emp_im print_win_ OLD
set OLD 0
${print_win_}toplab conf -text "Job Done!"
if { [catch {eval exec $opt(print_play) /home/chrismc/lib/cricket/woohoo.au &} err] } {
puts stderr "Failed to start an xterm: $err"
return;
}
killAfters checkQ
${print_win_}pic conf -image $emp_im
}
proc checkQ {} {
global opt printer job_on tries checks OLD
global dead_print_im emp_im full_im print_win_ first_job
incr tries
if { $tries == 5 } {
${print_win_}toplab conf -text "Timed Out"
return
}
killAfters checkQ
if { [catch { exec $opt(print_lpq) -P$printer } result] } {
${print_win_}pic conf -image $dead_print_im
after 3000 checkQ
return
}
set valid_line 0
catch {
unset first_job
unset NEW
}
foreach line [split [string trim $result "\n"] "\n"] {
if { [regexp -- "^-+" $line m] } {
set valid_line 1
continue
} elseif { $valid_line } {
scan [string range $line 0 12] "%s" owner
scan [string range $line 12 28] "%s" status
scan [string range $line 45 55] "%d" job
if { $opt(user) == $owner } {
set NEW($job) $valid_line
set job_on $printer
if { ![info exists first_job] } {
set first_job $valid_line
if { $valid_line == "1" } {
if { $status == "Printing" } { set first_job "active" }
}
}
set last_job $valid_line
}
incr valid_line
}
}
${print_win_}toplab conf -text ""
if { [array exists NEW] } {
${print_win_}pic conf -image $full_im
if { [array size NEW] == 1 } {
${print_win_}toplab conf -text "job $first_job"
} else {
${print_win_}toplab conf -text "1st: $first_job\nLast: $last_job"
}
set tries 0
} else {
if { $OLD && $job_on == $printer } {
printSuccess
return
}
${print_win_}toplab conf -text "Check $checks"
${print_win_}pic conf -image $emp_im
}
after 3000 checkQ
if { [array exists NEW] } { set OLD 1 }
incr checks
update
}
proc createMenu {} {
global printer print_win_ dead_print_im opt
menu ${print_win_}m -tearoff 0
${print_win_}m add command -label "Hide Menu" -command { ${print_win_}m unpost }
${print_win_}m add separator
if { [catch { open $opt(print_printersfile) r } f ] } {
puts stderr "failed to get list of printers: $f"
${print_win_}pic conf -image $dead_print_im
return
}
set data [read $f]
close $f
foreach pr [ split $data "\n" ] {
if { [ regexp {(^[^:\t ]+):} $pr m pn ] == 1 } {
${print_win_}m add radiobutton -label $pn -variable printer
}
}
}
proc printerChanged {name element type} {
global print_win_
upvar $name x
set tmp [string range $x 3 end]
if { [string length $tmp] > 7 } {
set tmp [string range $tmp 0 7]
${print_win_}l conf -text "$tmp"
} else {
${print_win_}l conf -text "$tmp"
}
}
proc Menu {} {
global print_win_ print_win
if { [winfo ismapped ${print_win_}m] } {
${print_win_}m unpost
} else {
${print_win_}m post [expr {[winfo rootx $print_win]+20}] [winfo rooty $print_win]
}
}
proc printQInit {} {
global env auto_path printer job_on opt OLD
global dead_print_im emp_im full_im print_win_ print_win
if { [wm title .] != "sensor" } {
set print_win_ ".printQ."
set print_win ".printQ"
toplevel $print_win
wm withdraw $print_win
} else {
set print_win "."
set print_win_ "."
}
set job_on ""
set printer "cm_lw"
set OLD 0
trace variable printer w printerChanged
set emp_im [image create pixmap -file /home/chrismc/lib/blp/print_emp.xpm]
set full_im [image create pixmap -file /home/chrismc/lib/blp/print_full.xpm]
set dead_print_im [image create pixmap -file /home/chrismc/lib/blp/print_dead.xpm]
label ${print_win_}toplab -text "" -font "*-r-*--10-*" -highlightthickness 0 -bd 0 \
-fg $opt(print_fg) -bg $opt(print_bg)
label ${print_win_}pic -image $emp_im -highlightthickness 0 -bd 0 -bg $opt(print_bg)
label ${print_win_}l -text "lw" -font "*-r-*--10-*" -highlightthickness 0 -bd 0 \
-fg $opt(print_fg) -bg $opt(print_bg)
grid ${print_win_}toplab -sticky nsew
grid ${print_win_}pic -sticky nsew
grid ${print_win_}l -sticky nsew
grid columnconfigure $print_win 0 -weight 1
grid rowconfigure $print_win 0 -weight 1
grid rowconfigure $print_win 1 -weight 1
grid rowconfigure $print_win 2 -weight 1
createMenu
bind $print_win <1> {
${print_win_}toplab conf -text ""
set checks 0
set tries 0
checkQ
}
bind $print_win <3> Menu
bind $print_win <2> {
killAfters checkQ
${print_win_}toplab conf -text ""
${print_win_}pic conf -image $emp_im
}
wm deiconify $print_win
}
proc BlpError {str} { tk_dialog .d {Blp Error} "$str" error 0 "OK" }
blpInit
if { $opt(use_biff) } { biffInit }
if { $opt(use_load) } { loadInit }
if { $opt(use_printQ) } { printQInit }
if { $opt(use_sensor) } { sensorInit }