summaryrefslogtreecommitdiffstats
path: root/win/tkWinWm.c
diff options
context:
space:
mode:
authorculler <culler>2019-03-04 14:47:34 (GMT)
committerculler <culler>2019-03-04 14:47:34 (GMT)
commitb3fab43c803e6cf64fd5b33e58e27d0c9b7b5936 (patch)
tree3127894724aca49c5ee0b8c41b4aee6bc9e9e101 /win/tkWinWm.c
parent5b5253e31d9f4612d08e0eca74c799c2f75b1784 (diff)
parentff204cc30af52bf00260514cc8998da8de614f5c (diff)
downloadtk-b3fab43c803e6cf64fd5b33e58e27d0c9b7b5936.zip
tk-b3fab43c803e6cf64fd5b33e58e27d0c9b7b5936.tar.gz
tk-b3fab43c803e6cf64fd5b33e58e27d0c9b7b5936.tar.bz2
Disallow transient/master cycles. Fix bgerror for Aqua to avoid hangs when an error occurs in an idle task run by [NSView drawRect].
Diffstat (limited to 'win/tkWinWm.c')
-rw-r--r--win/tkWinWm.c20
1 files changed, 12 insertions, 8 deletions
diff --git a/win/tkWinWm.c b/win/tkWinWm.c
index f842a08..4d8a952 100644
--- a/win/tkWinWm.c
+++ b/win/tkWinWm.c
@@ -5526,7 +5526,7 @@ WmTransientCmd(
Tcl_Obj *const objv[]) /* Argument objects. */
{
register WmInfo *wmPtr = winPtr->wmInfoPtr;
- TkWindow *masterPtr = wmPtr->masterPtr, **masterPtrPtr = &masterPtr;
+ TkWindow *masterPtr = wmPtr->masterPtr, **masterPtrPtr = &masterPtr, *w;
WmInfo *wmPtr2;
if ((objc != 3) && (objc != 4)) {
@@ -5584,13 +5584,17 @@ WmTransientCmd(
Tcl_SetErrorCode(interp, "TK", "WM", "TRANSIENT", "ICON", NULL);
return TCL_ERROR;
}
-
- if (masterPtr == winPtr) {
- Tcl_SetObjResult(interp, Tcl_ObjPrintf(
- "can't make \"%s\" its own master", Tk_PathName(winPtr)));
- Tcl_SetErrorCode(interp, "TK", "WM", "TRANSIENT", "SELF", NULL);
- return TCL_ERROR;
- } else if (masterPtr != wmPtr->masterPtr) {
+ for (w = masterPtr; w != NULL && w->wmInfoPtr != NULL;
+ w = (TkWindow *)w->wmInfoPtr->masterPtr) {
+ if (w == winPtr) {
+ Tcl_SetObjResult(interp, Tcl_ObjPrintf(
+ "setting \"%s\" as master creates a transient/master cycle",
+ Tk_PathName(masterPtr)));
+ Tcl_SetErrorCode(interp, "TK", "WM", "TRANSIENT", "SELF", NULL);
+ return TCL_ERROR;
+ }
+ }
+ if (masterPtr != wmPtr->masterPtr) {
/*
* Remove old master map/unmap binding before setting the new
* master. The event handler will ensure that transient states