
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 ;)

