home *** CD-ROM | disk | FTP | other *** search
/ PC World 2005 June / PCWorld_2005-06_cd.bin / software / vyzkuste / firewally / firewally.exe / framework-2.3.exe / msgbox.tcl < prev    next >
Text File  |  2003-09-01  |  16KB  |  420 lines

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