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 /unix | |
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 'unix')
-rw-r--r-- | unix/tkUnixWm.c | 20 |
1 files changed, 13 insertions, 7 deletions
diff --git a/unix/tkUnixWm.c b/unix/tkUnixWm.c index cb821d9..f548bcd 100644 --- a/unix/tkUnixWm.c +++ b/unix/tkUnixWm.c @@ -3520,7 +3520,7 @@ WmTransientCmd( Tcl_Obj *const objv[]) /* Argument objects. */ { register WmInfo *wmPtr = winPtr->wmInfoPtr; - TkWindow *masterPtr = wmPtr->masterPtr; + TkWindow *masterPtr = wmPtr->masterPtr, *w; WmInfo *wmPtr2; if ((objc != 3) && (objc != 4)) { @@ -3589,12 +3589,18 @@ WmTransientCmd( 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 |