msgbox.tcl
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:16k
源码类别:

通讯编程

开发平台:

Visual C++

  1. # msgbox.tcl --
  2. #
  3. # Implements messageboxes for platforms that do not have native
  4. # messagebox support.
  5. #
  6. # RCS: @(#) $Id: msgbox.tcl,v 1.24.2.4 2007/05/30 06:37:03 das Exp $
  7. #
  8. # Copyright (c) 1994-1997 Sun Microsystems, Inc.
  9. #
  10. # See the file "license.terms" for information on usage and redistribution
  11. # of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  12. #
  13. # Ensure existence of ::tk::dialog namespace
  14. #
  15. namespace eval ::tk::dialog {}
  16. image create bitmap ::tk::dialog::b1 -foreground black 
  17. -data "#define b1_width 32n#define b1_height 32
  18. static unsigned char q1_bits[] = {
  19.    0x00, 0xf8, 0x1f, 0x00, 0x00, 0x07, 0xe0, 0x00, 0xc0, 0x00, 0x00, 0x03,
  20.    0x20, 0x00, 0x00, 0x04, 0x10, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x10,
  21.    0x04, 0x00, 0x00, 0x20, 0x02, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x40,
  22.    0x01, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x80,
  23.    0x01, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x80,
  24.    0x01, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x40,
  25.    0x04, 0x00, 0x00, 0x20, 0x08, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x08,
  26.    0x60, 0x00, 0x00, 0x04, 0x80, 0x03, 0x80, 0x03, 0x00, 0x0c, 0x78, 0x00,
  27.    0x00, 0x30, 0x04, 0x00, 0x00, 0x40, 0x04, 0x00, 0x00, 0x40, 0x04, 0x00,
  28.    0x00, 0x80, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x06, 0x00,
  29.    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};"
  30. image create bitmap ::tk::dialog::b2 -foreground white 
  31. -data "#define b2_width 32n#define b2_height 32
  32. static unsigned char b2_bits[] = {
  33.    0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x1f, 0x00, 0x00, 0xff, 0xff, 0x00,
  34.    0xc0, 0xff, 0xff, 0x03, 0xe0, 0xff, 0xff, 0x07, 0xf0, 0xff, 0xff, 0x0f,
  35.    0xf8, 0xff, 0xff, 0x1f, 0xfc, 0xff, 0xff, 0x3f, 0xfc, 0xff, 0xff, 0x3f,
  36.    0xfe, 0xff, 0xff, 0x7f, 0xfe, 0xff, 0xff, 0x7f, 0xfe, 0xff, 0xff, 0x7f,
  37.    0xfe, 0xff, 0xff, 0x7f, 0xfe, 0xff, 0xff, 0x7f, 0xfe, 0xff, 0xff, 0x7f,
  38.    0xfe, 0xff, 0xff, 0x7f, 0xfc, 0xff, 0xff, 0x3f, 0xfc, 0xff, 0xff, 0x3f,
  39.    0xf8, 0xff, 0xff, 0x1f, 0xf0, 0xff, 0xff, 0x0f, 0xe0, 0xff, 0xff, 0x07,
  40.    0x80, 0xff, 0xff, 0x03, 0x00, 0xfc, 0x7f, 0x00, 0x00, 0xf0, 0x07, 0x00,
  41.    0x00, 0xc0, 0x03, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x80, 0x03, 0x00,
  42.    0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
  43.    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};"
  44. image create bitmap ::tk::dialog::q -foreground blue 
  45. -data "#define q_width 32n#define q_height 32
  46. static unsigned char q_bits[] = {
  47.    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  48.    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x07, 0x00,
  49.    0x00, 0x10, 0x0f, 0x00, 0x00, 0x18, 0x1e, 0x00, 0x00, 0x38, 0x1e, 0x00,
  50.    0x00, 0x38, 0x1e, 0x00, 0x00, 0x10, 0x0f, 0x00, 0x00, 0x80, 0x07, 0x00,
  51.    0x00, 0xc0, 0x01, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00,
  52.    0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0xe0, 0x01, 0x00,
  53.    0x00, 0xe0, 0x01, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  54.    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  55.    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  56.    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  57.    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};"
  58. image create bitmap ::tk::dialog::i -foreground blue 
  59. -data "#define i_width 32n#define i_height 32
  60. static unsigned char i_bits[] = {
  61.    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  62.    0x00, 0xe0, 0x01, 0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0xf0, 0x03, 0x00,
  63.    0x00, 0xe0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  64.    0x00, 0xf8, 0x03, 0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0xe0, 0x03, 0x00,
  65.    0x00, 0xe0, 0x03, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x00, 0xe0, 0x03, 0x00,
  66.    0x00, 0xe0, 0x03, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x00, 0xf0, 0x07, 0x00,
  67.    0x00, 0xf8, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  68.    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  69.    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  70.    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  71.    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};"
  72. image create bitmap ::tk::dialog::w1 -foreground black 
  73. -data "#define w1_width 32n#define w1_height 32
  74. static unsigned char w1_bits[] = {
  75.    0x00, 0x80, 0x01, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x20, 0x04, 0x00,
  76.    0x00, 0x10, 0x04, 0x00, 0x00, 0x10, 0x08, 0x00, 0x00, 0x08, 0x08, 0x00,
  77.    0x00, 0x08, 0x10, 0x00, 0x00, 0x04, 0x10, 0x00, 0x00, 0x04, 0x20, 0x00,
  78.    0x00, 0x02, 0x20, 0x00, 0x00, 0x02, 0x40, 0x00, 0x00, 0x01, 0x40, 0x00,
  79.    0x00, 0x01, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x01,
  80.    0x40, 0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x02,
  81.    0x20, 0x00, 0x00, 0x04, 0x10, 0x00, 0x00, 0x04, 0x10, 0x00, 0x00, 0x08,
  82.    0x08, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x10, 0x04, 0x00, 0x00, 0x10,
  83.    0x04, 0x00, 0x00, 0x20, 0x02, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0x40,
  84.    0x01, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x20,
  85.    0xfc, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00};"
  86. image create bitmap ::tk::dialog::w2 -foreground yellow 
  87. -data "#define w2_width 32n#define w2_height 32
  88. static unsigned char w2_bits[] = {
  89.    0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0xc0, 0x03, 0x00,
  90.    0x00, 0xe0, 0x03, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0xf0, 0x07, 0x00,
  91.    0x00, 0xf0, 0x0f, 0x00, 0x00, 0xf8, 0x0f, 0x00, 0x00, 0xf8, 0x1f, 0x00,
  92.    0x00, 0xfc, 0x1f, 0x00, 0x00, 0xfc, 0x3f, 0x00, 0x00, 0xfe, 0x3f, 0x00,
  93.    0x00, 0xfe, 0x7f, 0x00, 0x00, 0xff, 0x7f, 0x00, 0x00, 0xff, 0xff, 0x00,
  94.    0x80, 0xff, 0xff, 0x00, 0x80, 0xff, 0xff, 0x01, 0xc0, 0xff, 0xff, 0x01,
  95.    0xc0, 0xff, 0xff, 0x03, 0xe0, 0xff, 0xff, 0x03, 0xe0, 0xff, 0xff, 0x07,
  96.    0xf0, 0xff, 0xff, 0x07, 0xf0, 0xff, 0xff, 0x0f, 0xf8, 0xff, 0xff, 0x0f,
  97.    0xf8, 0xff, 0xff, 0x1f, 0xfc, 0xff, 0xff, 0x1f, 0xfe, 0xff, 0xff, 0x3f,
  98.    0xfe, 0xff, 0xff, 0x3f, 0xfe, 0xff, 0xff, 0x3f, 0xfc, 0xff, 0xff, 0x1f,
  99.    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};"
  100. image create bitmap ::tk::dialog::w3 -foreground black 
  101. -data "#define w3_width 32n#define w3_height 32
  102. static unsigned char w3_bits[] = {
  103.    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  104.    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  105.    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  106.    0x00, 0xc0, 0x03, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0xe0, 0x07, 0x00,
  107.    0x00, 0xe0, 0x07, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0xe0, 0x07, 0x00,
  108.    0x00, 0xc0, 0x03, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0xc0, 0x03, 0x00,
  109.    0x00, 0x80, 0x01, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x80, 0x01, 0x00,
  110.    0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0xc0, 0x03, 0x00,
  111.    0x00, 0xc0, 0x03, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
  112.    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  113.    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};"
  114. # ::tk::MessageBox --
  115. #
  116. # Pops up a messagebox with an application-supplied message with
  117. # an icon and a list of buttons. This procedure will be called
  118. # by tk_messageBox if the platform does not have native
  119. # messagebox support, or if the particular type of messagebox is
  120. # not supported natively.
  121. #
  122. # Color icons are used on Unix displays that have a color
  123. # depth of 4 or more and $tk_strictMotif is not on.
  124. #
  125. # This procedure is a private procedure shouldn't be called
  126. # directly. Call tk_messageBox instead.
  127. #
  128. # See the user documentation for details on what tk_messageBox does.
  129. #
  130. proc ::tk::MessageBox {args} {
  131.     global tcl_platform tk_strictMotif
  132.     variable ::tk::Priv
  133.     set w ::tk::PrivMsgBox
  134.     upvar $w data
  135.     #
  136.     # The default value of the title is space (" ") not the empty string
  137.     # because for some window managers, a 
  138.     # wm title .foo ""
  139.     # causes the window title to be "foo" instead of the empty string.
  140.     #
  141.     set specs {
  142. {-default "" "" ""}
  143.         {-icon "" "" "info"}
  144.         {-message "" "" ""}
  145.         {-parent "" "" .}
  146.         {-title "" "" " "}
  147.         {-type "" "" "ok"}
  148.     }
  149.     tclParseConfigSpec $w $specs "" $args
  150.     if {[lsearch -exact {info warning error question} $data(-icon)] == -1} {
  151. error "bad -icon value "$data(-icon)": must be error, info, question, or warning"
  152.     }
  153.     # Store tk windowingsystem to avoid too many calls
  154.     set windowingsystem [tk windowingsystem]
  155.     if {$windowingsystem eq "classic" || $windowingsystem eq "aqua"} {
  156. switch -- $data(-icon) {
  157.     "error"     {set data(-icon) "stop"}
  158.     "warning"   {set data(-icon) "caution"}
  159.     "info"      {set data(-icon) "note"}
  160. }
  161. option add *Dialog*background systemDialogBackgroundActive widgetDefault
  162. option add *Dialog*Button.highlightBackground 
  163. systemDialogBackgroundActive widgetDefault
  164.     }
  165.     if {![winfo exists $data(-parent)]} {
  166. error "bad window path name "$data(-parent)""
  167.     }
  168.     switch -- $data(-type) {
  169. abortretryignore { 
  170.     set names [list abort retry ignore]
  171.     set labels [list &Abort &Retry &Ignore]
  172. }
  173. ok {
  174.     set names [list ok]
  175.     set labels {&OK}
  176. }
  177. okcancel {
  178.     set names [list ok cancel]
  179.     set labels [list &OK &Cancel]
  180. }
  181. retrycancel {
  182.     set names [list retry cancel]
  183.     set labels [list &Retry &Cancel]
  184. }
  185. yesno {
  186.     set names [list yes no]
  187.     set labels [list &Yes &No]
  188. }
  189. yesnocancel {
  190.     set names [list yes no cancel]
  191.     set labels [list &Yes &No &Cancel]
  192. }
  193. default {
  194.     error "bad -type value "$data(-type)": must be
  195.     abortretryignore, ok, okcancel, retrycancel,
  196.     yesno, or yesnocancel"
  197. }
  198.     }
  199.     set buttons {}
  200.     foreach name $names lab $labels {
  201. lappend buttons [list $name -text [mc $lab]]
  202.     }
  203.     # If no default button was specified, the default default is the 
  204.     # first button (Bug: 2218).
  205.     if {$data(-default) eq ""} {
  206. set data(-default) [lindex [lindex $buttons 0] 0]
  207.     }
  208.     set valid 0
  209.     foreach btn $buttons {
  210. if {[lindex $btn 0] eq $data(-default)} {
  211.     set valid 1
  212.     break
  213. }
  214.     }
  215.     if {!$valid} {
  216. error "invalid default button "$data(-default)""
  217.     }
  218.     # 2. Set the dialog to be a child window of $parent
  219.     #
  220.     #
  221.     if {$data(-parent) ne "."} {
  222. set w $data(-parent).__tk__messagebox
  223.     } else {
  224. set w .__tk__messagebox
  225.     }
  226.     # 3. Create the top-level window and divide it into top
  227.     # and bottom parts.
  228.     destroy $w
  229.     toplevel $w -class Dialog
  230.     wm title $w $data(-title)
  231.     wm iconname $w Dialog
  232.     wm protocol $w WM_DELETE_WINDOW { }
  233.     # There is only one background colour for the whole dialog
  234.     set bg [$w cget -background]
  235.     # Message boxes should be transient with respect to their parent so that
  236.     # they always stay on top of the parent window.  But some window managers
  237.     # will simply create the child window as withdrawn if the parent is not
  238.     # viewable (because it is withdrawn or iconified).  This is not good for
  239.     # "grab"bed windows.  So only make the message box transient if the parent
  240.     # is viewable.
  241.     #
  242.     if {[winfo viewable [winfo toplevel $data(-parent)]] } {
  243. wm transient $w $data(-parent)
  244.     }    
  245.     if {$windowingsystem eq "classic" || $windowingsystem eq "aqua"} {
  246. ::tk::unsupported::MacWindowStyle style $w moveableModal {}
  247.     }
  248.     frame $w.bot -background $bg
  249.     pack $w.bot -side bottom -fill both
  250.     frame $w.top -background $bg
  251.     pack $w.top -side top -fill both -expand 1
  252.     if {$windowingsystem ne "classic" && $windowingsystem ne "aqua"} {
  253. $w.bot configure -relief raised -bd 1
  254. $w.top configure -relief raised -bd 1
  255.     }
  256.     # 4. Fill the top part with bitmap and message (use the option
  257.     # database for -wraplength and -font so that they can be
  258.     # overridden by the caller).
  259.     option add *Dialog.msg.wrapLength 3i widgetDefault
  260.     if {$windowingsystem eq "classic" || $windowingsystem eq "aqua"} {
  261. option add *Dialog.msg.font system widgetDefault
  262.     } else {
  263. option add *Dialog.msg.font {Times 14} widgetDefault
  264.     }
  265.     label $w.msg -anchor nw -justify left -text $data(-message) 
  266.     -background $bg
  267.     if {$data(-icon) ne ""} {
  268. if {($windowingsystem eq "classic" || $windowingsystem eq "aqua")
  269. || ([winfo depth $w] < 4) || $tk_strictMotif} {
  270.     label $w.bitmap -bitmap $data(-icon) -background $bg
  271. } else {
  272.     canvas $w.bitmap -width 32 -height 32 -highlightthickness 0 
  273.     -background $bg
  274.     switch $data(-icon) {
  275. error {
  276.     $w.bitmap create oval 0 0 31 31 -fill red -outline black
  277.     $w.bitmap create line 9 9 23 23 -fill white -width 4
  278.     $w.bitmap create line 9 23 23 9 -fill white -width 4
  279. }
  280. info {
  281.     $w.bitmap create image 0 0 -anchor nw 
  282.     -image ::tk::dialog::b1
  283.     $w.bitmap create image 0 0 -anchor nw 
  284.     -image ::tk::dialog::b2
  285.     $w.bitmap create image 0 0 -anchor nw 
  286.     -image ::tk::dialog::i
  287. }
  288. question {
  289.     $w.bitmap create image 0 0 -anchor nw 
  290.     -image ::tk::dialog::b1
  291.     $w.bitmap create image 0 0 -anchor nw 
  292.     -image ::tk::dialog::b2
  293.     $w.bitmap create image 0 0 -anchor nw 
  294.     -image ::tk::dialog::q
  295. }
  296. default {
  297.     $w.bitmap create image 0 0 -anchor nw 
  298.     -image ::tk::dialog::w1
  299.     $w.bitmap create image 0 0 -anchor nw 
  300.     -image ::tk::dialog::w2
  301.     $w.bitmap create image 0 0 -anchor nw 
  302.     -image ::tk::dialog::w3
  303. }
  304.     }
  305. }
  306.     }
  307.     grid $w.bitmap $w.msg -in $w.top -sticky news -padx 2m -pady 2m
  308.     grid columnconfigure $w.top 1 -weight 1
  309.     grid rowconfigure $w.top 0 -weight 1
  310.     # 5. Create a row of buttons at the bottom of the dialog.
  311.     set i 0
  312.     foreach but $buttons {
  313. set name [lindex $but 0]
  314. set opts [lrange $but 1 end]
  315. if {![llength $opts]} {
  316.     # Capitalize the first letter of $name
  317.     set capName [string toupper $name 0]
  318.     set opts [list -text $capName]
  319. }
  320. eval [list tk::AmpWidget button $w.$name -padx 3m] $opts 
  321. [list -command [list set tk::Priv(button) $name]]
  322. if {$name eq $data(-default)} {
  323.     $w.$name configure -default active
  324. } else {
  325.     $w.$name configure -default normal
  326. }
  327. grid $w.$name -in $w.bot -row 0 -column $i -padx 3m -pady 2m -sticky ew
  328. grid columnconfigure $w.bot $i -uniform buttons
  329. # We boost the size of some Mac buttons for l&f
  330. if {$windowingsystem eq "classic" || $windowingsystem eq "aqua"} {
  331.     set tmp [string tolower $name]
  332.     if {$tmp eq "ok" || $tmp eq "cancel" || $tmp eq "yes" ||
  333.     $tmp eq "no" || $tmp eq "abort" || $tmp eq "retry" ||
  334.     $tmp eq "ignore"} {
  335. grid columnconfigure $w.bot $i -minsize 90
  336.     }
  337.     grid configure $w.$name -pady 7
  338. }
  339.         incr i
  340. # create the binding for the key accelerator, based on the underline
  341. #
  342.         # set underIdx [$w.$name cget -under]
  343.         # if {$underIdx >= 0} {
  344.         #     set key [string index [$w.$name cget -text] $underIdx]
  345.         #     bind $w <Alt-[string tolower $key]>  [list $w.$name invoke]
  346.         #     bind $w <Alt-[string toupper $key]>  [list $w.$name invoke]
  347.         # }
  348.     }
  349.     bind $w <Alt-Key> [list ::tk::AltKeyInDialog $w %A]
  350.     if {$data(-default) ne ""} {
  351. bind $w <FocusIn> {
  352.     if {"Button" eq [winfo class %W]} {
  353. %W configure -default active
  354.     }
  355. }
  356. bind $w <FocusOut> {
  357.     if {"Button" eq [winfo class %W]} {
  358. %W configure -default normal
  359.     }
  360. }
  361.     }
  362.     # 6. Create a binding for <Return> on the dialog
  363.     bind $w <Return> {
  364. if {"Button" eq [winfo class %W]} {
  365.     tk::ButtonInvoke %W
  366. }
  367.     }
  368.     # 7. Withdraw the window, then update all the geometry information
  369.     # so we know how big it wants to be, then center the window in the
  370.     # display and de-iconify it.
  371.     ::tk::PlaceWindow $w widget $data(-parent)
  372.     # 8. Set a grab and claim the focus too.
  373.     if {$data(-default) ne ""} {
  374. set focus $w.$data(-default)
  375.     } else {
  376. set focus $w
  377.     }
  378.     ::tk::SetFocusGrab $w $focus
  379.     # 9. Wait for the user to respond, then restore the focus and
  380.     # return the index of the selected button.  Restore the focus
  381.     # before deleting the window, since otherwise the window manager
  382.     # may take the focus away so we can't redirect it.  Finally,
  383.     # restore any grab that was in effect.
  384.     vwait ::tk::Priv(button)
  385.     ::tk::RestoreFocusGrab $w $focus
  386.     return $Priv(button)
  387. }