2004-02-13 [VI] This isn't a screen saver really. It just uses the [minimalist curses] package to draw boxes of various sizes on your screen. Any keypress exits it. There's some element of randomness in how often it draws because every second it picks four coordinates. But it only draws a rectangle if those coordinates make sense. Only works on terminals that support vt100 like alt character set : true of linux, vt100 and xterm and derivatives. Any keypress exits. 2004-10-12 [VI] Changed to support [minimalist curses] changes. No more timeout and getch. See the ssaver proc for an example of non-blocking input package require curses # Order is nswe set ldc(nw) j set ldc(ne) m set ldc(se) l set ldc(sw) k set ldc(nswe) n set ldc(we) q set ldc(nse) t set ldc(nsw) u set ldc(nwe) v set ldc(swe) w set ldc(ns) x proc box {row1 col1 row2 col2} { global ldc curses attr on alt curses move $row1 $col1 curses puts $ldc(se) curses move $row2 $col1 curses puts $ldc(ne) for {set i [expr $row1 + 1] } {$i < $row2} {incr i} { curses move $i $col1 curses puts $ldc(ns) curses move $i $col2 curses puts $ldc(ns) } for {set i [expr $col1 + 1] } {$i < $col2} {incr i} { curses move $row1 $i curses puts $ldc(we) curses move $row2 $i curses puts $ldc(we) } curses move $row1 $col2 curses puts $ldc(sw) curses move $row2 $col2 curses puts $ldc(nw) } proc boxer {} { set rows [curses info lines] set cols [curses info cols] if {int(rand()*$rows) % 2 == 0} { curses attr on reverse } else { curses attr off reverse } set row1 [expr int(rand()*$rows)] set row2 [expr int(rand()*$rows)] set col1 [expr int(rand()*$cols-1)] set col2 [expr int(rand()*$cols-1)] if {$row2 - $row1 >= 2 && $col2 - $col1 >= 2} { box $row1 $col1 $row2 $col2 curses refresh } after 1000 boxer } proc ssaver {} { expr srand([clock seconds]) fconfigure stdin -buffering none -blocking 0 fileevent stdin readable {set ::done 1} set ::done 0 curses refresh; # empty the screen before we start boxer vwait ::done read stdin; # clear out input queue before exit } ssaver <>Text Screen