+#----- subwindow -----
+
+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"
+ if {[info exists innerwindow_after]} return
+ set innerwindow_after [after idle applet::innerwindow-resetup]
+}
+
+proc innerwindow-resetup {} {
+ variable innerwindow_after
+ variable subwindow_on_destroying
+ variable subwindow_on_ready
+ variable border_colour
+ variable border_width
+ variable deforient
+ unset innerwindow_after
+
+ debug RESETUP
+
+ if {![winfo exists .i.i]} return
+ destroy [frame .i.i.make-exist]
+
+ uplevel #0 $subwindow_on_destroying
+ catch { destroy .i.i.b }
+
+ set orientation [.i orientation]
+ debug "orientation $orientation"
+ if {![string compare $orientation unknown]} {
+ set orientation $deforient
+ }
+ .i configure -image applet::innerwindow-ph-$orientation
+
+ 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 {on_destroying on_ready} {
+ variable w
+ variable h
+
+ foreach v {on_destroying on_ready} {
+ variable subwindow_$v [set $v]
+ }
+
+ image create photo applet::innerwindow-ph-horizontal -width $w -height 2
+ image create photo applet::innerwindow-ph-vertical -width 2 -height $h
+ .i configure -image applet::innerwindow-ph-horizontal
+
+ destroy [frame .i.make-exist]
+ destroy [frame .i.i.make-exist]
+ bind .i <<IconConfigure>> {
+ applet::subwindow-need-recreate
+ }
+}
+
+#----- subprocess -----
+
+variable subproc none
+variable ratelimit {}
+
+proc setup-subproc {get_cmdline} {
+ variable subproc_get_cmdline $get_cmdline
+ setup-subwindow applet::subproc-destroying applet::subproc-ready
+}
+
+proc subproc-destroying {} {
+ variable subproc
+ debug "DESTROYING $subproc"
+
+ catch { destroy .i.i.b.c }
+
+ switch -exact $subproc {
+ none { }
+ old { }
+ default { kill $subproc; set subproc old }