summaryrefslogtreecommitdiff
path: root/tk/generic/tkPanedWindow.c
diff options
context:
space:
mode:
Diffstat (limited to 'tk/generic/tkPanedWindow.c')
-rw-r--r--tk/generic/tkPanedWindow.c22
1 files changed, 14 insertions, 8 deletions
diff --git a/tk/generic/tkPanedWindow.c b/tk/generic/tkPanedWindow.c
index fffe111673e..f07458f4474 100644
--- a/tk/generic/tkPanedWindow.c
+++ b/tk/generic/tkPanedWindow.c
@@ -389,10 +389,16 @@ Tk_PanedWindowObjCmd(clientData, interp, objc, objv)
pwPtr->cursor = None;
pwPtr->sashCursor = None;
+ /*
+ * Keep a hold of the associated tkwin until we destroy the widget,
+ * otherwise Tk might free it while we still need it.
+ */
+
+ Tcl_Preserve((ClientData) pwPtr->tkwin);
+
if (Tk_InitOptions(interp, (char *) pwPtr, pwOpts->pwOptions,
tkwin) != TCL_OK) {
Tk_DestroyWindow(pwPtr->tkwin);
- ckfree((char *) pwPtr);
return TCL_ERROR;
}
@@ -416,11 +422,10 @@ Tk_PanedWindowObjCmd(clientData, interp, objc, objv)
pwPtr->proxywin = Tk_CreateAnonymousWindow(interp, parent, (char *) NULL);
Tk_CreateEventHandler(pwPtr->proxywin, ExposureMask, ProxyWindowEventProc,
(ClientData) pwPtr);
-
+
if (ConfigurePanedWindow(interp, pwPtr, objc - 2, objv + 2) != TCL_OK) {
- Tk_DestroyWindow(pwPtr->tkwin);
Tk_DestroyWindow(pwPtr->proxywin);
- ckfree((char *) pwPtr);
+ Tk_DestroyWindow(pwPtr->tkwin);
return TCL_ERROR;
}
@@ -1309,8 +1314,8 @@ PanedWindowCmdDeletedProc(clientData)
*/
if (!(pwPtr->flags & WIDGET_DELETED)) {
- Tk_DestroyWindow(pwPtr->tkwin);
Tk_DestroyWindow(pwPtr->proxywin);
+ Tk_DestroyWindow(pwPtr->tkwin);
}
}
@@ -1466,18 +1471,19 @@ DestroyPanedWindow(pwPtr)
if (pwPtr->slaves) {
ckfree((char *) pwPtr->slaves);
}
-
+
/*
* Remove the widget command from the interpreter.
*/
Tcl_DeleteCommandFromToken(pwPtr->interp, pwPtr->widgetCmd);
-
+
/*
* Let Tk_FreeConfigOptions clean up the rest.
*/
-
+
Tk_FreeConfigOptions((char *) pwPtr, pwPtr->optionTable, pwPtr->tkwin);
+ Tcl_Release((ClientData) pwPtr->tkwin);
pwPtr->tkwin = NULL;
Tcl_EventuallyFree((ClientData) pwPtr, TCL_DYNAMIC);