summaryrefslogtreecommitdiffstats
path: root/generic/tkPack.c
diff options
context:
space:
mode:
authorjan.nijtmans <nijtmans@users.sourceforge.net>2024-10-25 21:06:25 (GMT)
committerjan.nijtmans <nijtmans@users.sourceforge.net>2024-10-25 21:06:25 (GMT)
commit0d5336db012f45753abace489f18f0ca299c6961 (patch)
treeb1bf3280a9046df99226158978502eeb26f5b0a3 /generic/tkPack.c
parente97381a6d921de403516d5b761539a450f4af83c (diff)
parent1320b8a2a9c1269a345d44d673a7a35707fbbe9c (diff)
downloadtk-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.c46
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) {