Subject: Fixed [011706ec42] for the scrollbar case.

From: fvogel <[email-masked]>
Date: Wed, 18 May 2016 10:14:33 +0000

---
 library/scrlbar.tcl  | 11 ++++++++---
 tests/scrollbar.test | 23 +++++++++++++++++++++--
 2 files changed, 29 insertions(+), 5 deletions(-)

diff --git a/library/scrlbar.tcl b/library/scrlbar.tcl
index b7be014..6f1caa2 100644
--- a/library/scrlbar.tcl
+++ b/library/scrlbar.tcl
@@ -430,6 +430,9 @@ proc ::tk::ScrollTopBottom {w x y} {
 
 proc ::tk::ScrollButton2Down {w x y} {
     variable ::tk::Priv
+    if {![winfo exists $w]} {
+        return
+    }
     set element [$w identify $x $y]
     if {[string match {arrow[12]} $element]} {
 	ScrollButtonDown $w $x $y
@@ -443,7 +446,9 @@ proc ::tk::ScrollButton2Down {w x y} {
     # slider drag.
 
     update idletasks
-    $w configure -activerelief sunken
-    $w activate slider
-    ScrollStartDrag $w $x $y
+    if {[winfo exists $w]} {
+        $w configure -activerelief sunken
+        $w activate slider
+        ScrollStartDrag $w $x $y
+    }
 }
diff --git a/tests/scrollbar.test b/tests/scrollbar.test
index 8f967ea..bd14067 100644
--- a/tests/scrollbar.test
+++ b/tests/scrollbar.test
@@ -669,8 +669,8 @@ test scrollbar-11.1 {bug fix: [011706ec42] Scrollbar unsafe wrt widget destructi
         }
     }
     toplevel .top
-    scrollbar .top.s -command destroy_scrollbar
-    bind .top.s <2> destroy_scrollbar
+    scrollbar .top.s
+    bind .top.s <2> {destroy_scrollbar}
     pack .top.s
     focus -force .top.s
     update
@@ -679,6 +679,25 @@ test scrollbar-11.1 {bug fix: [011706ec42] Scrollbar unsafe wrt widget destructi
 } -cleanup {
     destroy .top.s .top
 } -result {} 
+test scrollbar-11.2 {bug fix: [011706ec42] Scrollbar unsafe wrt widget destruction} -body {
+    proc destroy_scrollbar {{y 0}} {
+        if {[winfo exists .top.s]} {
+            destroy .top.s
+        }
+    }
+    toplevel .top
+    wm minsize .top 50 400
+    update
+    scrollbar .top.s
+    bind .top.s <2> {after idle destroy_scrollbar}
+    pack .top.s -expand true -fill y
+    focus -force .top.s
+    update
+    event generate .top.s <2> -x 2 -y [expr {[winfo height .top.s] / 2}]
+    update  ; # shall not trigger error  invalid command name ".top.s"
+} -cleanup {
+    destroy .top.s .top
+} -result {} 
 
 catch {destroy .s}
 catch {destroy .t}
-- 
cgit v0.12