diff options
author | culler <culler> | 2019-03-01 15:46:38 (GMT) |
---|---|---|
committer | culler <culler> | 2019-03-01 15:46:38 (GMT) |
commit | ec1cf983bd80cc43701c88134d9bd94131e6100f (patch) | |
tree | fecd0eba4210b352d34a3d95b5bfbed2369f3583 /unix/tkUnixWm.c | |
parent | 403f01fa032b477c866cb88915f0604d9d9d0dac (diff) | |
download | tk-ec1cf983bd80cc43701c88134d9bd94131e6100f.zip tk-ec1cf983bd80cc43701c88134d9bd94131e6100f.tar.gz tk-ec1cf983bd80cc43701c88134d9bd94131e6100f.tar.bz2 |
Make it be an error to create a transient/master cycle on unix.
Diffstat (limited to 'unix/tkUnixWm.c')
-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 8944ecc..9ed9082 100644 --- a/unix/tkUnixWm.c +++ b/unix/tkUnixWm.c @@ -3524,7 +3524,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)) { @@ -3593,12 +3593,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 |