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

通讯编程

开发平台:

Visual C++

  1. # This file is a Tcl script to test out Tk's "bind" and "bindtags"
  2. # commands plus the procedures in tkBind.c.  It is organized in the
  3. # standard fashion for Tcl tests.
  4. #
  5. # Copyright (c) 1994 The Regents of the University of California.
  6. # Copyright (c) 1994-1995 Sun Microsystems, Inc.
  7. # Copyright (c) 1998-1999 by Scriptics Corporation.
  8. # All rights reserved.
  9. #
  10. # RCS: @(#) $Id: bind.test,v 1.11.2.1 2007/05/16 15:22:19 dgp Exp $
  11. package require tcltest 2.1
  12. namespace import -force tcltest::configure
  13. namespace import -force tcltest::testsDirectory
  14. configure -testdir [file join [pwd] [file dirname [info script]]]
  15. configure -loadfile [file join [testsDirectory] constraints.tcl]
  16. tcltest::loadTestedCommands
  17. tk useinputmethods 0
  18. catch {destroy .b}
  19. toplevel .b -width 100 -height 50
  20. wm geom .b +0+0
  21. update idletasks
  22. proc setup {} {
  23.     catch {destroy .b.f}
  24.     frame .b.f -class Test -width 150 -height 100
  25.     pack .b.f
  26.     focus -force .b.f
  27.     foreach p [event info] {event delete $p}    
  28.     update
  29. }
  30. setup
  31. foreach i [bind Test] {
  32.     bind Test $i {}
  33. }
  34. foreach i [bind all] {
  35.     bind all $i {}
  36. }
  37. test bind-1.1 {bind command} {
  38.     list [catch {bind} msg] $msg
  39. } {1 {wrong # args: should be "bind window ?pattern? ?command?"}}
  40. test bind-1.2 {bind command} {
  41.     list [catch {bind a b c d} msg] $msg
  42. } {1 {wrong # args: should be "bind window ?pattern? ?command?"}}
  43. test bind-1.3 {bind command} {
  44.     list [catch {bind .gorp} msg] $msg
  45. } {1 {bad window path name ".gorp"}}
  46. test bind-1.4 {bind command} {
  47.     list [catch {bind foo} msg] $msg
  48. } {0 {}}
  49. test bind-1.5 {bind command} {
  50.     list [catch {bind .b <gorp-> {}} msg] $msg
  51. } {0 {}}
  52. test bind-1.6 {bind command} {
  53.     catch {destroy .b.f}
  54.     frame .b.f
  55.     bind .b.f <Enter> {test script}
  56.     set result [bind .b.f <Enter>]
  57.     bind .b.f <Enter> {}
  58.     list $result [bind .b.f <Enter>]
  59. } {{test script} {}}
  60. test bind-1.7 {bind command} {
  61.     catch {destroy .b.f}
  62.     frame .b.f
  63.     bind .b.f <Enter> {test script}
  64.     bind .b.f <Enter> {+more text}
  65.     bind .b.f <Enter>
  66. } {test script
  67. more text}
  68. test bind-1.8 {bind command} {
  69.     list [catch {bind .b <gorp-> {test script}} msg] $msg [bind .b]
  70. } {1 {bad event type or keysym "gorp"} {}}
  71. test bind-1.9 {bind command} {
  72.     list [catch {bind .b <gorp->} msg] $msg
  73. } {0 {}}
  74. test bind-1.10 {bind command} {
  75.     catch {destroy .b.f}
  76.     frame .b.f
  77.     bind .b.f <Enter> {script 1}
  78.     bind .b.f <Leave> {script 2}
  79.     bind .b.f a {script for a}
  80.     bind .b.f b {script for b}
  81.     lsort [bind .b.f]
  82. } {<Enter> <Leave> a b}
  83. test bind-2.1 {bindtags command} {
  84.     list [catch {bindtags} msg] $msg
  85. } {1 {wrong # args: should be "bindtags window ?taglist?"}}
  86. test bind-2.2 {bindtags command} {
  87.     list [catch {bindtags a b c} msg] $msg
  88. } {1 {wrong # args: should be "bindtags window ?taglist?"}}
  89. test bind-2.3 {bindtags command} {
  90.     list [catch {bindtags .foo} msg] $msg
  91. } {1 {bad window path name ".foo"}}
  92. test bind-2.4 {bindtags command} {
  93.     bindtags .b
  94. } {.b Toplevel all}
  95. test bind-2.5 {bindtags command} {
  96.     catch {destroy .b.f}
  97.     frame .b.f
  98.     bindtags .b.f
  99. } {.b.f Frame .b all}
  100. test bind-2.6 {bindtags command} {
  101.     catch {destroy .b.f}
  102.     frame .b.f
  103.     bindtags .b.f {{x y z} b c d}
  104.     bindtags .b.f
  105. } {{x y z} b c d}
  106. test bind-2.7 {bindtags command} {
  107.     catch {destroy .b.f}
  108.     frame .b.f
  109.     bindtags .b.f {x y z}
  110.     bindtags .b.f {}
  111.     bindtags .b.f
  112. } {.b.f Frame .b all}
  113. test bind-2.8 {bindtags command} {
  114.     catch {destroy .b.f}
  115.     frame .b.f
  116.     bindtags .b.f {x y z}
  117.     bindtags .b.f {a b c d}
  118.     bindtags .b.f
  119. } {a b c d}
  120. test bind-2.9 {bindtags command} {
  121.     catch {destroy .b.f}
  122.     frame .b.f
  123.     bindtags .b.f {a b c}
  124.     list [catch {bindtags .b.f "{"} msg] $msg [bindtags .b.f]
  125. } {1 {unmatched open brace in list} {.b.f Frame .b all}}
  126. test bind-2.10 {bindtags command} {
  127.     catch {destroy .b.f}
  128.     frame .b.f
  129.     bindtags .b.f {a b c}
  130.     list [catch {bindtags .b.f "a .gorp b"} msg] $msg [bindtags .b.f]
  131. } {0 {} {a .gorp b}}
  132. test bind-3.1 {TkFreeBindingTags procedure} {
  133.     catch {destroy .b.f}
  134.     frame .b.f
  135.     bindtags .b.f "a b c d"
  136.     destroy .b.f
  137. } {}
  138. test bind-3.2 {TkFreeBindingTags procedure} {
  139.     catch {destroy .b.f}
  140.     frame .b.f
  141.     catch {bindtags .b.f "a .gorp b .b.f"}
  142.     destroy .b.f
  143. } {}
  144. bind all <Enter> {lappend x "%W enter all"}
  145. bind Test <Enter> {lappend x "%W enter frame"}
  146. bind Toplevel <Enter> {lappend x "%W enter toplevel"}
  147. bind xyz <Enter> {lappend x "%W enter xyz"}
  148. bind {a b} <Enter> {lappend x "%W enter {a b}"}
  149. bind .b <Enter>  {lappend x "%W enter .b"}
  150. test bind-4.1 {TkBindEventProc procedure} {
  151.     catch {destroy .b.f}
  152.     frame .b.f -class Test -width 150 -height 100
  153.     pack .b.f
  154.     update
  155.     bind .b.f <Enter> {lappend x "%W enter .b.f"}
  156.     set x {}
  157.     event gen .b.f <Enter>
  158.     set x
  159. } {{.b.f enter .b.f} {.b.f enter frame} {.b.f enter .b} {.b.f enter all}}
  160. test bind-4.2 {TkBindEventProc procedure} {
  161.     catch {destroy .b.f}
  162.     frame .b.f -class Test -width 150 -height 100
  163.     pack .b.f
  164.     update
  165.     bind .b.f <Enter> {lappend x "%W enter .b.f"}
  166.     bindtags .b.f {.b.f {a b} xyz}
  167.     set x {}
  168.     event gen .b.f <Enter> 
  169.     set x
  170. } {{.b.f enter .b.f} {.b.f enter {a b}} {.b.f enter xyz}}
  171. test bind-4.3 {TkBindEventProc procedure} {
  172.     set x {}
  173.     event gen .b <Enter>
  174.     set x
  175. } {{.b enter .b} {.b enter toplevel} {.b enter all}}
  176. test bind-4.4 {TkBindEventProc procedure} {
  177.     catch {destroy .b.f}
  178.     frame .b.f -class Test -width 150 -height 100
  179.     pack .b.f
  180.     update
  181.     bindtags .b.f {.b.f .b.f2 .b.f3}
  182.     frame .b.f3 -width 50 -height 50
  183.     pack .b.f3
  184.     bind .b.f <Enter> {lappend x "%W enter .b.f"}
  185.     bind .b.f3 <Enter> {lappend x "%W enter .b.f3"}
  186.     set x {}
  187.     event gen .b.f <Enter>
  188.     destroy .b.f3
  189.     set x
  190. } {{.b.f enter .b.f} {.b.f enter .b.f3}}
  191. test bind-4.5 {TkBindEventProc procedure} {
  192.     # This tests memory allocation for objPtr;  it won't serve any useful
  193.     # purpose unless run with some sort of allocation checker turned on.
  194.     catch {destroy .b.f}
  195.     frame .b.f -class Test -width 150 -height 100
  196.     pack .b.f
  197.     update
  198.     bindtags .b.f {a b c d e f g h i j k l m n o p q r s t u v w x y z}
  199.     event gen .b.f <Enter>
  200. } {}
  201. bind all <Enter> {}
  202. bind Test <Enter> {}
  203. bind Toplevel <Enter> {}
  204. bind xyz <Enter> {}
  205. bind {a b} <Enter> {}
  206. bind .b <Enter> {}
  207. test bind-5.1 {Tk_CreateBindingTable procedure} {
  208.     catch {destroy .b.c}
  209.     canvas .b.c
  210.     .b.c bind foo
  211. } {}
  212. testConstraint testcbind [llength [info commands testcbind]]
  213. test bind-6.1 {Tk_DeleteBindTable procedure} {
  214.     catch {destroy .b.c}
  215.     canvas .b.c
  216.     .b.c bind foo <1> {string 1}
  217.     .b.c create rectangle 0 0 100 100
  218.     .b.c bind 1 <2> {string 2}
  219.     destroy .b.c
  220. } {}
  221. test bind-6.2 {Tk_DeleteBindTable procedure: pending bindings deleted later} testcbind {
  222.     catch {interp delete foo}
  223.     interp create foo
  224.     foo eval {
  225. load {} Tk
  226. tk useinputmethods 0
  227. load {} Tktest
  228. wm geometry . +0+0
  229. frame .t -width 50 -height 50
  230. bindtags .t {a b c d}
  231. pack .t
  232. update
  233. set x {}
  234. testcbind a <1> "lappend x a1; destroy ." "lappend x bye.a1"
  235. bind b <1> "lappend x b1"
  236. testcbind c <1> "lappend x c1" "lappend x bye.c1"
  237. testcbind c <2> "lappend x all2" "lappend x bye.all2"
  238. event gen .t <1>
  239.     }
  240.     set x [foo eval set x]
  241.     interp delete foo
  242.     set x
  243. } {a1 bye.all2 bye.a1 b1 bye.c1}
  244. test bind-7.1 {Tk_CreateBinding procedure: bad binding} {
  245.     catch {destroy .b.c}
  246.     canvas .b.c
  247.     list [catch {.b.c bind foo <} msg] $msg
  248. } {1 {no event type or button # or keysym}}
  249. test bind-7.2 {Tk_CreateBinding procedure: replace existing C binding} testcbind {
  250.     catch {destroy .b.f}
  251.     frame .b.f
  252.     testcbind .b.f <1> "xyz" "lappend x bye.1"
  253.     set x {}
  254.     bind .b.f <1> "abc"
  255.     destroy .b.f
  256.     set x
  257. } {bye.1}
  258. test bind-7.3 {Tk_CreateBinding procedure: append} {
  259.     catch {destroy .b.c}
  260.     canvas .b.c
  261.     .b.c bind foo <1> "button 1"
  262.     .b.c bind foo <1> "+more button 1"
  263.     .b.c bind foo <1>
  264. } {button 1
  265. more button 1}
  266. test bind-7.4 {Tk_CreateBinding procedure: append to non-existing} {
  267.     catch {destroy .b.c}
  268.     canvas .b.c
  269.     .b.c bind foo <1> "+button 1"
  270.     .b.c bind foo <1>
  271. } {button 1}
  272. test bind-8.1 {TkCreateBindingProcedure: error} testcbind {
  273.     list [catch {testcbind . <xyz> "xyz"} msg] $msg
  274. } {1 {bad event type or keysym "xyz"}}
  275. test bind-8.2 {TkCreateBindingProcedure: new binding} testcbind {
  276.     catch {destroy .b.f}
  277.     frame .b.f
  278.     testcbind .b.f <1> "lappend x 1" "lappend x bye.1"
  279.     set x {}
  280.     event gen .b.f <1>
  281.     destroy .b.f
  282.     set x
  283. } {bye.1}
  284. test bind-8.3 {TkCreateBindingProcedure: replace existing} testcbind {
  285.     catch {destroy .b.f}
  286.     frame .b.f
  287.     pack .b.f
  288.     set x {}
  289.     testcbind .b.f <1> "lappend x old1" "lappend x bye.old1"
  290.     testcbind .b.f <1> "lappend x new1" "lappend x bye.new1"
  291.     set x
  292. } {bye.old1}
  293. test bind-8.4 {TkCreateBindingProcedure: replace existing while pending} testcbind {
  294.     catch {destroy .b.f}
  295.     frame .b.f
  296.     pack .b.f
  297.     update
  298.     testcbind .b.f <1> "lappend x .b.f; testcbind Frame <1> {lappend x Frame}"
  299.     testcbind Frame <1> "lappend x never"
  300.     set x {}
  301.     event gen .b.f <1>
  302.     bind .b.f <1> {}
  303.     set x
  304. } {.b.f Frame}
  305. test bind-9.1 {Tk_DeleteBinding procedure} {
  306.     catch {destroy .b.f}
  307.     frame .b.f -class Test -width 150 -height 100
  308.     list [catch {bind .b.f <} msg] $msg
  309. } {0 {}}
  310. test bind-9.2 {Tk_DeleteBinding procedure} {
  311.     catch {destroy .b.f}
  312.     frame .b.f -class Test -width 150 -height 100
  313.     foreach i {a b c d} {
  314. bind .b.f $i "binding for $i"
  315.     }
  316.     set result {}
  317.     foreach i {b d a c} {
  318. bind .b.f $i {}
  319. lappend result [lsort [bind .b.f]]
  320.     }
  321.     set result
  322. } {{a c d} {a c} c {}}
  323. test bind-9.3 {Tk_DeleteBinding procedure} {
  324.     catch {destroy .b.f}
  325.     frame .b.f -class Test -width 150 -height 100
  326.     foreach i {<1> <Meta-1> <Control-1> <Double-Alt-1>} {
  327. bind .b.f $i "binding for $i"
  328.     }
  329.     set result {}
  330.     foreach i {<Control-1> <Double-Alt-1> <1> <Meta-1>} {
  331. bind .b.f $i {}
  332. lappend result [lsort [bind .b.f]]
  333.     }
  334.     set result
  335. } {{<Button-1> <Double-Alt-Button-1> <Meta-Button-1>} {<Button-1> <Meta-Button-1>} <Meta-Button-1> {}}
  336. test bind-9.4 {Tk_DeleteBinding procedure: pending bindings delete later} testcbind {
  337.     catch {destroy .b.f}
  338.     frame .b.f
  339.     pack .b.f
  340.     update
  341.     bindtags .b.f {a b c}
  342.     testcbind a <1> {lappend x a1; bind c <1> {}; bind c <2> {}} {lappend x bye.a1}
  343.     bind b <1> {lappend x b1}
  344.     testcbind c <1> {lappend x c1} {lappend x bye.c1}
  345.     testcbind c <2> {lappend x c2} {lappend x bye.c2}
  346.     set x {}
  347.     event gen .b.f <1>
  348.     bind a <1> {}
  349.     bind b <1> {}
  350.     set x
  351. } {a1 bye.c2 b1 bye.c1 bye.a1}
  352. test bind-10.1 {Tk_GetBinding procedure} {
  353.     catch {destroy .b.c}
  354.     canvas .b.c
  355.     list [catch {.b.c bind foo <} msg] $msg
  356. } {1 {no event type or button # or keysym}}
  357. test bind-10.2 {Tk_GetBinding procedure} {
  358.     catch {destroy .b.c}
  359.     canvas .b.c
  360.     .b.c bind foo a Test
  361.     .b.c bind foo a
  362. } {Test}
  363. test bind-10.3 {Tk_GetBinding procedure: C binding} testcbind {
  364.     catch {destroy .b.f}
  365.     frame .b.f
  366.     testcbind .b.f <1> "foo"
  367.     list [bind .b.f] [bind .b.f <1>]
  368. } {<Button-1> {}}
  369. test bind-11.1 {Tk_GetAllBindings procedure} {
  370.     catch {destroy .b.f}
  371.     frame .b.f -class Test -width 150 -height 100
  372.     foreach i "! a \{ ~ <Delete> <space> <<Paste>> <Tab> <Linefeed> <less> <Meta-a> <Acircumflex>" {
  373. bind .b.f $i Test
  374.     }
  375.     lsort [bind .b.f]
  376. } {! <<Paste>> <Key-Acircumflex> <Key-Delete> <Key-Linefeed> <Key-Tab> <Key-less> <Key-space> <Meta-Key-a> a { ~}
  377. test bind-11.2 {Tk_GetAllBindings procedure} {
  378.     catch {destroy .b.f}
  379.     frame .b.f -class Test -width 150 -height 100
  380.     foreach i "<Double-1> <Triple-1> <Meta-Control-a> <Double-Alt-Enter> <1>" {
  381. bind .b.f $i Test
  382.     }
  383.     lsort [bind .b.f]
  384. } {<Button-1> <Control-Meta-Key-a> <Double-Alt-Enter> <Double-Button-1> <Triple-Button-1>}
  385. test bind-11.3 {Tk_GetAllBindings procedure} {
  386.     catch {destroy .b.f}
  387.     frame .b.f -class Test -width 150 -height 100
  388.     foreach i "<Double-Triple-1> abcd a<Leave>b" {
  389. bind .b.f $i Test
  390.     }
  391.     lsort [bind .b.f]
  392. } {<Triple-Button-1> a<Leave>b abcd}
  393. test bind-12.1 {Tk_DeleteAllBindings procedure} {
  394.     catch {destroy .b.f}
  395.     frame .b.f -class Test -width 150 -height 100
  396.     destroy .b.f
  397. } {}
  398. test bind-12.2 {Tk_DeleteAllBindings procedure} {
  399.     catch {destroy .b.f}
  400.     frame .b.f -class Test -width 150 -height 100
  401.     foreach i "a b c <Meta-1> <Alt-a> <Control-a>" {
  402. bind .b.f $i x
  403.     }
  404.     destroy .b.f
  405. } {}
  406. test bind-12.3 {Tk_DeleteAllBindings procedure: pending bindings deleted later} testcbind {
  407.     catch {destroy .b.f}
  408.     frame .b.f
  409.     pack .b.f
  410.     update
  411.     testcbind .b.f <1> {lappend x before; event gen .b.f <2>; lappend x after} {lappend x bye.f1}
  412.     testcbind .b.f <2> {destroy .b.f} {lappend x bye.f2}
  413.     bind .b.f <Destroy> {lappend x fDestroy}
  414.     testcbind .b.f <3> {foo} {lappend x bye.f3}
  415.     set x {}
  416.     event gen .b.f <1>
  417.     set x
  418. } {before fDestroy bye.f3 bye.f2 after bye.f1}
  419. bind Test <KeyPress> {lappend x "%W %K Test press any"}
  420. bind all <KeyPress> {lappend x "%W %K all press any"}
  421. bind Test a {lappend x "%W %K Test press a"}
  422. bind all x {lappend x "%W %K all press x"}
  423. test bind-13.1 {Tk_BindEvent procedure} {
  424.     setup
  425.     bind .b.f a {lappend x "%W %K .b.f press a"}
  426.     set x {}
  427.     event gen .b.f <Key-a>
  428.     event gen .b.f <Key-b>
  429.     event gen .b.f <Key-x>
  430.     set x
  431. } {{.b.f a .b.f press a} {.b.f a Test press a} {.b.f a all press any} {.b.f b Test press any} {.b.f b all press any} {.b.f x Test press any} {.b.f x all press x}}
  432. bind Test <KeyPress> {lappend x "%W %K Test press any"; break}
  433. bind all <KeyPress> {continue; lappend x "%W %K all press any"}
  434. test bind-13.2 {Tk_BindEvent procedure} {
  435.     setup
  436.     bind .b.f b {lappend x "%W %K .b.f press a"}
  437.     set x {}
  438.     event gen .b.f <Key-b>
  439.     set x
  440. } {{.b.f b .b.f press a} {.b.f b Test press any}}
  441. if {[info procs bgerror] == "bgerror"} {
  442.     rename bgerror {}
  443. }
  444. proc bgerror args {}
  445. bind Test <KeyPress> {lappend x "%W %K Test press any"; error Test}
  446. test bind-13.3 {Tk_BindEvent procedure} {
  447.     setup
  448.     bind .b.f b {lappend x "%W %K .b.f press a"}
  449.     set x {}
  450.     event gen .b.f <Key-b>
  451.     update
  452.     list $x $errorInfo
  453. } {{{.b.f b .b.f press a} {.b.f b Test press any}} {Test
  454.     while executing
  455. "error Test"
  456.     (command bound to event)}}
  457. rename bgerror {}
  458. test bind-13.4 {Tk_BindEvent procedure} {
  459.     proc foo {} {
  460. set x 44
  461. event gen .b.f <Key-a>
  462.     }
  463.     setup
  464.     bind .b.f a {lappend x "%W %K .b.f press a"}
  465.     set x {}
  466.     foo
  467.     set x
  468. } {{.b.f a .b.f press a} {.b.f a Test press a}}
  469. test bind-13.5 {Tk_BindEvent procedure} {
  470.     bind all <Destroy> {lappend x "%W destroyed"}
  471.     set x {}
  472.     list [catch {frame .b.g -gorp foo} msg] $msg $x
  473. } {1 {unknown option "-gorp"} {{.b.g destroyed}}}
  474. foreach i [bind all] {
  475.     bind all $i {}
  476. }
  477. foreach i [bind Test] {
  478.     bind Test $i {}
  479. }
  480. test bind-13.6 {Tk_BindEvent procedure} {
  481.     setup
  482.     bind .b.f z {lappend x "%W z (.b.f binding)"}
  483.     bind Test z {lappend x "%W z (.b.f binding)"}
  484.     bind all z {bind .b.f z {}; lappend x "%W z (.b.f binding)"}
  485.     set x {}
  486.     event gen .b.f <Key-z>
  487.     bind Test z {}
  488.     bind all z {}
  489.     set x
  490. } {{.b.f z (.b.f binding)} {.b.f z (.b.f binding)} {.b.f z (.b.f binding)}}
  491. test bind-13.7 {Tk_BindEvent procedure} {
  492.     setup
  493.     bind .b.f z {lappend x "%W z (.b.f binding)"}
  494.     bind Test z {lappend x "%W z (.b.f binding)"}
  495.     bind all z {destroy .b.f; lappend x "%W z (.b.f binding)"}
  496.     set x {}
  497.     event gen .b.f <Key-z>
  498.     bind Test z {}
  499.     bind all z {}
  500.     set x
  501. } {{.b.f z (.b.f binding)} {.b.f z (.b.f binding)} {.b.f z (.b.f binding)}}
  502. test bind-13.8 {Tk_BindEvent procedure} {
  503.     setup
  504.     bind .b.f <1> {lappend x "%W z (.b.f <1> binding)"}
  505.     bind .b.f <ButtonPress> {lappend x "%W z (.b.f <ButtonPress> binding)"}
  506.     set x {}
  507.     event gen .b.f <Button-1>
  508.     event gen .b.f <Button-2>
  509.     set x
  510. } {{.b.f z (.b.f <1> binding)} {.b.f z (.b.f <ButtonPress> binding)}}
  511. test bind-13.9 {Tk_BindEvent procedure: ignore NotifyInferior} {
  512.     setup
  513.     bind .b.f <Enter> "lappend x Enter%#"
  514.     bind .b.f <Leave> "lappend x Leave%#"
  515.     set x {}
  516.     event gen .b.f <Enter> -serial 100 -detail NotifyAncestor
  517.     event gen .b.f <Enter> -serial 101 -detail NotifyInferior
  518.     event gen .b.f <Leave> -serial 102 -detail NotifyAncestor
  519.     event gen .b.f <Leave> -serial 103 -detail NotifyInferior
  520.     set x
  521. } {Enter100 Leave102}
  522. test bind-13.10 {Tk_BindEvent procedure: collapse Motions} {
  523.     setup
  524.     bind .b.f <Motion> "lappend x Motion%#(%x,%y)"
  525.     set x {}
  526.     event gen .b.f <Motion> -serial 100 -x 100 -y 200 -when tail 
  527.     update
  528.     event gen .b.f <Motion> -serial 101 -x 200 -y 300 -when tail
  529.     event gen .b.f <Motion> -serial 102 -x 300 -y 400 -when tail 
  530.     update
  531.     set x
  532. } {Motion100(100,200) Motion102(300,400)}
  533. test bind-13.11 {Tk_BindEvent procedure: collapse repeating modifiers} {
  534.     setup
  535.     bind .b.f <Key> "lappend x %K%#"
  536.     bind .b.f <KeyRelease> "lappend x %K%#"
  537.     event gen .b.f <Key-Shift_L> -serial 100 -when tail 
  538.     event gen .b.f <KeyRelease-Shift_L> -serial 101 -when tail 
  539.     event gen .b.f <Key-Shift_L> -serial 102 -when tail 
  540.     event gen .b.f <KeyRelease-Shift_L> -serial 103 -when tail 
  541.     update
  542. } {}
  543. test bind-13.12 {Tk_BindEvent procedure: valid key detail} {
  544.     setup
  545.     bind .b.f <Key> "lappend x Key%K"
  546.     bind .b.f <KeyRelease> "lappend x Release%K"
  547.     set x {}
  548.     event gen .b.f <Key> -keysym a
  549.     event gen .b.f <KeyRelease> -keysym a
  550.     set x
  551. } {Keya Releasea}
  552. test bind-13.13 {Tk_BindEvent procedure: invalid key detail} {
  553.     setup
  554.     bind .b.f <Key> "lappend x Key%K"
  555.     bind .b.f <KeyRelease> "lappend x Release%K"
  556.     set x {}
  557.     event gen .b.f <Key> -keycode 0
  558.     event gen .b.f <KeyRelease> -keycode 0
  559.     set x
  560. } {Key?? Release??}
  561. test bind-13.14 {Tk_BindEvent procedure: button detail} {
  562.     setup
  563.     bind .b.f <Button> "lappend x Button%b"
  564.     bind .b.f <ButtonRelease> "lappend x Release%b"
  565.     set x {}
  566.     event gen .b.f <Button> -button 1
  567.     event gen .b.f <ButtonRelease> -button 3
  568.     set x
  569. } {Button1 Release3}
  570. test bind-13.15 {Tk_BindEvent procedure: virtual detail} {
  571.     setup
  572.     bind .b.f <<Paste>> "lappend x Paste"
  573.     set x {}
  574.     event gen .b.f <<Paste>>
  575.     set x
  576. } {Paste}
  577. test bind-13.16 {Tk_BindEvent procedure: virtual event in event stream} {
  578.     setup
  579.     bind .b.f <<Paste>> "lappend x Paste"
  580.     set x {}
  581.     event gen .b.f <<Paste>>
  582.     set x
  583. } {Paste}
  584. test bind-13.17 {Tk_BindEvent procedure: match detail physical} {
  585.     setup
  586.     bind .b.f <Button-2> {set x Button-2}
  587.     event add <<Paste>> <Button-2>
  588.     bind .b.f <<Paste>> {set x Paste}
  589.     set x {}
  590.     event gen .b.f <Button-2>
  591.     set x
  592. } {Button-2}
  593. test bind-13.18 {Tk_BindEvent procedure: no match detail physical} {
  594.     setup
  595.     event add <<Paste>> <Button-2>
  596.     bind .b.f <<Paste>> {set x Paste}
  597.     set x {}
  598.     event gen .b.f <Button-2>
  599.     set x
  600. } {Paste}
  601. test bind-13.19 {Tk_BindEvent procedure: match detail virtual} {
  602.     setup
  603.     event add <<Paste>> <Button-2>
  604.     bind .b.f <<Paste>> "lappend x Paste"
  605.     set x {}
  606.     event gen .b.f <Button-2>
  607.     set x
  608. } {Paste}
  609. test bind-13.20 {Tk_BindEvent procedure: no match detail virtual} {
  610.     setup
  611.     event add <<Paste>> <Button-2>
  612.     bind .b.f <<Paste>> "lappend x Paste"
  613.     set x {}
  614.     event gen .b.f <Button>
  615.     set x
  616. } {}
  617. test bind-13.21 {Tk_BindEvent procedure: match no-detail physical} {
  618.     setup
  619.     bind .b.f <Button> {set x Button}
  620.     event add <<Paste>> <Button>
  621.     bind .b.f <<Paste>> {set x Paste}
  622.     set x {}
  623.     event gen .b.f <Button-2>
  624.     set x
  625. } {Button}
  626. test bind-13.22 {Tk_BindEvent procedure: no match no-detail physical} {
  627.     setup
  628.     event add <<Paste>> <Button>
  629.     bind .b.f <<Paste>> {set x Paste}
  630.     set x {}
  631.     event gen .b.f <Button-2>
  632.     set x
  633. } {Paste}
  634. test bind-13.23 {Tk_BindEvent procedure: match no-detail virtual} {
  635.     setup
  636.     event add <<Paste>> <Button>
  637.     bind .b.f <<Paste>> "lappend x Paste"
  638.     set x {}
  639.     event gen .b.f <Button-2>
  640.     set x
  641. } {Paste}
  642. test bind-13.24 {Tk_BindEvent procedure: no match no-detail virtual} {
  643.     setup
  644.     event add <<Paste>> <Key>
  645.     bind .b.f <<Paste>> "lappend x Paste"
  646.     set x {}
  647.     event gen .b.f <Button>
  648.     set x
  649. } {}
  650. test bind-13.25 {Tk_BindEvent procedure: precedence} {
  651.     setup
  652.     event add <<Paste>> <Button-2>
  653.     event add <<Copy>> <Button>
  654.     bind .b.f <Button-2> "lappend x Button-2"
  655.     bind .b.f <<Paste>> "lappend x Paste"
  656.     bind .b.f <Button> "lappend x Button"
  657.     bind .b.f <<Copy>> "lappend x Copy"
  658.     set x {}
  659.     event gen .b.f <Button-2>
  660.     bind .b.f <Button-2> {}
  661.     event gen .b.f <Button-2>
  662.     bind .b.f <<Paste>> {}
  663.     event gen .b.f <Button-2>
  664.     bind .b.f <Button> {}
  665.     event gen .b.f <Button-2>
  666.     bind .b.f <<Copy>> {}
  667.     event gen .b.f <Button-2>
  668.     set x
  669. } {Button-2 Paste Button Copy}
  670. test bind-13.26 {Tk_BindEvent procedure: no detail virtual pattern list} {
  671.     setup
  672.     bind .b.f <Button-2> {set x Button-2}
  673.     set x {}
  674.     event gen .b.f <Button-2> 
  675.     set x
  676. } {Button-2}
  677. test bind-13.27 {Tk_BindEvent procedure: detail virtual pattern list} {
  678.     setup
  679.     event add <<Paste>> <Button-2>
  680.     bind .b.f <<Paste>> {set x Paste}
  681.     set x {}
  682.     event gen .b.f <Button-2>
  683.     set x
  684. } {Paste}
  685. test bind-13.28 {Tk_BindEvent procedure: no no-detail virtual pattern list} {
  686.     setup
  687.     bind .b.f <Button> {set x Button}
  688.     set x {}
  689.     event gen .b.f <Button-2>
  690.     set x
  691. } {Button}
  692. test bind-13.29 {Tk_BindEvent procedure: no-detail virtual pattern list} {
  693.     setup
  694.     event add <<Paste>> <Button>
  695.     bind .b.f <<Paste>> {set x Paste}
  696.     set x {}
  697.     event gen .b.f <Button-2>
  698.     set x
  699. } {Paste}
  700. test bind-13.30 {Tk_BindEvent procedure: no match} {
  701.     setup
  702.     event gen .b.f <Button-2>
  703. } {}
  704. test bind-13.31 {Tk_BindEvent procedure: match} {
  705.     setup
  706.     bind .b.f <Button-2> {set x Button-2}
  707.     set x {}
  708.     event gen .b.f <Button-2>
  709.     set x
  710. } {Button-2}
  711. test bind-13.32 {Tk_BindEvent procedure: many C bindings cause realloc} testcbind {
  712.     setup
  713.     bindtags .b.f {a b c d e f g h i j k l m n o p}
  714.     foreach p [bindtags .b.f] {
  715. testcbind $p <1> "lappend x $p"
  716.     }
  717.     set x {}
  718.     event gen .b.f <1>
  719.     foreach p [bindtags .b.f] {
  720. bind $p <1> {}
  721.     }
  722.     set x
  723. } {a b c d e f g h i j k l m n o p}
  724. test bind-13.33 {Tk_BindEvent procedure: multiple tags} {
  725.     setup
  726.     bind .b.f <Button-2> {lappend x .b.f}
  727.     bind Test <Button-2> {lappend x Button}
  728.     set x {}
  729.     event gen .b.f <Button-2>
  730.     bind Test <Button-2> {}
  731.     set x
  732. } {.b.f Button}
  733. test bind-13.34 {Tk_BindEvent procedure: execute C binding} testcbind {
  734.     setup
  735.     testcbind .b.f <1> {lappend x 1}
  736.     set x {}
  737.     event gen .b.f <1>
  738.     set x
  739. } {1}
  740. test bind-13.35 {Tk_BindEvent procedure: pending list marked deleted} testcbind {
  741.     setup
  742.     testcbind Test <1> {lappend x Test} {lappend x Deleted}
  743.     bind .b.f <1> {lappend x .b.f; destroy .b.f}
  744.     set x {}
  745.     event gen .b.f <1>
  746.     set y [list $x [bind Test]]
  747.     bind Test <1> {}
  748.     set y
  749. } {.b.f <Button-1>}
  750. test bind-13.36 {Tk_BindEvent procedure: C binding marked deleted} testcbind {
  751.     setup
  752.     testcbind Test <1> {lappend x Test} {lappend x Deleted}
  753.     bind .b.f <1> {lappend x .b.f; bind Test <1> {}; lappend x after}
  754.     set x {}
  755.     event gen .b.f <1>
  756.     set x
  757. } {.b.f after Deleted}
  758. test bind-13.37 {Tk_BindEvent procedure: C binding gets to run} testcbind {
  759.     setup
  760.     testcbind Test <1> {lappend x Test}
  761.     bind .b.f <1> {lappend x .b.f}
  762.     set x {}
  763.     event gen .b.f <1>
  764.     bind Test <1> {}
  765.     set x
  766. } {.b.f Test}
  767. test bind-13.38 {Tk_BindEvent procedure: C binding deleted, refcount == 0} testcbind {
  768.     setup
  769.     testcbind .b.f <1> {lappend x hi; bind .b.f <1> {}} {lappend x bye}
  770.     set x {}
  771.     event gen .b.f <1>
  772.     set x
  773. } {hi bye}
  774. test bind-13.39 {Tk_BindEvent procedure: C binding deleted, refcount != 0} testcbind {
  775.     setup
  776.     testcbind .b.f <1> {
  777. lappend x before$n
  778. if {$n==0} {
  779.     bind .b.f <1> {}
  780. } else {
  781.     set n [expr $n-1]
  782.     event gen .b.f <1>
  783. }
  784. lappend x after$n
  785.     } {lappend x Deleted}
  786.     set n 3
  787.     set x {}
  788.     event gen .b.f <1>
  789.     set x
  790. } {before3 before2 before1 before0 after0 after0 after0 after0 Deleted}
  791. test bind-13.40 {Tk_BindEvent procedure: continue in script} {
  792.     setup
  793.     bind .b.f <Button-2> {lappend x b1; continue; lappend x b2}
  794.     bind Test <Button-2> {lappend x B1; continue; lappend x B2}
  795.     set x {}
  796.     event gen .b.f <Button-2>
  797.     bind Test <Button-2> {}
  798.     set x
  799. } {b1 B1}
  800. test bind-13.41 {Tk_BindEvent procedure: continue in script} testcbind {
  801.     setup
  802.     testcbind .b.f <Button-2> {lappend x b1; continue; lappend x b2}
  803.     testcbind Test <Button-2> {lappend x B1; continue; lappend x B2}
  804.     set x {}
  805.     event gen .b.f <Button-2>
  806.     bind Test <Button-2> {}
  807.     set x
  808. } {b1 B1}
  809. test bind-13.42 {Tk_BindEvent procedure: break in script} {
  810.     setup
  811.     bind .b.f <Button-2> {lappend x b1; break; lappend x b2}
  812.     bind Test <Button-2> {lappend x B1; break; lappend x B2}
  813.     set x {}
  814.     event gen .b.f <Button-2>
  815.     bind Test <Button-2> {}
  816.     set x
  817. } {b1}
  818. test bind-13.43 {Tk_BindEvent procedure: break in script} testcbind {
  819.     setup
  820.     testcbind .b.f <Button-2> {lappend x b1; break; lappend x b2}
  821.     testcbind Test <Button-2> {lappend x B1; break; lappend x B2}
  822.     set x {}
  823.     event gen .b.f <Button-2>
  824.     bind Test <Button-2> {}
  825.     set x
  826. } {b1}
  827. proc bgerror msg {
  828.     global x 
  829.     lappend x $msg
  830. }
  831. test bind-13.44 {Tk_BindEvent procedure: error in script} {
  832.     setup
  833.     bind .b.f <Button-2> {lappend x b1; blap}
  834.     bind Test <Button-2> {lappend x B1}
  835.     set x {}
  836.     event gen .b.f <Button-2>
  837.     update
  838.     bind Test <Button-2> {}
  839.     set x
  840. } {b1 {invalid command name "blap"}}
  841. test bind-13.45 {Tk_BindEvent procedure: error in script} testcbind {
  842.     setup
  843.     testcbind .b.f <Button-2> {lappend x b1; blap}
  844.     testcbind Test <Button-2> {lappend x B1}
  845.     set x {}
  846.     event gen .b.f <Button-2>
  847.     update
  848.     bind Test <Button-2> {}
  849.     set x
  850. } {b1 {invalid command name "blap"}}
  851. test bind-14.1 {TkBindDeadWindow: no C bindings pending} testcbind {
  852.     setup
  853.     bind .b.f <1> x
  854.     testcbind .b.f <2> y
  855.     destroy .b.f
  856. } {}
  857. test bind-14.2 {TkBindDeadWindow: is called after <Destroy>} testcbind {
  858.     setup
  859.     testcbind .b.f <Destroy> "lappend x .b.f"
  860.     testcbind Test <Destroy> "lappend x Test"
  861.     set x {}
  862.     destroy .b.f
  863.     bind Test <Destroy> {}
  864.     set x
  865. } {.b.f Test}
  866. test bind-14.3 {TkBindDeadWindow: pending C bindings} testcbind {
  867.     setup
  868.     bindtags .b.f {a b c d}
  869.     testcbind a <1> "lappend x a1" "lappend x bye.a1"
  870.     testcbind b <1> "destroy .b.f; lappend x b1" "lappend x bye.b1"
  871.     testcbind c <1> "lappend x c1" "lappend x bye.c1"
  872.     testcbind d <1> "lappend x d1" "lappend x bye.d1"
  873.     bind a <2> "event gen .b.f <1>"
  874.     testcbind b <2> "lappend x b2" "lappend x bye.b2"
  875.     testcbind c <2> "lappend x c2" "lappend x bye.d2"
  876.     bind d <2> "lappend x d2"
  877.     testcbind a <3> "event gen .b.f <2>"
  878.     set x {}
  879.     event gen .b.f <3>
  880.     set y $x
  881.     foreach tag {a b c d} {
  882. foreach event {<1> <2> <3>} {
  883.     bind $tag $event {}
  884. }
  885.     }
  886.     set y
  887. } {a1 b1 d2}
  888.     
  889. test bind-15.1 {MatchPatterns procedure, ignoring type mismatches} {
  890.     setup
  891.     bind .b.f ab {set x 1}
  892.     set x 0
  893.     event gen .b.f <Key-a>
  894.     event gen .b.f <KeyRelease-a>
  895.     event gen .b.f <Key-b>
  896.     event gen .b.f <KeyRelease-b>
  897.     set x
  898. } 1
  899. test bind-15.2 {MatchPatterns procedure, ignoring type mismatches} {
  900.     setup
  901.     bind .b.f ab {set x 1}
  902.     set x 0
  903.     event gen .b.f <Key-a>
  904.     event gen .b.f <Enter>
  905.     event gen .b.f <KeyRelease-a>
  906.     event gen .b.f <Leave>
  907.     event gen .b.f <Key-b>
  908.     event gen .b.f <KeyRelease-b>
  909.     set x
  910. } 1
  911. test bind-15.3 {MatchPatterns procedure, ignoring type mismatches} {
  912.     setup
  913.     bind .b.f ab {set x 1}
  914.     set x 0
  915.     event gen .b.f <Key-a>
  916.     event gen .b.f <Button-1>
  917.     event gen .b.f <Key-b>
  918.     set x
  919. } 0
  920. test bind-15.4 {MatchPatterns procedure, ignoring type mismatches} {
  921.     setup
  922.     bind .b.f <Double-1> {set x 1}
  923.     set x 0
  924.     event gen .b.f <Button-1>
  925.     event gen .b.f <ButtonRelease-1>
  926.     event gen .b.f <Button-1>
  927.     event gen .b.f <ButtonRelease-1>
  928.     set x
  929. } 1
  930. test bind-15.5 {MatchPatterns procedure, ignoring type mismatches} {
  931.     setup
  932.     bind .b.f <Double-ButtonRelease> {set x 1}
  933.     set x 0
  934.     event gen .b.f <Button-1>
  935.     event gen .b.f <ButtonRelease-1>
  936.     event gen .b.f <Button-2>
  937.     event gen .b.f <ButtonRelease-2>
  938.     set x
  939. } 1
  940. test bind-15.6 {MatchPatterns procedure, ignoring type mismatches} {
  941.     setup
  942.     bind .b.f <Double-1> {set x 1}
  943.     set x 0
  944.     event gen .b.f <Button-1>
  945.     event gen .b.f <Key-a>
  946.     event gen .b.f <ButtonRelease-1>
  947.     event gen .b.f <Button-1>
  948.     event gen .b.f <ButtonRelease-1>
  949.     set x
  950. } 0
  951. test bind-15.7 {MatchPatterns procedure, ignoring type mismatches} {
  952.     setup
  953.     bind .b.f <Double-1> {set x 1}
  954.     set x 0
  955.     event gen .b.f <Button-1>
  956.     event gen .b.f <Key-Shift_L>
  957.     event gen .b.f <ButtonRelease-1>
  958.     event gen .b.f <Button-1>
  959.     event gen .b.f <ButtonRelease-1>
  960.     set x
  961. } 1
  962. test bind-15.8 {MatchPatterns procedure, ignoring type mismatches} {
  963.     setup
  964.     bind .b.f ab {set x 1}
  965.     set x 0
  966.     event gen .b.f <Key-a>
  967.     event gen .b.f <Key-c>
  968.     event gen .b.f <Key-b>
  969.     set x
  970. } 0
  971. test bind-15.9 {MatchPatterns procedure, modifier checks} {
  972.     setup
  973.     bind .b.f <M1-M2-Key> {set x 1}
  974.     set x 0
  975.     event gen .b.f <Key-a> -state 0x18
  976.     set x
  977. } 1
  978. test bind-15.10 {MatchPatterns procedure, modifier checks} {
  979.     setup
  980.     bind .b.f <M1-M2-Key> {set x 1}
  981.     set x 0
  982.     event gen .b.f <Key-a> -state 0xfc
  983.     set x
  984. } 1
  985. test bind-15.11 {MatchPatterns procedure, modifier checks} {
  986.     setup
  987.     bind .b.f <M1-M2-Key> {set x 1}
  988.     set x 0
  989.     event gen .b.f <Key-a> -state 0x8
  990.     set x
  991. } 0
  992. test bind-15.12 {MatchPatterns procedure, ignore modifier presses and releases} {nonPortable} {
  993.     # This test is non-portable because the Shift_L keysym may behave
  994.     # differently on some platforms.
  995.     setup
  996.     bind .b.f aB {set x 1}
  997.     set x 0
  998.     event gen .b.f <Key-a>
  999.     event gen .b.f <Key-Shift_L>
  1000.     event gen .b.f <Key-b> -state 1
  1001.     set x
  1002. } 1
  1003. test bind-15.13 {MatchPatterns procedure, checking detail} {
  1004.     setup
  1005.     bind .b.f ab {set x 1}
  1006.     set x 0
  1007.     event gen .b.f <Key-a>
  1008.     event gen .b.f <Key-c>
  1009.     set x
  1010. } 0
  1011. test bind-15.14 {MatchPatterns procedure, checking "nearby"} {
  1012.     setup
  1013.     bind .b.f <Double-1> {set x 1}
  1014.     set x 0
  1015.     event gen .b.f <Button-2> 
  1016.     event gen .b.f <ButtonRelease-2>
  1017.     event gen .b.f <Button-1> -x 30 -y 40
  1018.     event gen .b.f <Button-1> -x 31 -y 39
  1019.     event gen .b.f <ButtonRelease-1>
  1020.     set x
  1021. } 1
  1022. test bind-15.15 {MatchPatterns procedure, checking "nearby"} {
  1023.     setup
  1024.     bind .b.f <Double-1> {set x 1}
  1025.     set x 0
  1026.     event gen .b.f <Button-2> 
  1027.     event gen .b.f <ButtonRelease-2>
  1028.     event gen .b.f <Button-1> -x 30 -y 40
  1029.     event gen .b.f <Button-1> -x 29 -y 41
  1030.     event gen .b.f <ButtonRelease-1>
  1031.     set x
  1032. } 1
  1033. test bind-15.16 {MatchPatterns procedure, checking "nearby"} {
  1034.     setup
  1035.     bind .b.f <Double-1> {set x 1}
  1036.     set x 0
  1037.     event gen .b.f <Button-2> 
  1038.     event gen .b.f <ButtonRelease-2>
  1039.     event gen .b.f <Button-1> -x 30 -y 40
  1040.     event gen .b.f <Button-1> -x 40 -y 40
  1041.     event gen .b.f <ButtonRelease-2>
  1042.     set x
  1043. } 0
  1044. test bind-15.17 {MatchPatterns procedure, checking "nearby"} {
  1045.     setup
  1046.     bind .b.f <Double-1> {set x 1}
  1047.     set x 0
  1048.     event gen .b.f <Button-2> 
  1049.     event gen .b.f <ButtonRelease-2>
  1050.     event gen .b.f <Button-1> -x 30 -y 40
  1051.     event gen .b.f <Button-1> -x 20 -y 40
  1052.     event gen .b.f <ButtonRelease-1>
  1053.     set x
  1054. } 0
  1055. test bind-15.18 {MatchPatterns procedure, checking "nearby"} {
  1056.     setup
  1057.     bind .b.f <Double-1> {set x 1}
  1058.     set x 0
  1059.     event gen .b.f <Button-2> 
  1060.     event gen .b.f <ButtonRelease-2>
  1061.     event gen .b.f <Button-1> -x 30 -y 40
  1062.     event gen .b.f <Button-1> -x 30 -y 30
  1063.     event gen .b.f <ButtonRelease-1>
  1064.     set x
  1065. } 0
  1066. test bind-15.19 {MatchPatterns procedure, checking "nearby"} {
  1067.     setup
  1068.     bind .b.f <Double-1> {set x 1}
  1069.     set x 0
  1070.     event gen .b.f <Button-2> 
  1071.     event gen .b.f <ButtonRelease-2>
  1072.     event gen .b.f <Button-1> -x 30 -y 40
  1073.     event gen .b.f <Button-1> -x 30 -y 50
  1074.     event gen .b.f <ButtonRelease-1>
  1075.     set x
  1076. } 0
  1077. test bind-15.20 {MatchPatterns procedure, checking "nearby"} {
  1078.     setup
  1079.     bind .b.f <Double-1> {set x 1}
  1080.     set x 0
  1081.     event gen .b.f <Button-2> 
  1082.     event gen .b.f <ButtonRelease-2>
  1083.     event gen .b.f <Button-1> -time 300
  1084.     event gen .b.f <Button-1> -time 700
  1085.     event gen .b.f <ButtonRelease-1>
  1086.     set x
  1087. } 1
  1088. test bind-15.21 {MatchPatterns procedure, checking "nearby"} {
  1089.     setup
  1090.     bind .b.f <Double-1> {set x 1}
  1091.     set x 0
  1092.     event gen .b.f <Button-2> 
  1093.     event gen .b.f <ButtonRelease-2>
  1094.     event gen .b.f <Button-1> -time 300
  1095.     event gen .b.f <Button-1> -time 900
  1096.     event gen .b.f <ButtonRelease-1>
  1097.     set x
  1098. } 0
  1099. test bind-15.22 {MatchPatterns procedure, time wrap-around} {
  1100.     setup
  1101.     bind .b.f <Double-1> {set x 1}
  1102.     set x 0
  1103.     event gen .b.f <Button-1> -time [expr -100]
  1104.     event gen .b.f <Button-1> -time 200
  1105.     event gen .b.f <ButtonRelease-1>
  1106.     set x
  1107. } 1
  1108. test bind-15.23 {MatchPatterns procedure, time wrap-around} {
  1109.     setup
  1110.     bind .b.f <Double-1> {set x 1}
  1111.     set x 0
  1112.     event gen .b.f <Button-1> -time -100
  1113.     event gen .b.f <Button-1> -time 500
  1114.     event gen .b.f <ButtonRelease-1>
  1115.     set x
  1116. } 0
  1117. test bind-15.24 {MatchPatterns procedure, virtual event} {
  1118.     setup
  1119.     event add <<Paste>> <Button-1>
  1120.     bind .b.f <<Paste>> {lappend x paste}
  1121.     set x {}
  1122.     event gen .b.f <Button-1>
  1123.     event gen .b.f <ButtonRelease-1>
  1124.     set x
  1125. } {paste}
  1126. test bind-15.25 {MatchPatterns procedure, reject a  virtual event} {
  1127.     setup
  1128.     event add <<Paste>> <Shift-Button-1>
  1129.     bind .b.f <<Paste>> {lappend x paste}
  1130.     set x {}
  1131.     event gen .b.f <Button-1>
  1132.     event gen .b.f <ButtonRelease-1>
  1133.     set x
  1134. } {}
  1135. test bind-15.26 {MatchPatterns procedure, reject a virtual event} {
  1136.     setup
  1137.     event add <<V1>> <Button>
  1138.     event add <<V2>> <Button-1>
  1139.     event add <<V3>> <Shift-Button-1>
  1140.     bind .b.f <<V2>> "lappend x V2%#"
  1141.     set x {}
  1142.     event gen .b.f <Button> -serial 101
  1143.     event gen .b.f <Button-1> -serial 102
  1144.     event gen .b.f <Shift-Button-1> -serial 103
  1145.     event gen .b.f <ButtonRelease-1>
  1146.     bind .b.f <Shift-Button-1> "lappend x Shift-Button-1"
  1147.     event gen .b.f <Button> -serial 104
  1148.     event gen .b.f <Button-1> -serial 105
  1149.     event gen .b.f <Shift-Button-1> -serial 106
  1150.     event gen .b.f <ButtonRelease-1>
  1151.     set x
  1152. } {V2102 V2103 V2105 Shift-Button-1}
  1153. test bind-15.27 {MatchPatterns procedure, conflict resolution} {
  1154.     setup
  1155.     bind .b.f <KeyPress> {set x 0}
  1156.     bind .b.f a {set x 1}
  1157.     set x none
  1158.     event gen .b.f <Key-a>
  1159.     set x
  1160. } 1
  1161. test bind-15.28 {MatchPatterns procedure, conflict resolution} {
  1162.     setup
  1163.     bind .b.f <KeyPress> {set x 0}
  1164.     bind .b.f a {set x 1}
  1165.     set x none
  1166.     event gen .b.f <Key-b>
  1167.     set x
  1168. } 0
  1169. test bind-15.29 {MatchPatterns procedure, conflict resolution} {
  1170.     setup
  1171.     bind .b.f <KeyPress> {lappend x 0}
  1172.     bind .b.f a {lappend x 1}
  1173.     bind .b.f ba {lappend x 2}
  1174.     set x none
  1175.     event gen .b.f <Key-b>
  1176.     event gen .b.f <KeyRelease-b>
  1177.     event gen .b.f <Key-a>
  1178.     set x
  1179. } {none 0 2}
  1180. test bind-15.30 {MatchPatterns procedure, conflict resolution} {
  1181.     setup
  1182.     bind .b.f <ButtonPress> {set x 0}
  1183.     bind .b.f <1> {set x 1}
  1184.     set x none
  1185.     event gen .b.f <Button-1>
  1186.     event gen .b.f <ButtonRelease-1>
  1187.     set x
  1188. } 1
  1189. test bind-15.31 {MatchPatterns procedure, conflict resolution} {
  1190.     setup
  1191.     bind .b.f <M1-Key> {set x 0}
  1192.     bind .b.f <M2-Key> {set x 1}
  1193.     set x none
  1194.     event gen .b.f <Key-a> -state 0x18
  1195.     set x
  1196. } 1
  1197. test bind-15.32 {MatchPatterns procedure, conflict resolution} {
  1198.     setup
  1199.     bind .b.f <M2-Key> {set x 0}
  1200.     bind .b.f <M1-Key> {set x 1}
  1201.     set x none
  1202.     event gen .b.f <Key-a> -state 0x18
  1203.     set x
  1204. } 1
  1205. test bind-15.33 {MatchPatterns procedure, conflict resolution} {
  1206.     setup
  1207.     bind .b.f <1> {lappend x single}
  1208.     bind Test <1> {lappend x single(Test)}
  1209.     bind Test <Double-1> {lappend x double(Test)}
  1210.     set x {}
  1211.     event gen .b.f <Button-1>
  1212.     event gen .b.f <Button-1>
  1213.     event gen .b.f <Button-1>
  1214.     event gen .b.f <ButtonRelease-1>
  1215.     set x
  1216. } {single single(Test) single double(Test) single double(Test)}
  1217. foreach i [bind Test] {
  1218.     bind Test $i {}
  1219. }
  1220. test bind-16.1 {ExpandPercents procedure} {
  1221.     setup
  1222.     bind .b.f <Enter> {set x abcd}
  1223.     set x none
  1224.     event gen .b.f <Enter>
  1225.     set x
  1226. } abcd
  1227. test bind-16.2 {ExpandPercents procedure} {
  1228.     setup
  1229.     bind .b.f <Enter> {set x %#}
  1230.     set x none
  1231.     event gen .b.f <Enter> -serial 1234
  1232.     set x
  1233. } 1234
  1234. test bind-16.3 {ExpandPercents procedure} {
  1235.     setup
  1236.     bind .b.f <Configure> {set x %a}
  1237.     set x none
  1238.     event gen .b.f <Configure> -above .b -window .b.f
  1239.     set x
  1240. } [winfo id .b]
  1241. test bind-16.4 {ExpandPercents procedure} {
  1242.     setup
  1243.     bind .b.f <Button> {set x %b}
  1244.     set x none
  1245.     event gen .b.f <Button-3>
  1246.     event gen .b.f <ButtonRelease-3>
  1247.     set x
  1248. } 3
  1249. test bind-16.5 {ExpandPercents procedure} {
  1250.     setup
  1251.     bind .b.f <Expose> {set x %c}
  1252.     set x none
  1253.     event gen .b.f <Expose> -count 47
  1254.     set x
  1255. } 47
  1256. test bind-16.6 {ExpandPercents procedure} {
  1257.     setup
  1258.     bind .b.f <Enter> {set x %d}
  1259.     set x none
  1260.     event gen .b.f <Enter> -detail NotifyAncestor
  1261.     set x
  1262. } NotifyAncestor
  1263. test bind-16.7 {ExpandPercents procedure} {
  1264.     setup
  1265.     bind .b.f <Enter> {set x %d}
  1266.     set x none
  1267.     event gen .b.f <Enter> -detail NotifyVirtual
  1268.     set x
  1269. } NotifyVirtual
  1270. test bind-16.8 {ExpandPercents procedure} {
  1271.     setup
  1272.     bind .b.f <Enter> {set x %d}
  1273.     set x none
  1274.     event gen .b.f <Enter> -detail NotifyNonlinear
  1275.     set x
  1276. } NotifyNonlinear
  1277. test bind-16.9 {ExpandPercents procedure} {
  1278.     setup
  1279.     bind .b.f <Enter> {set x %d}
  1280.     set x none
  1281.     event gen .b.f <Enter> -detail NotifyNonlinearVirtual
  1282.     set x
  1283. } NotifyNonlinearVirtual
  1284. test bind-16.10 {ExpandPercents procedure} {
  1285.     setup
  1286.     bind .b.f <Enter> {set x %d}
  1287.     set x none
  1288.     event gen .b.f <Enter> -detail NotifyPointer
  1289.     set x
  1290. } NotifyPointer
  1291. test bind-16.11 {ExpandPercents procedure} {
  1292.     setup
  1293.     bind .b.f <Enter> {set x %d}
  1294.     set x none
  1295.     event gen .b.f <Enter> -detail NotifyPointerRoot
  1296.     set x
  1297. } NotifyPointerRoot
  1298. test bind-16.12 {ExpandPercents procedure} {
  1299.     setup
  1300.     bind .b.f <Enter> {set x %d}
  1301.     set x none
  1302.     event gen .b.f <Enter> -detail NotifyDetailNone
  1303.     set x
  1304. } NotifyDetailNone
  1305. test bind-16.13 {ExpandPercents procedure} {
  1306.     setup
  1307.     bind .b.f <Enter> {set x %f}
  1308.     set x none
  1309.     event gen .b.f <Enter> -focus 1
  1310.     set x
  1311. } 1
  1312. test bind-16.14 {ExpandPercents procedure} {
  1313.     setup
  1314.     bind .b.f <Expose> {set x "%x %y %w %h"}
  1315.     set x none
  1316.     event gen .b.f <Expose> -x 24 -y 18 -width 147 -height 61
  1317.     set x
  1318. } {24 18 147 61}
  1319. test bind-16.15 {ExpandPercents procedure} {
  1320.     setup
  1321.     bind .b.f <Configure> {set x "%x %y %w %h"}
  1322.     set x none
  1323.     event gen .b.f <Configure> -x 24 -y 18 -width 147 -height 61 -window .b.f
  1324.     set x
  1325. } {24 18 147 61}
  1326. test bind-16.16 {ExpandPercents procedure} {
  1327.     setup
  1328.     bind .b.f <Key> {set x "%k"}
  1329.     set x none
  1330.     event gen .b.f <Key> -keycode 146
  1331.     set x
  1332. } 146
  1333. test bind-16.17 {ExpandPercents procedure} {
  1334.     setup
  1335.     bind .b.f <Enter> {set x "%m"}
  1336.     set x none
  1337.     event gen .b.f <Enter> -mode NotifyNormal
  1338.     set x
  1339. } NotifyNormal
  1340. test bind-16.18 {ExpandPercents procedure} {
  1341.     setup
  1342.     bind .b.f <Enter> {set x "%m"}
  1343.     set x none
  1344.     event gen .b.f <Enter> -mode NotifyGrab
  1345.     set x
  1346. } NotifyGrab
  1347. test bind-16.19 {ExpandPercents procedure} {
  1348.     setup
  1349.     bind .b.f <Enter> {set x "%m"}
  1350.     set x none
  1351.     event gen .b.f <Enter> -mode NotifyUngrab
  1352.     set x
  1353. } NotifyUngrab
  1354. test bind-16.20 {ExpandPercents procedure} {
  1355.     setup
  1356.     bind .b.f <Enter> {set x "%m"}
  1357.     set x none
  1358.     event gen .b.f <Enter> -mode NotifyWhileGrabbed
  1359.     set x
  1360. } NotifyWhileGrabbed
  1361. test bind-16.21 {ExpandPercents procedure} {
  1362.     setup
  1363.     bind .b.f <Map> {set x "%o"}
  1364.     set x none
  1365.     event gen .b.f <Map> -override 1 -window .b.f
  1366.     set x
  1367. } 1
  1368. test bind-16.22 {ExpandPercents procedure} {
  1369.     setup
  1370.     bind .b.f <Reparent> {set x "%o"}
  1371.     set x none
  1372.     event gen .b.f <Reparent> -override true -window .b.f
  1373.     set x
  1374. } 1
  1375. test bind-16.23 {ExpandPercents procedure} {
  1376.     setup
  1377.     bind .b.f <Configure> {set x "%o"}
  1378.     set x none
  1379.     event gen .b.f <Configure> -override 1 -window .b.f
  1380.     set x
  1381. } 1
  1382. test bind-16.24 {ExpandPercents procedure} {
  1383.     setup
  1384.     bind .b.f <Circulate> {set x "%p"}
  1385.     set x none
  1386.     event gen .b.f <Circulate> -place PlaceOnTop -window .b.f
  1387.     set x
  1388. } PlaceOnTop
  1389. test bind-16.25 {ExpandPercents procedure} {
  1390.     setup
  1391.     bind .b.f <Circulate> {set x "%p"}
  1392.     set x none
  1393.     event gen .b.f <Circulate> -place PlaceOnBottom -window .b.f
  1394.     set x
  1395. } PlaceOnBottom
  1396. test bind-16.26 {ExpandPercents procedure} {
  1397.     setup
  1398.     bind .b.f <1> {set x "%s"}
  1399.     set x none
  1400.     event gen .b.f <Button-1> -state 1402
  1401.     event gen .b.f <ButtonRelease-1>
  1402.     set x
  1403. } 1402
  1404. test bind-16.27 {ExpandPercents procedure} {
  1405.     setup
  1406.     bind .b.f <Enter> {set x "%s"}
  1407.     set x none
  1408.     event gen .b.f <Enter> -state 0x3ff
  1409.     set x
  1410. } 1023
  1411. test bind-16.28 {ExpandPercents procedure} {
  1412.     setup
  1413.     bind .b.f <Visibility> {set x "%s"}
  1414.     set x none
  1415.     event gen .b.f <Visibility> -state VisibilityPartiallyObscured
  1416.     set x
  1417. } VisibilityPartiallyObscured
  1418. test bind-16.29 {ExpandPercents procedure} {
  1419.     setup
  1420.     bind .b.f <Visibility> {set x "%s"}
  1421.     set x none
  1422.     event gen .b.f <Visibility> -state VisibilityUnobscured
  1423.     set x
  1424. } VisibilityUnobscured
  1425. test bind-16.30 {ExpandPercents procedure} {
  1426.     setup
  1427.     bind .b.f <Visibility> {set x "%s"}
  1428.     set x none
  1429.     event gen .b.f <Visibility> -state VisibilityFullyObscured
  1430.     set x
  1431. } VisibilityFullyObscured
  1432. test bind-16.31 {ExpandPercents procedure} {
  1433.     setup
  1434.     bind .b.f <Button> {set x "%t"}
  1435.     set x none
  1436.     event gen .b.f <Button> -time 4294
  1437.     event gen .b.f <ButtonRelease>
  1438.     set x
  1439. } 4294
  1440. test bind-16.32 {ExpandPercents procedure} {
  1441.     setup
  1442.     bind .b.f <Button> {set x "%x %y"}
  1443.     set x none
  1444.     event gen .b.f <Button> -x 881 -y 432
  1445.     event gen .b.f <ButtonRelease>
  1446.     set x
  1447. } {881 432}
  1448. test bind-16.33 {ExpandPercents procedure} {
  1449.     setup
  1450.     bind .b.f <Reparent> {set x "%x %y"}
  1451.     set x none
  1452.     event gen .b.f <Reparent> -x 882 -y 431 -window .b.f
  1453.     set x
  1454. } {882 431}
  1455. test bind-16.34 {ExpandPercents procedure} {
  1456.     setup
  1457.     bind .b.f <Enter> {set x "%x %y"}
  1458.     set x none
  1459.     event gen .b.f <Enter> -x 781 -y 632
  1460.     set x
  1461. } {781 632}
  1462. test bind-16.35 {ExpandPercents procedure} {nonPortable} {
  1463.     setup
  1464.     bind .b.f <Key> {lappend x "%A"}
  1465.     set x {}
  1466.     event gen .b.f <Key-a>
  1467.     event gen .b.f <Key-A> -state 1
  1468.     event gen .b.f <Key-Tab>
  1469.     event gen .b.f <Key-Return>
  1470.     event gen .b.f <Key-F1>
  1471.     event gen .b.f <Key-Shift_L>
  1472.     event gen .b.f <Key-space>
  1473.     event gen .b.f <Key-dollar> -state 1
  1474.     event gen .b.f <Key-braceleft> -state 1
  1475.     event gen .b.f <Key-Multi_key>
  1476.     event gen .b.f <Key-e>
  1477.     event gen .b.f <Key-apostrophe>
  1478.     set x
  1479. } "a A { } {r} {{}} {{}} { } {$} \{ {{}} {{}} u00e9"
  1480. test bind-16.36 {ExpandPercents procedure} {
  1481.     setup
  1482.     bind .b.f <Configure> {set x "%B"}
  1483.     set x none
  1484.     event gen .b.f <Configure> -borderwidth 24 -window .b.f
  1485.     set x
  1486. } 24
  1487. test bind-16.37 {ExpandPercents procedure} {
  1488.     setup
  1489.     bind .b.f <Enter> {set x "%E"}
  1490.     set x none
  1491.     event gen .b.f <Enter> -sendevent 1
  1492.     set x
  1493. } 1
  1494. test bind-16.38 {ExpandPercents procedure} {nonPortable} {
  1495.     setup
  1496.     bind .b.f <Key> {lappend x %K}
  1497.     set x {}
  1498.     event gen .b.f <Key-a>
  1499.     event gen .b.f <Key-A> -state 1
  1500.     event gen .b.f <Key-Tab>
  1501.     event gen .b.f <Key-F1>
  1502.     event gen .b.f <Key-Shift_L>
  1503.     event gen .b.f <Key-space>
  1504.     event gen .b.f <Key-dollar> -state 1
  1505.     event gen .b.f <Key-braceleft> -state 1
  1506.     set x
  1507. } {a A Tab F1 Shift_L space dollar braceleft}
  1508. test bind-16.39 {ExpandPercents procedure} {
  1509.     setup
  1510.     bind .b.f <Key> {set x "%N"}
  1511.     set x none
  1512.     event gen .b.f <Key-a>
  1513.     set x
  1514. } 97
  1515. test bind-16.40 {ExpandPercents procedure} {
  1516.     setup
  1517.     bind .b.f <Key> {set x "%S"}
  1518.     set x none
  1519.     event gen .b.f <Key-a> -subwindow .b
  1520.     set x
  1521. } [winfo id .b]
  1522. test bind-16.41 {ExpandPercents procedure} {
  1523.     setup
  1524.     bind .b.f <Key> {set x "%T"}
  1525.     set x none
  1526.     event gen .b.f <Key>
  1527.     set x
  1528. } 2
  1529. test bind-16.42 {ExpandPercents procedure} {
  1530.     setup
  1531.     bind .b.f <Key> {set x "%W"}
  1532.     set x none
  1533.     event gen .b.f <Key>
  1534.     set x
  1535. } .b.f
  1536. test bind-16.43 {ExpandPercents procedure} {
  1537.     setup
  1538.     bind .b.f <Button> {set x "%X %Y"}
  1539.     set x none
  1540.     event gen .b.f <Button> -rootx 422 -rooty 13
  1541.     event gen .b.f <ButtonRelease>
  1542.     set x
  1543. } {422 13}
  1544. test bind-16.44 {ExpandPercents procedure} {
  1545.     setup
  1546.     bind .b.f <Gravity> {set x "%R %S"}
  1547.     set x none
  1548.     event gen .b.f <Gravity>
  1549.     set x
  1550. } {?? ??}
  1551. test bind-17.1 {event command} {
  1552.     list [catch {event} msg] $msg
  1553. } {1 {wrong # args: should be "event option ?arg?"}}
  1554. test bind-17.2 {event command} {
  1555.     list [catch {event xyz} msg] $msg
  1556. } {1 {bad option "xyz": must be add, delete, generate, or info}}
  1557. test bind-17.3 {event command: add} {
  1558.     list [catch {event add} msg] $msg
  1559. } {1 {wrong # args: should be "event add virtual sequence ?sequence ...?"}}
  1560. test bind-17.4 {event command: add 1} {
  1561.     setup
  1562.     event add <<Paste>> <Control-v>
  1563.     event info <<Paste>>
  1564. } {<Control-Key-v>}
  1565. test bind-17.5 {event command: add 2} {
  1566.     setup
  1567.     event add <<Paste>> <Control-v> <Button-2>
  1568.     lsort [event info <<Paste>>]
  1569. } {<Button-2> <Control-Key-v>}
  1570. test bind-17.6 {event command: add with error} {
  1571.     setup
  1572.     list [catch {event add <<Paste>> <Control-v> <Button-2> abc <xyz> <1>} 
  1573.     msg] $msg [lsort [event info <<Paste>>]]
  1574. } {1 {bad event type or keysym "xyz"} {<Button-2> <Control-Key-v> abc}}
  1575. test bind-17.7 {event command: delete} {
  1576.     list [catch {event delete} msg] $msg
  1577. } {1 {wrong # args: should be "event delete virtual ?sequence sequence ...?"}}
  1578. test bind-17.8 {event command: delete many} {
  1579.     setup
  1580.     event add <<Paste>> <3> <1> <2> t
  1581.     event delete <<Paste>> <1> <2>
  1582.     lsort [event info <<Paste>>]
  1583. } {<Button-3> t}
  1584. test bind-17.9 {event command: delete all} {
  1585.     setup
  1586.     event add <<Paste>> a b
  1587.     event delete <<Paste>>
  1588.     event info <<Paste>>
  1589. } {}
  1590. test bind-17.10 {event command: delete 1} {
  1591.     setup
  1592.     event add <<Paste>> a b c
  1593.     event delete <<Paste>> b
  1594.     lsort [event info <<Paste>>]
  1595. } {a c}
  1596. test bind-17.11 {event command: info name} {
  1597.     setup
  1598.     event add <<Paste>> a b c
  1599.     lsort [event info <<Paste>>]
  1600. } {a b c}
  1601. test bind-17.12 {event command: info all} {
  1602.     setup
  1603.     event add <<Paste>> a
  1604.     event add <<Alive>> b
  1605.     lsort [event info]
  1606. } {<<Alive>> <<Paste>>}
  1607. test bind-17.13 {event command: info error} {
  1608.     list [catch {event info <<Paste>> <Control-v>} msg] $msg
  1609. } {1 {wrong # args: should be "event info ?virtual?"}}
  1610. test bind-17.14 {event command: generate} {
  1611.     list [catch {event generate} msg] $msg
  1612. } {1 {wrong # args: should be "event generate window event ?options?"}}
  1613. test bind-17.15 {event command: generate} {
  1614.     setup
  1615.     bind .b.f <1> "lappend x 1"
  1616.     set x {}
  1617.     event generate .b.f <1>
  1618.     set x
  1619. } {1}
  1620. test bind-17.16 {event command: generate} {
  1621.     list [catch {event generate .b.f <xyz>} msg] $msg
  1622. } {1 {bad event type or keysym "xyz"}}
  1623. test bind-17.17 {event command} {
  1624.     list [catch {event foo} msg] $msg
  1625. } {1 {bad option "foo": must be add, delete, generate, or info}}
  1626. test bind-18.1 {CreateVirtualEvent procedure: GetVirtualEventUid} {
  1627.     list [catch {event add asd <Ctrl-v>} msg] $msg
  1628. } {1 {virtual event "asd" is badly formed}}
  1629. test bind-18.2 {CreateVirtualEvent procedure: FindSequence} {
  1630.     list [catch {event add <<asd>> <Ctrl-v>} msg] $msg
  1631. } {1 {bad event type or keysym "Ctrl"}}
  1632. test bind-18.3 {CreateVirtualEvent procedure: new physical} {
  1633.     setup
  1634.     event add <<xyz>> <Control-v>
  1635.     event info <<xyz>>
  1636. } {<Control-Key-v>}
  1637. test bind-18.4 {CreateVirtualEvent procedure: duplicate physical} {
  1638.     setup
  1639.     event add <<xyz>> <Control-v> 
  1640.     event add <<xyz>> <Control-v>
  1641.     event info <<xyz>>
  1642. } {<Control-Key-v>}
  1643. test bind-18.5 {CreateVirtualEvent procedure: existing physical} {
  1644.     setup
  1645.     event add <<xyz>> <Control-v>
  1646.     event add <<abc>> <Control-v>
  1647.     list [lsort [event info]] [event info <<xyz>>] [event info <<abc>>]
  1648. } {{<<abc>> <<xyz>>} <Control-Key-v> <Control-Key-v>}
  1649. test bind-18.6 {CreateVirtualEvent procedure: new virtual} {
  1650.     setup
  1651.     event add <<xyz>> <Control-v>
  1652.     list [event info] [event info <<xyz>>]
  1653. } {<<xyz>> <Control-Key-v>}
  1654. test bind-18.7 {CreateVirtualEvent procedure: existing virtual} {
  1655.     setup
  1656.     event add <<xyz>> <Control-v>
  1657.     event add <<xyz>> <Button-2>
  1658.     list [event info] [lsort [event info <<xyz>>]]
  1659. } {<<xyz>> {<Button-2> <Control-Key-v>}}
  1660. test bind-19.1 {DeleteVirtualEvent procedure: GetVirtualEventUid} {
  1661.     list [catch {event add xyz {}} msg] $msg
  1662. } {1 {virtual event "xyz" is badly formed}}
  1663. test bind-19.2 {DeleteVirtualEvent procedure: non-existent virtual} {
  1664.     setup
  1665.     event delete <<xyz>>
  1666.     event info
  1667. } {}
  1668. test bind-19.3 {DeleteVirtualEvent procedure: delete 1} {
  1669.     setup
  1670.     event add <<xyz>> <Control-v>
  1671.     event delete <<xyz>> <Control-v>
  1672.     event info <<xyz>>
  1673. } {}
  1674. test bind-19.4 {DeleteVirtualEvent procedure: delete 1, not owned} {
  1675.     setup
  1676.     event add <<xyz>> <Control-v>
  1677.     event delete <<xyz>> <Button-1>
  1678.     event info <<xyz>>
  1679. } {<Control-Key-v>}
  1680. test bind-19.5 {DeleteVirtualEvent procedure: delete 1, badly formed} {
  1681.     setup
  1682.     event add <<xyz>> <Control-v>
  1683.     list [catch {event delete <<xyz>> <xyz>} msg] $msg
  1684. } {1 {bad event type or keysym "xyz"}}
  1685. test bind-19.6 {DeleteVirtualEvent procedure: delete 1, badly formed} {
  1686.     setup
  1687.     event add <<xyz>> <Control-v>
  1688.     list [catch {event delete <<xyz>> <<Paste>>} msg] $msg
  1689. } {1 {virtual event not allowed in definition of another virtual event}}
  1690. test bind-19.7 {DeleteVirtualEvent procedure: owns 1, delete all} {
  1691.     setup
  1692.     event add <<xyz>> <Control-v>
  1693.     event delete <<xyz>>
  1694.     event info 
  1695. } {}
  1696. test bind-19.8 {DeleteVirtualEvent procedure: owns 1, delete 1} {
  1697.     setup
  1698.     event add <<xyz>> <Control-v>
  1699.     event delete <<xyz>> <Control-v>
  1700.     event info 
  1701. } {}
  1702. test bind-19.9 {DeleteVirtualEvent procedure: owns many, delete all} {
  1703.     setup
  1704.     event add <<xyz>> <Control-v> <Control-w> <Control-x>
  1705.     event delete <<xyz>>
  1706.     event info
  1707. } {}
  1708. test bind-19.10 {DeleteVirtualEvent procedure: owns many, delete 1} {
  1709.     setup
  1710.     event add <<xyz>> <Control-v> <Control-w> <Control-x>
  1711.     event delete <<xyz>> <Control-w>
  1712.     lsort [event info <<xyz>>]
  1713. } {<Control-Key-v> <Control-Key-x>}
  1714. test bind-19.11 {DeleteVirtualEvent procedure: owned by 1, only} {
  1715.     setup
  1716.     event add <<xyz>> <Button-2>
  1717.     bind .b.f <<xyz>> {lappend x %#}
  1718.     set x {}
  1719.     event gen .b.f <Button-2> -serial 101
  1720.     event gen .b.f <ButtonRelease-2>
  1721.     event delete <<xyz>>
  1722.     event gen .b.f <Button-2> -serial 102
  1723.     event gen .b.f <ButtonRelease-2>
  1724.     set x
  1725. } {101}
  1726. test bind-19.12 {DeleteVirtualEvent procedure: owned by 1, first in chain} {
  1727.     setup
  1728.     event add <<abc>> <Control-Button-2>
  1729.     event add <<xyz>> <Button-2>
  1730.     bind .b.f <<xyz>> {lappend x xyz}
  1731.     bind .b.f <<abc>> {lappend x abc}
  1732.     set x {}
  1733.     event gen .b.f <Button-2>
  1734.     event gen .b.f <ButtonRelease-2>
  1735.     event gen .b.f <Control-Button-2>
  1736.     event gen .b.f <Control-ButtonRelease-2>
  1737.     event delete <<xyz>> 
  1738.     event gen .b.f <Button-2>
  1739.     event gen .b.f <ButtonRelease-2>
  1740.     event gen .b.f <Control-Button-2>
  1741.     event gen .b.f <Control-ButtonRelease-2>
  1742.     list $x [event info <<abc>>]
  1743. } {{xyz abc abc} <Control-Button-2>}
  1744. test bind-19.13 {DeleteVirtualEvent procedure: owned by 1, second in chain} {
  1745.     setup
  1746.     event add <<def>> <Shift-Button-2>
  1747.     event add <<xyz>> <Button-2>
  1748.     event add <<abc>> <Control-Button-2>
  1749.     bind .b.f <<xyz>> {lappend x xyz}
  1750.     bind .b.f <<abc>> {lappend x abc}
  1751.     bind .b.f <<def>> {lappend x def}
  1752.     set x {}
  1753.     event gen .b.f <Button-2>
  1754.     event gen .b.f <ButtonRelease-2>
  1755.     event gen .b.f <Control-Button-2>
  1756.     event gen .b.f <Control-ButtonRelease-2>
  1757.     event gen .b.f <Shift-Button-2>
  1758.     event gen .b.f <Shift-ButtonRelease-2>
  1759.     event delete <<xyz>>
  1760.     event gen .b.f <Button-2>
  1761.     event gen .b.f <Control-Button-2>
  1762.     event gen .b.f <Shift-Button-2>
  1763.     event gen .b.f <ButtonRelease-2>
  1764.     event gen .b.f <Control-ButtonRelease-2>
  1765.     event gen .b.f <Shift-ButtonRelease-2>
  1766.     list $x [event info <<def>>] [event info <<xyz>>] [event info <<abc>>]
  1767. } {{xyz abc def abc def} <Shift-Button-2> {} <Control-Button-2>}
  1768. test bind-19.14 {DeleteVirtualEvent procedure: owned by 1, last in chain} {
  1769.     setup
  1770.     event add <<xyz>> <Button-2>
  1771.     event add <<abc>> <Control-Button-2>
  1772.     event add <<def>> <Shift-Button-2>
  1773.     bind .b.f <<xyz>> {lappend x xyz}
  1774.     bind .b.f <<abc>> {lappend x abc}
  1775.     bind .b.f <<def>> {lappend x def}
  1776.     set x {}
  1777.     event gen .b.f <Button-2>
  1778.     event gen .b.f <ButtonRelease-2>
  1779.     event gen .b.f <Control-Button-2>
  1780.     event gen .b.f <Control-ButtonRelease-2>
  1781.     event gen .b.f <Shift-Button-2>
  1782.     event gen .b.f <Shift-ButtonRelease-2>
  1783.     event delete <<xyz>> 
  1784.     event gen .b.f <Button-2>
  1785.     event gen .b.f <ButtonRelease-2>
  1786.     event gen .b.f <Control-Button-2>
  1787.     event gen .b.f <Control-ButtonRelease-2>
  1788.     event gen .b.f <Shift-Button-2>
  1789.     event gen .b.f <Shift-ButtonRelease-2>
  1790.     list $x [event info <<xyz>>] [event info <<abc>>] [event info <<def>>]
  1791. } {{xyz abc def abc def} {} <Control-Button-2> <Shift-Button-2>}
  1792. test bind-19.15 {DeleteVirtualEvent procedure: owned by many, first} {
  1793.     setup
  1794.     pack [frame .b.g -class Test -width 150 -height 100]
  1795.     pack [frame .b.h -class Test -width 150 -height 100]
  1796.     update
  1797.     event add <<xyz>> <Button-2>
  1798.     event add <<abc>> <Button-2>
  1799.     event add <<def>> <Button-2>
  1800.     bind .b.f <<xyz>> {lappend x xyz}
  1801.     bind .b.g <<abc>> {lappend x abc}
  1802.     bind .b.h <<def>> {lappend x def}
  1803.     set x {}
  1804.     event gen .b.f <Button-2>
  1805.     event gen .b.f <ButtonRelease-2>
  1806.     event gen .b.g <Button-2>
  1807.     event gen .b.g <ButtonRelease-2>
  1808.     event gen .b.h <Button-2>
  1809.     event gen .b.h <ButtonRelease-2>
  1810.     event delete <<xyz>> 
  1811.     event gen .b.f <Button-2>
  1812.     event gen .b.f <ButtonRelease-2>
  1813.     event gen .b.g <Button-2>
  1814.     event gen .b.g <ButtonRelease-2>
  1815.     event gen .b.h <Button-2>
  1816.     event gen .b.h <ButtonRelease-2>
  1817.     destroy .b.g
  1818.     destroy .b.h
  1819.     list $x [event info <<xyz>>] [event info <<abc>>] [event info <<def>>]
  1820. } {{xyz abc def abc def} {} <Button-2> <Button-2>}
  1821. test bind-19.16 {DeleteVirtualEvent procedure: owned by many, middle} {
  1822.     setup
  1823.     pack [frame .b.g -class Test -width 150 -height 100]
  1824.     pack [frame .b.h -class Test -width 150 -height 100]
  1825.     update
  1826.     event add <<xyz>> <Button-2>
  1827.     event add <<abc>> <Button-2>
  1828.     event add <<def>> <Button-2>
  1829.     bind .b.f <<xyz>> {lappend x xyz}
  1830.     bind .b.g <<abc>> {lappend x abc}
  1831.     bind .b.h <<def>> {lappend x def}
  1832.     set x {}
  1833.     event gen .b.f <Button-2>
  1834.     event gen .b.f <ButtonRelease-2>
  1835.     event gen .b.g <Button-2>
  1836.     event gen .b.g <ButtonRelease-2>
  1837.     event gen .b.h <Button-2>
  1838.     event gen .b.h <ButtonRelease-2>
  1839.     event delete <<abc>>
  1840.     event gen .b.f <Button-2>
  1841.     event gen .b.f <ButtonRelease-2>
  1842.     event gen .b.g <Button-2>
  1843.     event gen .b.g <ButtonRelease-2>
  1844.     event gen .b.h <Button-2>
  1845.     event gen .b.h <ButtonRelease-2>
  1846.     destroy .b.g
  1847.     destroy .b.h
  1848.     list $x [event info <<xyz>>] [event info <<abc>>] [event info <<def>>]
  1849. } {{xyz abc def xyz def} <Button-2> {} <Button-2>}
  1850. test bind-19.17 {DeleteVirtualEvent procedure: owned by many, last} {
  1851.     setup
  1852.     pack [frame .b.g -class Test -width 150 -height 100]
  1853.     pack [frame .b.h -class Test -width 150 -height 100]
  1854.     update
  1855.     event add <<xyz>> <Button-2>
  1856.     event add <<abc>> <Button-2>
  1857.     event add <<def>> <Button-2>
  1858.     bind .b.f <<xyz>> {lappend x xyz}
  1859.     bind .b.g <<abc>> {lappend x abc}
  1860.     bind .b.h <<def>> {lappend x def}
  1861.     set x {}
  1862.     event gen .b.f <Button-2>
  1863.     event gen .b.f <ButtonRelease-2>
  1864.     event gen .b.g <Button-2>
  1865.     event gen .b.g <ButtonRelease-2>
  1866.     event gen .b.h <Button-2>
  1867.     event gen .b.h <ButtonRelease-2>
  1868.     event delete <<def>> 
  1869.     event gen .b.f <Button-2>
  1870.     event gen .b.f <ButtonRelease-2>
  1871.     event gen .b.g <Button-2>
  1872.     event gen .b.g <ButtonRelease-2>
  1873.     event gen .b.h <Button-2>
  1874.     event gen .b.h <ButtonRelease-2>
  1875.     destroy .b.g
  1876.     destroy .b.h
  1877.     list $x [event info <<xyz>>] [event info <<abc>>] [event info <<def>>]
  1878. } {{xyz abc def xyz abc} <Button-2> <Button-2> {}}
  1879. test bind-20.1 {GetVirtualEvent procedure: GetVirtualEventUid} {
  1880.     list [catch {event info asd} msg] $msg
  1881. } {1 {virtual event "asd" is badly formed}}
  1882. test bind-20.2 {GetVirtualEvent procedure: non-existent event} {
  1883.     event info <<asd>>
  1884. } {}
  1885. test bind-20.3 {GetVirtualEvent procedure: owns 1} {
  1886.     setup
  1887.     event add <<xyz>> <Control-Key-v>
  1888.     event info <<xyz>>
  1889. } {<Control-Key-v>}
  1890. test bind-20.4 {GetVirtualEvent procedure: owns many} {
  1891.     setup
  1892.     event add <<xyz>> <Control-v> <Button-2> spack
  1893.     event info <<xyz>>
  1894. } {<Control-Key-v> <Button-2> spack}
  1895. test bind-21.1 {GetAllVirtualEvents procedure: no events} {
  1896.     setup
  1897.     event info
  1898. } {}
  1899. test bind-21.2 {GetAllVirtualEvents procedure: 1 event} {
  1900.     setup
  1901.     event add <<xyz>> <Control-v>
  1902.     event info
  1903. } {<<xyz>>}
  1904. test bind-21.3 {GetAllVirtualEvents procedure: many events} {
  1905.     setup
  1906.     event add <<xyz>> <Control-v>
  1907.     event add <<xyz>> <Button-2>
  1908.     event add <<abc>> <Control-v>
  1909.     event add <<def>> <Key-F6>
  1910.     lsort [event info]
  1911. } {<<abc>> <<def>> <<xyz>>}
  1912. test bind-22.1 {HandleEventGenerate} {
  1913.     list [catch {event gen .xyz <Control-v>} msg] $msg
  1914. } {1 {bad window path name ".xyz"}}
  1915. test bind-22.2 {HandleEventGenerate} {
  1916.     list [catch {event gen zzz <Control-v>} msg] $msg
  1917. } {1 {bad window name/identifier "zzz"}}
  1918. test bind-22.3 {HandleEventGenerate} {
  1919.     list [catch {event gen 47 <Control-v>} msg] $msg
  1920. } {1 {bad window name/identifier "47"}}
  1921. test bind-22.4 {HandleEventGenerate} {
  1922.     setup
  1923.     bind .b.f <Button> {set x "%s %b"}
  1924.     set x {}
  1925.     event gen [winfo id .b.f] <Control-Button-1> -state 260
  1926.     set x
  1927. } {260 1}
  1928. test bind-22.5 {HandleEventGenerate} {
  1929.     list [catch {event gen . <xyz>} msg] $msg
  1930. } {1 {bad event type or keysym "xyz"}}
  1931. test bind-22.6 {HandleEventGenerate} {
  1932.     list [catch {event gen . <Double-Button-1>} msg] $msg
  1933. } {1 {Double or Triple modifier not allowed}}
  1934. test bind-22.7 {HandleEventGenerate} {
  1935.     list [catch {event gen . xyz} msg] $msg
  1936. } {1 {only one event specification allowed}}
  1937. test bind-22.8 {HandleEventGenerate} {
  1938.     list [catch {event gen . <Button> -button} msg] $msg
  1939. } {1 {value for "-button" missing}}
  1940. test bind-22.9 {HandleEventGenerate} {
  1941.     setup
  1942.     bind .b.f <Button> {set x "%s %b"}
  1943.     set x {}
  1944.     event gen .b.f <ButtonRelease-1>
  1945.     event gen .b.f <ButtonRelease-2>
  1946.     event gen .b.f <ButtonRelease-3>
  1947.     event gen .b.f <Control-Button-1>
  1948.     event gen .b.f <Control-ButtonRelease-1>
  1949.     set x
  1950. } {4 1}
  1951. test bind-22.10 {HandleEventGenerate} {
  1952.     setup
  1953.     bind .b.f <Key> {set x "%s %K"}
  1954.     set x {}
  1955.     event gen .b.f <Control-Key-1>
  1956.     set x
  1957. } {4 1}
  1958. test bind-22.11 {HandleEventGenerate} {
  1959.     setup
  1960.     bind .b.f <<Paste>> {set x "%s"}
  1961.     set x {}
  1962.     event gen .b.f <<Paste>> -state 1
  1963.     set x
  1964. } {1}
  1965. test bind-22.12 {HandleEventGenerate} {
  1966.     setup
  1967.     bind .b.f <Motion> {set x "%s"}
  1968.     set x {}
  1969.     event gen .b.f <Control-Motion>
  1970.     set x
  1971. } {4}
  1972. test bind-22.13 {HandleEventGenerate} {
  1973.     setup
  1974.     bind .b.f <Button> {lappend x %#}
  1975.     set x {}
  1976.     event gen .b.f <Button> -when now -serial 100
  1977.     event gen .b.f <ButtonRelease> -when now
  1978.     set x
  1979. } {100}
  1980. test bind-22.14 {HandleEventGenerate} {
  1981.     setup
  1982.     bind .b.f <Button> {lappend x %#}
  1983.     set x {}
  1984.     event gen .b.f <Button> -when head -serial 100
  1985.     event gen .b.f <Button> -when head -serial 101
  1986.     event gen .b.f <Button> -when head -serial 102
  1987.     event gen .b.f <ButtonRelease> -when tail
  1988.     lappend x foo
  1989.     update
  1990.     set x
  1991. } {foo 102 101 100}
  1992. test bind-22.15 {HandleEventGenerate} {
  1993.     setup
  1994.     bind .b.f <Button> {lappend x %#}
  1995.     set x {}
  1996.     event gen .b.f <Button> -when head -serial 99
  1997.     event gen .b.f <Button> -when mark -serial 100
  1998.     event gen .b.f <Button> -when mark -serial 101
  1999.     event gen .b.f <Button> -when mark -serial 102
  2000.     event gen .b.f <ButtonRelease> -when tail
  2001.     lappend x foo
  2002.     update
  2003.     set x
  2004. } {foo 100 101 102 99}
  2005. test bind-22.16 {HandleEventGenerate} {
  2006.     setup
  2007.     bind .b.f <Button> {lappend x %#}
  2008.     set x {}
  2009.     event gen .b.f <Button> -when head -serial 99
  2010.     event gen .b.f <Button> -when tail -serial 100
  2011.     event gen .b.f <Button> -when tail -serial 101
  2012.     event gen .b.f <Button> -when tail -serial 102
  2013.     event gen .b.f <ButtonRelease> -when tail
  2014.     lappend x foo
  2015.     update
  2016.     set x
  2017. } {foo 99 100 101 102}
  2018. test bind-22.17 {HandleEventGenerate} {
  2019.     list [catch {event gen . <Button> -when xyz} msg] $msg
  2020. } {1 {bad -when value "xyz": must be now, head, mark, or tail}}
  2021. test bind-22.18 {HandleEventGenerate} {
  2022.     # Bug 411307
  2023.     list [catch {event gen . <a> -root 98765} msg] $msg
  2024. } {1 {bad window name/identifier "98765"}}
  2025. set i 19
  2026. foreach check {
  2027.     {<Configure> %a {-above .xyz} {{1 {bad window path name ".xyz"}}}}
  2028.     {<Configure> %a {-above .b} {[winfo id .b]}}
  2029.     {<Configure> %a {-above xyz} {{1 {bad window name/identifier "xyz"}}}}
  2030.     {<Configure> %a {-above [winfo id .b]} {[winfo id .b]}}
  2031.     {<Key> %b    {-above .} {{1 {<Key> event doesn't accept "-above" option}}}}
  2032.     {<Configure> %B {-borderwidth xyz} {{1 {bad screen distance "xyz"}}}}    
  2033.     {<Configure> %B {-borderwidth 2i} {[winfo pixels .b.f 2i]}}
  2034.     {<Key> %k     {-borderwidth 2i} {{1 {<Key> event doesn't accept "-borderwidth" option}}}}
  2035.     {<Button> %b    {-button xyz} {{1 {expected integer but got "xyz"}}}}
  2036.     {<Button> %b    {-button 1} 1}
  2037.     {<ButtonRelease> %b    {-button 1} 1}
  2038.     {<Key> %k     {-button 1} {{1 {<Key> event doesn't accept "-button" option}}}}
  2039.     {<Expose> %c    {-count xyz} {{1 {expected integer but got "xyz"}}}}
  2040.     {<Expose> %c    {-count 20} 20}
  2041.     {<Key> %b     {-count 20} {{1 {<Key> event doesn't accept "-count" option}}}}
  2042.     {<Enter> %d     {-detail xyz} {{1 {bad -detail value "xyz": must be NotifyAncestor, NotifyVirtual, NotifyInferior, NotifyNonlinear, NotifyNonlinearVirtual, NotifyPointer, NotifyPointerRoot, or NotifyDetailNone}}}}
  2043.     {<FocusIn> %d   {-detail NotifyVirtual} {{}}}
  2044.     {<Enter> %d     {-detail NotifyVirtual} NotifyVirtual}
  2045.     {<Key> %k     {-detail NotifyVirtual} {{1 {<Key> event doesn't accept "-detail" option}}}}
  2046.     {<Enter> %f     {-focus xyz} {{1 {expected boolean value but got "xyz"}}}}
  2047.     {<Enter> %f     {-focus 1} 1}
  2048.     {<Key> %k     {-focus 1} {{1 {<Key> event doesn't accept "-focus" option}}}}
  2049.     {<Expose> %h    {-height xyz} {{1 {bad screen distance "xyz"}}}}
  2050.     {<Expose> %h    {-height 2i} {[winfo pixels .b.f 2i]}}
  2051.     {<Configure> %h {-height 2i} {[winfo pixels .b.f 2i]}}
  2052.     {<Key> %k     {-height 2i} {{1 {<Key> event doesn't accept "-height" option}}}}
  2053.     {<Key> %k     {-keycode xyz} {{1 {expected integer but got "xyz"}}}}
  2054.     {<Key> %k     {-keycode 20} 20}
  2055.     {<Button> %b    {-keycode 20} {{1 {<Button> event doesn't accept "-keycode" option}}}}
  2056.     {<Key> %K     {-keysym xyz} {{1 {unknown keysym "xyz"}}}}
  2057.     {<Key> %K     {-keysym a} a}
  2058.     {<Button> %b    {-keysym a} {{1 {<Button> event doesn't accept "-keysym" option}}}}
  2059.     {<Enter> %m     {-mode xyz} {{1 {bad -mode value "xyz": must be NotifyNormal, NotifyGrab, NotifyUngrab, or NotifyWhileGrabbed}}}}
  2060.     {<Enter> %m     {-mode NotifyNormal} NotifyNormal}
  2061.     {<FocusIn> %m   {-mode NotifyNormal} {{}}}
  2062.     {<Key> %k     {-mode NotifyNormal} {{1 {<Key> event doesn't accept "-mode" option}}}}
  2063.     {<Map> %o     {-override xyz} {{1 {expected boolean value but got "xyz"}}}}
  2064.     {<Map> %o     {-override 1} 1}
  2065.     {<Reparent> %o  {-override 1} 1}
  2066.     {<Configure> %o {-override 1} 1}
  2067.     {<Key> %k     {-override 1} {{1 {<Key> event doesn't accept "-override" option}}}}
  2068.     {<Circulate> %p {-place xyz} {{1 {bad -place value "xyz": must be PlaceOnTop, or PlaceOnBottom}}}}
  2069.     {<Circulate> %p {-place PlaceOnTop} PlaceOnTop}
  2070.     {<Key> %k     {-place PlaceOnTop} {{1 {<Key> event doesn't accept "-place" option}}}}
  2071.     {<Key> %R     {-root .xyz} {{1 {bad window path name ".xyz"}}}}
  2072.     {<Key> %R     {-root .b} {[winfo id .b]}}
  2073.     {<Key> %R     {-root xyz} {{1 {bad window name/identifier "xyz"}}}}
  2074.     {<Key> %R     {-root [winfo id .b]} {[winfo id .b]}}
  2075.     {<Button> %R    {-root .b} {[winfo id .b]}}
  2076.     {<ButtonRelease> %R    {-root .b} {[winfo id .b]}}
  2077.     {<Motion> %R    {-root .b} {[winfo id .b]}}
  2078.     {<<Paste>> %R   {-root .b} {[winfo id .b]}}
  2079.     {<Enter> %R     {-root .b} {[winfo id .b]}}
  2080.     {<Configure> %R {-root .b} {{1 {<Configure> event doesn't accept "-root" option}}}}
  2081.     {<Key> %X     {-rootx xyz} {{1 {bad screen distance "xyz"}}}}
  2082.     {<Key> %X     {-rootx 2i} {[winfo pixels .b.f 2i]}}
  2083.     {<Button> %X    {-rootx 2i} {[winfo pixels .b.f 2i]}}
  2084.     {<ButtonRelease> %X    {-rootx 2i} {[winfo pixels .b.f 2i]}}
  2085.     {<Motion> %X    {-rootx 2i} {[winfo pixels .b.f 2i]}}
  2086.     {<<Paste>> %X   {-rootx 2i} {[winfo pixels .b.f 2i]}}
  2087.     {<Enter> %X     {-rootx 2i} {[winfo pixels .b.f 2i]}}
  2088.     {<Configure> %X {-rootx 2i} {{1 {<Configure> event doesn't accept "-rootx" option}}}}
  2089.     {<Key> %Y     {-rooty xyz} {{1 {bad screen distance "xyz"}}}}
  2090.     {<Key> %Y     {-rooty 2i} {[winfo pixels .b.f 2i]}}
  2091.     {<Button> %Y    {-rooty 2i} {[winfo pixels .b.f 2i]}}
  2092.     {<ButtonRelease> %Y    {-rooty 2i} {[winfo pixels .b.f 2i]}}
  2093.     {<Motion> %Y    {-rooty 2i} {[winfo pixels .b.f 2i]}}
  2094.     {<<Paste>> %Y   {-rooty 2i} {[winfo pixels .b.f 2i]}}
  2095.     {<Enter> %Y     {-rooty 2i} {[winfo pixels .b.f 2i]}}
  2096.     {<Configure> %Y {-rooty 2i} {{1 {<Configure> event doesn't accept "-rooty" option}}}}
  2097.     {<Key> %E     {-sendevent xyz} {{1 {expected boolean value but got "xyz"}}}}
  2098.     {<Key> %E     {-sendevent 1} 1}
  2099.     {<Key> %E     {-sendevent yes} 1}
  2100.     {<Key> %E     {-sendevent 43} 43}
  2101.     {<Key> %#     {-serial xyz} {{1 {expected integer but got "xyz"}}}}
  2102.     {<Key> %#     {-serial 100} 100}
  2103.     {<Key> %s     {-state xyz} {{1 {expected integer but got "xyz"}}}}
  2104.     {<Key> %s     {-state 1} 1}
  2105.     {<Button> %s    {-state 1025} 1025}
  2106.     {<ButtonRelease> %s    {-state 1025} 1025}
  2107.     {<Motion> %s    {-state 1} 1}
  2108.     {<<Paste>> %s   {-state 1} 1}
  2109.     {<Enter> %s     {-state 1} 1}
  2110.     {<Visibility> %s {-state xyz} {{1 {bad -state value "xyz": must be VisibilityUnobscured, VisibilityPartiallyObscured, or VisibilityFullyObscured}}}}
  2111.     {<Visibility> %s {-state VisibilityUnobscured} VisibilityUnobscured}
  2112.     {<Configure> %s {-state xyz} {{1 {<Configure> event doesn't accept "-state" option}}}}
  2113.     {<Key> %S     {-subwindow .xyz} {{1 {bad window path name ".xyz"}}}}
  2114.     {<Key> %S     {-subwindow .b} {[winfo id .b]}}
  2115.     {<Key> %S     {-subwindow xyz} {{1 {bad window name/identifier "xyz"}}}}
  2116.     {<Key> %S     {-subwindow [winfo id .b]} {[winfo id .b]}}
  2117.     {<Button> %S    {-subwindow .b} {[winfo id .b]}}
  2118.     {<ButtonRelease> %S    {-subwindow .b} {[winfo id .b]}}
  2119.     {<Motion> %S    {-subwindow .b} {[winfo id .b]}}
  2120.     {<<Paste>> %S   {-subwindow .b} {[winfo id .b]}}
  2121.     {<Enter> %S     {-subwindow .b} {[winfo id .b]}}
  2122.     {<Configure> %S {-subwindow .b} {{1 {<Configure> event doesn't accept "-subwindow" option}}}}
  2123.     {<Key> %t     {-time xyz} {{1 {expected integer but got "xyz"}}}}
  2124.     {<Key> %t     {-time 100} 100}
  2125.     {<Button> %t    {-time 100} 100}
  2126.     {<ButtonRelease> %t    {-time 100} 100}
  2127.     {<Motion> %t    {-time 100} 100}
  2128.     {<<Paste>> %t   {-time 100} 100}
  2129.     {<Enter> %t     {-time 100} 100}
  2130.     {<Property> %t  {-time 100} 100}
  2131.     {<Configure> %t {-time 100} {{1 {<Configure> event doesn't accept "-time" option}}}}
  2132.     {<Expose> %w    {-width xyz} {{1 {bad screen distance "xyz"}}}}
  2133.     {<Expose> %w    {-width 2i} {[winfo pixels .b.f 2i]}}
  2134.     {<Configure> %w {-width 2i} {[winfo pixels .b.f 2i]}}
  2135.     {<Key> %k     {-width 2i} {{1 {<Key> event doesn't accept "-width" option}}}}
  2136.     {<Unmap> %W    {-window .xyz} {{1 {bad window path name ".xyz"}}}}
  2137.     {<Unmap> %W    {-window .b.f} .b.f}
  2138.     {<Unmap> %W    {-window xyz} {{1 {bad window name/identifier "xyz"}}}}
  2139.     {<Unmap> %W    {-window [winfo id .b.f]} .b.f}
  2140.     {<Unmap> %W     {-window .b.f} .b.f}
  2141.     {<Map> %W     {-window .b.f} .b.f}
  2142.     {<Reparent> %W  {-window .b.f} .b.f}
  2143.     {<Configure> %W {-window .b.f} .b.f}
  2144.     {<Gravity> %W   {-window .b.f} .b.f}
  2145.     {<Circulate> %W {-window .b.f} .b.f}
  2146.     {<Key> %W     {-window .b.f} {{1 {<Key> event doesn't accept "-window" option}}}}
  2147.     {<Key> %x     {-x xyz} {{1 {bad screen distance "xyz"}}}}
  2148.     {<Key> %x     {-x 2i} {[winfo pixels .b.f 2i]}}
  2149.     {<Button> %x    {-x 2i} {[winfo pixels .b.f 2i]}}
  2150.     {<ButtonRelease> %x    {-x 2i} {[winfo pixels .b.f 2i]}}
  2151.     {<Motion> %x    {-x 2i} {[winfo pixels .b.f 2i]}}
  2152.     {<<Paste>> %x   {-x 2i} {[winfo pixels .b.f 2i]}}
  2153.     {<Enter> %x     {-x 2i} {[winfo pixels .b.f 2i]}}
  2154.     {<Expose> %x    {-x 2i} {[winfo pixels .b.f 2i]}}
  2155.     {<Configure> %x {-x 2i} {[winfo pixels .b.f 2i]}}
  2156.     {<Gravity> %x   {-x 2i} {[winfo pixels .b.f 2i]}}
  2157.     {<Reparent> %x  {-x 2i} {[winfo pixels .b.f 2i]}}
  2158.     {<Map> %x     {-x 2i} {{1 {<Map> event doesn't accept "-x" option}}}}
  2159.     {<Key> %y     {-y xyz} {{1 {bad screen distance "xyz"}}}}
  2160.     {<Key> %y     {-y 2i} {[winfo pixels .b.f 2i]}}
  2161.     {<Button> %y    {-y 2i} {[winfo pixels .b.f 2i]}}
  2162.     {<ButtonRelease> %y    {-y 2i} {[winfo pixels .b.f 2i]}}
  2163.     {<Motion> %y    {-y 2i} {[winfo pixels .b.f 2i]}}
  2164.     {<<Paste>> %y   {-y 2i} {[winfo pixels .b.f 2i]}}
  2165.     {<Enter> %y     {-y 2i} {[winfo pixels .b.f 2i]}}
  2166.     {<Expose> %y    {-y 2i} {[winfo pixels .b.f 2i]}}
  2167.     {<Configure> %y {-y 2i} {[winfo pixels .b.f 2i]}}
  2168.     {<Gravity> %y   {-y 2i} {[winfo pixels .b.f 2i]}}
  2169.     {<Reparent> %y  {-y 2i} {[winfo pixels .b.f 2i]}}
  2170.     {<Map> %y     {-y 2i} {{1 {<Map> event doesn't accept "-y" option}}}}
  2171.     {<Key> %k     {-xyz 1} {{1 {bad option "-xyz": must be -when, -above, -borderwidth, -button, -count, -delta, -detail, -focus, -height, -keycode, -keysym, -mode, -override, -place, -root, -rootx, -rooty, -sendevent, -serial, -state, -subwindow, -time, -warp, -width, -window, -x, or -y}}}}
  2172. } {
  2173.     set event [lindex $check 0]
  2174.     test bind-22.$i "HandleEventGenerate: options $event [lindex $check 2]" {
  2175. setup
  2176. bind .b.f $event "lappend x [lindex $check 1]"
  2177. set x {}
  2178. if [catch {eval event gen .b.f $event [lindex $check 2]} msg] {
  2179.     set x [list 1 $msg]
  2180. }
  2181. set x
  2182.     } [eval set x [lindex $check 3]]
  2183.     incr i
  2184. }
  2185. test bind-23.1 {GetVirtualEventUid procedure} {
  2186.     list [catch {event info <<asd} msg] $msg
  2187. } {1 {virtual event "<<asd" is badly formed}}
  2188. test bind-23.2 {GetVirtualEventUid procedure} {
  2189.     list [catch {event info <<>>} msg] $msg
  2190. } {1 {virtual event "<<>>" is badly formed}}
  2191. test bind-23.3 {GetVirtualEventUid procedure} {
  2192.     list [catch {event info <<asd>} msg] $msg
  2193. } {1 {virtual event "<<asd>" is badly formed}}
  2194. test bind-23.4 {GetVirtualEventUid procedure} {
  2195.     event info <<asd>>
  2196. } {}
  2197. test bind-24.1 {FindSequence procedure: no event} {
  2198.     list [catch {bind .b {} test} msg] $msg
  2199. } {1 {no events specified in binding}}
  2200. test bind-24.2 {FindSequence procedure: bad event} {
  2201.     list [catch {bind .b <xyz> test} msg] $msg
  2202. } {1 {bad event type or keysym "xyz"}}
  2203. test bind-24.3 {FindSequence procedure: virtual allowed} {
  2204.     bind .b.f <<Paste>> test
  2205. } {}
  2206. test bind-24.4 {FindSequence procedure: virtual not allowed} {
  2207.    list [catch {event add <<Paste>> <<Alive>>} msg] $msg
  2208. } {1 {virtual event not allowed in definition of another virtual event}}
  2209. test bind-24.5 {FindSequence procedure, multiple bindings} {
  2210.     setup
  2211.     bind .b.f <1> {lappend x single}
  2212.     bind .b.f <Double-1> {lappend x double}
  2213.     bind .b.f <Triple-1> {lappend x triple}
  2214.     bind .b.f <Quadruple-1> {lappend x quadruple}
  2215.     set x press
  2216.     event gen .b.f <Button-1>
  2217.     event gen .b.f <ButtonRelease-1>
  2218.     lappend x press
  2219.     event gen .b.f <Button-1>
  2220.     event gen .b.f <ButtonRelease-1>
  2221.     lappend x press
  2222.     event gen .b.f <Button-1>
  2223.     event gen .b.f <ButtonRelease-1>
  2224.     lappend x press
  2225.     event gen .b.f <Button-1>
  2226.     event gen .b.f <ButtonRelease-1>
  2227.     lappend x press
  2228.     event gen .b.f <Button-1>
  2229.     event gen .b.f <ButtonRelease-1>
  2230.     set x
  2231. } {press single press double press triple press quadruple press quadruple}
  2232. test bind-24.6 {FindSequence procedure: virtual composed} {
  2233.     list [catch {bind .b <Control-b><<Paste>> "puts hi"} msg] $msg
  2234. } {1 {virtual events may not be composed}}
  2235. test bind-24.7 {FindSequence procedure: new pattern sequence} {
  2236.     setup
  2237.     bind .b.f <Button-1><Button-2> {lappend x 1-2}
  2238.     set x {}
  2239.     event gen .b.f <Button-1>
  2240.     event gen .b.f <ButtonRelease-1>
  2241.     event gen .b.f <Button-2>
  2242.     event gen .b.f <ButtonRelease-2>
  2243.     set x
  2244. } {1-2}
  2245. test bind-24.8 {FindSequence procedure: similar pattern sequence} {
  2246.     setup
  2247.     bind .b.f <Button-1><Button-2> {lappend x 1-2}
  2248.     bind .b.f <Button-2> {lappend x 2}
  2249.     set x {}
  2250.     event gen .b.f <Button-3>
  2251.     event gen .b.f <Button-2>
  2252.     event gen .b.f <ButtonRelease-2>
  2253.     event gen .b.f <Button-1>
  2254.     event gen .b.f <ButtonRelease-1>
  2255.     event gen .b.f <Button-2>
  2256.     event gen .b.f <ButtonRelease-2>
  2257.     set x
  2258. } {2 1-2}
  2259. test bind-24.9 {FindSequence procedure: similar pattern sequence} {
  2260.     setup
  2261.     bind .b.f <Button-1><Button-2> {lappend x 1-2}
  2262.     bind .b.f <Button-2><Button-2> {lappend x 2-2}
  2263.     set x {}
  2264.     event gen .b.f <Button-3>
  2265.     event gen .b.f <Button-2>
  2266.     event gen .b.f <ButtonRelease-2>
  2267.     event gen .b.f <Button-2>
  2268.     event gen .b.f <ButtonRelease-2>
  2269.     event gen .b.f <Button-1>
  2270.     event gen .b.f <ButtonRelease-1>
  2271.     event gen .b.f <Button-2>
  2272.     event gen .b.f <ButtonRelease-2>
  2273.     set x
  2274. } {2-2 1-2}
  2275. test bind-24.10 {FindSequence procedure: similar pattern sequence} {
  2276.     setup
  2277.     bind .b.f <Button-2><Button-2> {lappend x 2-2}
  2278.     bind .b.f <Double-Button-2> {lappend x d-2}
  2279.     set x {}
  2280.     event gen .b.f <Button-3>
  2281.     event gen .b.f <Button-2>
  2282.     event gen .b.f <ButtonRelease-2>
  2283.     event gen .b.f <Button-2>
  2284.     event gen .b.f <ButtonRelease-2>
  2285.     event gen .b.f <Button-1>
  2286.     event gen .b.f <ButtonRelease-1>
  2287.     event gen .b.f <Button-2> -x 100
  2288.     event gen .b.f <ButtonRelease-2>
  2289.     event gen .b.f <Button-2> -x 200
  2290.     event gen .b.f <ButtonRelease-2>
  2291.     set x
  2292. } {d-2 2-2}
  2293. test bind-24.11 {FindSequence procedure: new sequence, don't create} {
  2294.     setup
  2295.     bind .b.f <Button-2>
  2296. } {}
  2297. test bind-24.12 {FindSequence procedure: not new sequence, don't create} {
  2298.     setup
  2299.     bind .b.f <Control-Button-2> "foo"
  2300.     bind .b.f <Button-2>
  2301. } {}
  2302. test bind-24.13 {FindSequence procedure: no binding} {
  2303.     catch {destroy .b.f}
  2304.     frame .b.f -class Test -width 150 -height 100
  2305.     list [catch {bind .b.f <a>} msg] $msg
  2306. } {0 {}}
  2307. test bind-24.14 {FindSequence procedure: no binding} {
  2308.     catch {destroy .b.f}
  2309.     canvas .b.f
  2310.     set i [.b.f create rect 10 10 100 100]
  2311.     list [catch {.b.f bind $i <a>} msg] $msg
  2312. } {0 {}}
  2313. test bind-25.1 {ParseEventDescription procedure} {
  2314.     list [catch {bind .b x7 test} msg] $msg
  2315. } {1 {bad ASCII character 0x7}}
  2316. test bind-25.2 {ParseEventDescription procedure} {
  2317.     list [catch {bind .b "x7f" test} msg] $msg
  2318. } {1 {bad ASCII character 0x7f}}
  2319. test bind-25.3 {ParseEventDescription procedure} {
  2320.     list [catch {bind .b "x4" test} msg] $msg
  2321. } {1 {bad ASCII character 0x4}}
  2322. test bind-25.4 {ParseEventDescription procedure} {
  2323.     setup
  2324.     bind .b.f a test
  2325.     bind .b.f a
  2326. } {test}
  2327. test bind-25.5 {ParseEventDescription procedure: virtual} {
  2328.     list [catch {bind .b <<>> foo} msg] $msg
  2329. } {1 {virtual event "<<>>" is badly formed}}
  2330. test bind-25.6 {ParseEventDescription procedure: virtual} {
  2331.     list [catch {bind .b <<Paste foo} msg] $msg
  2332. } {1 {missing ">" in virtual binding}}
  2333. test bind-25.7 {ParseEventDescription procedure: virtual} {
  2334.     list [catch {bind .b <<Paste> foo} msg] $msg
  2335. } {1 {missing ">" in virtual binding}}
  2336. test bind-25.8 {ParseEventDescription procedure: correctly terminate virtual} {
  2337.     list [catch {bind .b <<Paste>>h foo} msg] $msg
  2338. } {1 {virtual events may not be composed}}
  2339. test bind-25.9 {ParseEventDescription procedure} {
  2340.     list [catch {bind .b <> test} msg] $msg
  2341. } {1 {no event type or button # or keysym}}
  2342. test bind-25.10 {ParseEventDescription procedure: misinterpreted modifier} {
  2343.     button .x
  2344.     bind .x <Control-M> a
  2345.     bind .x <M-M> b
  2346.     set x [lsort [bind .x]]
  2347.     destroy .x
  2348.     set x
  2349. } {<Control-Key-M> <Meta-Key-M>}
  2350. test bind-25.11 {ParseEventDescription procedure} {
  2351.     catch {destroy .b.f}
  2352.     frame .b.f -class Test -width 150 -height 100
  2353.     bind .b.f <a---> {nothing}
  2354.     bind .b.f
  2355. } a
  2356. test bind-25.12 {ParseEventDescription procedure} {
  2357.     list [catch {bind .b <a-- test} msg] $msg
  2358. } {1 {missing ">" in binding}}
  2359. test bind-25.13 {ParseEventDescription procedure} {
  2360.     list [catch {bind .b <a-b> test} msg] $msg
  2361. } {1 {extra characters after detail in binding}}
  2362. test bind-25.14 {ParseEventDescription} {
  2363.     setup
  2364.     list [catch {bind .b <<abc {puts hi}} msg] $msg
  2365. } {1 {missing ">" in virtual binding}}
  2366. test bind-25.15 {ParseEventDescription} {
  2367.     setup
  2368.     list [catch {bind .b <<abc> {puts hi}} msg] $msg
  2369. } {1 {missing ">" in virtual binding}}
  2370. test bind-25.16 {ParseEventDescription} {
  2371.     setup
  2372.     bind .b <<Shift-Paste>> {puts hi}
  2373.     bind .b
  2374. } {<<Shift-Paste>>}
  2375. test bind-25.17 {ParseEventDescription} {
  2376.     setup
  2377.     list [catch {event add <<xyz>> <<abc>>} msg] $msg
  2378. } {1 {virtual event not allowed in definition of another virtual event}}
  2379. set i 1
  2380. foreach check {
  2381.     {{<Control- a>} <Control-Key-a>}
  2382.     {<Shift-a> <Shift-Key-a>}
  2383.     {<Lock-a> <Lock-Key-a>}
  2384.     {<Meta---a> <Meta-Key-a>}
  2385.     {<M-a> <Meta-Key-a>}
  2386.     {<Alt-a> <Alt-Key-a>}
  2387.     {<B1-a> <B1-Key-a>}
  2388.     {<B2-a> <B2-Key-a>}
  2389.     {<B3-a> <B3-Key-a>}
  2390.     {<B4-a> <B4-Key-a>}
  2391.     {<B5-a> <B5-Key-a>}
  2392.     {<Button1-a> <B1-Key-a>}
  2393.     {<Button2-a> <B2-Key-a>}
  2394.     {<Button3-a> <B3-Key-a>}
  2395.     {<Button4-a> <B4-Key-a>}
  2396.     {<Button5-a> <B5-Key-a>}
  2397.     {<M1-a> <Mod1-Key-a>}
  2398.     {<M2-a> <Mod2-Key-a>}
  2399.     {<M3-a> <Mod3-Key-a>}
  2400.     {<M4-a> <Mod4-Key-a>}
  2401.     {<M5-a> <Mod5-Key-a>}
  2402.     {<Mod1-a> <Mod1-Key-a>}
  2403.     {<Mod2-a> <Mod2-Key-a>}
  2404.     {<Mod3-a> <Mod3-Key-a>}
  2405.     {<Mod4-a> <Mod4-Key-a>}
  2406.     {<Mod5-a> <Mod5-Key-a>}
  2407.     {<Double-a> <Double-Key-a>}
  2408.     {<Triple-a> <Triple-Key-a>}
  2409.     {{<Double 1>} <Double-Button-1>}
  2410.     {<Triple-1> <Triple-Button-1>}
  2411.     {{<M1-M2 M3-M4 B1-Control-a>} <Control-B1-Mod1-Mod2-Mod3-Mod4-Key-a>}
  2412. } {
  2413.     test bind-25.$i {modifier names} {
  2414. catch {destroy .b.f}
  2415. frame .b.f -class Test -width 150 -height 100
  2416. bind .b.f [lindex $check 0] foo
  2417. bind .b.f
  2418.     } [lindex $check 1]
  2419.     bind .b.f [lindex $check 1] {}
  2420.     incr i
  2421. }
  2422. foreach event [bind Test] {
  2423.     bind Test $event {}
  2424. }
  2425. foreach event [bind all] {
  2426.     bind all $event {}
  2427. }
  2428. test bind-26.1 {event names} {
  2429.     catch {destroy .b.f}
  2430.     frame .b.f -class Test -width 150 -height 100
  2431.     bind .b.f <FocusIn> {nothing}
  2432.     bind .b.f
  2433. } <FocusIn>
  2434. test bind-26.2 {event names} {
  2435.     catch {destroy .b.f}
  2436.     frame .b.f -class Test -width 150 -height 100
  2437.     bind .b.f <FocusOut> {nothing}
  2438.     bind .b.f
  2439. } <FocusOut>
  2440. test bind-26.3 {event names} {
  2441.     setup
  2442.     bind .b.f <Destroy> {lappend x "destroyed"}
  2443.     set x [bind .b.f]
  2444.     destroy .b.f
  2445.     set x
  2446. } {<Destroy> destroyed}
  2447. set i 4
  2448. foreach check { 
  2449.     {Motion Motion}
  2450.     {Button Button}
  2451.     {ButtonPress Button}
  2452.     {ButtonRelease ButtonRelease}
  2453.     {Colormap Colormap}
  2454.     {Enter Enter}
  2455.     {Leave Leave}
  2456.     {Expose Expose}
  2457.     {Key Key}
  2458.     {KeyPress Key}
  2459.     {KeyRelease KeyRelease}
  2460.     {Property Property}
  2461.     {Visibility Visibility}
  2462.     {Activate Activate}
  2463.     {Deactivate Deactivate}
  2464. } {
  2465.     set event [lindex $check 0]
  2466.     test bind-26.$i {event names} {
  2467. setup
  2468. bind .b.f <$event> "set x {event $event}"
  2469. set x xyzzy
  2470. event gen .b.f <$event>
  2471. list $x [bind .b.f]
  2472.     } [list "event $event" <[lindex $check 1]>]
  2473.     incr i
  2474. }
  2475. foreach check { 
  2476.     {Circulate Circulate}
  2477.     {Configure Configure}
  2478.     {Gravity Gravity}
  2479.     {Map Map}
  2480.     {Reparent Reparent}
  2481.     {Unmap Unmap}
  2482. } {
  2483.     set event [lindex $check 0]
  2484.     test bind-26.$i {event names} {
  2485. setup
  2486. bind .b.f <$event> "set x {event $event}"
  2487. set x xyzzy
  2488. event gen .b.f <$event> -window .b.f
  2489. list $x [bind .b.f]
  2490.     } [list "event $event" <[lindex $check 1]>]
  2491.     incr i
  2492. }
  2493. test bind-27.1 {button names} {
  2494.     list [catch {bind .b <Expose-1> foo} msg] $msg
  2495. } {1 {specified button "1" for non-button event}}
  2496. test bind-27.2 {button names} {
  2497.     list [catch {bind .b <Button-6> foo} msg] $msg
  2498. } {1 {specified keysym "6" for non-key event}}
  2499. set i 3
  2500. foreach button {1 2 3 4 5} {
  2501.     test bind-27.$i {button names} {
  2502. setup
  2503. bind .b.f <Button-$button> "lappend x "button $button""
  2504. set x [bind .b.f]
  2505. event gen .b.f <Button-$button>
  2506. event gen .b.f <ButtonRelease-$button>
  2507. set x
  2508.     } [list <Button-$button> "button $button"]
  2509.     incr i
  2510. }
  2511. test bind-28.1 {keysym names} {
  2512.     list [catch {bind .b <Expose-a> foo} msg] $msg
  2513. } {1 {specified keysym "a" for non-key event}}
  2514. test bind-28.2 {keysym names} {
  2515.     list [catch {bind .b <Gorp> foo} msg] $msg
  2516. } {1 {bad event type or keysym "Gorp"}}
  2517. test bind-28.3 {keysym names} {
  2518.     list [catch {bind .b <Key-Stupid> foo} msg] $msg
  2519. } {1 {bad event type or keysym "Stupid"}}
  2520. test bind-28.4 {keysym names} {
  2521.     catch {destroy .b.f}
  2522.     frame .b.f -class Test -width 150 -height 100
  2523.     bind .b.f <a> foo
  2524.     bind .b.f
  2525. } a
  2526. set i 5
  2527. foreach check {
  2528.     {a 0 a}
  2529.     {space 0 <Key-space>}
  2530.     {Return 0 <Key-Return>}
  2531.     {X 1 X}
  2532. } {
  2533.     set keysym [lindex $check 0]
  2534.     test bind-28.$i {keysym names} {
  2535. setup
  2536. bind .b.f <Key-$keysym> "lappend x "keysym $keysym""
  2537. bind .b.f <Key-x> "lappend x {bad binding match}"
  2538. set x [lsort [bind .b.f]]
  2539. event gen .b.f <Key-$keysym> -state [lindex $check 1]
  2540. set x
  2541.     } [concat [lsort "x [lindex $check 2]"] "{keysym $keysym}"]
  2542.     incr i
  2543. }
  2544. test bind-29.1 {dummy test to help ensure proper numbering} {} {}
  2545. setup
  2546. bind .b.f <KeyPress> {set x %K}
  2547. set i 2
  2548. foreach check {
  2549.     {a 0 a}
  2550.     {x 1 X}
  2551.     {x 2 X}
  2552.     {space 0 space}
  2553.     {F1 1 F1}
  2554. } {
  2555.     test bind-29.$i {GetKeySym procedure} {nonPortable} {
  2556. set x nothing
  2557. event gen .b.f <KeyPress> -keysym [lindex $check 0] 
  2558. -state [lindex $check 1]
  2559. set x
  2560.     } [lindex $check 2]
  2561.     incr i
  2562. }
  2563. proc bgerror msg {
  2564.     global x errorInfo
  2565.     set x [list $msg $errorInfo]
  2566. }
  2567. test bind-30.1 {Tk_BackgroundError procedure} {
  2568.     setup
  2569.     bind .b.f <Button> {error "This is a test"}
  2570.     set x none
  2571.     event gen .b.f <Button>
  2572.     event gen .b.f <ButtonRelease>
  2573.     update
  2574.     set x
  2575. } {{This is a test} {This is a test
  2576.     while executing
  2577. "error "This is a test""
  2578.     (command bound to event)}}
  2579. test bind-30.2 {Tk_BackgroundError procedure} {
  2580.     proc do {} {
  2581. event gen .b.f <Button>
  2582. event gen .b.f <ButtonRelease>
  2583.     }
  2584.     setup
  2585.     bind .b.f <Button> {error Message2}
  2586.     set x none
  2587.     do
  2588.     update
  2589.     set x
  2590. } {Message2 {Message2
  2591.     while executing
  2592. "error Message2"
  2593.     (command bound to event)}}
  2594. rename bgerror {}
  2595. test bind-31.1 {MouseWheel events} {
  2596.     setup
  2597.     set x {}
  2598.     bind .b.f <MouseWheel> {set x Wheel}
  2599.     event gen .b.f <MouseWheel>
  2600.     set x
  2601. } {Wheel}
  2602. test bind-31.2 {MouseWheel events} {
  2603.     setup
  2604.     set x {}
  2605.     bind .b.f <MouseWheel> {set x %D}
  2606.     event gen .b.f <MouseWheel> -delta 120
  2607.     set x
  2608. } {120}
  2609. test bind-31.2 {MouseWheel events} {
  2610.     setup
  2611.     set x {}
  2612.     bind .b.f <MouseWheel> {set x "%D %x %y"}
  2613.     event gen .b.f <MouseWheel> -delta 240 -x 10 -y 30
  2614.     set x
  2615. } {240 10 30}
  2616. destroy .b
  2617. # cleanup
  2618. ::tcltest::cleanupTests
  2619. return