diff options
| author | jan.nijtmans <nijtmans@users.sourceforge.net> | 2024-10-25 21:06:25 (GMT) |
|---|---|---|
| committer | jan.nijtmans <nijtmans@users.sourceforge.net> | 2024-10-25 21:06:25 (GMT) |
| commit | 0d5336db012f45753abace489f18f0ca299c6961 (patch) | |
| tree | b1bf3280a9046df99226158978502eeb26f5b0a3 /generic/tkPack.c | |
| parent | e97381a6d921de403516d5b761539a450f4af83c (diff) | |
| parent | 1320b8a2a9c1269a345d44d673a7a35707fbbe9c (diff) | |
| download | tk-core-tip-626.zip tk-core-tip-626.tar.gz tk-core-tip-626.tar.bz2 | |
Merge 9.0core-tip-626
Diffstat (limited to 'generic/tkPack.c')
| -rw-r--r-- | generic/tkPack.c | 46 |
1 files changed, 35 insertions, 11 deletions
diff --git a/generic/tkPack.c b/generic/tkPack.c index 727e37a..63e03a3 100644 --- a/generic/tkPack.c +++ b/generic/tkPack.c @@ -246,7 +246,9 @@ Tk_PackObjCmd( if (TkGetWindowFromObj(interp, tkwin, objv[i], &content) != TCL_OK) { continue; } - contentPtr = GetPacker(content); + if (!(contentPtr = GetPacker(content))) { + continue; + } if ((contentPtr != NULL) && (contentPtr->containerPtr != NULL)) { Tk_ManageGeometry(content, NULL, NULL); if (contentPtr->containerPtr->tkwin != Tk_Parent(contentPtr->tkwin)) { @@ -271,7 +273,9 @@ Tk_PackObjCmd( if (TkGetWindowFromObj(interp, tkwin, objv[2], &content) != TCL_OK) { return TCL_ERROR; } - contentPtr = GetPacker(content); + if (!(contentPtr = GetPacker(content))) { + return TCL_OK; + } if (contentPtr->containerPtr == NULL) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "window \"%s\" isn't packed", argv2)); @@ -325,7 +329,9 @@ Tk_PackObjCmd( if (TkGetWindowFromObj(interp, tkwin, objv[2], &container) != TCL_OK) { return TCL_ERROR; } - containerPtr = GetPacker(container); + if (!(containerPtr = GetPacker(container))) { + return TCL_OK; + } if (objc == 3) { Tcl_SetObjResult(interp, Tcl_NewBooleanObj(!(containerPtr->flags & DONT_PROPAGATE))); @@ -382,7 +388,9 @@ Tk_PackObjCmd( return TCL_ERROR; } resultObj = Tcl_NewObj(); - containerPtr = GetPacker(container); + if (!(containerPtr = GetPacker(container))) { + return TCL_OK; + } for (contentPtr = containerPtr->contentPtr; contentPtr != NULL; contentPtr = contentPtr->nextPtr) { Tcl_ListObjAppendElement(NULL, resultObj, @@ -919,11 +927,12 @@ YExpansion( * GetPacker -- * * This internal function is used to locate a Packer structure for a - * given window, creating one if one doesn't exist already. + * window, creating one if one doesn't exist already, except if the window + * is already dead. * * Results: * The return value is a pointer to the Packer structure corresponding to - * tkwin. + * tkwin, or NULL when tkwin is already dead. * * Side effects: * A new packer structure may be created. If so, then a callback is set @@ -942,6 +951,10 @@ GetPacker( int isNew; TkDisplay *dispPtr = ((TkWindow *) tkwin)->dispPtr; + if (((TkWindow *) tkwin)->flags & TK_ALREADY_DEAD) { + return NULL; + } + if (!dispPtr->packInit) { dispPtr->packInit = 1; Tcl_InitHashTable(&dispPtr->packerHashTable, TCL_ONE_WORD_KEYS); @@ -1247,7 +1260,10 @@ ConfigureContent( Tcl_SetErrorCode(interp, "TK", "GEOMETRY", "TOPLEVEL", NULL); return TCL_ERROR; } - contentPtr = GetPacker(content); + if (!(contentPtr = GetPacker(content))) { + continue; + } + contentPtr->flags &= ~OLD_STYLE; /* @@ -1285,7 +1301,9 @@ ConfigureContent( != TCL_OK) { return TCL_ERROR; } - prevPtr = GetPacker(other); + if (!(prevPtr = GetPacker(other))) { + continue; + } if (prevPtr->containerPtr == NULL) { notPacked: Tcl_SetObjResult(interp, Tcl_ObjPrintf( @@ -1311,7 +1329,9 @@ ConfigureContent( != TCL_OK) { return TCL_ERROR; } - otherPtr = GetPacker(other); + if (!(otherPtr = GetPacker(other))) { + continue; + } if (otherPtr->containerPtr == NULL) { goto notPacked; } @@ -1360,7 +1380,9 @@ ConfigureContent( != TCL_OK) { return TCL_ERROR; } - containerPtr = GetPacker(other); + if (!(containerPtr = GetPacker(other))) { + continue; + } prevPtr = containerPtr->contentPtr; if (prevPtr != NULL) { while (prevPtr->nextPtr != NULL) { @@ -1443,7 +1465,9 @@ ConfigureContent( */ if (!positionGiven) { - containerPtr = GetPacker(Tk_Parent(content)); + if (!(containerPtr = GetPacker(Tk_Parent(content)))) { + continue; + } prevPtr = containerPtr->contentPtr; if (prevPtr != NULL) { while (prevPtr->nextPtr != NULL) { |
