Tk Source Code

Artifact [c134104f]
Login

Artifact c134104fd6672c1df032e08ae29c869bb9b6d28976b429e83389b70fb22a15db:

Attachment "menucascade.diff" to ticket [7f67bb40] added by emiliano 2026-01-16 20:23:57.
Index: generic/tkMenu.c
==================================================================
--- generic/tkMenu.c
+++ generic/tkMenu.c
@@ -935,10 +935,38 @@
 	    goto error;
 	}
 	if ((index < 0) || (menuPtr->entries[index]->type != CASCADE_ENTRY)) {
 	    result = TkPostSubmenu(interp, menuPtr, NULL);
 	} else {
+	    const char *menuName = Tcl_GetString(objv[0]);
+	    const char *submenuName;
+	    Tcl_Obj *namePtr = menuPtr->entries[index]->namePtr;
+	    Tk_Window submenuWin;
+
+	    if (! namePtr) {
+		/* there's no "-menu" option set; return */
+		return TCL_OK;
+	    }
+
+	    submenuName = Tcl_GetString(namePtr);
+	    submenuWin = Tk_NameToWindow(NULL, submenuName, menuPtr->tkwin);
+
+	    if (! submenuWin) {
+		Tcl_SetObjResult(interp, Tcl_ObjPrintf(
+			"unknown cascade menu \"%s\"", submenuName));
+		Tcl_SetErrorCode(interp, "TK", "MENU", "CASCADE", "UNKNOWN",
+			menuName, NULL);
+		return TCL_ERROR;
+	    }
+	    if (Tk_Parent(submenuWin) != menuPtr->tkwin) {
+		Tcl_SetObjResult(interp, Tcl_ObjPrintf(
+			"cascade menu \"%s\" is not a child of \"%s\"",
+			 submenuName, menuName));
+		Tcl_SetErrorCode(interp, "TK", "MENU", "CASCADE", "NOCHILD",
+			menuName, NULL);
+		return TCL_ERROR;
+	    }
 	    result = TkPostSubmenu(interp, menuPtr, menuPtr->entries[index]);
 	}
 	break;
     }
     case MENU_TYPE: {