Subject: Fixed bug [2981253] - spinbox button frozen in case of repeated depressions (cherrypicked [5fe2f5839e])

From: fvogel <[email-masked]>
Date: Mon, 7 Mar 2016 20:54:20 +0000

---
 library/spinbox.tcl | 46 ++++++++++++++++++++++++++++++++--------------
 1 file changed, 32 insertions(+), 14 deletions(-)

diff --git a/library/spinbox.tcl b/library/spinbox.tcl
index fecf7d6..1965ed8 100644
--- a/library/spinbox.tcl
+++ b/library/spinbox.tcl
@@ -86,10 +86,12 @@ bind Spinbox <B1-Motion> {
     ::tk::spinbox::Motion %W %x %y
 }
 bind Spinbox <Double-1> {
+    ::tk::spinbox::ArrowPress %W %x %y
     set tk::Priv(selectMode) word
     ::tk::spinbox::MouseSelect %W %x sel.first
 }
 bind Spinbox <Triple-1> {
+    ::tk::spinbox::ArrowPress %W %x %y
     set tk::Priv(selectMode) line
     ::tk::spinbox::MouseSelect %W %x 0
 }
@@ -332,6 +334,35 @@ proc ::tk::spinbox::ClosestGap {w x} {
     incr pos
 }
 
+# ::tk::spinbox::ArrowPress --
+# This procedure is invoked to handle button-1 presses in buttonup
+# or buttondown elements of spinbox widgets.
+#
+# Arguments:
+# w -		The spinbox window in which the button was pressed.
+# x -		The x-coordinate of the button press.
+# y -		The y-coordinate of the button press.
+
+proc ::tk::spinbox::ArrowPress {w x y} {
+    variable ::tk::Priv
+
+    if {[$w cget -state] ne "disabled" && \
+            [string match "button*" $Priv(element)]} {
+        $w selection element $Priv(element)
+        set Priv(repeated) 0
+        set Priv(relief) [$w cget -$Priv(element)relief]
+        catch {after cancel $Priv(afterId)}
+        set delay [$w cget -repeatdelay]
+        if {$delay > 0} {
+            set Priv(afterId) [after $delay \
+                    [list ::tk::spinbox::Invoke $w $Priv(element)]]
+        }
+        if {[info exists Priv(outsideElement)]} {
+            unset Priv(outsideElement)
+        }
+    }
+}
+
 # ::tk::spinbox::ButtonDown --
 # This procedure is invoked to handle button-1 presses in spinbox
 # widgets.  It moves the insertion cursor, sets the selection anchor,
@@ -355,20 +386,7 @@ proc ::tk::spinbox::ButtonDown {w x y} {
 
     switch -exact $Priv(element) {
 	"buttonup" - "buttondown" {
-	    if {"disabled" ne [$w cget -state]} {
-		$w selection element $Priv(element)
-		set Priv(repeated) 0
-		set Priv(relief) [$w cget -$Priv(element)relief]
-		catch {after cancel $Priv(afterId)}
-		set delay [$w cget -repeatdelay]
-		if {$delay > 0} {
-		    set Priv(afterId) [after $delay \
-			    [list ::tk::spinbox::Invoke $w $Priv(element)]]
-		}
-		if {[info exists Priv(outsideElement)]} {
-		    unset Priv(outsideElement)
-		}
-	    }
+	    ::tk::spinbox::ArrowPress $w $x $y
 	}
 	"entry" {
 	    set Priv(selectMode) char
-- 
cgit v0.12