summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorfvogel <fvogel@noemail.net>2016-01-06 20:28:27 (GMT)
committerfvogel <fvogel@noemail.net>2016-01-06 20:28:27 (GMT)
commitf08a7a74f3df6933557e918e3cbcadf0d68fb8b8 (patch)
treee722c2cc7c734b1e6a496ddaf9548197537d28f8
parent7300c3c529d0b1dc62642a80e335378cdb03238e (diff)
parenta1a0dc67c4e4bcda5093da1df6355b46f0e40bae (diff)
downloadtk-f08a7a74f3df6933557e918e3cbcadf0d68fb8b8.zip
tk-f08a7a74f3df6933557e918e3cbcadf0d68fb8b8.tar.gz
tk-f08a7a74f3df6933557e918e3cbcadf0d68fb8b8.tar.bz2
Fixed bug [3102228] - <<ListboxSelect>> doesn't fire when selection lost
FossilOrigin-Name: 142932e332b32cce0ab37f19f13f4e3b609cf4e6
-rw-r--r--generic/tkListbox.c35
-rw-r--r--tests/listbox.test15
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 b01652b..62b8cc1 100644
--- a/tests/listbox.test
+++ b/tests/listbox.test
@@ -2193,6 +2193,21 @@ test listbox-31.1 {<<ListboxSelect>> event} -setup {
unset -nocomplain res
} -result {0 2 1}
+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