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