Use and : bind . {puts "Someone just iconified me."} More sophisticated programming recognizes "that toplevel bindings apply to every child widget, so you should also test that the widget '''is''' a toplevel" and also that "Unmap will also happen when you switch desktops, so you have to ... test the state": bind . {unmapper %W} proc unmapper W { if {[string equal [winfo toplevel $W] $W] && [string equal [wm state $W] iconic]} { puts "Minimizing $W." }