diff options
author | fvogel <fvogelnew1@free.fr> | 2015-12-31 13:50:50 (GMT) |
---|---|---|
committer | fvogel <fvogelnew1@free.fr> | 2015-12-31 13:50:50 (GMT) |
commit | 13cdecd256069109fe277a62a153cb31b3a1348b (patch) | |
tree | c3d33b35e54683ce7bd8b5465f49e120b057b53f | |
parent | 1a7d3ba3cabd12bbfac8cf8a06c1cc2b755ce3dc (diff) | |
download | tk-13cdecd256069109fe277a62a153cb31b3a1348b.zip tk-13cdecd256069109fe277a62a153cb31b3a1348b.tar.gz tk-13cdecd256069109fe277a62a153cb31b3a1348b.tar.bz2 |
Fixed bug [3102228] - <<ListboxSelect>> doesn't fire when selection lostbug_3102228fff
-rw-r--r-- | generic/tkListbox.c | 35 | ||||
-rw-r--r-- | tests/listbox.test | 15 |
2 files changed, 50 insertions, 0 deletions
diff --git a/generic/tkListbox.c b/generic/tkListbox.c index 248dd7b..ff72596 100644 --- a/generic/tkListbox.c +++ b/generic/tkListbox.c @@ -401,6 +401,7 @@ static void ListboxEventProc(ClientData clientData, static int ListboxFetchSelection(ClientData clientData, int offset, char *buffer, int maxBytes); static void ListboxLostSelection(ClientData clientData); +static void GenerateListboxSelectEvent(Listbox *listPtr); static void EventuallyRedrawRange(Listbox *listPtr, int first, int last); static void ListboxScanTo(Listbox *listPtr, int x, int y); @@ -3177,12 +3178,46 @@ ListboxLostSelection( if ((listPtr->exportSelection) && (listPtr->nElements > 0)) { ListboxSelect(listPtr, 0, listPtr->nElements-1, 0); + GenerateListboxSelectEvent(listPtr); } } /* *---------------------------------------------------------------------- * + * GenerateListboxSelectEvent -- + * + * Send an event that the listbox selection was updated. This is + * equivalent to event generate $listboxWidget <<ListboxSelect>> + * + * Results: + * None + * + * Side effects: + * Any side effect possible, depending on bindings to this event. + * + *---------------------------------------------------------------------- + */ + +static void +GenerateListboxSelectEvent( + Listbox *listPtr) /* Information about widget. */ +{ + union {XEvent general; XVirtualEvent virtual;} event; + + memset(&event, 0, sizeof(event)); + event.general.xany.type = VirtualEvent; + event.general.xany.serial = NextRequest(Tk_Display(listPtr->tkwin)); + event.general.xany.send_event = False; + event.general.xany.window = Tk_WindowId(listPtr->tkwin); + event.general.xany.display = Tk_Display(listPtr->tkwin); + event.virtual.name = Tk_GetUid("ListboxSelect"); + Tk_HandleEvent(&event.general); +} + +/* + *---------------------------------------------------------------------- + * * EventuallyRedrawRange -- * * Ensure that a given range of elements is eventually redrawn on the diff --git a/tests/listbox.test b/tests/listbox.test index b4046b6..7952abd 100644 --- a/tests/listbox.test +++ b/tests/listbox.test @@ -2169,6 +2169,21 @@ test listbox-30.1 {Bug 3607326} -setup { unset -nocomplain a } -result * -match glob -returnCodes error +test listbox-31.2 {<<ListboxSelect>> event on lost selection} -setup { + destroy .l +} -body { + pack [listbox .l -exportselection true] + update + bind .l <<ListboxSelect>> {lappend res [list [selection own] [%W curselection]]} + .l insert end a b c + focus -force .l + event generate .l <1> -x 5 -y 5 ; # <<ListboxSelect>> fires + selection clear ; # <<ListboxSelect>> fires again + set res +} -cleanup { + destroy .l +} -result {{.l 0} {{} {}}} + resetGridInfo deleteWindows option clear |