summaryrefslogtreecommitdiffstats
path: root/unix
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 /unix
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 'unix')
-rw-r--r--unix/tkUnixWm.c20
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