1# This file is a Tcl script to test out Tk's interactions with the window
2# manager, including the "wm" command. It is organized in the standard fashion
3# for Tcl tests.
4#
5# Copyright (c) 1992-1994 The Regents of the University of California.
6# Copyright (c) 1994-1997 Sun Microsystems, Inc.
7# Copyright (c) 1998-1999 by Scriptics Corporation.
8# All rights reserved.
9#
10# RCS: @(#) $Id$
11
12# This file tests window manager interactions that work across platforms.
13# Window manager tests that only work on a specific platform should be placed
14# in unixWm.test or winWm.test.
15
16package require tcltest 2.1
17eval tcltest::configure $argv
18tcltest::loadTestedCommands
19
20wm deiconify .
21if {![winfo ismapped .]} {
22    tkwait visibility .
23}
24
25proc stdWindow {} {
26    destroy .t
27    toplevel .t -width 100 -height 50
28    wm geom .t +0+0
29    update
30}
31
32# [raise] and [lower] may return before the window manager has completed the
33# operation. The raiseDelay procedure idles for a while to give the operation
34# a chance to complete.
35#
36
37proc raiseDelay {} {
38    after 100; update
39}
40
41# How to carry out a small delay while processing events
42
43proc eventDelay {{delay 200}} {
44    after $delay "set done 1" ; vwait done
45}
46
47deleteWindows
48
49##############################################################################
50
51stdWindow
52
53test wm-1.1 {Tk_WmObjCmd procedure, miscellaneous errors} -returnCodes error -body {
54    wm
55} -result {wrong # args: should be "wm option window ?arg ...?"}
56# Next test will fail every time set of subcommands is changed
57test wm-1.2 {Tk_WmObjCmd procedure, miscellaneous errors} -returnCodes error -body {
58    wm foo
59} -result {bad option "foo": must be aspect, attributes, client, colormapwindows, command, deiconify, focusmodel, forget, frame, geometry, grid, group, iconbitmap, iconify, iconmask, iconname, iconphoto, iconposition, iconwindow, manage, maxsize, minsize, overrideredirect, positionfrom, protocol, resizable, sizefrom, stackorder, state, title, transient, or withdraw}
60test wm-1.3 {Tk_WmObjCmd procedure, miscellaneous errors} -returnCodes error -body {
61    wm command
62} -result {wrong # args: should be "wm option window ?arg ...?"}
63test wm-1.4 {Tk_WmObjCmd procedure, miscellaneous errors} -returnCodes error -body {
64    wm aspect bogus
65} -result {bad window path name "bogus"}
66test wm-1.5 {Tk_WmObjCmd procedure, miscellaneous errors} -body {
67    button .b -text hello
68    wm geometry .b
69} -returnCodes error -cleanup {
70    destroy .b
71} -result {window ".b" isn't a top-level window}
72
73
74### wm aspect ###
75test wm-aspect-1.1 {usage} -returnCodes error -body {
76    wm aspect
77} -result {wrong # args: should be "wm option window ?arg ...?"}
78test wm-aspect-1.2 {usage} -returnCodes error -body {
79    wm aspect . _
80} -result {wrong # args: should be "wm aspect window ?minNumer minDenom maxNumer maxDenom?"}
81test wm-aspect-1.3 {usage} -returnCodes error -body {
82    wm aspect . _ _ _
83} -result {wrong # args: should be "wm aspect window ?minNumer minDenom maxNumer maxDenom?"}
84test wm-aspect-1.4 {usage} -returnCodes error -body {
85    wm aspect . _ _ _ _ _
86} -result {wrong # args: should be "wm aspect window ?minNumer minDenom maxNumer maxDenom?"}
87test wm-aspect-1.5 {usage} -returnCodes error -body {
88    wm aspect . bad 14 15 16
89} -result {expected integer but got "bad"}
90test wm-aspect-1.6 {usage} -returnCodes error -body {
91    wm aspect . 13 foo 15 16
92} -result {expected integer but got "foo"}
93test wm-aspect-1.7 {usage} -returnCodes error -body {
94    wm aspect . 13 14 bar 16
95} -result {expected integer but got "bar"}
96test wm-aspect-1.8 {usage} -returnCodes error -body {
97    wm aspect . 13 14 15 baz
98} -result {expected integer but got "baz"}
99test wm-aspect-1.9 {usage} -returnCodes error -body {
100    wm aspect . 0 14 15 16
101} -result {aspect number can't be <= 0}
102test wm-aspect-1.10 {usage} -returnCodes error -body {
103    wm aspect . 13 0 15 16
104} -result {aspect number can't be <= 0}
105test wm-aspect-1.11 {usage} -returnCodes error -body {
106    wm aspect . 13 14 0 16
107} -result {aspect number can't be <= 0}
108test wm-aspect-1.12 {usage} -returnCodes error -body {
109    wm aspect . 13 14 15 0
110} -result {aspect number can't be <= 0}
111
112test wm-aspect-2.1 {setting and reading values} -setup {
113    set result {}
114} -body {
115    lappend result [wm aspect .t]
116    wm aspect .t 3 4 10 2
117    lappend result [wm aspect .t]
118    wm aspect .t {} {} {} {}
119    lappend result [wm aspect .t]
120} -result [list {} {3 4 10 2} {}]
121
122
123### wm attributes ###
124test wm-attributes-1.1 {usage} -returnCodes error -body {
125    wm attributes
126} -result {wrong # args: should be "wm option window ?arg ...?"}
127test wm-attributes-1.2.1 {usage} -constraints win -returnCodes error -body {
128    # This is the wrong error to output - unix has it right, but it's
129    # not critical.
130    wm attributes . _
131} -result {wrong # args: should be "wm attributes window ?-alpha ?double?? ?-transparentcolor ?color?? ?-disabled ?bool?? ?-fullscreen ?bool?? ?-toolwindow ?bool?? ?-topmost ?bool??"}
132test wm-attributes-1.2.2 {usage} -constraints win -returnCodes error -body {
133    wm attributes . -alpha 1.0 -disabled
134} -result {wrong # args: should be "wm attributes window ?-alpha ?double?? ?-transparentcolor ?color?? ?-disabled ?bool?? ?-fullscreen ?bool?? ?-toolwindow ?bool?? ?-topmost ?bool??"}
135test wm-attributes-1.2.3 {usage} -constraints win -returnCodes error -body {
136    # This is the wrong error to output - unix has it right, but it's
137    # not critical.
138    wm attributes . -to
139} -result {wrong # args: should be "wm attributes window ?-alpha ?double?? ?-transparentcolor ?color?? ?-disabled ?bool?? ?-fullscreen ?bool?? ?-toolwindow ?bool?? ?-topmost ?bool??"}
140test wm-attributes-1.2.4 {usage} -constraints {unix notAqua} -returnCodes error -body {
141    wm attributes . _
142} -result {bad attribute "_": must be -alpha, -topmost, -zoomed, -fullscreen, or -type}
143test wm-attributes-1.2.5 {usage} -constraints aqua -returnCodes error -body {
144    wm attributes . _
145} -result {bad attribute "_": must be -alpha, -modified, -notify, or -titlepath}
146
147
148### wm client ###
149test wm-client-1.1 {usage} -returnCodes error -body {
150    wm client
151} -result {wrong # args: should be "wm option window ?arg ...?"}
152test wm-client-1.2 {usage} -returnCodes error -body {
153    wm client . _ _
154} -result {wrong # args: should be "wm client window ?name?"}
155
156test wm-client-2.1 {setting and reading values} -setup {
157    set result {}
158} -body {
159    lappend result [wm client .t]
160    wm client .t Miffo
161    lappend result [wm client .t]
162    wm client .t {}
163    lappend result [wm client .t]
164} -result [list {} Miffo {}]
165
166deleteWindows
167
168test wm-attributes-1.3.0 {default -fullscreen value} -constraints win -body {
169    toplevel .t
170    wm attributes .t -fullscreen
171} -cleanup {
172    deleteWindows
173} -result 0
174test wm-attributes-1.3.1 {change -fullscreen before map} -constraints win -body {
175    toplevel .t
176    wm attributes .t -fullscreen 1
177    wm attributes .t -fullscreen
178} -cleanup {
179    deleteWindows
180} -result 1
181test wm-attributes-1.3.2 {change -fullscreen before map} -constraints win -body {
182    toplevel .t
183    wm attributes .t -fullscreen 1
184    update
185    wm attributes .t -fullscreen
186} -cleanup {
187    deleteWindows
188} -result 1
189test wm-attributes-1.3.3 {change -fullscreen after map} -constraints win -body {
190    toplevel .t
191    update
192    wm attributes .t -fullscreen 1
193    wm attributes .t -fullscreen
194} -cleanup {
195    deleteWindows
196} -result 1
197test wm-attributes-1.3.4 {change -fullscreen after map} -setup {
198    set booleans [list]
199} -constraints win -body {
200    toplevel .t
201    update
202    lappend booleans [wm attributes .t -fullscreen]
203    wm attributes .t -fullscreen 1
204    lappend booleans [wm attributes .t -fullscreen]
205    # Query above should not clear fullscreen state
206    lappend booleans [wm attributes .t -fullscreen]
207    wm attributes .t -fullscreen 0
208    lappend booleans [wm attributes .t -fullscreen]
209} -cleanup {
210    deleteWindows
211} -result {0 1 1 0}
212test wm-attributes-1.3.5 {change -fullscreen after map} -setup {
213    set results [list]
214    set normal_geom "301x302+101+102"
215    set fullscreen_geom "[winfo screenwidth .]x[winfo screenheight .]+0+0"
216} -constraints win -body {
217    toplevel .t
218    wm geom .t $normal_geom
219    update
220    lappend results [string equal [wm geom .t] $normal_geom]
221    wm attributes .t -fullscreen 1
222    lappend results [string equal [wm geom .t] $fullscreen_geom]
223    wm attributes .t -fullscreen 0
224    lappend results [string equal [wm geom .t] $normal_geom]
225} -cleanup {
226    deleteWindows
227} -result {1 1 1}
228test wm-attributes-1.3.6 {state change does not change -fullscreen} -constraints win -body {
229    toplevel .t
230    update
231    wm attributes .t -fullscreen 1
232    wm withdraw .t
233    wm deiconify .t
234    wm attributes .t -fullscreen
235} -cleanup {
236    deleteWindows
237} -result 1
238test wm-attributes-1.3.7 {state change does not change -fullscreen} -constraints win -body {
239    toplevel .t
240    update
241    wm attributes .t -fullscreen 1
242    wm iconify .t
243    wm deiconify .t
244    wm attributes .t -fullscreen
245} -cleanup {
246    deleteWindows
247} -result 1
248test wm-attributes-1.3.8 {override-redirect not compatible with fullscreen attribute} -constraints win -body {
249    toplevel .t
250    update
251    wm overrideredirect .t 1
252    wm attributes .t -fullscreen 1
253} -returnCodes error -cleanup {
254    deleteWindows
255} -result {can't set fullscreen attribute for ".t": override-redirect flag is set}
256test wm-attributes-1.3.9 {max height too small} -constraints win -body {
257    toplevel .t
258    update
259    wm maxsize .t 5000 450
260    wm attributes .t -fullscreen 1
261} -returnCodes error -cleanup {
262    deleteWindows
263} -result {can't set fullscreen attribute for ".t": max width/height is too small}
264test wm-attributes-1.3.10 {max height too small} -constraints win -body {
265    toplevel .t
266    update
267    wm maxsize .t 450 5000
268    wm attributes .t -fullscreen 1
269} -returnCodes error -cleanup {
270    deleteWindows
271} -result {can't set fullscreen attribute for ".t": max width/height is too small}
272test wm-attributes-1.3.11 {another attribute, then -fullscreen} -constraints win -body {
273    toplevel .t
274    update
275    wm attributes .t -alpha 1.0 -fullscreen 1
276    wm attributes .t -fullscreen
277} -cleanup {
278    deleteWindows
279} -result 1
280test wm-attributes-1.3.12 {another attribute, then -fullscreen, then another} -constraints win -body {
281    toplevel .t
282    update
283    wm attributes .t -toolwindow 0 -fullscreen 1 -topmost 0
284    wm attributes .t -fullscreen
285} -cleanup {
286    deleteWindows
287} -result 1
288
289test wm-attributes-1.4.0 {setting/unsetting fullscreen does not change the focus} -setup {
290    set results [list]
291} -constraints win -body {
292    focus -force .
293    toplevel .t
294    lower .t
295    update
296    lappend results [focus]
297
298    wm attributes .t -fullscreen 1
299    eventDelay
300    lappend results [focus]
301
302    wm attributes .t -fullscreen 0
303    eventDelay
304    lappend results [focus]
305} -cleanup {
306    deleteWindows
307} -result {. . .}
308test wm-attributes-1.4.1 {setting fullscreen does not generate FocusIn on wrapper create} -setup {
309    catch {unset focusin}
310} -constraints win -body {
311    focus -force .
312    toplevel .t
313    pack [entry .t.e]
314    lower .t
315    bind .t <FocusIn> {lappend focusin %W}
316    eventDelay
317
318    lappend focusin 1
319    focus -force .t.e
320    eventDelay
321
322    lappend focusin 2
323    wm attributes .t -fullscreen 1
324    eventDelay
325
326    lappend focusin 3
327    wm attributes .t -fullscreen 0
328    eventDelay
329
330    lappend focusin final [focus]
331} -cleanup {
332    bind . <FocusIn> {}
333    bind .t <FocusIn> {}
334    deleteWindows
335} -result {1 .t .t.e 2 3 final .t.e}
336
337test wm-attributes-1.5.0 {fullscreen stackorder} -setup {
338    set results [list]
339} -constraints win -body {
340    toplevel .t
341    lappend results [wm stackorder .]
342    eventDelay
343    lappend results [wm stackorder .]
344
345    # Default stacking is on top of other windows on the display. Setting the
346    # fullscreen attribute does not change this.
347    wm attributes .t -fullscreen 1
348    eventDelay
349    lappend results [wm stackorder .]
350} -cleanup {
351    deleteWindows
352} -result {. {. .t} {. .t}}
353test wm-attributes-1.5.1 {fullscreen stackorder} -setup {
354    set results [list]
355} -constraints win -body {
356    toplevel .t
357    lower .t
358    eventDelay
359    lappend results [wm stackorder .]
360
361    # If stacking order is explicitly set, then setting the fullscreen
362    # attribute should not change it.
363    wm attributes .t -fullscreen 1
364    eventDelay
365    lappend results [wm stackorder .]
366} -cleanup {
367    deleteWindows
368} -result {{.t .} {.t .}}
369test wm-attributes-1.5.2 {fullscreen stackorder} -setup {
370    set results [list]
371} -constraints win -body {
372    toplevel .t
373    # lower forces the window to be mapped, it would not be otherwise
374    lower .t
375    lappend results [wm stackorder .]
376
377    # If stacking order is explicitly set for an unmapped window, then setting
378    # the fullscreen attribute should not change it.
379    wm attributes .t -fullscreen 1
380    eventDelay
381    lappend results [wm stackorder .]
382} -cleanup {
383    deleteWindows
384} -result {{.t .} {.t .}}
385test wm-attributes-1.5.3 {fullscreen stackorder} -setup {
386    set results [list]
387} -constraints win -body {
388    toplevel .t
389    eventDelay
390    lappend results [wm stackorder .]
391
392    wm attributes .t -fullscreen 1
393    eventDelay
394    lappend results [wm stackorder .]
395
396    # Unsetting the fullscreen attribute should not change the stackorder.
397    wm attributes .t -fullscreen 0
398    eventDelay
399    lappend results [wm stackorder .]
400} -cleanup {
401    deleteWindows
402} -result {{. .t} {. .t} {. .t}}
403test wm-attributes-1.5.4 {fullscreen stackorder} -setup {
404    set results [list]
405} -constraints win -body {
406    toplevel .t
407    lower .t
408    eventDelay
409    lappend results [wm stackorder .]
410
411    wm attributes .t -fullscreen 1
412    eventDelay
413    lappend results [wm stackorder .]
414
415    # Unsetting the fullscreen attribute should not change the stackorder.
416    wm attributes .t -fullscreen 0
417    eventDelay
418    lappend results [wm stackorder .]
419} -cleanup {
420    deleteWindows
421} -result {{.t .} {.t .} {.t .}}
422test wm-attributes-1.5.5 {fullscreen stackorder} -setup {
423    set results [list]
424} -constraints win -body {
425    toplevel .a
426    toplevel .b
427    toplevel .c
428    raise .a
429    raise .b
430    raise .c
431    eventDelay
432    lappend results [wm stackorder .]
433
434    wm attributes .b -fullscreen 1
435    eventDelay
436    lappend results [wm stackorder .]
437
438    # Unsetting the fullscreen attribute should not change the stackorder.
439    wm attributes .b -fullscreen 0
440    eventDelay
441    lappend results [wm stackorder .]
442} -cleanup {
443    deleteWindows
444} -result {{. .a .b .c} {. .a .b .c} {. .a .b .c}}
445
446
447stdWindow
448
449
450### wm colormapwindows ###
451test wm-colormapwindows-1.1 {usage} -returnCodes error -body {
452    wm colormapwindows
453} -result {wrong # args: should be "wm option window ?arg ...?"}
454test wm-colormapwindows-1.2 {usage} -returnCodes error -body {
455    wm colormapwindows . _ _
456} -result {wrong # args: should be "wm colormapwindows window ?windowList?"}
457test wm-colormapwindows-1.3 {usage} -returnCodes error -body {
458    wm colormapwindows . "a \{"
459} -result {unmatched open brace in list}
460test wm-colormapwindows-1.4 {usage} -returnCodes error -body {
461    wm colormapwindows . foo
462} -result {bad window path name "foo"}
463
464test wm-colormapwindows-2.1 {reading values} -body {
465    toplevel .t2 -width 200 -height 200 -colormap new
466    wm geom .t2 +0+0
467    frame .t2.a -width 100 -height 30
468    frame .t2.b -width 100 -height 30 -colormap new
469    pack .t2.a .t2.b -side top
470    update
471    set x [wm colormapwindows .t2]
472    frame .t2.c -width 100 -height 30 -colormap new
473    pack .t2.c -side top
474    update
475    list $x [wm colormapwindows .t2]
476} -cleanup {
477    destroy .t2
478} -result {{.t2.b .t2} {.t2.b .t2.c .t2}}
479test wm-colormapwindows-2.2 {setting and reading values} -body {
480    toplevel .t2 -width 200 -height 200
481    wm geom .t2 +0+0
482    frame .t2.a -width 100 -height 30
483    frame .t2.b -width 100 -height 30
484    frame .t2.c -width 100 -height 30
485    pack .t2.a .t2.b .t2.c -side top
486    wm colormapwindows .t2 {.t2.b .t2.a}
487    wm colormapwindows .t2
488} -cleanup {
489    destroy .t2
490} -result {.t2.b .t2.a}
491
492
493### wm command ###
494test wm-command-1.1 {usage} -returnCodes error -body {
495    wm command
496} -result {wrong # args: should be "wm option window ?arg ...?"}
497test wm-command-1.2 {usage} -returnCodes error -body {
498    wm command . _ _
499} -result {wrong # args: should be "wm command window ?value?"}
500test wm-command-1.3 {usage} -returnCodes error -body {
501    wm command . "a \{"
502} -result {unmatched open brace in list}
503
504test wm-command-2.1 {setting and reading values} -setup {
505    set result {}
506} -body {
507    lappend result [wm command .t]
508    wm command .t [list Miffo Foo]
509    lappend result [wm command .t]
510    wm command .t {}
511    lappend result [wm command .t]
512} -result [list {} [list Miffo Foo] {}]
513
514
515### wm deiconify ###
516test wm-deiconify-1.1 {usage} -returnCodes error -body {
517    wm deiconify
518} -result {wrong # args: should be "wm option window ?arg ...?"}
519test wm-deiconify-1.2 {usage} -returnCodes error -body {
520    wm deiconify . _
521} -result {wrong # args: should be "wm deiconify window"}
522test wm-deiconify-1.3 {usage} -returnCodes error -body {
523    wm deiconify _
524} -result {bad window path name "_"}
525test wm-deiconify-1.4 {usage} -setup {
526    destroy .icon
527} -body {
528    toplevel .icon -width 50 -height 50 -bg red
529    wm iconwindow .t .icon
530    wm deiconify .icon
531} -returnCodes error -cleanup {
532    destroy .icon
533} -result {can't deiconify .icon: it is an icon for .t}
534# test embedded window for Windows
535test wm-deiconify-1.5 {usage} -constraints win -setup {
536    destroy .embed
537} -body {
538    frame .t.f -container 1
539    toplevel .embed -use [winfo id .t.f]
540    wm deiconify .embed
541} -returnCodes error -cleanup {
542    destroy .t.f .embed
543} -result {can't deiconify .embed: the container does not support the request}
544# test embedded window for other platforms
545test wm-deiconify-1.6 {usage} -constraints !win -setup {
546    destroy .embed
547} -body {
548    frame .t.f -container 1
549    toplevel .embed -use [winfo id .t.f]
550    wm deiconify .embed
551} -returnCodes error -cleanup {
552    destroy .t.f .embed
553} -result {can't deiconify .embed: it is an embedded window}
554
555deleteWindows
556test wm-deiconify-2.1 {a window that has never been mapped\
557        should not be mapped by a call to deiconify} -body {
558    toplevel .t
559    wm deiconify .t
560    winfo ismapped .t
561} -cleanup {
562    deleteWindows
563} -result 0
564test wm-deiconify-2.2 {a window that has already been\
565        mapped should be mapped by deiconify} -body {
566    toplevel .t
567    update idletasks
568    wm withdraw .t
569    wm deiconify .t
570    winfo ismapped .t
571} -cleanup {
572    deleteWindows
573} -result 1
574test wm-deiconify-2.3 {geometry for an unmapped window\
575        should not be calculated by a call to deiconify,\
576        it should be done at idle time} -setup {
577    set results {}
578} -body {
579    toplevel .t -width 200 -height 200
580    lappend results [wm geometry .t]
581    wm deiconify .t
582    lappend results [wm geometry .t]
583    update idletasks
584    lappend results [lindex [split \
585        [wm geometry .t] +] 0]
586} -cleanup {
587    deleteWindows
588} -result {1x1+0+0 1x1+0+0 200x200}
589test wm-deiconify-2.4 {invoking destroy after a deiconify\
590        should not result in a crash because of a callback\
591        set on the toplevel} -body {
592    toplevel .t
593    wm withdraw .t
594    wm deiconify .t
595    destroy .t
596    update
597} -cleanup {
598    deleteWindows
599}
600
601
602### wm focusmodel ###
603test wm-focusmodel-1.1 {usage} -returnCodes error -body {
604    wm focusmodel
605} -result {wrong # args: should be "wm option window ?arg ...?"}
606test wm-focusmodel-1.2 {usage} -returnCodes error -body {
607    wm focusmodel . _ _
608} -result {wrong # args: should be "wm focusmodel window ?active|passive?"}
609test wm-focusmodel-1.3 {usage} -returnCodes error -body {
610    wm focusmodel . bogus
611} -result {bad argument "bogus": must be active or passive}
612
613stdWindow
614
615test wm-focusmodel-2.1 {setting and reading values} -setup {
616    set result {}
617} -body {
618    lappend result [wm focusmodel .t]
619    wm focusmodel .t active
620    lappend result [wm focusmodel .t]
621    wm focusmodel .t passive
622    lappend result [wm focusmodel .t]
623} -result {passive active passive}
624
625
626### wm frame ###
627test wm-frame-1.1 {usage} -returnCodes error -body {
628    wm frame
629} -result {wrong # args: should be "wm option window ?arg ...?"}
630test wm-frame-1.2 {usage} -returnCodes error -body {
631    wm frame . _
632} -result {wrong # args: should be "wm frame window"}
633
634
635### wm geometry ###
636test wm-geometry-1.1 {usage} -returnCodes error -body {
637    wm geometry
638} -result {wrong # args: should be "wm option window ?arg ...?"}
639test wm-geometry-1.2 {usage} -returnCodes error -body {
640    wm geometry . _ _
641} -result {wrong # args: should be "wm geometry window ?newGeometry?"}
642test wm-geometry-1.3 {usage} -returnCodes error -body {
643    wm geometry . bogus
644} -result {bad geometry specifier "bogus"}
645
646test wm-geometry-2.1 {setting values} -setup {
647    set result {}
648} -body {
649    wm geometry .t 150x150+50+50
650    update
651    lappend result [wm geometry .t]
652    wm geometry .t {}
653    update
654    lappend result [string equal [wm geometry .t] "150x150+50+50"]
655} -result [list 150x150+50+50 0]
656
657
658### wm grid ###
659test wm-grid-1.1 {usage} -returnCodes error -body {
660    wm grid
661} -result {wrong # args: should be "wm option window ?arg ...?"}
662test wm-grid-1.2 {usage} -returnCodes error -body {
663    wm grid . _
664} -result {wrong # args: should be "wm grid window ?baseWidth baseHeight widthInc heightInc?"}
665test wm-grid-1.3 {usage} -returnCodes error -body {
666    wm grid . _ _ _
667} -result {wrong # args: should be "wm grid window ?baseWidth baseHeight widthInc heightInc?"}
668test wm-grid-1.4 {usage} -returnCodes error -body {
669    wm grid . _ _ _ _ _
670} -result {wrong # args: should be "wm grid window ?baseWidth baseHeight widthInc heightInc?"}
671test wm-grid-1.5 {usage} -returnCodes error -body {
672    wm grid . bad 14 15 16
673} -result {expected integer but got "bad"}
674test wm-grid-1.6 {usage} -returnCodes error -body {
675    wm grid . 13 foo 15 16
676} -result {expected integer but got "foo"}
677test wm-grid-1.7 {usage} -returnCodes error -body {
678    wm grid . 13 14 bar 16
679} -result {expected integer but got "bar"}
680test wm-grid-1.8 {usage} -returnCodes error -body {
681    wm grid . 13 14 15 baz
682} -result {expected integer but got "baz"}
683test wm-grid-1.9 {usage} -returnCodes error -body {
684    wm grid . -1 14 15 16
685} -result {baseWidth can't be < 0}
686test wm-grid-1.10 {usage} -returnCodes error -body {
687    wm grid . 13 -1 15 16
688} -result {baseHeight can't be < 0}
689test wm-grid-1.11 {usage} -returnCodes error -body {
690    wm grid . 13 14 -1 16
691} -result {widthInc can't be <= 0}
692test wm-grid-1.12 {usage} -returnCodes error -body {
693    wm grid . 13 14 15 -1
694} -result {heightInc can't be <= 0}
695
696test wm-grid-2.1 {setting and reading values} -setup {
697    set result {}
698} -body {
699    lappend result [wm grid .t]
700    wm grid .t 3 4 10 2
701    lappend result [wm grid .t]
702    wm grid .t {} {} {} {}
703    lappend result [wm grid .t]
704} -result [list {} {3 4 10 2} {}]
705
706
707### wm group ###
708test wm-group-1.1 {usage} -returnCodes error -body {
709    wm group
710} -result {wrong # args: should be "wm option window ?arg ...?"}
711test wm-group-1.2 {usage} -returnCodes error -body {
712    wm group .t 12 13
713} -result {wrong # args: should be "wm group window ?pathName?"}
714test wm-group-1.3 {usage} -returnCodes error -body {
715    wm group .t bogus
716} -result {bad window path name "bogus"}
717
718test wm-group-2.1 {setting and reading values} -setup {
719    set result {}
720} -body {
721    lappend result [wm group .t]
722    wm group .t .
723    lappend result [wm group .t]
724    wm group .t {}
725    lappend result [wm group .t]
726} -result [list {} . {}]
727
728
729### wm iconbitmap ###
730test wm-iconbitmap-1.1 {usage} -returnCodes error -body {
731    wm iconbitmap
732} -result {wrong # args: should be "wm option window ?arg ...?"}
733test wm-iconbitmap-1.2.1 {usage} -constraints unix -returnCodes error -body {
734    wm iconbitmap .t 12 13
735} -result {wrong # args: should be "wm iconbitmap window ?bitmap?"}
736test wm-iconbitmap-1.2.2 {usage} -constraints win -returnCodes error -body {
737    wm iconbitmap .t 12 13 14
738} -result {wrong # args: should be "wm iconbitmap window ?-default? ?image?"}
739test wm-iconbitmap-1.3 {usage} -constraints win -returnCodes error -body {
740    wm iconbitmap .t 12 13
741} -result {illegal option "12" must be "-default"}
742test wm-iconbitmap-1.4 {usage} -returnCodes error -body {
743    wm iconbitmap .t bad-bitmap
744} -result {bitmap "bad-bitmap" not defined}
745
746test wm-iconbitmap-2.1 {setting and reading values} -setup {
747    set result {}
748} -body {
749    lappend result [wm iconbitmap .t]
750    wm iconbitmap .t hourglass
751    lappend result [wm iconbitmap .t]
752    wm iconbitmap .t {}
753    lappend result [wm iconbitmap .t]
754} -result [list {} hourglass {}]
755
756
757### wm iconify ###
758test wm-iconify-1.1 {usage} -returnCodes error -body {
759    wm iconify
760} -result {wrong # args: should be "wm option window ?arg ...?"}
761test wm-iconify-1.2 {usage} -returnCodes error -body {
762    wm iconify .t _
763} -result {wrong # args: should be "wm iconify window"}
764
765destroy .t2
766test wm-iconify-2.1 {Misc errors} -body {
767    toplevel .t2
768    wm overrideredirect .t2 1
769    wm iconify .t2
770} -returnCodes error -cleanup {
771    destroy .t2
772} -result {can't iconify ".t2": override-redirect flag is set}
773test wm-iconify-2.2 {Misc errors} -body {
774    toplevel .t2
775    wm geom .t2 +0+0
776    wm transient .t2 .t
777    wm iconify .t2
778} -returnCodes error -cleanup {
779    destroy .t2
780} -result {can't iconify ".t2": it is a transient}
781test wm-iconify-2.3 {Misc errors} -body {
782    toplevel .t2
783    wm geom .t2 +0+0
784    wm iconwindow .t .t2
785    wm iconify .t2
786} -returnCodes error -cleanup {
787    destroy .t2
788} -result {can't iconify .t2: it is an icon for .t}
789# test embedded window for Windows
790test wm-iconify-2.4.1 {Misc errors} -constraints win -setup {
791    destroy .t2
792} -body {
793    frame .t.f -container 1
794    toplevel .t2 -use [winfo id .t.f]
795    wm iconify .t2
796} -returnCodes error -cleanup {
797    destroy .t2 .r.f
798} -result {can't iconify .t2: the container does not support the request}
799# test embedded window for other platforms
800test wm-iconify-2.4.2 {Misc errors} -constraints !win -setup {
801    destroy .t2
802} -body {
803    frame .t.f -container 1
804    toplevel .t2 -use [winfo id .t.f]
805    wm iconify .t2
806} -returnCodes error -cleanup {
807    destroy .t2 .r.f
808} -result {can't iconify .t2: it is an embedded window}
809
810test wm-iconify-3.1 {iconify behavior} -body {
811    toplevel .t2
812    wm geom .t2 -0+0
813    update
814    set result [winfo ismapped .t2]
815    wm iconify .t2
816    update
817    lappend result [winfo ismapped .t2]
818} -cleanup {
819    destroy .t2
820} -result {1 0}
821
822
823### wm iconmask ###
824test wm-iconmask-1.1 {usage} -returnCodes error -body {
825    wm iconmask
826} -result {wrong # args: should be "wm option window ?arg ...?"}
827test wm-iconmask-1.2 {usage} -returnCodes error -body {
828    wm iconmask .t 12 13
829} -result {wrong # args: should be "wm iconmask window ?bitmap?"}
830test wm-iconmask-1.3 {usage} -returnCodes error -body {
831    wm iconmask .t bad-bitmap
832} -result {bitmap "bad-bitmap" not defined}
833
834test wm-iconmask-2.1 {setting and reading values} -setup {
835    set result {}
836} -body {
837    lappend result [wm iconmask .t]
838    wm iconmask .t hourglass
839    lappend result [wm iconmask .t]
840    wm iconmask .t {}
841    lappend result [wm iconmask .t]
842} -result [list {} hourglass {}]
843
844
845### wm iconname ###
846test wm-iconname-1.1 {usage} -returnCodes error -body {
847    wm iconname
848} -result {wrong # args: should be "wm option window ?arg ...?"}
849test wm-iconname-1.2 {usage} -returnCodes error -body {
850    wm iconname .t 12 13
851} -result {wrong # args: should be "wm iconname window ?newName?"}
852
853test wm-iconname-2.1 {setting and reading values} -setup {
854    set result {}
855} -body {
856    lappend result [wm iconname .t]
857    wm iconname .t ThisIconHasAName
858    lappend result [wm iconname .t]
859    wm iconname .t {}
860    lappend result [wm iconname .t]
861} -result [list {} ThisIconHasAName {}]
862
863
864### wm iconphoto ###
865test wm-iconphoto-1.1 {usage} -returnCodes error -body {
866    wm iconphoto
867} -result {wrong # args: should be "wm option window ?arg ...?"}
868test wm-iconphoto-1.2 {usage} -returnCodes error -body {
869    wm iconphoto .
870} -result {wrong # args: should be "wm iconphoto window ?-default? image1 ?image2 ...?"}
871test wm-iconphoto-1.3 {usage} -returnCodes error -body {
872    wm iconphoto . notanimage
873} -result {can't use "notanimage" as iconphoto: not a photo image}
874test wm-iconphoto-1.4 {usage} -returnCodes error -body {
875    # we currently have no return info
876    wm iconphoto . -default
877} -result {wrong # args: should be "wm iconphoto window ?-default? image1 ?image2 ...?"}
878
879# All other iconphoto tests are platform specific
880
881
882### wm iconposition ###
883test wm-iconposition-1.1 {usage} -returnCodes error -body {
884    wm iconposition
885} -result {wrong # args: should be "wm option window ?arg ...?"}
886test wm-iconposition-1.2 {usage} -returnCodes error -body {
887    wm iconposition .t 12
888} -result {wrong # args: should be "wm iconposition window ?x y?"}
889test wm-iconposition-1.3 {usage} -returnCodes error -body {
890    wm iconposition .t 12 13 14
891} -result {wrong # args: should be "wm iconposition window ?x y?"}
892test wm-iconposition-1.4 {usage} -returnCodes error -body {
893    wm iconposition .t bad 13
894} -result {expected integer but got "bad"}
895test wm-iconposition-1.5 {usage} -returnCodes error -body {
896    wm iconposition .t 13 lousy
897} -result {expected integer but got "lousy"}
898
899test wm-iconposition-2.1 {setting and reading values} -setup {
900    set result {}
901} -body {
902    lappend result [wm iconposition .t]
903    wm iconposition .t 10 20
904    lappend result [wm iconposition .t]
905    wm iconposition .t {} {}
906    lappend result [wm iconposition .t]
907} -result [list {} {10 20} {}]
908
909
910### wm iconwindow ###
911test wm-iconwindow-1.1 {usage} -returnCodes error -body {
912    wm iconwindow
913} -result {wrong # args: should be "wm option window ?arg ...?"}
914test wm-iconwindow-1.2 {usage} -returnCodes error -body {
915    wm iconwindow .t 12 13
916} -result {wrong # args: should be "wm iconwindow window ?pathName?"}
917test wm-iconwindow-1.3 {usage} -returnCodes error -body {
918    wm iconwindow .t bogus
919} -result {bad window path name "bogus"}
920test wm-iconwindow-1.4 {usage} -setup {
921    destroy .b
922} -body {
923    button .b -text Help
924    wm iconwindow .t .b
925} -returnCodes error -cleanup {
926    destroy .b
927} -result {can't use .b as icon window: not at top level}
928test wm-iconwindow-1.5 {usage} -setup {
929    destroy .icon .t2
930} -body {
931    toplevel .icon -width 50 -height 50 -bg green
932    toplevel .t2
933    wm geom .t2 -0+0
934    wm iconwindow .t2 .icon
935    wm iconwindow .t .icon
936} -returnCodes error -cleanup {
937    destroy .t2 .icon
938} -result {.icon is already an icon for .t2}
939
940test wm-iconwindow-2.1 {setting and reading values} -setup {
941    destroy .icon
942    set result {}
943} -body {
944    lappend result [wm iconwindow .t]
945    toplevel .icon -width 50 -height 50 -bg green
946    wm iconwindow .t .icon
947    lappend result [wm iconwindow .t]
948    wm iconwindow .t {}
949    destroy .icon
950    lappend result [wm iconwindow .t]
951} -result {{} .icon {}}
952
953
954### wm maxsize ###
955test wm-maxsize-1.1 {usage} -returnCodes error -body {
956    wm maxsize
957} -result {wrong # args: should be "wm option window ?arg ...?"}
958test wm-maxsize-1.2 {usage} -returnCodes error -body {
959    wm maxsize . a
960} -result {wrong # args: should be "wm maxsize window ?width height?"}
961test wm-maxsize-1.3 {usage} -returnCodes error -body {
962    wm maxsize . a b c
963} -result {wrong # args: should be "wm maxsize window ?width height?"}
964test wm-maxsize-1.4 {usage} -returnCodes error -body {
965    wm maxsize . x 100
966} -result {expected integer but got "x"}
967test wm-maxsize-1.5 {usage} -returnCodes error -body {
968    wm maxsize . 100 bogus
969} -result {expected integer but got "bogus"}
970test wm-maxsize-1.6 {usage} -setup {
971    destroy .t2
972} -body {
973    toplevel .t2
974    wm maxsize .t2 300 200
975    wm maxsize .t2
976} -cleanup {
977    destroy .t2
978} -result {300 200}
979test wm-maxsize-1.7 {maxsize must be <= screen size} -setup {
980    destroy .t
981} -body {
982    toplevel .t
983    lassign [wm maxsize .t] t_width t_height
984    set s_width [winfo screenwidth .t]
985    set s_height [winfo screenheight .t]
986    expr {($t_width <= $s_width) && ($t_height <= $s_height)}
987} -cleanup {
988    destroy .t
989} -result 1
990
991destroy .t
992test wm-maxsize-2.1 {setting the maxsize to a value smaller\
993        than the current size will resize a toplevel} -body {
994    toplevel .t -width 300 -height 300
995    update
996    wm maxsize .t 200 150
997    # UpdateGeometryInfo invoked at idle
998    update
999    lrange [split [wm geom .t] x+] 0 1
1000} -cleanup {
1001    destroy .t
1002} -result {200 150}
1003test wm-maxsize-2.2 {setting the maxsize to a value smaller\
1004        than the current size will resize a gridded toplevel} -body {
1005    toplevel .t
1006    wm grid .t 0 0 50 50
1007    wm geometry .t 6x6
1008    update
1009    wm maxsize .t 4 3
1010    # UpdateGeometryInfo invoked at idle
1011    update
1012    lrange [split [wm geom .t] x+] 0 1
1013} -cleanup {
1014    destroy .t
1015} -result {4 3}
1016test wm-maxsize-2.3 {attempting to resize to a value\
1017        bigger than the current maxsize will set it to the max size} -body {
1018    toplevel .t -width 200 -height 200
1019    wm maxsize .t 300 250
1020    update
1021    wm geom .t 400x300
1022    update
1023    lrange [split [wm geom .t] x+] 0 1
1024} -cleanup {
1025    destroy .t
1026} -result {300 250}
1027test wm-maxsize-2.4 {attempting to resize to a value bigger than the\
1028	current maxsize will set it to the max size when gridded} -body {
1029    toplevel .t
1030    wm grid .t 1 1 50 50
1031    wm geom .t 4x4
1032    wm maxsize .t 6 5
1033    update
1034    wm geom .t 8x6
1035    update
1036    lrange [split [wm geom .t] x+] 0 1
1037} -cleanup {
1038    destroy .t
1039} -result {6 5}
1040test wm-maxsize-2.5 {Use max size if window size is not explicitly set\
1041	and the reqWidth/reqHeight are bigger than the max size} -body {
1042    toplevel .t
1043    pack [frame .t.f -width 400 -height 400]
1044    update idletasks
1045    set req [list [winfo reqwidth .t] [winfo reqheight .t]]
1046    wm maxsize .t 300 300
1047    update
1048    list $req [lrange [split [wm geom .t] x+] 0 1]
1049} -cleanup {
1050    destroy .t
1051} -result {{400 400} {300 300}}
1052
1053
1054### wm minsize ###
1055test wm-minsize-1.1 {usage} -returnCodes error -body {
1056    wm minsize
1057} -result {wrong # args: should be "wm option window ?arg ...?"}
1058test wm-minsize-1.2 {usage} -returnCodes error -body {
1059    wm minsize . a
1060} -result {wrong # args: should be "wm minsize window ?width height?"}
1061test wm-minsize-1.3 {usage} -returnCodes error -body {
1062    wm minsize . a b c
1063} -result {wrong # args: should be "wm minsize window ?width height?"}
1064test wm-minsize-1.4 {usage} -returnCodes error -body {
1065    wm minsize . x 100
1066} -result {expected integer but got "x"}
1067test wm-minsize-1.5 {usage} -returnCodes error -body {
1068    wm minsize . 100 bogus
1069} -result {expected integer but got "bogus"}
1070test wm-minsize-1.6 {usage} -setup {
1071    destroy .t2
1072} -body {
1073    toplevel .t2
1074    wm minsize .t2 300 200
1075    wm minsize .t2
1076} -cleanup {
1077    destroy .t2
1078} -result {300 200}
1079
1080test wm-minsize-2.1 {setting the minsize to a value larger\
1081        than the current size will resize a toplevel} -body {
1082    toplevel .t -width 200 -height 200
1083    update
1084    wm minsize .t 400 300
1085    # UpdateGeometryInfo invoked at idle
1086    update
1087    lrange [split [wm geom .t] x+] 0 1
1088} -cleanup {
1089    destroy .t
1090} -result {400 300}
1091test wm-minsize-2.2 {setting the minsize to a value larger\
1092        than the current size will resize a gridded toplevel} -body {
1093    toplevel .t
1094    wm grid .t 1 1 50 50
1095    wm geom .t 4x4
1096    update
1097    wm minsize .t 8 8
1098    # UpdateGeometryInfo invoked at idle
1099    update
1100    lrange [split [wm geom .t] x+] 0 1
1101} -cleanup {
1102    destroy .t
1103} -result {8 8}
1104test wm-minsize-2.3 {attempting to resize to a value\
1105        smaller than the current minsize will set it to the minsize} -body {
1106    toplevel .t -width 400 -height 400
1107    wm minsize .t 300 300
1108    update
1109    wm geom .t 200x200
1110    update
1111    lrange [split [wm geom .t] x+] 0 1
1112} -cleanup {
1113    destroy .t
1114} -result {300 300}
1115test wm-minsize-2.4 {attempting to resize to a value smaller than the\
1116	current minsize will set it to the minsize when gridded} -body {
1117    toplevel .t
1118    wm grid .t 1 1 50 50
1119    wm geom .t 8x8
1120    wm minsize .t 6 6
1121    update
1122    wm geom .t 4x4
1123    update
1124    lrange [split [wm geom .t] x+] 0 1
1125} -cleanup {
1126    destroy .t
1127} -result {6 6}
1128test wm-minsize-2.5 {Use min size if window size is not explicitly set\
1129	and the reqWidth/reqHeight are smaller than the min size} -setup {
1130    set result [list]
1131} -body {
1132    toplevel .t
1133    pack [frame .t.f -width 250 -height 250]
1134    update idletasks
1135    lappend result [list [winfo reqwidth .t] [winfo reqheight .t]]
1136    wm minsize .t 300 300
1137    update
1138    lappend result [lrange [split [wm geom .t] x+] 0 1]
1139} -cleanup {
1140    destroy .t
1141} -result {{250 250} {300 300}}
1142
1143stdWindow
1144
1145### wm overrideredirect ###
1146test wm-overrideredirect-1.1 {usage} -returnCodes error -body {
1147    wm overrideredirect
1148} -result {wrong # args: should be "wm option window ?arg ...?"}
1149test wm-overrideredirect-1.2 {usage} -returnCodes error -body {
1150    wm overrideredirect .t 1 2
1151} -result {wrong # args: should be "wm overrideredirect window ?boolean?"}
1152test wm-overrideredirect-1.3 {usage} -returnCodes error -body {
1153    wm overrideredirect .t boo
1154} -result {expected boolean value but got "boo"}
1155
1156test wm-overrideredirect-2.1 {setting and reading values} -setup {
1157    set result {}
1158} -body {
1159    lappend result [wm overrideredirect .t]
1160    wm overrideredirect .t true
1161    lappend result [wm overrideredirect .t]
1162    wm overrideredirect .t off
1163    lappend result [wm overrideredirect .t]
1164} -result {0 1 0}
1165
1166
1167### wm positionfrom ###
1168test wm-positionfrom-1.1 {usage} -returnCodes error -body {
1169    wm positionfrom
1170} -result {wrong # args: should be "wm option window ?arg ...?"}
1171test wm-positionfrom-1.2 {usage} -returnCodes error -body {
1172    wm positionfrom .t 1 2
1173} -result {wrong # args: should be "wm positionfrom window ?user/program?"}
1174test wm-positionfrom-1.3 {usage} -returnCodes error -body {
1175    wm positionfrom .t none
1176} -result {bad argument "none": must be program or user}
1177
1178test wm-positionfrom-2.1 {setting and reading values} -setup {
1179    destroy .t2
1180    set result {}
1181} -body {
1182    toplevel .t2
1183    wm positionfrom .t user
1184    lappend result [wm positionfrom .t]
1185    wm positionfrom .t program
1186    lappend result [wm positionfrom .t]
1187    wm positionfrom .t {}
1188    lappend result [wm positionfrom .t]
1189} -cleanup {
1190    destroy .t2
1191} -result {user program {}}
1192
1193
1194### wm protocol ###
1195test wm-protocol-1.1 {usage} -returnCodes error -body {
1196    wm protocol
1197} -result {wrong # args: should be "wm option window ?arg ...?"}
1198test wm-protocol-1.2 {usage} -returnCodes error -body {
1199    wm protocol .t 1 2 3
1200} -result {wrong # args: should be "wm protocol window ?name? ?command?"}
1201
1202test wm-protocol-2.1 {setting and reading values} -body {
1203    wm protocol .t {foo a} {a b c}
1204    wm protocol .t bar {test script for bar}
1205    wm protocol .t
1206} -cleanup {
1207    wm protocol .t {foo a} {}
1208    wm protocol .t bar {}
1209} -result {bar {foo a}}
1210test wm-protocol-2.2 {setting and reading values} -setup {
1211    set result {}
1212} -body {
1213    wm protocol .t foo {a b c}
1214    wm protocol .t bar {test script for bar}
1215    lappend result [wm protocol .t foo] [wm protocol .t bar]
1216    wm protocol .t foo {}
1217    wm protocol .t bar {}
1218    lappend result [wm protocol .t foo] [wm protocol .t bar]
1219} -result {{a b c} {test script for bar} {} {}}
1220test wm-protocol-2.3 {setting and reading values} -body {
1221    wm protocol .t foo {a b c}
1222    wm protocol .t foo {test script}
1223    wm protocol .t foo
1224} -cleanup {
1225    wm protocol .t foo {}
1226} -result {test script}
1227
1228
1229### wm resizable ###
1230test wm-resizable-1.1 {usage} -returnCodes error -body {
1231    wm resizable
1232} -result {wrong # args: should be "wm option window ?arg ...?"}
1233test wm-resizable-1.2 {usage} -returnCodes error -body {
1234    wm resizable .t 1
1235} -result {wrong # args: should be "wm resizable window ?width height?"}
1236test wm-resizable-1.3 {usage} -returnCodes error -body {
1237    wm resizable .t 1 2 3
1238} -result {wrong # args: should be "wm resizable window ?width height?"}
1239test wm-resizable-1.4 {usage} -returnCodes error -body {
1240    wm resizable .t bad 0
1241} -result {expected boolean value but got "bad"}
1242test wm-resizable-1.5 {usage} -returnCodes error -body {
1243    wm resizable .t 1 bad
1244} -result {expected boolean value but got "bad"}
1245
1246test wm-resizable-2.1 {setting and reading values} {
1247    wm resizable .t 0 1
1248    set result [wm resizable .t]
1249    wm resizable .t 1 0
1250    lappend result [wm resizable .t]
1251    wm resizable .t 1 1
1252    lappend result [wm resizable .t]
1253} {0 1 {1 0} {1 1}}
1254
1255
1256### wm sizefrom ###
1257test wm-sizefrom-1.1 {usage} -returnCodes error -body {
1258    wm sizefrom
1259} -result {wrong # args: should be "wm option window ?arg ...?"}
1260test wm-sizefrom-1.2 {usage} -returnCodes error -body {
1261    wm sizefrom .t 1 2
1262} -result {wrong # args: should be "wm sizefrom window ?user|program?"}
1263test wm-sizefrom-1.4 {usage} -returnCodes error -body {
1264    wm sizefrom .t bad
1265} -result {bad argument "bad": must be program or user}
1266
1267test wm-sizefrom-2.1 {setting and reading values} {
1268    set result [list [wm sizefrom .t]]
1269    wm sizefrom .t user
1270    lappend result [wm sizefrom .t]
1271    wm sizefrom .t program
1272    lappend result [wm sizefrom .t]
1273    wm sizefrom .t {}
1274    lappend result [wm sizefrom .t]
1275} {{} user program {}}
1276
1277destroy .t
1278
1279### wm stackorder ###
1280test wm-stackorder-1.1 {usage} -returnCodes error -body {
1281    wm stackorder
1282} -result {wrong # args: should be "wm option window ?arg ...?"}
1283test wm-stackorder-1.2 {usage} -returnCodes error -body {
1284    wm stackorder . _
1285} -result {wrong # args: should be "wm stackorder window ?isabove|isbelow window?"}
1286test wm-stackorder-1.3 {usage} -returnCodes error -body {
1287    wm stackorder . _ _ _
1288} -result {wrong # args: should be "wm stackorder window ?isabove|isbelow window?"}
1289test wm-stackorder-1.4 {usage} -returnCodes error -body {
1290    wm stackorder . is .
1291} -result {ambiguous argument "is": must be isabove or isbelow}
1292test wm-stackorder-1.5 {usage} -returnCodes error -body {
1293    wm stackorder _
1294} -result {bad window path name "_"}
1295test wm-stackorder-1.6 {usage} -returnCodes error -body {
1296    wm stackorder . isabove _
1297} -result {bad window path name "_"}
1298test wm-stackorder-1.7 {usage} -body {
1299    toplevel .t
1300    button .t.b
1301    wm stackorder .t.b
1302} -cleanup {
1303    destroy .t
1304} -returnCodes error -result {window ".t.b" isn't a top-level window}
1305test wm-stackorder-1.8 {usage} -body {
1306    toplevel .t
1307    button .t.b
1308    pack .t.b
1309    update
1310    wm stackorder . isabove .t.b
1311} -cleanup {
1312    destroy .t
1313} -returnCodes error -result {window ".t.b" isn't a top-level window}
1314test wm-stackorder-1.9 {usage} -body {
1315    toplevel .t
1316    button .t.b
1317    pack .t.b
1318    update
1319    wm stackorder . isbelow .t.b
1320} -cleanup {
1321    destroy .t
1322} -returnCodes error -result {window ".t.b" isn't a top-level window}
1323test wm-stackorder-1.10 {usage, isabove|isbelow toplevels must be mapped} -body {
1324    toplevel .t
1325    update
1326    wm withdraw .t
1327    wm stackorder .t isabove .
1328} -cleanup {
1329    destroy .t
1330} -returnCodes error -result {window ".t" isn't mapped}
1331test wm-stackorder-1.11 {usage, isabove|isbelow toplevels must be mapped} -body {
1332    toplevel .t
1333    update
1334    wm withdraw .t
1335    wm stackorder . isbelow .t
1336} -cleanup {
1337    destroy .t
1338} -returnCodes error -result {window ".t" isn't mapped}
1339deleteWindows
1340
1341test wm-stackorder-2.1 {stacking order} -body {
1342    toplevel .t ; update
1343    wm stackorder .
1344} -cleanup {
1345    destroy .t
1346} -result {. .t}
1347test wm-stackorder-2.2 {stacking order} -body {
1348    toplevel .t ; update
1349    raise .
1350    raiseDelay
1351    wm stackorder .
1352} -cleanup {
1353    destroy .t
1354} -result {.t .}
1355test wm-stackorder-2.3 {stacking order} -body {
1356    toplevel .t ; update
1357    toplevel .t2 ; update
1358    raise .
1359    raise .t2
1360    raiseDelay
1361    wm stackorder .
1362} -cleanup {
1363    destroy .t .t2
1364} -result {.t . .t2}
1365test wm-stackorder-2.4 {stacking order} -body {
1366    toplevel .t ; update
1367    toplevel .t2 ; update
1368    raise .
1369    lower .t2
1370    raiseDelay
1371    wm stackorder .
1372} -cleanup {
1373    destroy .t .t2
1374} -result {.t2 .t .}
1375test wm-stackorder-2.5 {stacking order} -setup {
1376    destroy .parent
1377} -body {
1378    toplevel .parent ; update
1379    destroy .parent.child1
1380    toplevel .parent.child1 ; update
1381    destroy .parent.child2
1382    toplevel .parent.child2 ; update
1383    destroy .extra
1384    toplevel .extra ; update
1385    raise .parent
1386    lower .parent.child2
1387    raiseDelay
1388    wm stackorder .parent
1389} -cleanup {
1390    deleteWindows
1391} -result {.parent.child2 .parent.child1 .parent}
1392test wm-stackorder-2.6 {stacking order: non-toplevel widgets ignored} -body {
1393    toplevel .t1
1394    button .t1.b
1395    pack .t1.b
1396    update
1397    wm stackorder .
1398} -cleanup {
1399    destroy .t1
1400} -result {. .t1}
1401test wm-stackorder-2.7 {stacking order: no children returns self} -setup {
1402    deleteWindows
1403} -body {
1404    wm stackorder .
1405} -result {.}
1406
1407deleteWindows
1408
1409test wm-stackorder-3.1 {unmapped toplevel} -body {
1410    toplevel .t1 ; update
1411    toplevel .t2 ; update
1412    wm iconify .t1
1413    wm stackorder .
1414} -cleanup {
1415    destroy .t1 .t2
1416} -result {. .t2}
1417test wm-stackorder-3.2 {unmapped toplevel} -body {
1418    toplevel .t1 ; update
1419    toplevel .t2 ; update
1420    wm withdraw .t2
1421    wm stackorder .
1422} -cleanup {
1423    destroy .t1 .t2
1424} -result {. .t1}
1425test wm-stackorder-3.3 {unmapped toplevel} -body {
1426    toplevel .t1 ; update
1427    toplevel .t2 ; update
1428    wm withdraw .t2
1429    wm stackorder .t2
1430} -cleanup {
1431    destroy .t1 .t2
1432} -result {}
1433test wm-stackorder-3.4 {unmapped toplevel} -body {
1434    toplevel .t1 ; update
1435    toplevel .t1.t2 ; update
1436    wm withdraw .t1.t2
1437    wm stackorder .t1
1438} -cleanup {
1439    destroy .t1
1440} -result {.t1}
1441test wm-stackorder-3.5 {unmapped toplevel} -body {
1442    toplevel .t1 ; update
1443    toplevel .t1.t2 ; update
1444    wm withdraw .t1
1445    wm stackorder .t1
1446} -cleanup {
1447    destroy .t1
1448} -result {.t1.t2}
1449test wm-stackorder-3.6 {unmapped toplevel} -body {
1450    toplevel .t1 ; update
1451    toplevel .t1.t2 ; update
1452    toplevel .t1.t2.t3 ; update
1453    wm withdraw .t1.t2
1454    wm stackorder .t1
1455} -cleanup {
1456    destroy .t1
1457} -result {.t1 .t1.t2.t3}
1458test wm-stackorder-3.7 {unmapped toplevel, mapped children returned} -body {
1459    toplevel .t1 ; update
1460    toplevel .t1.t2 ; update
1461    wm withdraw .t1
1462    wm stackorder .t1
1463} -cleanup {
1464    destroy .t1
1465} -result {.t1.t2}
1466test wm-stackorder-3.8 {toplevel mapped in idle callback} -body {
1467    toplevel .t1
1468    wm stackorder .
1469} -cleanup {
1470    destroy .t1
1471} -result {.}
1472deleteWindows
1473
1474test wm-stackorder-4.1 {wm stackorder isabove|isbelow} -body {
1475    toplevel .t ; update
1476    raise .t
1477    wm stackorder . isabove .t
1478} -cleanup {
1479    destroy .t
1480} -result {0}
1481test wm-stackorder-4.2 {wm stackorder isabove|isbelow} -body {
1482    toplevel .t ; update
1483    raise .t
1484    wm stackorder . isbelow .t
1485} -cleanup {
1486    destroy .t
1487} -result {1}
1488test wm-stackorder-4.3 {wm stackorder isabove|isbelow} -body {
1489    toplevel .t ; update
1490    raise .
1491    raiseDelay
1492    wm stackorder .t isa .
1493} -cleanup {
1494    destroy .t
1495} -result {0}
1496test wm-stackorder-4.4 {wm stackorder isabove|isbelow} -body {
1497    toplevel .t ; update
1498    raise .
1499    raiseDelay
1500    wm stackorder .t isb .
1501} -cleanup {
1502    destroy .t
1503} -result {1}
1504deleteWindows
1505
1506test wm-stackorder-5.1 {a menu is not a toplevel} -body {
1507    toplevel .t
1508    menu .t.m -type menubar
1509    .t.m add cascade -label "File"
1510    .t configure -menu .t.m
1511    update
1512    raise .
1513    raiseDelay
1514    wm stackorder .
1515} -cleanup {
1516    destroy .t
1517} -result {.t .}
1518test wm-stackorder-5.2 {A normal toplevel can't be\
1519        raised above an overrideredirect toplevel} -body {
1520    toplevel .t
1521    wm overrideredirect .t 1
1522    raise .
1523    update
1524    raiseDelay
1525    wm stackorder . isabove .t
1526} -cleanup {
1527    destroy .t
1528} -result 0
1529test wm-stackorder-5.3 {An overrideredirect window\
1530        can be explicitly lowered} -body {
1531    toplevel .t
1532    wm overrideredirect .t 1
1533    lower .t
1534    update
1535    raiseDelay
1536    wm stackorder .t isbelow .
1537} -cleanup {
1538    destroy .t
1539} -result 1
1540
1541test wm-stackorder-6.1 {An embedded toplevel does not\
1542        appear in the stacking order} -body {
1543    toplevel .real -container 1
1544    toplevel .embd -bg blue -use [winfo id .real]
1545    update
1546    wm stackorder .
1547} -cleanup {
1548    deleteWindows
1549} -result {. .real}
1550
1551
1552stdWindow
1553
1554### wm title ###
1555test wm-title-1.1 {usage} -returnCodes error -body {
1556    wm title
1557} -result {wrong # args: should be "wm option window ?arg ...?"}
1558test wm-title-1.2 {usage} -returnCodes error -body {
1559    wm title . 1 2
1560} -result {wrong # args: should be "wm title window ?newTitle?"}
1561
1562test wm-title-2.1 {setting and reading values} -setup {
1563    destroy .t
1564} -body {
1565    toplevel .t
1566    set result [wm title .t]
1567    wm title .t Apa
1568    lappend result [wm title .t]
1569    wm title .t {}
1570    lappend result [wm title .t]
1571} -result {t Apa {}}
1572
1573
1574### wm transient ###
1575test wm-transient-1.1 {usage} -returnCodes error -body {
1576    catch {destroy .t} ; toplevel .t
1577    wm transient .t 1 2
1578} -result {wrong # args: should be "wm transient window ?master?"}
1579test wm-transient-1.2 {usage} -returnCodes error -body {
1580    catch {destroy .t} ; toplevel .t
1581    wm transient .t foo
1582} -result {bad window path name "foo"}
1583test wm-transient-1.3 {usage} -returnCodes error -body {
1584    catch {destroy .t} ; toplevel .t
1585    wm transient foo .t
1586} -result {bad window path name "foo"}
1587deleteWindows
1588test wm-transient-1.4 {usage} -returnCodes error -body {
1589    toplevel .master
1590    toplevel .subject
1591    wm transient .subject .master
1592    wm iconify .subject
1593} -cleanup {
1594    deleteWindows
1595} -result {can't iconify ".subject": it is a transient}
1596test wm-transient-1.5 {usage} -returnCodes error -body {
1597    toplevel .icon -bg blue
1598    toplevel .top
1599    wm iconwindow .top .icon
1600    toplevel .dummy
1601    wm transient .icon .dummy
1602} -cleanup {
1603    deleteWindows
1604} -result {can't make ".icon" a transient: it is an icon for .top}
1605test wm-transient-1.6 {usage} -returnCodes error -body {
1606    toplevel .icon -bg blue
1607    toplevel .top
1608    wm iconwindow .top .icon
1609    toplevel .dummy
1610    wm transient .dummy .icon
1611} -cleanup {
1612    deleteWindows
1613} -result {can't make ".icon" a master: it is an icon for .top}
1614test wm-transient-1.7 {usage} -returnCodes error -body {
1615    toplevel .master
1616    wm transient .master .master
1617} -cleanup {
1618    deleteWindows
1619} -result {can't make ".master" its own master}
1620test wm-transient-1.8 {usage} -returnCodes error -body {
1621    toplevel .master
1622    frame .master.f
1623    wm transient .master .master.f
1624} -cleanup {
1625    deleteWindows
1626} -result {can't make ".master" its own master}
1627
1628test wm-transient-2.1 {basic get/set of master} -setup {
1629    set results [list]
1630} -body {
1631    toplevel .master
1632    toplevel .subject
1633    lappend results [wm transient .subject]
1634    wm transient .subject .master
1635    lappend results [wm transient .subject]
1636    wm transient .subject {}
1637    lappend results [wm transient .subject]
1638} -cleanup {
1639    deleteWindows
1640} -result {{} .master {}}
1641test wm-transient-2.2 {first toplevel parent of non-toplevel master is used} -body {
1642    toplevel .master
1643    frame .master.f
1644    toplevel .subject
1645    wm transient .subject .master.f
1646    wm transient .subject
1647} -cleanup {
1648    deleteWindows
1649} -result {.master}
1650
1651test wm-transient-3.1 {transient toplevel is withdrawn
1652        when mapped if master is withdrawn} -body {
1653    toplevel .master
1654    wm withdraw .master
1655    update
1656    toplevel .subject
1657    wm transient .subject .master
1658    update
1659    list [wm state .subject] [winfo ismapped .subject]
1660} -cleanup {
1661    deleteWindows
1662} -result {withdrawn 0}
1663test wm-transient-3.2 {already mapped transient toplevel
1664        takes on withdrawn state of master} -body {
1665    toplevel .master
1666    wm withdraw .master
1667    update
1668    toplevel .subject
1669    update
1670    wm transient .subject .master
1671    update
1672    list [wm state .subject] [winfo ismapped .subject]
1673} -cleanup {
1674    deleteWindows
1675} -result {withdrawn 0}
1676test wm-transient-3.3 {withdraw/deiconify on the master
1677        also does a withdraw/deiconify on the transient} -setup {
1678    set results [list]
1679} -body {
1680    toplevel .master
1681    toplevel .subject
1682    update
1683    wm transient .subject .master
1684    wm withdraw .master
1685    update
1686    lappend results [wm state .subject] [winfo ismapped .subject]
1687    wm deiconify .master
1688    update
1689    lappend results [wm state .subject] [winfo ismapped .subject]
1690} -cleanup {
1691    deleteWindows
1692} -result {withdrawn 0 normal 1}
1693
1694test wm-transient-4.1 {transient toplevel is withdrawn
1695        when mapped if master is iconic} -body {
1696    toplevel .master
1697    wm iconify .master
1698    update
1699    toplevel .subject
1700    wm transient .subject .master
1701    update
1702    list [wm state .subject] [winfo ismapped .subject]
1703} -cleanup {
1704    deleteWindows
1705} -result {withdrawn 0}
1706test wm-transient-4.2 {already mapped transient toplevel
1707        is withdrawn if master is iconic} -body {
1708    toplevel .master
1709    wm iconify .master
1710    update
1711    toplevel .subject
1712    update
1713    wm transient .subject .master
1714    update
1715    list [wm state .subject] [winfo ismapped .subject]
1716} -cleanup {
1717    deleteWindows
1718} -result {withdrawn 0}
1719test wm-transient-4.3 {iconify/deiconify on the master
1720        does a withdraw/deiconify on the transient} -setup {
1721    set results [list]
1722} -body {
1723    toplevel .master
1724    toplevel .subject
1725    update
1726    wm transient .subject .master
1727    wm iconify .master
1728    update
1729    lappend results [wm state .subject] [winfo ismapped .subject]
1730    wm deiconify .master
1731    update
1732    lappend results [wm state .subject] [winfo ismapped .subject]
1733} -cleanup {
1734    deleteWindows
1735} -result {withdrawn 0 normal 1}
1736
1737test wm-transient-5.1 {an error during transient command should not
1738        cause the map/unmap binding to be deleted} -setup {
1739    set results [list]
1740} -body {
1741    toplevel .master
1742    toplevel .subject
1743    update
1744    wm transient .subject .master
1745    # Expect a bad window path error here
1746    lappend results [catch {wm transient .subject .bad}]
1747    wm withdraw .master
1748    update
1749    lappend results [wm state .subject]
1750    wm deiconify .master
1751    update
1752    lappend results [wm state .subject]
1753} -cleanup {
1754    deleteWindows
1755} -result {1 withdrawn normal}
1756test wm-transient-5.2 {remove transient property when master
1757        is destroyed} -body {
1758    toplevel .master
1759    toplevel .subject
1760    wm transient .subject .master
1761    update
1762    destroy .master
1763    update
1764    wm transient .subject
1765} -cleanup {
1766    deleteWindows
1767} -result {}
1768test wm-transient-5.3 {remove transient property from window
1769        that had never been mapped when master is destroyed} -body {
1770    toplevel .master
1771    toplevel .subject
1772    wm transient .subject .master
1773    destroy .master
1774    wm transient .subject
1775} -cleanup {
1776    deleteWindows
1777} -result {}
1778
1779test wm-transient-6.1 {a withdrawn transient does not track
1780        state changes in the master} -body {
1781    toplevel .master
1782    toplevel .subject
1783    update
1784    wm transient .subject .master
1785    wm withdraw .subject
1786    wm withdraw .master
1787    wm deiconify .master
1788    # idle handler should not map the transient
1789    update
1790    wm state .subject
1791} -cleanup {
1792    deleteWindows
1793} -result {withdrawn}
1794test wm-transient-6.2 {a withdrawn transient does not track
1795        state changes in the master} -setup {
1796    set results [list]
1797} -body {
1798    toplevel .master
1799    toplevel .subject
1800    update
1801    wm transient .subject .master
1802    wm withdraw .subject
1803    wm withdraw .master
1804    wm deiconify .master
1805    # idle handler should not map the transient
1806    update
1807    lappend results [wm state .subject]
1808    wm deiconify .subject
1809    lappend results [wm state .subject]
1810    wm withdraw .master
1811    lappend results [wm state .subject]
1812    wm deiconify .master
1813    # idle handler should map transient
1814    update
1815    lappend results [wm state .subject]
1816} -cleanup {
1817    deleteWindows
1818} -result {withdrawn normal withdrawn normal}
1819test wm-transient-6.3 {a withdrawn transient does not track
1820        state changes in the master} -body {
1821    toplevel .master
1822    toplevel .subject
1823    update
1824    # withdraw before making window a transient
1825    wm withdraw .subject
1826    wm transient .subject .master
1827    wm withdraw .master
1828    wm deiconify .master
1829    # idle handler should not map the transient
1830    update
1831    wm state .subject
1832} -cleanup {
1833    deleteWindows
1834} -result {withdrawn}
1835
1836# wm-transient-7.*: See SF Tk Bug #592201 "wm transient fails with two masters"
1837# wm-transient-7.3 through 7.5 all caused panics on Unix in Tk 8.4b1.
1838# 7.1 and 7.2 added to catch (potential) future errors.
1839#
1840test wm-transient-7.1 {Destroying transient} -body {
1841    toplevel .t
1842    toplevel .transient
1843    wm transient .transient .t
1844    destroy .transient
1845    destroy .t
1846    # OK: the above did not cause a panic.
1847} -cleanup {
1848    deleteWindows
1849}
1850test wm-transient-7.2 {Destroying master} -body {
1851    toplevel .t
1852    toplevel .transient
1853    wm transient .transient .t
1854    destroy .t
1855    wm transient .transient
1856} -cleanup {
1857    deleteWindows
1858} -result {}
1859test wm-transient-7.3 {Reassign transient, destroy old master} -body {
1860    toplevel .t1
1861    toplevel .t2
1862    toplevel .transient
1863    wm transient .transient .t1
1864    wm transient .transient .t2
1865    destroy .t1	;# Caused panic in 8.4b1
1866    destroy .t2
1867    destroy .transient
1868} -cleanup {
1869    deleteWindows
1870}
1871test wm-transient-7.4 {Reassign transient, destroy new master} -body {
1872    toplevel .t1
1873    toplevel .t2
1874    toplevel .transient
1875    wm transient .transient .t1
1876    wm transient .transient .t2
1877    destroy .t2 	;# caused panic in 8.4b1
1878    destroy .t1
1879    destroy .transient
1880} -cleanup {
1881    deleteWindows
1882}
1883test wm-transient-7.5 {Reassign transient, destroy transient} -body {
1884    toplevel .t1
1885    toplevel .t2
1886    toplevel .transient
1887    wm transient .transient .t1
1888    wm transient .transient .t2
1889    destroy .transient
1890    destroy .t2 	;# caused panic in 8.4b1
1891    destroy .t1		;# so did this
1892} -cleanup {
1893    deleteWindows
1894}
1895
1896test wm-transient-8.1 {transient to withdrawn window, Bug 1163496} -setup {
1897    deleteWindows
1898    set result {}
1899} -body {
1900    # Verifies that transients stay on top of their masters, even if they were
1901    # made transients when those masters were withdrawn.
1902    toplevel .t1; wm withdraw  .t1;     update
1903    toplevel .t2; wm transient .t2 .t1; update
1904    lappend result [winfo ismapped .t1] [winfo ismapped .t2]
1905    wm deiconify .t1; update
1906    lappend result [winfo ismapped .t1] [winfo ismapped .t2]
1907    raise .t1; update
1908    lappend result [lsearch -all -inline -glob [wm stackorder .] ".t?"]
1909} -cleanup {
1910    deleteWindows
1911} -result {0 0 1 1 {.t1 .t2}}
1912
1913
1914### wm state ###
1915test wm-state-1.1 {usage} -returnCodes error -body {
1916    wm state
1917} -result {wrong # args: should be "wm option window ?arg ...?"}
1918test wm-state-1.2 {usage} -returnCodes error -body {
1919    wm state . _ _
1920} -result {wrong # args: should be "wm state window ?state?"}
1921
1922deleteWindows
1923test wm-state-2.1 {initial state} -body {
1924    toplevel .t
1925    wm state .t
1926} -cleanup {
1927    deleteWindows
1928} -result {normal}
1929test wm-state-2.2 {state change before map} -body {
1930    toplevel .t
1931    wm state .t withdrawn
1932    wm state .t
1933} -cleanup {
1934    deleteWindows
1935} -result {withdrawn}
1936test wm-state-2.3 {state change before map} -body {
1937    toplevel .t
1938    wm withdraw .t
1939    wm state .t
1940} -cleanup {
1941    deleteWindows
1942} -result {withdrawn}
1943test wm-state-2.4 {state change after map} -body {
1944    toplevel .t
1945    update
1946    wm state .t withdrawn
1947    wm state .t
1948} -cleanup {
1949    deleteWindows
1950} -result {withdrawn}
1951test wm-state-2.5 {state change after map} -body {
1952    toplevel .t
1953    update
1954    wm withdraw .t
1955    wm state .t
1956} -cleanup {
1957    deleteWindows
1958} -result {withdrawn}
1959test wm-state-2.6 {state change before map} -body {
1960    toplevel .t
1961    wm state .t iconic
1962    wm state .t
1963} -cleanup {
1964    deleteWindows
1965} -result {iconic}
1966test wm-state-2.7 {state change before map} -body {
1967    toplevel .t
1968    wm iconify .t
1969    wm state .t
1970} -cleanup {
1971    deleteWindows
1972} -result {iconic}
1973test wm-state-2.8 {state change after map} -body {
1974    toplevel .t
1975    update
1976    wm state .t iconic
1977    wm state .t
1978} -cleanup {
1979    deleteWindows
1980} -result {iconic}
1981test wm-state-2.9 {state change after map} -body {
1982    toplevel .t
1983    update
1984    wm iconify .t
1985    wm state .t
1986} -cleanup {
1987    deleteWindows
1988} -result {iconic}
1989test wm-state-2.10 {state change before map} -body {
1990    toplevel .t
1991    wm withdraw .t
1992    wm state .t normal
1993    wm state .t
1994} -cleanup {
1995    deleteWindows
1996} -result {normal}
1997test wm-state-2.11 {state change before map} -body {
1998    toplevel .t
1999    wm withdraw .t
2000    wm deiconify .t
2001    wm state .t
2002} -cleanup {
2003    deleteWindows
2004} -result {normal}
2005test wm-state-2.12 {state change after map} -body {
2006    toplevel .t
2007    update
2008    wm withdraw .t
2009    wm state .t normal
2010    wm state .t
2011} -cleanup {
2012    deleteWindows
2013} -result {normal}
2014test wm-state-2.13 {state change after map} -body {
2015    toplevel .t
2016    update
2017    wm withdraw .t
2018    wm deiconify .t
2019    wm state .t
2020} -cleanup {
2021    deleteWindows
2022} -result {normal}
2023test wm-state-2.14 {state change before map} -body {
2024    toplevel .t
2025    wm iconify .t
2026    wm state .t normal
2027    wm state .t
2028} -cleanup {
2029    deleteWindows
2030} -result {normal}
2031test wm-state-2.15 {state change before map} -body {
2032    toplevel .t
2033    wm iconify .t
2034    wm deiconify .t
2035    wm state .t
2036} -cleanup {
2037    deleteWindows
2038} -result {normal}
2039test wm-state-2.16 {state change after map} -body {
2040    toplevel .t
2041    update
2042    wm iconify .t
2043    wm state .t normal
2044    wm state .t
2045} -cleanup {
2046    deleteWindows
2047} -result {normal}
2048test wm-state-2.17 {state change after map} -body {
2049    toplevel .t
2050    update
2051    wm iconify .t
2052    wm deiconify .t
2053    wm state .t
2054} -cleanup {
2055    deleteWindows
2056} -result {normal}
2057test wm-state-2.18 {state change after map} -constraints win -body {
2058    toplevel .t
2059    update
2060    wm state .t zoomed
2061    wm state .t
2062} -cleanup {
2063    deleteWindows
2064} -result {zoomed}
2065
2066
2067### wm withdraw ###
2068test wm-withdraw-1.1 {usage} -returnCodes error -body {
2069    wm withdraw
2070} -result {wrong # args: should be "wm option window ?arg ...?"}
2071test wm-withdraw-1.2 {usage} -returnCodes error -body {
2072    wm withdraw . _
2073} -result {wrong # args: should be "wm withdraw window"}
2074
2075deleteWindows
2076test wm-withdraw-2.1 {Misc errors} -body {
2077    toplevel .t
2078    toplevel .t2
2079    wm iconwindow .t .t2
2080    wm withdraw .t2
2081} -returnCodes error -cleanup {
2082    deleteWindows
2083} -result {can't withdraw .t2: it is an icon for .t}
2084
2085test wm-withdraw-3.1 {} -setup {
2086    set result {}
2087} -body {
2088    toplevel .t
2089    update
2090    wm withdraw .t
2091    lappend result [wm state .t] [winfo ismapped .t]
2092    wm deiconify .t
2093    lappend result [wm state .t] [winfo ismapped .t]
2094} -cleanup {
2095    deleteWindows
2096} -result {withdrawn 0 normal 1}
2097
2098
2099### Misc. wm tests ###
2100test wm-deletion-epoch-1.1 {Deletion epoch on multiple displays} -constraints altDisplay -body {
2101    # See Tk Bug #671330 "segfault when e.g. deiconifying destroyed window"
2102    set w [toplevel .t -screen $env(TK_ALT_DISPLAY)]
2103    wm deiconify $w         ;# this caches the WindowRep
2104    destroy .t
2105    wm deiconify $w
2106} -returnCodes error -result {bad window path name ".t"} -cleanup {
2107    deleteWindows
2108}
2109
2110### Docking test (manage, forget) ###
2111test wm-manage-1.1 {managing a frame} -setup {
2112    set result [list]
2113} -body {
2114    toplevel .t
2115    frame .t.f
2116    pack [label .t.f.l -text hello]
2117    wm manage .t.f
2118    raise .t.f
2119    update
2120    lappend result [winfo manage .t.f]
2121    lappend result [winfo toplevel .t.f]
2122} -cleanup {
2123    deleteWindows
2124} -result {wm .t.f}
2125test wm-manage-1.2 {managing a toplevel} -setup {
2126    set result [list]
2127} -body {
2128    toplevel .t
2129    pack [label .t.l -text hello]
2130    wm manage .t
2131    raise .t
2132    update
2133    lappend result [winfo manage .t]
2134    lappend result [winfo toplevel .t]
2135} -cleanup {
2136    deleteWindows
2137} -result {wm .t}
2138test wm-manage-1.3 {managing a labelframe} -setup {
2139    set result [list]
2140} -body {
2141    toplevel .t
2142    labelframe .t.f -text Labelframe
2143    pack [label .t.f.l -text hello]
2144    wm manage .t.f
2145    raise .t.f
2146    update
2147    lappend result [winfo manage .t.f]
2148    lappend result [winfo toplevel .t.f]
2149} -cleanup {
2150    deleteWindows
2151} -result {wm .t.f}
2152test wm-manage-1.4 {managing a ttk::frame} -setup {
2153    set result [list]
2154} -body {
2155    toplevel .t
2156    ttk::frame .t.f
2157    pack [label .t.f.l -text hello]
2158    wm manage .t.f
2159    raise .t.f
2160    update
2161    lappend result [winfo manage .t.f]
2162    lappend result [winfo toplevel .t.f]
2163} -cleanup {
2164    deleteWindows
2165} -returnCodes error -result "window \".t.f\" is not manageable: must be a frame, labelframe or toplevel"
2166test wm-manage-1.5 {managing a text widget} -setup {
2167    set result [list]
2168} -body {
2169    toplevel .t
2170    text .t.f
2171    .t.f insert end "Manage text\n" {}
2172    wm manage .t.f
2173    raise .t.f
2174    update
2175    lappend result [winfo manage .t.f]
2176    lappend result [winfo toplevel .t.f]
2177} -cleanup {
2178    deleteWindows
2179} -returnCodes error -result "window \".t.f\" is not manageable: must be a frame, labelframe or toplevel"
2180test wm-manage-1.6 {managing a button} -setup {
2181    set result [list]
2182} -body {
2183    toplevel .t
2184    button .t.f -text Button
2185    wm manage .t.f
2186    raise .t.f
2187    update
2188    lappend result [winfo manage .t.f]
2189    lappend result [winfo toplevel .t.f]
2190} -cleanup {
2191    deleteWindows
2192} -returnCodes error -result "window \".t.f\" is not manageable: must be a frame, labelframe or toplevel"
2193test wm-manage-1.7 {managing a frame} -setup {
2194    set result [list]
2195} -body {
2196    toplevel .t
2197    frame .t.f
2198    pack [label .t.f.l -text Label]
2199    pack .t.f
2200    update
2201    lappend result [winfo manage .t.f]
2202    lappend result [winfo toplevel .t.f]
2203    wm manage .t.f
2204    raise .t.f
2205    update
2206    lappend result [winfo manage .t.f]
2207    lappend result [winfo toplevel .t.f]
2208    wm forget .t.f
2209    pack .t.f
2210    update
2211    lappend result [winfo manage .t.f]
2212    lappend result [winfo toplevel .t.f]
2213} -cleanup {
2214    deleteWindows
2215} -result {pack .t wm .t.f pack .t}
2216test wm-manage-1.8 {unmanaging a toplevel} -setup {
2217    set result [list]
2218} -body {
2219    toplevel .t
2220    toplevel .t.t
2221    button .t.t.b -text "Manage This"
2222    pack .t.t.b
2223    update
2224    lappend result [winfo manage .t.t]
2225    lappend result [winfo toplevel .t.t.b]
2226    wm forget .t.t
2227    wm forget .t.t ; # second call should be a no-op
2228    pack .t.t
2229    update
2230    lappend result [winfo manage .t.t]
2231    lappend result [winfo toplevel .t.t.b]
2232    wm manage .t.t
2233    wm manage .t.t ; # second call should be a no-op
2234    wm deiconify .t.t
2235    update
2236    lappend result [winfo manage .t.t]
2237    lappend result [winfo toplevel .t.t.b]
2238} -cleanup {
2239    deleteWindows
2240} -result {wm .t.t pack .t wm .t.t}
2241
2242test wm-forget-1.1 "bug #2009788: forget toplevel can cause crash" -body {
2243    toplevel .parent
2244    toplevel .parent.child
2245    wm forget .parent.child
2246    winfo exists .parent.child
2247} -cleanup {
2248    deleteWindows
2249}  -result {1}
2250test wm-forget-1.2 "bug #2009788: forget toplevel can cause crash" -body {
2251    toplevel .parent
2252    update
2253    toplevel .parent.child
2254    wm forget .parent.child
2255    winfo exists .parent.child
2256} -cleanup {
2257    deleteWindows
2258}  -result {1}
2259test wm-forget-1.3 "bug #2009788: forget toplevel can cause crash" -body {
2260    toplevel .parent
2261    toplevel .parent.child
2262    wm forget .parent.child
2263    wm manage .parent.child
2264    winfo exists .parent.child
2265} -cleanup {
2266    deleteWindows
2267}  -result {1}
2268test wm-forget-1.4 "pack into unmapped toplevel causes crash" -body {
2269    toplevel .parent
2270    toplevel .parent.child
2271    wm forget .parent.child
2272    pack [button .parent.child.button -text Hello]
2273    after 250 {destroy .parent}
2274    tkwait window .parent
2275} -cleanup {
2276    deleteWindows
2277} -result {}
2278
2279# FIXME:
2280
2281# Test delivery of virtual events to the WM. We could check to see if the
2282# window was raised after a button click for example. This sort of testing may
2283# not be possible.
2284
2285##############################################################################
2286
2287deleteWindows
2288cleanupTests
2289catch {unset results}
2290catch {unset focusin}
2291return
2292
2293# Local variables:
2294# mode: tcl
2295# End:
2296