From 2614228b70ca1ef60c2ae9a719eb9a78953c7f2c Mon Sep 17 00:00:00 2001
From: Ivica Ico Bukvic <ico@vt.edu>
Date: Fri, 29 Mar 2013 01:14:03 -0400
Subject: [PATCH] further improved robustness of the scrolling algorithm

---
 pd/src/pd.tk | 43 ++++++++++++++++++++++++++++++++++---------
 1 file changed, 34 insertions(+), 9 deletions(-)

diff --git a/pd/src/pd.tk b/pd/src/pd.tk
index d23a6a3c3..a2ec545b3 100644
--- a/pd/src/pd.tk
+++ b/pd/src/pd.tk
@@ -3525,6 +3525,10 @@ proc pdtk_canvas_getscroll {name} {
 					if { $y < $y1 } {set y1 $y}
 					if { $y > $y2 } {set y2 $y}
 				}
+				#set imgtags [$name gettags $item]
+				#set imgtag [lindex $imgtags 0]
+				#puts stderr $imgtag
+				#$name create rectangle $x1 $y1 $x2 $y2 -outline #ff0000 -tag debug
 			}
 
 	    }
@@ -3560,32 +3564,53 @@ proc pdtk_canvas_getscroll {name} {
 		set canvaswidth [ expr {abs($xmaxval-$xminval)} ]
 		set canvasheight [ expr {abs($ymaxval-$yminval)} ]
 
-		#puts stderr "$winwidth ? $canvaswidth   $winheight ? $canvasheight"
+		#puts stderr "BEFORE W: $winwidth ? $canvaswidth -- H: $winheight ? $canvasheight -- SC: $::xscrollable($parentname) $::yscrollable($parentname)"
 
 		if {$::scroll($parentname) == 1} {
-			if {$winwidth >= $canvaswidth || $::xscrollable($parentname) && [expr $winwidth + 14] >= $canvaswidth} {
+
+			if {($::xscrollable($parentname) && $::yscrollable($parentname)
+					&& [expr $winwidth + 14] >= $canvaswidth
+					&& [expr $winheight + 14] >= $canvasheight)} {
+				#puts stderr "TRYING TO ADJUST WIDTH & HEIGHT"
 				pack forget $parentname.scrollhort
 				set ::xscrollable($parentname) 0
-				set winwidth [winfo width $parentname.c]
-				set winheight [winfo height $parentname.c]
+				pack forget $parentname.scrollvert
+				set ::yscrollable($parentname) 0
+				set winwidth [expr {$winwidth + 14}]
+				set winheight [expr {$winheight + 14}]
 			}
-			if {$winheight >= $canvasheight || $::yscrollable($parentname) && [expr $winheight + 14] >= $canvasheight} {
+
+			if {$winwidth >= $canvaswidth && $::xscrollable($parentname)} {
+				#puts stderr "NO HORIZONTAL NECESSARY"
+				pack forget $parentname.scrollhort
+				set ::xscrollable($parentname) 0
+				set winheight [expr {$winheight + 14}]
+			}
+
+			if {$winheight >= $canvasheight && $::yscrollable($parentname)} {
+				#puts stderr "NO VERTICAL NECESSARY"
 				pack forget $parentname.scrollvert
 				set ::yscrollable($parentname) 0
-				set winwidth [winfo width $parentname.c]
-				set winheight [winfo height $parentname.c]
+				set winwidth [expr {$winwidth + 14}]
 			}
-			if {$winwidth < $canvaswidth} {
+
+			#puts stderr "AFTER W: $winwidth ? $canvaswidth -- H: $winheight ? $canvasheight -- SC: $::xscrollable($parentname) $::yscrollable($parentname)"
+
+			if {$winwidth < $canvaswidth && $::xscrollable($parentname) == 0} {
+				#puts stderr "PUTTING HORIZONTAL"
 				pack $parentname.scrollhort -fill x \
 					-side bottom -before $parentname.c
 				set ::xscrollable($parentname) 1
 			}
-			if {$winheight < $canvasheight} {
+			if {$winheight < $canvasheight && $::yscrollable($parentname) == 0} {
+				#puts stderr "PUTTING VERTICAL"
 				pack $parentname.scrollvert -fill y \
 					-side right -before $parentname.c
 				set ::yscrollable($parentname) 1
 			}
 		}
+
+		#puts stderr "========================\n\n"
 	
 		if {$pdtk_canvas_mouseup_name != $name || \
 				$pdtk_canvas_mouseup_xminval != $xminval || \
-- 
GitLab