X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=chiark-tcl-applet.git;a=blobdiff_plain;f=applet.tcl;h=57270a245c6e4363d059df2e0485a2c0a07371cf;hp=5d9a65dc1c4fe487b8191837889d063414456028;hb=7033cfe238878b11503cc0006fe375ee9308474a;hpb=3d95f708f3791786019a008fc4b98744aa398e6b diff --git a/applet.tcl b/applet.tcl index 5d9a65d..57270a2 100644 --- a/applet.tcl +++ b/applet.tcl @@ -1,13 +1,5 @@ # General purpose code for being a tray applet -proc manyset {list args} { - foreach val $list var $args { - upvar 1 $var my - set my $val - } -} - - package require Tclx package require tktray @@ -41,13 +33,6 @@ package require tktray # menus, when an item is selected, call # applet::msel # -# Debug: -# -# Caller may call -# applet::setup-debug ON-DEBUG -# which will result in calls to [concat ON-DEBUG [list MESSAGE]] -# (or ON-DEBUG may be "" in which case messages are discarded) -# # Icon: # # Caller should call: @@ -56,25 +41,28 @@ package require tktray # # Alternatively of icon, it may provide other arrangements for # using the provided subwindow. Such a caller should call -# applet::setup-subwindow \ -# WIDTH HEIGHT DEFAULT-ORIENTATION BORDER-COLOUR BORDER-WIDTH \ -# ON-DESTROYING ON-READY +# applet::setup-subwindow ON-DESTROYING ON-READY # Then the main code will call ON-DESTROYING just before # destroying the inner window and recreating it, and # [concat ON-READY [list ORIENTATION]] # just after. The inner window to use is called .i.i.b. # +# This uses variables, in the applet namespace, +# w h border_colour border_width deforient +# These should be set before setup-subwindow is called and not +# modified thereafter. +# # The user of the subwindow machinery may call # applet::subwindow-need-recreate # if for any reason the inner window should be destroyed and recreated. # # Alternatively, it may request that a subprocess be spawned # repeatedly with the xid of a suitable window. -# applet::setup-subproc \ -# WIDTH HEIGHT DEFAULT-ORIENTATION BORDER-COLOUR BORDER-WIDTH \ -# GET-CMDLINE +# applet::setup-subproc GET-CMDLINE # Then the main code will call [concat GET_CMDLINE [list XID ORIENTATION]] # to get the command line to run. +# +# This also uses the same variables as setup-subwindow. wm withdraw . @@ -87,18 +75,6 @@ fconfigure stderr -buffering none namespace eval applet { -variable debug {} - -proc debug {m} { - variable debug - if {![llength $debug]} return - uplevel #0 $debug [list $m] -} - -proc setup-debug {d} { - variable debug $d -} - # used by both menus and tooltips variable posted 0 @@ -113,15 +89,15 @@ proc menubuttonpressed {b x y} { variable posted tooltip-cancel if {$posted == $b} { - debug "unpost $posted toggle" + debug::debug "unpost $posted toggle" .m$posted unpost set posted 0 } elseif {[winfo exists .m$b]} { if {$posted} { .m$posted unpost - debug "unpost $posted other" + debug::debug "unpost $posted other" } - debug "post $b" + debug::debug "post $b" set posted $b .m$b post $x $y } @@ -198,6 +174,7 @@ proc tooltip-show {x y} { incr y 9 wm geometry .tt +$x+$y wm deiconify .tt + raise .tt uplevel #0 $tooltip_on_vis } @@ -212,9 +189,15 @@ proc setimage {image} { variable subwindow_on_destroying variable subwindow_on_ready +variable w 50 +variable h 50 +variable deforient horizontal +variable border_colour darkblue +variable border_width 1 + proc subwindow-need-recreate {} { variable innerwindow_after - debug "IW-EVENT" + debug::debug "IW-EVENT" if {[info exists innerwindow_after]} return set innerwindow_after [after idle applet::innerwindow-resetup] } @@ -223,12 +206,12 @@ proc innerwindow-resetup {} { variable innerwindow_after variable subwindow_on_destroying variable subwindow_on_ready - variable subwindow_border_colour - variable subwindow_border_width - variable subwindow_default_orientation + variable border_colour + variable border_width + variable deforient unset innerwindow_after - debug RESETUP + debug::debug RESETUP if {![winfo exists .i.i]} return destroy [frame .i.i.make-exist] @@ -237,24 +220,23 @@ proc innerwindow-resetup {} { catch { destroy .i.i.b } set orientation [.i orientation] - debug "orientation $orientation" + debug::debug "orientation $orientation" if {![string compare $orientation unknown]} { - set orientation $subwindow_default_orientation + set orientation $deforient } .i configure -image applet::innerwindow-ph-$orientation - frame .i.i.b -background darkblue -bd 1 + frame .i.i.b -background $border_colour -bd $border_width pack .i.i.b -fill both -side left -expand 1 uplevel #0 $subwindow_on_ready [list $orientation] } -proc setup-subwindow { - w h default_orientation border_colour border_width on_destroying on_ready -} { - foreach v { - default_orientation border_width border_colour on_destroying on_ready - } { +proc setup-subwindow {on_destroying on_ready} { + variable w + variable h + + foreach v {on_destroying on_ready} { variable subwindow_$v [set $v] } @@ -274,15 +256,14 @@ proc setup-subwindow { variable subproc none variable ratelimit {} -proc setup-subproc {w h deforient border_colour border_width get_cmdline} { +proc setup-subproc {get_cmdline} { variable subproc_get_cmdline $get_cmdline - setup-subwindow $w $h $deforient $border_colour $border_width \ - applet::subproc-destroying applet::subproc-ready + setup-subwindow applet::subproc-destroying applet::subproc-ready } proc subproc-destroying {} { variable subproc - debug "DESTROYING $subproc" + debug::debug "DESTROYING $subproc" catch { destroy .i.i.b.c } @@ -296,7 +277,7 @@ proc subproc-destroying {} { proc subproc-ready {orientation} { variable subproc variable subproc_orientation $orientation - debug "READY $subproc" + debug::debug "READY $subproc" frame .i.i.b.c -container 1 -background orange pack .i.i.b.c -fill both -side left -expand 1 @@ -312,7 +293,7 @@ proc subproc-ready {orientation} { error "unexpected state $subproc" } } - debug "READY-done $subproc" + debug::debug "READY-done $subproc" } proc run-child {} { @@ -324,14 +305,14 @@ proc run-child {} { set id [winfo id .i.i.b.c] set cmd [uplevel #0 $subproc_get_cmdline [list $id $subproc_orientation]] - debug "RUN-CHILD $subproc" + debug::debug "RUN-CHILD $subproc" set now [clock seconds] lappend ratelimit $now while {[lindex $ratelimit 0] < {$now - 10}} { set ratelimit [lrange $ratelimit 1 end] } if {[llength $ratelimit] > 10} { - debug stderr "crashing repeatedly, quitting $ratelimit" + puts stderr "crashing repeatedly, quitting $ratelimit" exit 127 } @@ -339,11 +320,11 @@ proc run-child {} { set subproc [subproc::fork applet::child-died { execl [lindex $cmd 0] [lrange $cmd 1 end] }] - debug "FORKED $subproc" + debug::debug "FORKED $subproc" } proc child-died {how how2} { - debug "DIED $how $how2" + debug::debug "DIED $how $how2" variable subproc switch -exact $subproc { old {