From eaa2bc5a17aaa0d49db3353dff3d73e09169394a Mon Sep 17 00:00:00 2001 From: fvogel Date: Wed, 30 Dec 2015 22:07:25 +0000 Subject: Fixed bug [1288433] - LisboxSelect event triggers when listbox state is disabled --- doc/listbox.n | 9 ++++++--- library/listbox.tcl | 36 +++++++++++++++++++++++++----------- tests/listbox.test | 24 ++++++++++++++++++++++++ 3 files changed, 55 insertions(+), 14 deletions(-) diff --git a/doc/listbox.n b/doc/listbox.n index 642e1f0..aecc8e2 100644 --- a/doc/listbox.n +++ b/doc/listbox.n @@ -431,9 +431,12 @@ Most people will probably want to use \fBbrowse\fR mode for single selections and \fBextended\fR mode for multiple selections; the other modes appear to be useful only in special situations. .PP -Any time the selection changes in the listbox, the virtual event -\fB<>\fR will be generated. It is easiest to bind -to this event to be made aware of any changes to listbox selection. +Any time the set of selected item(s) in the listbox is updated by the +user through the keyboard or mouse, the virtual event +\fB<>\fR will be generated. This virtual event will not +be generated when adjusting the selection with the \fIpathName +\fBselection\fR command. It is easiest to bind to this event to be +made aware of any user changes to listbox selection. .PP In addition to the above behavior, the following additional behavior is defined by the default bindings: diff --git a/library/listbox.tcl b/library/listbox.tcl index 2d9af20..5087786 100644 --- a/library/listbox.tcl +++ b/library/listbox.tcl @@ -118,7 +118,7 @@ bind Listbox { %W see 0 %W selection clear 0 end %W selection set 0 - event generate %W <> + tk::FireListboxSelectEvent %W } bind Listbox { tk::ListboxDataExtend %W 0 @@ -128,7 +128,7 @@ bind Listbox { %W see end %W selection clear 0 end %W selection set end - event generate %W <> + tk::FireListboxSelectEvent %W } bind Listbox { tk::ListboxDataExtend %W [%W index end] @@ -163,7 +163,7 @@ bind Listbox { bind Listbox { if {[%W cget -selectmode] ne "browse"} { %W selection clear 0 end - event generate %W <> + tk::FireListboxSelectEvent %W } } @@ -243,7 +243,7 @@ proc ::tk::ListboxBeginSelect {w el {focus 1}} { set Priv(listboxSelection) {} set Priv(listboxPrev) $el } - event generate $w <> + tk::FireListboxSelectEvent $w # check existence as ListboxSelect may destroy us if {$focus && [winfo exists $w] && [$w cget -state] eq "normal"} { focus $w @@ -271,7 +271,7 @@ proc ::tk::ListboxMotion {w el} { $w selection clear 0 end $w selection set $el set Priv(listboxPrev) $el - event generate $w <> + tk::FireListboxSelectEvent $w } extended { set i $Priv(listboxPrev) @@ -302,7 +302,7 @@ proc ::tk::ListboxMotion {w el} { incr i -1 } set Priv(listboxPrev) $el - event generate $w <> + tk::FireListboxSelectEvent $w } } } @@ -353,7 +353,7 @@ proc ::tk::ListboxBeginToggle {w el} { } else { $w selection set $el } - event generate $w <> + tk::FireListboxSelectEvent $w } } @@ -405,7 +405,7 @@ proc ::tk::ListboxUpDown {w amount} { browse { $w selection clear 0 end $w selection set active - event generate $w <> + tk::FireListboxSelectEvent $w } extended { $w selection clear 0 end @@ -413,7 +413,7 @@ proc ::tk::ListboxUpDown {w amount} { $w selection anchor active set Priv(listboxPrev) [$w index active] set Priv(listboxSelection) {} - event generate $w <> + tk::FireListboxSelectEvent $w } } } @@ -501,7 +501,7 @@ proc ::tk::ListboxCancel w { } incr first } - event generate $w <> + tk::FireListboxSelectEvent $w } # ::tk::ListboxSelectAll @@ -521,5 +521,19 @@ proc ::tk::ListboxSelectAll w { } else { $w selection set 0 end } - event generate $w <> + tk::FireListboxSelectEvent $w +} + +# ::tk::FireListboxSelectEvent +# +# Fire the <> event if the listbox is not in disabled +# state. +# +# Arguments: +# w - The listbox widget. + +proc ::tk::FireListboxSelectEvent w { + if {[$w cget -state] eq "normal"} { + event generate $w <> + } } diff --git a/tests/listbox.test b/tests/listbox.test index b4046b6..b01652b 100644 --- a/tests/listbox.test +++ b/tests/listbox.test @@ -2169,6 +2169,30 @@ test listbox-30.1 {Bug 3607326} -setup { unset -nocomplain a } -result * -match glob -returnCodes error +test listbox-31.1 {<> event} -setup { + destroy .l + unset -nocomplain res +} -body { + pack [listbox .l -state normal] + update + bind .l <> {lappend res [%W curselection]} + .l insert end a b c + focus -force .l + event generate .l <1> -x 5 -y 5 ; # <> fires + .l configure -state disabled + focus -force .l + event generate .l ; # <> does NOT fire + .l configure -state normal + focus -force .l + event generate .l ; # <> fires + .l selection clear 0 end ; # <> does NOT fire + .l selection set 1 1 ; # <> does NOT fire + lappend res [.l curselection] +} -cleanup { + destroy .l + unset -nocomplain res +} -result {0 2 1} + resetGridInfo deleteWindows option clear -- cgit v0.12