
Page 2

Page 3

Code
if {[string equal "windows" $::tcl_platform(platform)]} {console show}
proc snap2screen {W} {
    # so unmaximizing a toplevel on windows works
    if {[string equal "zoomed" [wm state $W]]} return
    # always returns the same on windows once prog is started - bug in Tk!
    set sw [winfo screenwidth $W]
    set sh [winfo screenheight $W]
 
    foreach {w h x y} [string map {x " " + " "} [winfo geometry $W]] break
 
    set sensi 40  ;# the magnetic border sensitivity
 
    set snapped 0    ;# do we need to snap the window anywhere?
 
    # Trick: Only do one of the snapping for each axis, we dont want a big
    #        window to be pulled from one side to the other... thats dumb ;)
 
    set yt  0
    set syt $y
    set yb  [expr {$sh - 54}]  ;# add some space coz of the taskbar on windows
    set syb [expr {$h + $y}]
 
    if {$syt <= ($yt + $sensi)} {
 
        puts "snapping to yt"
        set snapped 1 ; set y $yt
     
    } elseif {$syb >= ($yb - $sensi)} {
 
        puts "snapping to yb"
        set snapped 1 ; set y [expr {$yb - $h}]
     
    }
     
    set xr  [expr {$sw - 8}] ;# add some pixel padding to look nice on windows
    set sxr [expr {$w + $x}]
    set xl  0
    set sxl $x
 
    if {$sxr >= ($xr - $sensi)} {
 
        puts "snapping to xr"
        set snapped 1 ; set x [expr {$xr - $w}]
     
    } elseif {$sxl <= ($xl + $sensi)} {
 
        puts "snapping to xl"
        set snapped 1 ; set x $xl
     
    }
     
    if {$snapped} {
        # drop the configure binding for a sec so we dont get into recursive hell!
        set cscript [bind $W <Configure>]
        bind $W <Configure> {}
        wm geometry $W [join [list $w x $h + $x + $y] ""]  ;# do the snap
        update  ;# so that the window gets moved now, without this there is trouble
        bind $W <Configure> $cscript
    } else {
        puts "not snapped"
    }
 
}
bind . <Configure> {snap2screen %W}
toplevel .top
bind .top <Configure> {snap2screen %W}GPS: I like it. The only issue is the window bouncing back and forth in XP when I move to the edges. I may look into that problem tomorrow. Thanks for sharing.
Ro: Great! I've got to get WinXP and 2000 to test these things on. Thanks for your offer, I appreciate your help ;)

