-#!/usr/bin/wish8.4
+#!/usr/bin/wish8.4 -f
+# -*- Tcl -*-
-#----- general machinery -----
+source applet.tcl
-package require tktray
-
-wm withdraw .
-
-tktray::icon .i -class example
-.i configure -docked 1
-
-set posted 0
+#----- specifics -----
-foreach b {1 3} {
- menu .m$b -tearoff 0
-}
+.m1 add command -command { msel; puts hi } -label hi
+.m3 add command -command { msel; puts boo } -label boo
-proc pressed {b x y} {
- global posted
- tooltip_cancel
- if {$posted == $b} {
- puts "unpost $posted toggle"
- .m$posted unpost
- set posted 0
- } elseif {[winfo exists .m$b]} {
- if {$posted} {
- .m$posted unpost
- puts "unpost $posted other"
- }
- puts "post $b"
- set posted $b
- .m$b post $x $y
- }
-}
+image create bitmap ims -file gs_s.xbm
+#image create bitmap ims -file /usr/share/ghostscript/8.71/lib/gs_s.xbm
+#setimage ims
+#setimage ims
-proc msel {} {
- global posted
- set posted 0
-}
+setuptooltip
+settooltip "line\nanother"
-bind .i <ButtonPress> { pressed %b %X %Y }
+fconfigure stdout -buffering line
-proc tooltip_starttimer {state x y} {
- global tooltip_after posted tooltip_inwindow
- if {$state || $posted || !$tooltip_inwindow} { tooltip_cancel; return }
- catch { after cancel $tooltip_after }
- set tooltip_after [after 500 tooltip_show $x $y]
-}
+set status none
-proc tooltip_cancel {} {
- global tooltip_after
- catch { after cancel $tooltip_after }
- catch { unset $tooltip_after }
- wm withdraw .tt
+proc innerwindow-destroying {} {
+ global status
+ puts "DESTROYING $status"
+ switch -exact $status {
+ none { }
+ old { }
+ default { kill $status; set status old }
+ }
}
-set tooltip_inwindow 0
-
-proc tooltip_enter {state x y} {
- global tooltip_inwindow
- set tooltip_inwindow 1
- tooltip_starttimer $state $x $y
+proc innerwindow-ready {} {
+ global status
+ puts "READY $status"
+ switch -exact $status {
+ none {
+ run-child
+ }
+ old {
+ # wait for it to die
+ }
+ default {
+ error "unexpected state $status"
+ }
+ }
+ puts "READY-done $status"
}
-proc tooltip_leave {} {
- global tooltip_inwindow
- set tooltip_inwindow 0
- tooltip_cancel
-}
+set ratelimit 0
-proc setuptooltip {} {
- bind .i <Enter> { tooltip_enter %s %X %Y }
- bind .i <Leave> { tooltip_leave }
- bind .i <ButtonRelease> { tooltip_cancel; tooltip_starttimer %s %X %Y }
- bind .i <Motion> { tooltip_starttimer %s %X %Y }
- toplevel .tt -background black
- wm withdraw .tt
- wm overrideredirect .tt 1
- label .tt.t -justify left -background {#EEE1B3}
- pack .tt.t -padx 1 -pady 1
- settooltip {}
-}
+proc run-child {} {
+ global status ratelimit
-proc settooltip {s} {
- .tt.t configure -text $s
-}
+ puts "RUN-CHILD $status"
+ set now [clock seconds]
+ lappend ratelimit $now
+ while {[lindex $ratelimit 0] < {$now - 10}} {
+ set ratelimit [lrange $ratelimit 1 end]
+ }
+ if {[llength $ratelimit] > 10} {
+ puts stderr "crashing repeatedly, quitting $ratelimit"
+ exit 127
+ }
-proc tooltip_show {x y} {
- incr x 9
- incr y 9
- wm geometry .tt +$x+$y
- wm deiconify .tt
+ set status none
+ set status [fork-then child-died {
+ execl xacpi-simple [list -into [winfo id .i.i.b.c]]
+ }]
+ puts "FORKED $status"
}
-proc setimage {image} {
- .i configure -image $image
+proc child-died {how how2} {
+ puts "DIED $how $how2"
+ global status
+ switch -exact $status {
+ old {
+ set status none
+ run-child
+ }
+ default {
+ set status none
+ innerwindow-resetup-required "child died"
+ }
+ }
}
-#----- specifics -----
-
-.m1 add command -command { msel; puts hi } -label hi
-.m3 add command -command { msel; puts boo } -label boo
-
-image create bitmap ims -file /usr/share/ghostscript/8.71/lib/gs_s.xbm
-setimage ims
-
-setuptooltip
-settooltip "line\nanother"
+setupinnerwindow 40