diff options
author | culler <culler> | 2019-03-04 14:47:34 (GMT) |
---|---|---|
committer | culler <culler> | 2019-03-04 14:47:34 (GMT) |
commit | b3fab43c803e6cf64fd5b33e58e27d0c9b7b5936 (patch) | |
tree | 3127894724aca49c5ee0b8c41b4aee6bc9e9e101 /win/tkWinWm.c | |
parent | 5b5253e31d9f4612d08e0eca74c799c2f75b1784 (diff) | |
parent | ff204cc30af52bf00260514cc8998da8de614f5c (diff) | |
download | tk-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.c | 20 |
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 |