X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~yarrgweb/git?a=blobdiff_plain;f=ypp-chatlog-alerter;h=9db7bc61e7b3763050a653eb79a0ce5281a3bc58;hb=3fd5e41be6f4b6949e6284c08eb7059b303ccd78;hp=71a05bb9f209321e998d9258fedd81c4c2ed5a26;hpb=fc0aa4015af9e5d1e7f83ac7764841f3c9af4e43;p=ypp-sc-tools.web-live.git diff --git a/ypp-chatlog-alerter b/ypp-chatlog-alerter index 71a05bb..9db7bc6 100755 --- a/ypp-chatlog-alerter +++ b/ypp-chatlog-alerter @@ -1,41 +1,66 @@ #!/usr/bin/wish +proc manyset {list args} { + foreach val $list var $args { + upvar 1 $var my + set my $val + } +} + set progname ypp-chatlog-alerter +set height 5 -menu .mbar -tearoff 0 -foreach w {file edit} l {File Edit} { - menu .mbar.$w -tearoff 0 - .mbar add cascade -menu .mbar.$w -label $l -} proc menuent {w l a x} { set c [list .mbar.$w add command -label $l -command $x] if {[string length $a]} { lappend c -accel Command-$a } eval $c } -foreach l {Open Quit} a {O Q} x {newfile exit} { - menuent file $l $a $x -} -foreach l {Cut Copy Paste Clear} a {X C V {}} { - menuent edit $l $a [list event generate {[focus]} <<$l>>]] -} -. configure -menu .mbar - -switch -exact [tk windowingsystem] { - aqua { - set defaultfile ~/Library/Preferences/$progname.prefs +proc menus {} { + global height + + menu .mbar -tearoff 0 + foreach w {file edit} l {File Edit} { + menu .mbar.$w -tearoff 0 + .mbar add cascade -menu .mbar.$w -label $l } - x11 { - set defaultfile ~/.$progname.rc + foreach l {Open Quit} a {O Q} x {newfile exit} { + menuent file $l $a $x } - default { - error ? + foreach l {Cut Copy Paste Clear} a {X C V {}} { + menuent edit $l $a [list event generate {[focus]} <<$l>>]] } + . configure -menu .mbar +} + +proc nonportability {} { + global progname defaultfile + + switch -exact [tk windowingsystem] { + aqua { + set defaultfile ~/Library/Preferences/$progname.prefs + } + x11 { + set defaultfile ~/.$progname.rc + } + default { + error ? + } + } +} + +proc widgets {} { + global height + listbox .t -width 5 -height $height -borderwidth 0 + listbox .p -width 14 -height $height -borderwidth 0 + listbox .m -width 80 -height $height -borderwidth 0 + pack .t .p .m -side left } proc newfile {} { global currentfile defaultfile - set newfile [tk_getOpenFile -multiple 0 -title "Select YPP log to track"] + set newfile [tk_getOpenFile -multiple 0 -initialfile $currentfile \ + -title "Select YPP log to track"] if {![string length $newfile]} return set currentfile $newfile @@ -43,16 +68,111 @@ proc newfile {} { puts $newdefaults "[list set currentfile $currentfile]" close $newdefaults file rename -force $defaultfile.new $defaultfile - refresh + + #fixme refresh +} + +set lw_ls {times pirates messages} +set lw_ws {t p m} + +proc for_lw {body} { + global lw_ls lw_ws + uplevel 1 [list \ + foreach l $lw_ls \ + w $lw_ws \ + $body] +} + +set e_life 120 +set tint_switch 90 +set tint_switched [expr { exp( -($tint_switch+0.0) / $e_life ) }] + +proc retint {} { + global times e_life retint_after otherevent + catch { after cancel $retint_after } + set i 0 + set now [clock seconds] + set latest $otherevent + foreach time $times { + set latest [expr { $time > $latest ? $time : $latest }] + set tint [expr { + exp( -($now >= $time ? $now-$time : 0) / $e_life ) + }] + tintentries .t $i $tint + incr i + } + set next [expr { ($now - $latest < 10 ? 10 : + $now - $latest > 3000 ? 3000 : + $now - $latest + ) * 10 }] +puts "nexting $latest $now $next" + set retint_after [after $next retint] +} + +proc tintentries {ws y tint} { + global tint_switched + #puts "$tint $tint_switched" + set yellow [format "%02x" [expr {round( 255 * + ( $tint >= $tint_switched ? $tint : 0 ) + )}]] + set black [format "%02x" [expr {round( 255 * + ( $tint >= $tint_switched ? 0 : ($tint / $tint_switched)*0.75 + 0.25 ) + )}]] + set fg [format "#${black}${black}${black}"] + set bg [format "#${yellow}${yellow}00"] + foreach w $ws { $w itemconfigure $y -foreground $fg -background $bg } } -set currentfile {} +proc clearlists {} { + global height otherevent + global times pirates messages + set currentfile {} + + for_lw { .$w delete 0 end; set $l {} } + set ntimes {} + for {set i 0} {$i<$height} {incr i} { + for_lw { lappend $l {}; .$w insert end {} } + lappend ntimes 0 + } + set times $ntimes + set otherevent [clock seconds] + retint +} + +proc showtints {} { + global e_life + set divs 20 + listbox .tints -width 60 -height [expr {$divs+1}] + for {set y 0} {$y <= $divs} {incr y} { + set tint [expr {($y+0.0)/$divs}] + .tints insert end \ + "[format "#%2d %6f %4ds" $y $tint [expr {round( + $tint > 0 ? -log($tint) * $e_life : "9999" + )}]] The quick brown fox jumped over the lazy dog" + tintentries .tints $y $tint + } + pack .tints -side bottom +} -proc refresh {} { +proc parseargs {} { + global argv + foreach arg $argv { + if {![string compare $arg --test-tints]} { + showtints + } else { + error "unknown option $arg" + } + } } +menus +nonportability +parseargs +widgets +clearlists + if {[file exists $defaultfile]} { source $defaultfile } -listbox .l +#fixme refresh