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: {