# This file tests is a Tcl script to test the procedures in the file # tkWinWm.c. It is organized in the standard fashion for Tcl tests. # # This file contains a collection of tests for one or more of the Tcl # built-in commands. Sourcing this file into Tcl runs the tests and # generates output for errors. No output means no errors were found. # # Copyright © 1996 Sun Microsystems, Inc. # Copyright © 1998-1999 Scriptics Corporation. # All rights reserved. package require tcltest 2.2 namespace import ::tcltest::* tcltest::configure {*}$argv tcltest::loadTestedCommands testConstraint failsOnUbuntu [expr {![info exists ::env(CI)] || ![string match Linux $::tcl_platform(os)]}] testConstraint failsOnXQuarz [expr {$tcl_platform(os) ne "Darwin" || [tk windowingsystem] ne "x11" }] test winWm-1.1 {TkWmMapWindow} -constraints win -setup { destroy .t } -body { toplevel .t wm override .t 1 wm geometry .t +0+0 update list [winfo rootx .t] [winfo rooty .t] } -cleanup { destroy .t } -result {0 0} test winWm-1.2 {TkWmMapWindow} -constraints win -setup { destroy .t } -body { toplevel .t wm transient .t . update wm iconify . update wm deiconify . update wm iconify .t } -cleanup { destroy .t } -returnCodes error -result {can't iconify ".t": it is a transient} test winWm-1.3 {TkWmMapWindow} -constraints win -setup { destroy .t } -body { toplevel .t update toplevel .t2 update expr {[winfo x .t] != [winfo x .t2]} } -cleanup { destroy .t .t2 } -result 1 test winWm-1.4 {TkWmMapWindow} -constraints win -setup { destroy .t } -body { toplevel .t wm geometry .t +10+10 update toplevel .t2 wm geometry .t2 +40+10 update list [winfo x .t] [winfo x .t2] } -cleanup { destroy .t .t2 } -result {10 40} test winWm-1.5 {TkWmMapWindow} -constraints win -setup { destroy .t } -body { toplevel .t wm iconify .t update wm state .t } -result {iconic} test winWm-2.1 {TkpWmSetState} -constraints win -setup { destroy .t } -body { toplevel .t wm geometry .t 150x50+10+10 update set result [wm state .t] wm iconify .t update lappend result [wm state .t] wm deiconify .t update lappend result [wm state .t] } -cleanup { destroy .t } -result {normal iconic normal} test winWm-2.2 {TkpWmSetState} -constraints win -setup { destroy .t } -body { toplevel .t wm geometry .t 150x50+10+10 update set result [wm state .t] wm withdraw .t update lappend result [wm state .t] wm iconify .t update lappend result [wm state .t] wm deiconify .t update lappend result [wm state .t] } -cleanup { destroy .t } -result {normal withdrawn iconic normal} test winWm-2.3 {TkpWmSetState} -constraints win -setup { destroy .t } -body { toplevel .t wm geometry .t 150x50+10+10 update set result [wm state .t] wm state .t withdrawn update lappend result [wm state .t] wm state .t iconic update lappend result [wm state .t] wm state .t normal update lappend result [wm state .t] } -cleanup { destroy .t } -result {normal withdrawn iconic normal} test winWm-2.4 {TkpWmSetState} -constraints win -setup { destroy .t set result {} } -body { toplevel .t wm geometry .t 150x50+10+10 update lappend result [list [wm state .t] [wm geometry .t]] wm iconify .t update lappend result [list [wm state .t] [wm geometry .t]] wm geometry .t 200x50+10+10 update lappend result [list [wm state .t] [wm geometry .t]] wm deiconify .t update lappend result [list [wm state .t] [wm geometry .t]] } -cleanup { destroy .t } -result {{normal 150x50+10+10} {iconic 150x50+10+10} {iconic 150x50+10+10} {normal 200x50+10+10}} test winWm-3.1 {ConfigureTopLevel: window geometry propagation} -constraints { win } -setup { destroy .t } -body { toplevel .t wm geometry .t +0+0 button .t.b pack .t.b update set x [winfo x .t.b] destroy .t toplevel .t wm geometry .t +0+0 button .t.b update pack .t.b update expr {$x == [winfo x .t.b]} } -cleanup { destroy .t } -result 1 test winWm-4.1 {ConfigureTopLevel: menu resizing} -constraints win -setup { destroy .t } -body { toplevel .t frame .t.f -width 100 -height 50 pack .t.f menu .t.m .t.m add command -label "thisisreallylong" .t configure -menu .t.m wm geometry .t -0-0 update set menuheight [winfo y .t] .t.m add command -label "thisisreallylong" wm geometry .t -0-0 update set menuheight [expr {$menuheight - [winfo y .t]}] destroy .t toplevel .t frame .t.f -width 150 -height 50 -background red pack .t.f wm geometry .t -0-0 update set y [winfo y .t] menu .t.m .t.m add command -label foo .t configure -menu .t.m update expr {$y - [winfo y .t] eq $menuheight + 1} } -cleanup { destroy .t } -result 1 # This test works on 8.0p2 but has not worked on anything since 8.2. # It would be very strange to have a windows application increase the size # of the clientarea when a menu wraps so I believe this test to be wrong. # Original result was {50 50 50} new result may depend on the default menu # font test winWm-5.1 {UpdateGeometryInfo: menu resizing} -constraints win -setup { destroy .t set result {} } -body { toplevel .t frame .t.f -width 150 -height 50 -background red pack .t.f update set result [winfo height .t] menu .t.m .t.m add command -label foo .t configure -menu .t.m update lappend result [winfo height .t] .t.m add command -label "thisisreallylong" .t.m add command -label "thisisreallylong" update lappend result [winfo height .t] } -cleanup { destroy .t } -result {50 50 31} test winWm-5.2 {UpdateGeometryInfo: menu resizing} -constraints win -setup { destroy .t } -body { set result {} toplevel .t frame .t.f -width 150 -height 50 -background red pack .t.f wm geometry .t -0-0 update set y [winfo rooty .t] lappend result [winfo height .t] menu .t.m -tearoff 1 .t configure -menu .t.m .t.m add command -label foo .t.m add command -label "thisisreallylong" .t.m add command -label "thisisreallylong" update lappend result [winfo height .t] lappend result [expr {$y - [winfo rooty .t]}] destroy .t return $result } -cleanup { destroy .t } -result {50 50 0} test winWm-6.1 {wm attributes} -constraints win -setup { destroy .t } -body { toplevel .t wm attributes .t } -cleanup { destroy .t } -result {-alpha 1.0 -transparentcolor {} -disabled 0 -fullscreen 0 -toolwindow 0 -topmost 0} test winWm-6.2 {wm attributes} -constraints win -setup { destroy .t } -body { toplevel .t wm attributes .t -disabled } -cleanup { destroy .t } -result 0 test winWm-6.3 {wm attributes} -constraints win -setup { destroy .t } -body { toplevel .t wm attributes .t -foo } -cleanup { destroy .t } -returnCodes error -result {bad attribute "-foo": must be -alpha, -disabled, -fullscreen, -toolwindow, -topmost, or -transparentcolor} test winWm-6.4 {wm attributes -alpha} -constraints win -setup { destroy .t } -body { # Expect this to return all 1.0 {} on pre-2K/XP toplevel .t set res [wm attributes .t -alpha] # we don't return on set yet lappend res [wm attributes .t -alpha 0.5] lappend res [wm attributes .t -alpha] lappend res [wm attributes .t -alpha -100] lappend res [wm attributes .t -alpha] lappend res [wm attributes .t -alpha 100] lappend res [wm attributes .t -alpha] return $res } -cleanup { destroy .t } -result {1.0 {} 0.5 {} 0.0 {} 1.0} test winWm-6.5 {wm attributes -alpha} -constraints win -setup { destroy .t } -body { toplevel .t wm attributes .t -alpha foo } -cleanup { destroy .t } -returnCodes error -result {expected floating-point number but got "foo"} test winWm-6.6 {wm attributes -alpha} -constraints win -setup { destroy .t } -body { # This test is just to show off -alpha toplevel .t wm attributes .t -alpha 0.2 pack [label .t.l -text "Alpha Toplevel" -font "Helvetica 18 bold"] tk::PlaceWindow .t center update if {$::tcl_platform(osVersion) >= 5.0} { for {set i 0.2} {$i < 0.99} {set i [expr {$i+0.02}]} { wm attributes .t -alpha $i update idle after 20 } for {set i 0.99} {$i > 0.2} {set i [expr {$i-0.02}]} { wm attributes .t -alpha $i update idle after 20 } } } -cleanup { destroy .t } -result {} test winWm-6.7 {wm attributes -transparentcolor} -constraints win -setup { destroy .t set res {} } -body { # Expect this to return all "" on pre-2K/XP toplevel .t lappend res [wm attributes .t -transparentcolor] # we don't return on set yet lappend res [wm attributes .t -trans black] lappend res [wm attributes .t -trans] lappend res [wm attributes .t -trans "#FFFFFF"] lappend res [wm attributes .t -trans] } -cleanup { destroy .t } -result [list {} {} black {} "#FFFFFF"] test winWm-6.8 {wm attributes -transparentcolor} -constraints win -setup { destroy .t } -body { destroy .t toplevel .t wm attributes .t -tr foo } -cleanup { destroy .t } -returnCodes error -result {unknown color name "foo"} test winWm-7.1 {deiconify on an unmapped toplevel will raise \ the window and set the focus} -constraints { win } -setup { destroy .t } -body { toplevel .t lower .t focus -force . wm deiconify .t update list [wm stackorder .t isabove .] [focus] } -cleanup { destroy .t } -result {1 .t} test winWm-7.2 {deiconify on an already mapped toplevel\ will raise the window and set the focus} -constraints { win } -setup { destroy .t } -body { toplevel .t lower .t update focus -force . wm deiconify .t update list [wm stackorder .t isabove .] [focus] } -cleanup { destroy .t } -result {1 .t} test winWm-7.3 {UpdateWrapper must maintain Z order} -constraints win -setup { destroy .t } -body { destroy .t toplevel .t lower .t update set res [wm stackorder .t isbelow .] wm resizable .t 0 0 update list $res [wm stackorder .t isbelow .] } -cleanup { destroy .t } -result {1 1} test winWm-7.4 {UpdateWrapper must maintain focus} -constraints win -setup { destroy .t } -body { toplevel .t focus -force .t update set res [focus] wm resizable .t 0 0 update list $res [focus] } -cleanup { destroy .t } -result {.t .t} test winWm-8.1 {Tk_WmCmd procedure, "iconphoto" option} -constraints win -body { wm iconph . } -returnCodes error -result {wrong # args: should be "wm iconphoto window ?-default? image1 ?image2 ...?"} test winWm-8.2 {Tk_WmCmd procedure, "iconphoto" option} -constraints win -setup { destroy .t } -body { toplevel .t image create photo blank16 -width 16 -height 16 image create photo blank32 -width 32 -height 32 # This should just make blank icons for the window wm iconphoto .t blank16 blank32 image delete blank16 blank32 } -cleanup { destroy .t } -result {} test winWm-9.0 "Bug #2799589 - delayed activation of destroyed window" -constraints win -setup { proc winwm90click {w} { if {![winfo ismapped $w]} { update } event generate $w focus -force $w event generate $w -x 5 -y 5 event generate $w -x 5 -y 5 } proc winwm90proc3 {} { global winwm90done winwm90check set w .sd toplevel $w pack [button $w.b -text "OK" -command {set winwm90check 1}] bind $w.b {after idle {winwm90click %W}} update idletasks tkwait visibility $w grab $w tkwait variable winwm90check grab release $w destroy $w after idle {set winwm90done ok} } proc winwm90proc2 {w} { winwm90proc3; destroy $w } proc winwm90proc1 {w} { toplevel $w pack [button $w.b -text "Do dialog" -command [list winwm90proc2 $w]] bind $w.b {bind %W {}; after idle {winwm90click %W}} } global winwm90done set winwm90done wait toplevel .t } -body { pack [button .t.b -text "Show" -command {winwm90proc1 .tx}] bind .t.b {bind %W {}; after idle {winwm90click %W}} after 5000 {set winwm90done timeout} vwait winwm90done set winwm90done } -cleanup { foreach cmd {proc1 proc2 proc3 click} { rename winwm90$cmd {} } destroy .tx .t .sd } -result ok test winWm-9.1 "delayed activation of grabbed destroyed window" -constraints win -setup { proc winwm91click {w} { if {![winfo ismapped $w]} { update } event generate $w focus -force $w event generate $w -x 5 -y 5 event generate $w -x 5 -y 5 } proc winwm91proc3 {} { global winwm91done winwm91check set w .sd toplevel $w pack [button $w.b -text "OK" -command {set winwm91check 1}] bind $w.b {after idle {winwm91click %W}} update idletasks tkwait visibility $w grab $w tkwait variable winwm91check #skip the release: #grab release $w destroy $w after idle {set winwm91done ok} } proc winwm91proc2 {w} { winwm91proc3; destroy $w } proc winwm91proc1 {w} { toplevel $w pack [button $w.b -text "Do dialog" -command [list winwm91proc2 $w]] bind $w.b {bind %W {}; after idle {winwm91click %W}} } destroy .t global winwm91done set winwm91done wait toplevel .t } -body { pack [button .t.b -text "Show" -command {winwm91proc1 .tx}] bind .t.b {bind %W {}; after idle {winwm91click %W}} after 5000 {set winwm91done timeout} vwait winwm91done set winwm91done } -cleanup { foreach cmd {proc1 proc2 proc3 click} { rename winwm91$cmd {} } destroy .tx .t .sd } -result ok test winWm-9.2 "check wm forget for unmapped parent (#3205464,#2967911)" -constraints {failsOnUbuntu failsOnXQuarz} -setup { destroy .t toplevel .t set winwm92 {} frame .t.f -background blue -height 200 -width 200 frame .t.f.x -background red -height 100 -width 100 } -body { pack .t.f.x pack .t.f lappend aid [after 5000 {set ::winwm92 timeout}] [after 500 { wm manage .t.f wm iconify .t lappend aid [after 500 { wm forget .t.f wm deiconify .t lappend aid [after 500 { pack .t.f lappend aid [after 500 { set ::winwm92 [expr { [winfo rooty .t.f.x] == 0 ? "failed" : "ok"}]}] }] }] }] vwait ::winwm92 foreach id $aid { after cancel $id } set winwm92 } -cleanup { destroy .t.f.x .t.f .t unset -nocomplain winwm92 aid id } -result ok destroy .t # cleanup cleanupTests return # Local variables: # mode: tcl # End: