Subject: Experiment: can it be done without a busy wait as well? Not tested on all platforms yet, feedback appreciated!

From: "jan.nijtmans" <[email-masked]>
Date: Sat, 30 Apr 2016 15:50:35 +0000

---
 library/button.tcl | 21 +++++++++++++++------
 1 file changed, 15 insertions(+), 6 deletions(-)

diff --git a/library/button.tcl b/library/button.tcl
index 16624e7..469a9a8 100644
--- a/library/button.tcl
+++ b/library/button.tcl
@@ -589,6 +589,20 @@ proc ::tk::ButtonUp w {
 # Shared routines
 ##################
 
+# ::tk::ButtonInvokeEnd --
+# The procedure below is called after a button is invoked through
+# the keyboard.  It simulate a release of the button via the mouse.
+#
+# Arguments:
+# w -		The name of the widget.
+
+proc ::tk::ButtonInvokeEnd {w oldState oldRelief} {
+    if {[winfo exists $w]} {
+	$w configure -state $oldState -relief $oldRelief
+	uplevel #0 [list $w invoke]
+    }
+}
+
 # ::tk::ButtonInvoke --
 # The procedure below is called when a button is invoked through
 # the keyboard.  It simulate a press of the button via the mouse.
@@ -601,12 +615,7 @@ proc ::tk::ButtonInvoke w {
 	set oldRelief [$w cget -relief]
 	set oldState [$w cget -state]
 	$w configure -state active -relief sunken
-	update idletasks
-	after 100
-        if {[winfo exists $w]} {
-            $w configure -state $oldState -relief $oldRelief
-            uplevel #0 [list $w invoke]
-        }
+	after 100 [list ::tk::ButtonInvokeEnd $w $oldState $oldRelief]
     }
 }
 
-- 
cgit v0.12