diff options
author | hobbs <hobbs@noemail.net> | 2001-04-03 04:41:07 (GMT) |
---|---|---|
committer | hobbs <hobbs@noemail.net> | 2001-04-03 04:41:07 (GMT) |
commit | 246405dfa7b12083dc2c309966bdfb92c9f5cd4c (patch) | |
tree | 0ee52a4755cfc619e731dbddf8f550b6ff5a1e0d /generic/tkListbox.c | |
parent | 5c21bfd464cf6d8cb114fb2fe65a8eeb8b227350 (diff) | |
download | tk-246405dfa7b12083dc2c309966bdfb92c9f5cd4c.zip tk-246405dfa7b12083dc2c309966bdfb92c9f5cd4c.tar.gz tk-246405dfa7b12083dc2c309966bdfb92c9f5cd4c.tar.bz2 |
* tests/listbox.test: added test listbox-27.1, delete during
scrollbar update
* generic/tkListbox.c (DestroyListbox, ListboxEventProc):
corrected listbox to make proper use of Tcl_EventuallyFree and
protect against unusual listbox deletion.
FossilOrigin-Name: 484b8a6cf3a4d5698be30780bbd1a6094c1394a8
Diffstat (limited to 'generic/tkListbox.c')
-rw-r--r-- | generic/tkListbox.c | 31 |
1 files changed, 17 insertions, 14 deletions
diff --git a/generic/tkListbox.c b/generic/tkListbox.c index 25e8563..6c45dfd 100644 --- a/generic/tkListbox.c +++ b/generic/tkListbox.c @@ -11,7 +11,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tkListbox.c,v 1.19 2000/11/22 01:49:38 ericm Exp $ + * RCS: @(#) $Id: tkListbox.c,v 1.20 2001/04/03 04:41:08 hobbs Exp $ */ #include "tkPort.h" @@ -1456,16 +1456,6 @@ DestroyListbox(memPtr) Tcl_HashEntry *entry; Tcl_HashSearch search; - listPtr->flags |= LISTBOX_DELETED; - - Tcl_DeleteCommandFromToken(listPtr->interp, listPtr->widgetCmd); - if (listPtr->setGrid) { - Tk_UnsetGrid(listPtr->tkwin); - } - if (listPtr->flags & REDRAW_PENDING) { - Tcl_CancelIdleCall(DisplayListbox, (ClientData) listPtr); - } - /* If we have an internal list object, free it */ if (listPtr->listObj != NULL) { Tcl_DecrRefCount(listPtr->listObj); @@ -1834,6 +1824,9 @@ DisplayListbox(clientData) Pixmap pixmap; listPtr->flags &= ~REDRAW_PENDING; + if (listPtr->flags & LISTBOX_DELETED) { + return; + } if (listPtr->flags & MAXWIDTH_IS_STALE) { ListboxComputeGeometry(listPtr, 0, 1, 0); @@ -1848,7 +1841,7 @@ DisplayListbox(clientData) ListboxUpdateHScrollbar(listPtr); } listPtr->flags &= ~(REDRAW_PENDING|UPDATE_V_SCROLLBAR|UPDATE_H_SCROLLBAR); - if ((listPtr->tkwin == NULL) || !Tk_IsMapped(tkwin)) { + if ((listPtr->flags & LISTBOX_DELETED) || (!Tk_IsMapped(tkwin))) { return; } @@ -2453,7 +2446,17 @@ ListboxEventProc(clientData, eventPtr) NearestListboxElement(listPtr, eventPtr->xexpose.y + eventPtr->xexpose.height)); } else if (eventPtr->type == DestroyNotify) { - DestroyListbox((char *) clientData); + if (!(listPtr->flags & LISTBOX_DELETED)) { + listPtr->flags |= LISTBOX_DELETED; + Tcl_DeleteCommandFromToken(listPtr->interp, listPtr->widgetCmd); + if (listPtr->setGrid) { + Tk_UnsetGrid(listPtr->tkwin); + } + if (listPtr->flags & REDRAW_PENDING) { + Tcl_CancelIdleCall(DisplayListbox, clientData); + } + Tcl_EventuallyFree(clientData, DestroyListbox); + } } else if (eventPtr->type == ConfigureNotify) { int vertSpace; @@ -3067,7 +3070,7 @@ EventuallyRedrawRange(listPtr, first, last) /* We don't have to register a redraw callback if one is already pending, * or if the window doesn't exist, or if the window isn't mapped */ if ((listPtr->flags & REDRAW_PENDING) - || (listPtr->tkwin == NULL) + || (listPtr->flags & LISTBOX_DELETED) || !Tk_IsMapped(listPtr->tkwin)) { return; } |