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

通讯编程

开发平台:

Visual C++

  1. # This file is a Tcl script to test out the "focus" command and the
  2. # other procedures in the file tkFocus.c.  It is organized in the
  3. # standard fashion for Tcl tests.
  4. #
  5. # Copyright (c) 1994-1996 Sun Microsystems, Inc.
  6. # Copyright (c) 1998-1999 by Scriptics Corporation.
  7. # All rights reserved.
  8. #
  9. # RCS: @(#) $Id: focus.test,v 1.8 2002/07/14 05:48:46 dgp Exp $
  10. package require tcltest 2.1
  11. namespace import -force tcltest::configure
  12. namespace import -force tcltest::testsDirectory
  13. configure -testdir [file join [pwd] [file dirname [info script]]]
  14. configure -loadfile [file join [testsDirectory] constraints.tcl]
  15. tcltest::loadTestedCommands
  16. button .b -text .b -relief raised -bd 2
  17. pack .b
  18. proc focusSetup {} {
  19.     catch {destroy .t}
  20.     toplevel .t
  21.     wm geom .t +0+0
  22.     foreach i {b1 b2 b3 b4} {
  23. button .t.$i -text .t.$i -relief raised -bd 2
  24. pack .t.$i
  25.     }
  26.     tkwait visibility .t.b4
  27. }
  28. proc focusSetupAlt {} {
  29.     global env
  30.     catch {destroy .alt}
  31.     toplevel .alt -screen $env(TK_ALT_DISPLAY)
  32.     foreach i {a b c d} {
  33. button .alt.$i -text .alt.$i -relief raised -bd 2
  34. pack .alt.$i
  35.     }
  36.     tkwait visibility .alt.d
  37. }
  38. # Make sure the window manager knows who has focus
  39. catch {fixfocus}
  40. # The following procedure ensures that there is no input focus
  41. # in this application.  It does it by arranging for another
  42. # application to grab the focus.  The "after" and "update" stuff
  43. # is needed to wait long enough for pending actions to get through
  44. # the X server and possibly also the window manager.
  45. setupbg
  46. proc focusClear {} {
  47.     global x;
  48.     after 200 {set x 1}
  49.     tkwait variable x
  50.     dobg {focus -force .; update}
  51.     update
  52. }
  53. focusSetup
  54. if {[testConstraint altDisplay]} {
  55.     focusSetupAlt
  56. }
  57. update
  58. bind all <FocusIn> {
  59.     append focusInfo "in %W %dn"
  60. }
  61. bind all <FocusOut> {
  62.     append focusInfo "out %W %dn"
  63. }
  64. bind all <KeyPress> {
  65.     append focusInfo "press %W %K"
  66. }
  67. test focus-1.1 {Tk_FocusCmd procedure} {unixOnly} {
  68.     focusClear
  69.     focus
  70. } {}
  71. test focus-1.2 {Tk_FocusCmd procedure} {unixOnly altDisplay} {
  72.     focus .alt.b
  73.     focus
  74. } {}
  75. test focus-1.3 {Tk_FocusCmd procedure} {unixOnly} {
  76.     focusClear
  77.     focus .t.b3
  78.     focus
  79. } {}
  80. test focus-1.4 {Tk_FocusCmd procedure} {unixOnly} {
  81.     list [catch {focus ""} msg] $msg
  82. } {0 {}}
  83. test focus-1.5 {Tk_FocusCmd procedure} {unixOnly} {
  84.     focusClear
  85.     focus -force .t
  86.     focus .t.b3
  87.     focus
  88. } {.t.b3}
  89. test focus-1.6 {Tk_FocusCmd procedure} {unixOnly} {
  90.     list [catch {focus .gorp} msg] $msg
  91. } {1 {bad window path name ".gorp"}}
  92. test focus-1.7 {Tk_FocusCmd procedure} {unixOnly} {
  93.     list [catch {focus .gorp a} msg] $msg
  94. } {1 {bad option ".gorp": must be -displayof, -force, or -lastfor}}
  95. test focus-1.8 {Tk_FocusCmd procedure, focussing on dead window} {unixOnly} {
  96.     toplevel .t2
  97.     wm geom .t2 +10+10
  98.     frame .t2.f -width 200 -height 100 -bd 2 -relief raised
  99.     frame .t2.f2 -width 200 -height 100 -bd 2 -relief raised
  100.     pack .t2.f .t2.f2
  101.     bind .t2.f <Destroy> {focus .t2.f}
  102.     bind .t2.f2 <Destroy> {focus .t2}
  103.     focus -force .t2.f2
  104.     tkwait visibility .t2.f2
  105.     update
  106.     set x [focus]
  107.     destroy .t2.f2
  108.     lappend x [focus]
  109.     destroy .t2.f
  110.     lappend x [focus]
  111.     destroy .t2
  112.     set x
  113. } {.t2.f2 .t2 .t2}
  114. test focus-1.9 {Tk_FocusCmd procedure, -displayof option} {unixOnly} {
  115.     list [catch {focus -displayof} msg] $msg
  116. } {1 {wrong # args: should be "focus -displayof window"}}
  117. test focus-1.10 {Tk_FocusCmd procedure, -displayof option} {unixOnly} {
  118.     list [catch {focus -displayof a b} msg] $msg
  119. } {1 {wrong # args: should be "focus -displayof window"}}
  120. test focus-1.11 {Tk_FocusCmd procedure, -displayof option} {unixOnly} {
  121.     list [catch {focus -displayof .lousy} msg] $msg
  122. } {1 {bad window path name ".lousy"}}
  123. test focus-1.12 {Tk_FocusCmd procedure, -displayof option} {unixOnly} {
  124.     focusClear
  125.     focus .t
  126.     focus -displayof .t.b3
  127. } {}
  128. test focus-1.13 {Tk_FocusCmd procedure, -displayof option} {unixOnly} {
  129.     focusClear
  130.     focus -force .t
  131.     focus -displayof .t.b3
  132. } {.t}
  133. test focus-1.14 {Tk_FocusCmd procedure, -displayof option} {unixOnly altDisplay} {
  134.     focus -force .alt.c
  135.     focus -displayof .alt
  136. } {.alt.c}
  137. test focus-1.15 {Tk_FocusCmd procedure, -force option} {unixOnly} {
  138.     list [catch {focus -force} msg] $msg
  139. } {1 {wrong # args: should be "focus -force window"}}
  140. test focus-1.16 {Tk_FocusCmd procedure, -force option} {unixOnly} {
  141.     list [catch {focus -force a b} msg] $msg
  142. } {1 {wrong # args: should be "focus -force window"}}
  143. test focus-1.17 {Tk_FocusCmd procedure, -force option} {unixOnly} {
  144.     list [catch {focus -force foo} msg] $msg
  145. } {1 {bad window path name "foo"}}
  146. test focus-1.18 {Tk_FocusCmd procedure, -force option} {unixOnly} {
  147.     list [catch {focus -force ""} msg] $msg
  148. } {0 {}}
  149. test focus-1.19 {Tk_FocusCmd procedure, -force option} {unixOnly} {
  150.     focusClear
  151.     focus .t.b1
  152.     set x  [list [focus]]
  153.     focus -force .t.b1
  154.     lappend x [focus]
  155. } {{} .t.b1}
  156. test focus-1.20 {Tk_FocusCmd procedure, -lastfor option} {unixOnly} {
  157.     list [catch {focus -lastfor} msg] $msg
  158. } {1 {wrong # args: should be "focus -lastfor window"}}
  159. test focus-1.21 {Tk_FocusCmd procedure, -lastfor option} {unixOnly} {
  160.     list [catch {focus -lastfor 1 2} msg] $msg
  161. } {1 {wrong # args: should be "focus -lastfor window"}}
  162. test focus-1.22 {Tk_FocusCmd procedure, -lastfor option} {unixOnly} {
  163.     list [catch {focus -lastfor who_knows?} msg] $msg
  164. } {1 {bad window path name "who_knows?"}}
  165. test focus-1.23 {Tk_FocusCmd procedure, -lastfor option} {unixOnly} {
  166.     focus .b
  167.     focus .t.b1
  168.     list [focus -lastfor .] [focus -lastfor .t.b3]
  169. } {.b .t.b1}
  170. test focus-1.24 {Tk_FocusCmd procedure, -lastfor option} {unixOnly} {
  171.     destroy .t
  172.     focusSetup
  173.     update
  174.     focus -lastfor .t.b2
  175. } {.t}
  176. test focus-1.25 {Tk_FocusCmd procedure} {unixOnly} {
  177.     list [catch {focus -unknown} msg] $msg
  178. } {1 {bad option "-unknown": must be -displayof, -force, or -lastfor}}
  179. test focus-2.1 {TkFocusFilterEvent procedure} {unixOnly nonPortable testwrapper} {
  180.     focus -force .b
  181.     destroy .t
  182.     focusSetup
  183.     update
  184.     set focusInfo {}
  185.     event gen [testwrapper .t] <FocusIn> -detail NotifyAncestor 
  186.     -sendevent 0x54217567
  187.     list $focusInfo
  188. } {{}}
  189. test focus-2.2 {TkFocusFilterEvent procedure} {unixOnly nonPortable testwrapper} {
  190.     focus -force .b
  191.     destroy .t
  192.     focusSetup
  193.     update
  194.     set focusInfo {}
  195.     event gen .t <FocusIn> -detail NotifyAncestor -sendevent 0x547321ac
  196.     list $focusInfo [focus]
  197. } {{in .t NotifyAncestor
  198. } .b}
  199. test focus-2.3 {TkFocusFilterEvent procedure} {unixOnly nonPortable testwrapper} {
  200.     focus -force .b
  201.     destroy .t
  202.     focusSetup
  203.     update
  204.     set focusInfo {}
  205.     event gen [testwrapper .t] <FocusIn> -detail NotifyAncestor
  206.     update
  207.     list $focusInfo [focus -lastfor .t]
  208. } {{out .b NotifyNonlinear
  209. out . NotifyNonlinearVirtual
  210. in .t NotifyNonlinear
  211. } .t}
  212. test focus-2.4 {TkFocusFilterEvent procedure, FocusIn events} 
  213. {unixOnly nonPortable testwrapper} {
  214.     set result {}
  215.     focus .t.b1
  216.     # Important to end with NotifyAncestor, which is an
  217.     # event that is processed normally. This has a side
  218.     # effect on text 2.5
  219.     foreach detail {NotifyAncestor NotifyNonlinear
  220.     NotifyNonlinearVirtual NotifyPointer NotifyPointerRoot
  221.     NotifyVirtual NotifyAncestor} {
  222. focus -force .
  223. update
  224. event gen [testwrapper .t] <FocusIn> -detail $detail
  225. set focusInfo {}
  226. update
  227. lappend result $focusInfo
  228.     }
  229.     set result
  230. } {{out . NotifyNonlinear
  231. in .t NotifyNonlinearVirtual
  232. in .t.b1 NotifyNonlinear
  233. } {out . NotifyNonlinear
  234. in .t NotifyNonlinearVirtual
  235. in .t.b1 NotifyNonlinear
  236. } {} {out . NotifyNonlinear
  237. in .t NotifyNonlinearVirtual
  238. in .t.b1 NotifyNonlinear
  239. } {} {} {out . NotifyNonlinear
  240. in .t NotifyNonlinearVirtual
  241. in .t.b1 NotifyNonlinear
  242. }}
  243. test focus-2.5 {TkFocusFilterEvent procedure, creating FocusInfo struct} 
  244. {unixOnly nonPortable testwrapper} {
  245.     focusSetup
  246.     focus .t.b1
  247.     update
  248.     event gen [testwrapper .t] <FocusIn> -detail NotifyAncestor
  249.     list $focusInfo [focus]
  250. } {{out . NotifyNonlinear
  251. in .t NotifyNonlinearVirtual
  252. in .t.b1 NotifyNonlinear
  253. } .t.b1}
  254. test focus-2.6 {TkFocusFilterEvent procedure, FocusIn events} 
  255. {unixOnly testwrapper} {
  256.     focus .t.b1
  257.     focus .
  258.     update
  259.     event gen [testwrapper .t] <FocusIn> -detail NotifyAncestor
  260.     set focusInfo {}
  261.     set x [focus]
  262.     event gen . <KeyPress-x>
  263.     list $x $focusInfo
  264. } {.t.b1 {press .t.b1 x}}
  265. test focus-2.7 {TkFocusFilterEvent procedure, FocusOut events} 
  266. {unixOnly testwrapper} {
  267.     set result {}
  268.     foreach detail {NotifyAncestor NotifyInferior NotifyNonlinear
  269.     NotifyNonlinearVirtual NotifyPointer NotifyPointerRoot
  270.     NotifyVirtual} {
  271. focus -force .t.b1
  272. event gen [testwrapper .t] <FocusOut> -detail $detail
  273. update
  274. lappend result [focus]
  275.     }
  276.     set result
  277. } {{} .t.b1 {} {} .t.b1 .t.b1 {}}
  278. test focus-2.8 {TkFocusFilterEvent procedure, FocusOut events} 
  279. {unixOnly testwrapper} {
  280.     focus -force .t.b1
  281.     event gen .t.b1 <FocusOut> -detail NotifyAncestor
  282.     focus
  283. } {.t.b1}
  284. test focus-2.9 {TkFocusFilterEvent procedure, FocusOut events} 
  285. {unixOnly testwrapper} {
  286.     focus .t.b1
  287.     event gen [testwrapper .] <FocusOut> -detail NotifyAncestor
  288.     focus
  289. } {}
  290. test focus-2.10 {TkFocusFilterEvent procedure, Enter events} 
  291. {unixOnly testwrapper} {
  292.     set result {}
  293.     focus .t.b1
  294.     focusClear
  295.     foreach detail {NotifyAncestor NotifyInferior NotifyNonlinear
  296.     NotifyNonlinearVirtual NotifyVirtual} {
  297. event gen [testwrapper .t] <Enter> -detail $detail -focus 1
  298. update
  299. lappend result [focus]
  300. event gen [testwrapper .t] <Leave> -detail NotifyAncestor
  301. update
  302.     }
  303.     set result
  304. } {.t.b1 {} .t.b1 .t.b1 .t.b1}
  305. test focus-2.11 {TkFocusFilterEvent procedure, Enter events} 
  306. {unixOnly testwrapper} {
  307.     focusClear
  308.     set focusInfo {}
  309.     event gen [testwrapper .t] <Enter> -detail NotifyAncestor
  310.     update
  311.     set focusInfo
  312. } {}
  313. test focus-2.12 {TkFocusFilterEvent procedure, Enter events} 
  314. {unixOnly testwrapper} {
  315.     focus -force .b
  316.     update
  317.     set focusInfo {}
  318.     event gen [testwrapper .t] <Enter> -detail NotifyAncestor -focus 1
  319.     update
  320.     set focusInfo
  321. } {}
  322. test focus-2.13 {TkFocusFilterEvent procedure, Enter events} 
  323. {unixOnly testwrapper} {
  324.     focus .t.b1
  325.     focusClear
  326.     event gen [testwrapper .t] <Enter> -detail NotifyAncestor -focus 1
  327.     set focusInfo {}
  328.     update
  329.     set focusInfo
  330. } {in .t NotifyVirtual
  331. in .t.b1 NotifyAncestor
  332. }
  333. test focus-2.14 {TkFocusFilterEvent procedure, Enter events, ignore errors when setting focus due to implicit focus} {unixOnly testwrapper} {
  334.     focusClear
  335.     catch {destroy .t2}
  336.     toplevel .t2
  337.     wm withdraw .t2
  338.     update
  339.     set focusInfo {}
  340.     event gen [testwrapper .t2] <Enter> -detail NotifyAncestor -focus 1
  341.     update
  342.     destroy .t2
  343. } {}
  344. test focus-2.15 {TkFocusFilterEvent procedure, Leave events} 
  345. {unixOnly testwrapper} {
  346.     set result {}
  347.     focus .t.b1
  348.     foreach detail {NotifyAncestor NotifyInferior NotifyNonlinear
  349.     NotifyNonlinearVirtual NotifyVirtual} {
  350. focusClear
  351. event gen [testwrapper .t] <Enter> -detail NotifyAncestor -focus 1
  352. update
  353. event gen [testwrapper .t] <Leave> -detail $detail
  354. update
  355. lappend result [focus]
  356.     }
  357.     set result
  358. } {{} .t.b1 {} {} {}}
  359. test focus-2.16 {TkFocusFilterEvent procedure, Leave events} 
  360. {unixOnly testwrapper} {
  361.     set result {}
  362.     focus .t.b1
  363.     event gen [testwrapper .t] <Enter> -detail NotifyAncestor -focus 1
  364.     update
  365.     set focusInfo {}
  366.     event gen [testwrapper .t] <Leave> -detail NotifyAncestor
  367.     update
  368.     set focusInfo
  369. } {out .t.b1 NotifyAncestor
  370. out .t NotifyVirtual
  371. }
  372. test focus-2.17 {TkFocusFilterEvent procedure, Leave events} 
  373. {unixOnly testwrapper} {
  374.     set result {}
  375.     focus .t.b1
  376.     event gen [testwrapper .t] <Enter> -detail NotifyAncestor -focus 1
  377.     update
  378.     set focusInfo {}
  379.     event gen .t.b1 <Leave> -detail NotifyAncestor
  380.     event gen [testwrapper .] <Leave> -detail NotifyAncestor
  381.     update
  382.     list $focusInfo [focus]
  383. } {{out .t.b1 NotifyAncestor
  384. out .t NotifyVirtual
  385. } {}}
  386. test focus-3.1 {SetFocus procedure, create record on focus} 
  387. {unixOnly testwrapper} {
  388.     toplevel .t2 -width 250 -height 100
  389.     wm geometry .t2 +0+0
  390.     update
  391.     focus -force .t2
  392.     update
  393.     focus
  394. } {.t2}
  395. catch {destroy .t2}
  396. # This test produces no result, but it will generate a protocol
  397. # error if Tk forgets to make the window exist before focussing
  398. # on it.
  399. test focus-3.2 {SetFocus procedure, making window exist} 
  400. {unixOnly testwrapper} {
  401.     update
  402.     button .b2 -text "Another button"
  403.     focus .b2
  404.     update
  405. } {}
  406. catch {destroy .b2}
  407. update
  408. # The following test doesn't produce a check-able result, but if
  409. # there are bugs it may generate an X protocol error.
  410. test focus-3.3 {SetFocus procedure, delaying claim of X focus} 
  411. {unixOnly testwrapper} {
  412.     focusSetup
  413.     focus -force .t.b2
  414.     update
  415. } {}
  416. test focus-3.4 {SetFocus procedure, delaying claim of X focus} 
  417. {unixOnly testwrapper} {
  418.     focusSetup
  419.     wm withdraw .t
  420.     focus -force .t.b2
  421.     toplevel .t2 -width 250 -height 100
  422.     wm geometry .t2 +10+10
  423.     focus -force .t2
  424.     wm withdraw .t2
  425.     update
  426.     wm deiconify .t2
  427.     wm deiconify .t
  428. } {}
  429. catch {destroy .t2}
  430. test focus-3.5 {SetFocus procedure, generating events} 
  431. {unixOnly testwrapper} {
  432.     focusSetup
  433.     focusClear
  434.     set focusInfo {}
  435.     focus -force .t.b2
  436.     update
  437.     set focusInfo
  438. } {in .t NotifyVirtual
  439. in .t.b2 NotifyAncestor
  440. }
  441. test focus-3.6 {SetFocus procedure, generating events} 
  442. {unixOnly testwrapper} {
  443.     focusSetup
  444.     focus -force .b
  445.     update
  446.     set focusInfo {}
  447.     focus .t.b2
  448.     update
  449.     set focusInfo
  450. } {out .b NotifyNonlinear
  451. out . NotifyNonlinearVirtual
  452. in .t NotifyNonlinearVirtual
  453. in .t.b2 NotifyNonlinear
  454. }
  455. test focus-3.7 {SetFocus procedure, generating events} 
  456. {unixOnly nonPortable testwrapper} {
  457.     # Non-portable because some platforms generate extra events.
  458.     focusSetup
  459.     focusClear
  460.     set focusInfo {}
  461.     focus .t.b2
  462.     update
  463.     set focusInfo
  464. } {}
  465. test focus-4.1 {TkFocusDeadWindow procedure} {unixOnly testwrapper} {
  466.     focusSetup
  467.     update
  468.     focus -force .b
  469.     update
  470.     destroy .t
  471.     focus
  472. } {.b}
  473. test focus-4.2 {TkFocusDeadWindow procedure} {unixOnly testwrapper} {
  474.     focusSetup
  475.     update
  476.     focus -force .t.b2
  477.     focus .b
  478.     update
  479.     destroy .t.b2
  480.     update
  481.     focus
  482. } {.b}
  483. # Non-portable due to wm-specific redirection of input focus when
  484. # windows are deleted:
  485. test focus-4.3 {TkFocusDeadWindow procedure} {unixOnly nonPortable testwrapper} {
  486.     focusSetup
  487.     update
  488.     focus .t
  489.     update
  490.     destroy .t
  491.     update
  492.     focus
  493. } {}
  494. test focus-4.4 {TkFocusDeadWindow procedure} {unixOnly testwrapper} {
  495.     focusSetup
  496.     focus -force .t.b2
  497.     update
  498.     destroy .t.b2
  499.     focus
  500. } {.t}
  501. # I don't know how to test most of the remaining procedures of this file
  502. # explicitly;  they've already been exercised by the preceding tests.
  503. setupbg
  504. test focus-5.1 {ChangeXFocus procedure, don't take focus unless have it} 
  505. {unixOnly testwrapper secureserver} {
  506.     focusSetup
  507.     focus -force .t
  508.     update
  509.     set result [focus]
  510.     send [dobg {tk appname}] {focus -force .; update}
  511.     lappend result [focus]
  512.     focus .t.b2
  513.     update
  514.     lappend result [focus]
  515. } {.t {} {}}
  516. catch {destroy .t}
  517. bind all <FocusIn> {}
  518. bind all <FocusOut> {}
  519. bind all <KeyPress> {}
  520. cleanupbg
  521. fixfocus
  522. test focus-6.1 {miscellaneous - embedded application in same process} 
  523. {unixOnly testwrapper} {
  524.     eval interp delete [interp slaves]
  525.     catch {destroy .t}
  526.     toplevel .t
  527.     wm geometry .t +0+0
  528.     frame .t.f1 -container 1
  529.     frame .t.f2
  530.     pack .t.f1 .t.f2
  531.     entry .t.f2.e1 -bg red
  532.     pack .t.f2.e1
  533.     bind all <FocusIn> {lappend x "focus in %W %d"}
  534.     bind all <FocusOut> {lappend x "focus out %W %d"}
  535.     interp create child
  536.     child eval "set argv {-use [winfo id .t.f1]}"
  537.     load {} Tk child
  538.     child eval {
  539. entry .e1 -bg lightBlue
  540. pack .e1
  541. bind all <FocusIn> {lappend x "focus in %W %d"}
  542. bind all <FocusOut> {lappend x "focus out %W %d"}
  543. set x {}
  544.     }
  545.     # Claim the focus and wait long enough for it to really arrive.
  546.     focus -force .t.f2.e1
  547.     after 300 {set timer 1}
  548.     vwait timer
  549.     set x {}
  550.     lappend x [focus] [child eval focus]
  551.     # See if a "focus" command will move the focus to the embedded
  552.     # application.
  553.     child eval {focus .e1}
  554.     after 300 {set timer 1}
  555.     vwait timer
  556.     lappend x |
  557.     child eval {lappend x |}
  558.     # Bring the focus back to the main application.
  559.     focus .t.f2.e1
  560.     after 300 {set timer 1}
  561.     vwait timer
  562.     set result [list $x [child eval {set x}]]
  563.     interp delete child
  564.     set result
  565. } {{.t.f2.e1 {} {focus out .t.f2.e1 NotifyNonlinear} {focus out .t.f2 NotifyNonlinearVirtual} {focus in .t.f1 NotifyNonlinear} | {focus out .t.f1 NotifyNonlinear} {focus in .t.f2 NotifyNonlinearVirtual} {focus in .t.f2.e1 NotifyNonlinear}} {{focus in . NotifyVirtual} {focus in .e1 NotifyAncestor} | {focus out .e1 NotifyAncestor} {focus out . NotifyVirtual}}}
  566. test focus-6.2 {miscellaneous - embedded application in different process} 
  567. {unixOnly testwrapper} {
  568.     eval interp delete [interp slaves]
  569.     catch {destroy .t}
  570.     setupbg
  571.     toplevel .t
  572.     wm geometry .t +0+0
  573.     frame .t.f1 -container 1
  574.     frame .t.f2
  575.     pack .t.f1 .t.f2
  576.     entry .t.f2.e1 -bg red
  577.     pack .t.f2.e1
  578.     bind all <FocusIn> {lappend x "focus in %W %d"}
  579.     bind all <FocusOut> {lappend x "focus out %W %d"}
  580.     setupbg -use [winfo id .t.f1]
  581.     dobg {
  582. entry .e1 -bg lightBlue
  583. pack .e1
  584. bind all <FocusIn> {lappend x "focus in %W %d"}
  585. bind all <FocusOut> {lappend x "focus out %W %d"}
  586. set x {}
  587.     }
  588.     # Claim the focus and wait long enough for it to really arrive.
  589.     focus -force .t.f2.e1
  590.     after 300 {set timer 1}
  591.     vwait timer
  592.     set x {}
  593.     lappend x [focus] [dobg focus]
  594.     # See if a "focus" command will move the focus to the embedded
  595.     # application.
  596.     dobg {focus .e1}
  597.     after 300 {set timer 1}
  598.     vwait timer
  599.     lappend x |
  600.     dobg {lappend x |}
  601.     # Bring the focus back to the main application.
  602.     focus .t.f2.e1
  603.     after 300 {set timer 1}
  604.     vwait timer
  605.     set result [list $x [dobg {set x}]]
  606.     cleanupbg
  607.     set result
  608. } {{.t.f2.e1 {} {focus out .t.f2.e1 NotifyNonlinear} {focus out .t.f2 NotifyNonlinearVirtual} {focus in .t.f1 NotifyNonlinear} | {focus out .t.f1 NotifyNonlinear} {focus in .t.f2 NotifyNonlinearVirtual} {focus in .t.f2.e1 NotifyNonlinear}} {{focus in . NotifyVirtual} {focus in .e1 NotifyAncestor} | {focus out .e1 NotifyAncestor} {focus out . NotifyVirtual}}}
  609. deleteWindows
  610. bind all <FocusIn> {}
  611. bind all <FocusOut> {}
  612. # cleanup
  613. ::tcltest::cleanupTests
  614. return