From 36599c461c93a17d46a4267a38e8b66f44eca8e3 Mon Sep 17 00:00:00 2001
From: Ivica Ico Bukvic <ico@vt.edu>
Date: Sat, 13 Apr 2013 13:53:24 -0400
Subject: [PATCH] made drag scrolling less cpu hungry and easier to control

---
 pd/src/pd.tk | 38 +++++++++++++++++++++++++++++++++++++-
 1 file changed, 37 insertions(+), 1 deletion(-)

diff --git a/pd/src/pd.tk b/pd/src/pd.tk
index a2fef4eab..47b4f3c45 100644
--- a/pd/src/pd.tk
+++ b/pd/src/pd.tk
@@ -2229,13 +2229,15 @@ proc pdtk_canvas_new {name width height geometry editable} {
 	if {![info exists ::update_tick($name)]} {
 		set ::update_tick($name) 0
 	}
+	if {![info exists ::drag_tick($name)]} {
+		set ::drag_tick($name) 0
+	}
 	if {![info exists ::undo($name)]} {
 		set ::undo($name) no
 	}
 	if {![info exists ::redo($name)]} {
 		set ::redo($name) no
 	}
-
 	if {![info exists ::font($name)]} {
 		set ::font($name) 10
 	}
@@ -3442,6 +3444,7 @@ proc pdtk_select_all_gop_widgets {name gop state} {
 	}
 }
 
+# currently unused
 proc pdtk_canvas_getscroll_configure {canvas} {
 	set window [string trimright $canvas .c]
 	if {$::scroll($window)} {
@@ -3931,7 +3934,38 @@ proc pdtk_canvas_scroll {canvas xy distance} {
 	}
 }
 
+proc pdtk_check_scroll_on_motion_ping {name} {
+	set wname [string trimright $name .c]
+	if {![winfo exists $wname]} {
+		set ::drag_tick($wname) 0
+		return
+	}
+	if {$::drag_tick($wname) == 2} {
+		set ::drag_tick($wname) 3	
+		pdtk_check_scroll_on_motion $name 0
+	}
+	after 50 [list pdtk_check_scroll_on_motion_ping $name]
+}
+
 proc pdtk_check_scroll_on_motion {w threshold} {
+    # kludge since this gets called sometimes after a canvas is destroyed
+    if {![winfo exists $w]} {return}
+
+	# waiting for refresh
+	if {$::drag_tick([winfo parent $w]) == 2} {return}
+
+	# init
+	if {$::drag_tick([winfo parent $w]) == 0} {
+	 	set ::drag_tick([winfo parent $w]) 1
+		pdtk_check_scroll_on_motion_ping $w	
+	}
+
+	# update
+	if {$::drag_tick([winfo parent $w]) == 1} {
+		set ::drag_tick([winfo parent $w]) 2
+		return
+	}
+
 	set x1 [$w canvasx 0]
 	set x2 [expr [$w canvasx 0] + [winfo width $w]]
 	set y1 [$w canvasy 0]
@@ -3957,6 +3991,8 @@ proc pdtk_check_scroll_on_motion {w threshold} {
 			pdtk_canvas_scroll $w y -1
 		}
 	}
+
+	set ::drag_tick([winfo parent $w]) 1
 }
 
 proc pdtk_canvas_motion {name x y mods} {
-- 
GitLab