Spaces:
Runtime error
Runtime error
| # msgbox.tcl -- | |
| # | |
| # Implements messageboxes for platforms that do not have native | |
| # messagebox support. | |
| # | |
| # Copyright (c) 1994-1997 Sun Microsystems, Inc. | |
| # | |
| # See the file "license.terms" for information on usage and redistribution | |
| # of this file, and for a DISCLAIMER OF ALL WARRANTIES. | |
| # | |
| # Ensure existence of ::tk::dialog namespace | |
| # | |
| namespace eval ::tk::dialog {} | |
| image create bitmap ::tk::dialog::b1 -foreground black \ | |
| -data "#define b1_width 32\n#define b1_height 32 | |
| static unsigned char q1_bits[] = { | |
| 0x00, 0xf8, 0x1f, 0x00, 0x00, 0x07, 0xe0, 0x00, 0xc0, 0x00, 0x00, 0x03, | |
| 0x20, 0x00, 0x00, 0x04, 0x10, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x10, | |
| 0x04, 0x00, 0x00, 0x20, 0x02, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x40, | |
| 0x01, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x80, | |
| 0x01, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x80, | |
| 0x01, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x40, | |
| 0x04, 0x00, 0x00, 0x20, 0x08, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x08, | |
| 0x60, 0x00, 0x00, 0x04, 0x80, 0x03, 0x80, 0x03, 0x00, 0x0c, 0x78, 0x00, | |
| 0x00, 0x30, 0x04, 0x00, 0x00, 0x40, 0x04, 0x00, 0x00, 0x40, 0x04, 0x00, | |
| 0x00, 0x80, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x06, 0x00, | |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};" | |
| image create bitmap ::tk::dialog::b2 -foreground white \ | |
| -data "#define b2_width 32\n#define b2_height 32 | |
| static unsigned char b2_bits[] = { | |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x1f, 0x00, 0x00, 0xff, 0xff, 0x00, | |
| 0xc0, 0xff, 0xff, 0x03, 0xe0, 0xff, 0xff, 0x07, 0xf0, 0xff, 0xff, 0x0f, | |
| 0xf8, 0xff, 0xff, 0x1f, 0xfc, 0xff, 0xff, 0x3f, 0xfc, 0xff, 0xff, 0x3f, | |
| 0xfe, 0xff, 0xff, 0x7f, 0xfe, 0xff, 0xff, 0x7f, 0xfe, 0xff, 0xff, 0x7f, | |
| 0xfe, 0xff, 0xff, 0x7f, 0xfe, 0xff, 0xff, 0x7f, 0xfe, 0xff, 0xff, 0x7f, | |
| 0xfe, 0xff, 0xff, 0x7f, 0xfc, 0xff, 0xff, 0x3f, 0xfc, 0xff, 0xff, 0x3f, | |
| 0xf8, 0xff, 0xff, 0x1f, 0xf0, 0xff, 0xff, 0x0f, 0xe0, 0xff, 0xff, 0x07, | |
| 0x80, 0xff, 0xff, 0x03, 0x00, 0xfc, 0x7f, 0x00, 0x00, 0xf0, 0x07, 0x00, | |
| 0x00, 0xc0, 0x03, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x80, 0x03, 0x00, | |
| 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, | |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};" | |
| image create bitmap ::tk::dialog::q -foreground blue \ | |
| -data "#define q_width 32\n#define q_height 32 | |
| static unsigned char q_bits[] = { | |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x07, 0x00, | |
| 0x00, 0x10, 0x0f, 0x00, 0x00, 0x18, 0x1e, 0x00, 0x00, 0x38, 0x1e, 0x00, | |
| 0x00, 0x38, 0x1e, 0x00, 0x00, 0x10, 0x0f, 0x00, 0x00, 0x80, 0x07, 0x00, | |
| 0x00, 0xc0, 0x01, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, | |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0xe0, 0x01, 0x00, | |
| 0x00, 0xe0, 0x01, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};" | |
| image create bitmap ::tk::dialog::i -foreground blue \ | |
| -data "#define i_width 32\n#define i_height 32 | |
| static unsigned char i_bits[] = { | |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |
| 0x00, 0xe0, 0x01, 0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0xf0, 0x03, 0x00, | |
| 0x00, 0xe0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |
| 0x00, 0xf8, 0x03, 0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0xe0, 0x03, 0x00, | |
| 0x00, 0xe0, 0x03, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x00, 0xe0, 0x03, 0x00, | |
| 0x00, 0xe0, 0x03, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x00, 0xf0, 0x07, 0x00, | |
| 0x00, 0xf8, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};" | |
| image create bitmap ::tk::dialog::w1 -foreground black \ | |
| -data "#define w1_width 32\n#define w1_height 32 | |
| static unsigned char w1_bits[] = { | |
| 0x00, 0x80, 0x01, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x20, 0x04, 0x00, | |
| 0x00, 0x10, 0x04, 0x00, 0x00, 0x10, 0x08, 0x00, 0x00, 0x08, 0x08, 0x00, | |
| 0x00, 0x08, 0x10, 0x00, 0x00, 0x04, 0x10, 0x00, 0x00, 0x04, 0x20, 0x00, | |
| 0x00, 0x02, 0x20, 0x00, 0x00, 0x02, 0x40, 0x00, 0x00, 0x01, 0x40, 0x00, | |
| 0x00, 0x01, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x01, | |
| 0x40, 0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x02, | |
| 0x20, 0x00, 0x00, 0x04, 0x10, 0x00, 0x00, 0x04, 0x10, 0x00, 0x00, 0x08, | |
| 0x08, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x10, 0x04, 0x00, 0x00, 0x10, | |
| 0x04, 0x00, 0x00, 0x20, 0x02, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0x40, | |
| 0x01, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x20, | |
| 0xfc, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00};" | |
| image create bitmap ::tk::dialog::w2 -foreground yellow \ | |
| -data "#define w2_width 32\n#define w2_height 32 | |
| static unsigned char w2_bits[] = { | |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0xc0, 0x03, 0x00, | |
| 0x00, 0xe0, 0x03, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0xf0, 0x07, 0x00, | |
| 0x00, 0xf0, 0x0f, 0x00, 0x00, 0xf8, 0x0f, 0x00, 0x00, 0xf8, 0x1f, 0x00, | |
| 0x00, 0xfc, 0x1f, 0x00, 0x00, 0xfc, 0x3f, 0x00, 0x00, 0xfe, 0x3f, 0x00, | |
| 0x00, 0xfe, 0x7f, 0x00, 0x00, 0xff, 0x7f, 0x00, 0x00, 0xff, 0xff, 0x00, | |
| 0x80, 0xff, 0xff, 0x00, 0x80, 0xff, 0xff, 0x01, 0xc0, 0xff, 0xff, 0x01, | |
| 0xc0, 0xff, 0xff, 0x03, 0xe0, 0xff, 0xff, 0x03, 0xe0, 0xff, 0xff, 0x07, | |
| 0xf0, 0xff, 0xff, 0x07, 0xf0, 0xff, 0xff, 0x0f, 0xf8, 0xff, 0xff, 0x0f, | |
| 0xf8, 0xff, 0xff, 0x1f, 0xfc, 0xff, 0xff, 0x1f, 0xfe, 0xff, 0xff, 0x3f, | |
| 0xfe, 0xff, 0xff, 0x3f, 0xfe, 0xff, 0xff, 0x3f, 0xfc, 0xff, 0xff, 0x1f, | |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};" | |
| image create bitmap ::tk::dialog::w3 -foreground black \ | |
| -data "#define w3_width 32\n#define w3_height 32 | |
| static unsigned char w3_bits[] = { | |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |
| 0x00, 0xc0, 0x03, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0xe0, 0x07, 0x00, | |
| 0x00, 0xe0, 0x07, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0xe0, 0x07, 0x00, | |
| 0x00, 0xc0, 0x03, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0xc0, 0x03, 0x00, | |
| 0x00, 0x80, 0x01, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x80, 0x01, 0x00, | |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0xc0, 0x03, 0x00, | |
| 0x00, 0xc0, 0x03, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, | |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};" | |
| # ::tk::MessageBox -- | |
| # | |
| # Pops up a messagebox with an application-supplied message with | |
| # an icon and a list of buttons. This procedure will be called | |
| # by tk_messageBox if the platform does not have native | |
| # messagebox support, or if the particular type of messagebox is | |
| # not supported natively. | |
| # | |
| # Color icons are used on Unix displays that have a color | |
| # depth of 4 or more and $tk_strictMotif is not on. | |
| # | |
| # This procedure is a private procedure shouldn't be called | |
| # directly. Call tk_messageBox instead. | |
| # | |
| # See the user documentation for details on what tk_messageBox does. | |
| # | |
| proc ::tk::MessageBox {args} { | |
| global tk_strictMotif | |
| variable ::tk::Priv | |
| set w ::tk::PrivMsgBox | |
| upvar $w data | |
| # | |
| # The default value of the title is space (" ") not the empty string | |
| # because for some window managers, a | |
| # wm title .foo "" | |
| # causes the window title to be "foo" instead of the empty string. | |
| # | |
| set specs { | |
| {-default "" "" ""} | |
| {-detail "" "" ""} | |
| {-icon "" "" "info"} | |
| {-message "" "" ""} | |
| {-parent "" "" .} | |
| {-title "" "" " "} | |
| {-type "" "" "ok"} | |
| } | |
| tclParseConfigSpec $w $specs "" $args | |
| if {$data(-icon) ni {info warning error question}} { | |
| return -code error -errorcode [list TK LOOKUP ICON $data(-icon)] \ | |
| "bad -icon value \"$data(-icon)\": must be error, info, question, or warning" | |
| } | |
| set windowingsystem [tk windowingsystem] | |
| if {$windowingsystem eq "aqua"} { | |
| switch -- $data(-icon) { | |
| "error" {set data(-icon) "stop"} | |
| "warning" {set data(-icon) "caution"} | |
| "info" {set data(-icon) "note"} | |
| } | |
| option add *Dialog*background systemDialogBackgroundActive widgetDefault | |
| option add *Dialog*Button.highlightBackground \ | |
| systemDialogBackgroundActive widgetDefault | |
| } | |
| if {![winfo exists $data(-parent)]} { | |
| return -code error -errorcode [list TK LOOKUP WINDOW $data(-parent)] \ | |
| "bad window path name \"$data(-parent)\"" | |
| } | |
| switch -- $data(-type) { | |
| abortretryignore { | |
| set names [list abort retry ignore] | |
| set labels [list &Abort &Retry &Ignore] | |
| set cancel abort | |
| } | |
| ok { | |
| set names [list ok] | |
| set labels {&OK} | |
| set cancel ok | |
| } | |
| okcancel { | |
| set names [list ok cancel] | |
| set labels [list &OK &Cancel] | |
| set cancel cancel | |
| } | |
| retrycancel { | |
| set names [list retry cancel] | |
| set labels [list &Retry &Cancel] | |
| set cancel cancel | |
| } | |
| yesno { | |
| set names [list yes no] | |
| set labels [list &Yes &No] | |
| set cancel no | |
| } | |
| yesnocancel { | |
| set names [list yes no cancel] | |
| set labels [list &Yes &No &Cancel] | |
| set cancel cancel | |
| } | |
| default { | |
| return -code error -errorcode [list TK LOOKUP DLG_TYPE $data(-type)] \ | |
| "bad -type value \"$data(-type)\": must be\ | |
| abortretryignore, ok, okcancel, retrycancel,\ | |
| yesno, or yesnocancel" | |
| } | |
| } | |
| set buttons {} | |
| foreach name $names lab $labels { | |
| lappend buttons [list $name -text [mc $lab]] | |
| } | |
| # If no default button was specified, the default default is the | |
| # first button (Bug: 2218). | |
| if {$data(-default) eq ""} { | |
| set data(-default) [lindex [lindex $buttons 0] 0] | |
| } | |
| set valid 0 | |
| foreach btn $buttons { | |
| if {[lindex $btn 0] eq $data(-default)} { | |
| set valid 1 | |
| break | |
| } | |
| } | |
| if {!$valid} { | |
| return -code error -errorcode {TK MSGBOX DEFAULT} \ | |
| "bad -default value \"$data(-default)\": must be\ | |
| abort, retry, ignore, ok, cancel, no, or yes" | |
| } | |
| # 2. Set the dialog to be a child window of $parent | |
| # | |
| # | |
| if {$data(-parent) ne "."} { | |
| set w $data(-parent).__tk__messagebox | |
| } else { | |
| set w .__tk__messagebox | |
| } | |
| # There is only one background colour for the whole dialog | |
| set bg [ttk::style lookup . -background] | |
| # 3. Create the top-level window and divide it into top | |
| # and bottom parts. | |
| catch {destroy $w} | |
| toplevel $w -class Dialog -bg $bg | |
| wm title $w $data(-title) | |
| wm iconname $w Dialog | |
| wm protocol $w WM_DELETE_WINDOW [list $w.$cancel invoke] | |
| # Message boxes should be transient with respect to their parent so that | |
| # they always stay on top of the parent window. But some window managers | |
| # will simply create the child window as withdrawn if the parent is not | |
| # viewable (because it is withdrawn or iconified). This is not good for | |
| # "grab"bed windows. So only make the message box transient if the parent | |
| # is viewable. | |
| # | |
| if {[winfo viewable [winfo toplevel $data(-parent)]] } { | |
| wm transient $w $data(-parent) | |
| } | |
| if {$windowingsystem eq "aqua"} { | |
| ::tk::unsupported::MacWindowStyle style $w moveableModal {} | |
| } elseif {$windowingsystem eq "x11"} { | |
| wm attributes $w -type dialog | |
| } | |
| ttk::frame $w.bot | |
| grid anchor $w.bot center | |
| pack $w.bot -side bottom -fill both | |
| ttk::frame $w.top | |
| pack $w.top -side top -fill both -expand 1 | |
| # 4. Fill the top part with bitmap, message and detail (use the | |
| # option database for -wraplength and -font so that they can be | |
| # overridden by the caller). | |
| option add *Dialog.msg.wrapLength 3i widgetDefault | |
| option add *Dialog.dtl.wrapLength 3i widgetDefault | |
| option add *Dialog.msg.font TkCaptionFont widgetDefault | |
| option add *Dialog.dtl.font TkDefaultFont widgetDefault | |
| ttk::label $w.msg -anchor nw -justify left -text $data(-message) | |
| if {$data(-detail) ne ""} { | |
| ttk::label $w.dtl -anchor nw -justify left -text $data(-detail) | |
| } | |
| if {$data(-icon) ne ""} { | |
| if {([winfo depth $w] < 4) || $tk_strictMotif} { | |
| # ttk::label has no -bitmap option | |
| label $w.bitmap -bitmap $data(-icon) -background $bg | |
| } else { | |
| switch $data(-icon) { | |
| error { | |
| ttk::label $w.bitmap -image ::tk::icons::error | |
| } | |
| info { | |
| ttk::label $w.bitmap -image ::tk::icons::information | |
| } | |
| question { | |
| ttk::label $w.bitmap -image ::tk::icons::question | |
| } | |
| default { | |
| ttk::label $w.bitmap -image ::tk::icons::warning | |
| } | |
| } | |
| } | |
| } | |
| grid $w.bitmap $w.msg -in $w.top -sticky news -padx 2m -pady 2m | |
| grid configure $w.bitmap -sticky nw | |
| grid columnconfigure $w.top 1 -weight 1 | |
| if {$data(-detail) ne ""} { | |
| grid ^ $w.dtl -in $w.top -sticky news -padx 2m -pady {0 2m} | |
| grid rowconfigure $w.top 1 -weight 1 | |
| } else { | |
| grid rowconfigure $w.top 0 -weight 1 | |
| } | |
| # 5. Create a row of buttons at the bottom of the dialog. | |
| set i 0 | |
| foreach but $buttons { | |
| set name [lindex $but 0] | |
| set opts [lrange $but 1 end] | |
| if {![llength $opts]} { | |
| # Capitalize the first letter of $name | |
| set capName [string toupper $name 0] | |
| set opts [list -text $capName] | |
| } | |
| eval [list tk::AmpWidget ttk::button $w.$name] $opts \ | |
| [list -command [list set tk::Priv(button) $name]] | |
| if {$name eq $data(-default)} { | |
| $w.$name configure -default active | |
| } else { | |
| $w.$name configure -default normal | |
| } | |
| grid $w.$name -in $w.bot -row 0 -column $i -padx 3m -pady 2m -sticky ew | |
| grid columnconfigure $w.bot $i -uniform buttons | |
| # We boost the size of some Mac buttons for l&f | |
| if {$windowingsystem eq "aqua"} { | |
| set tmp [string tolower $name] | |
| if {$tmp eq "ok" || $tmp eq "cancel" || $tmp eq "yes" || | |
| $tmp eq "no" || $tmp eq "abort" || $tmp eq "retry" || | |
| $tmp eq "ignore"} { | |
| grid columnconfigure $w.bot $i -minsize 90 | |
| } | |
| grid configure $w.$name -pady 7 | |
| } | |
| incr i | |
| # create the binding for the key accelerator, based on the underline | |
| # | |
| # set underIdx [$w.$name cget -under] | |
| # if {$underIdx >= 0} { | |
| # set key [string index [$w.$name cget -text] $underIdx] | |
| # bind $w <Alt-[string tolower $key]> [list $w.$name invoke] | |
| # bind $w <Alt-[string toupper $key]> [list $w.$name invoke] | |
| # } | |
| } | |
| bind $w <Alt-Key> [list ::tk::AltKeyInDialog $w %A] | |
| if {$data(-default) ne ""} { | |
| bind $w <FocusIn> { | |
| if {[winfo class %W] in "Button TButton"} { | |
| %W configure -default active | |
| } | |
| } | |
| bind $w <FocusOut> { | |
| if {[winfo class %W] in "Button TButton"} { | |
| %W configure -default normal | |
| } | |
| } | |
| } | |
| # 6. Create bindings for <Return>, <Escape> and <Destroy> on the dialog | |
| bind $w <Return> { | |
| if {[winfo class %W] in "Button TButton"} { | |
| %W invoke | |
| } | |
| } | |
| # Invoke the designated cancelling operation | |
| bind $w <Escape> [list $w.$cancel invoke] | |
| # At <Destroy> the buttons have vanished, so must do this directly. | |
| bind $w.msg <Destroy> [list set tk::Priv(button) $cancel] | |
| # 7. Withdraw the window, then update all the geometry information | |
| # so we know how big it wants to be, then center the window in the | |
| # display (Motif style) and de-iconify it. | |
| ::tk::PlaceWindow $w widget $data(-parent) | |
| # 8. Set a grab and claim the focus too. | |
| if {$data(-default) ne ""} { | |
| set focus $w.$data(-default) | |
| } else { | |
| set focus $w | |
| } | |
| ::tk::SetFocusGrab $w $focus | |
| # 9. Wait for the user to respond, then restore the focus and | |
| # return the index of the selected button. Restore the focus | |
| # before deleting the window, since otherwise the window manager | |
| # may take the focus away so we can't redirect it. Finally, | |
| # restore any grab that was in effect. | |
| vwait ::tk::Priv(button) | |
| # Copy the result now so any <Destroy> that happens won't cause | |
| # trouble | |
| set result $Priv(button) | |
| ::tk::RestoreFocusGrab $w $focus | |
| return $result | |
| } | |