+pannerproc press {b x y} {
+ if {$b != 1} return
+ set d(down_x) $x
+ set d(down_y) $y
+ set d(down_xview) [lindex [$d(canvas) xview] 0]
+ set d(down_yview) [lindex [$d(canvas) yview] 0]
+ debug $w "press down=$x,$y view=$d(down_xview),$d(down_yview)"
+}
+
+pannerproc motion {x y} {
+ if {![info exists d(down_x)]} return
+ foreach xy {x y} wh {width height} {
+ set newpos [expr {
+ ([set $xy] - $d(down_$xy)) / $d(scale) / $d(c$wh)
+ + $d(down_${xy}view)
+ }]
+ $d(canvas) ${xy}view moveto $newpos
+ lappend dl $newpos
+ }
+ debug $w "motion $x,$y [join $dl ,]"
+ redisplay $w
+}
+
+pannerproc release {x y} {
+ debug $w "release $x,$y"
+ motion $w $x $y
+ catch { unset d(down_x) }
+}
+