Tk Source Code

Artifact [b97a278e]
Login

Artifact b97a278edfa7d0e646605949992b0c050a2083fe0556974ca075d2f3345be1ab:

Attachment "wmforget.diff" to ticket [c77b426d] added by emiliano 2026-01-22 00:00:30.
Index: macosx/tkMacOSXWm.c
==================================================================
--- macosx/tkMacOSXWm.c
+++ macosx/tkMacOSXWm.c
@@ -2567,11 +2567,11 @@
     TCL_UNUSED(Tcl_Size),			/* Number of arguments. */
     TCL_UNUSED(Tcl_Obj *const *))	/* Argument objects. */
 {
     Tk_Window frameWin = (Tk_Window)winPtr;
 
-    if (Tk_IsTopLevel(frameWin)) {
+    if (Tk_IsTopLevel(frameWin) && Tk_IsManageable(frameWin)) {
 	MacDrawable *macWin;
 
 	Tk_MakeWindowExist(frameWin);
 	Tk_MakeWindowExist((Tk_Window)winPtr->parentPtr);
 

Index: tests/wm.test
==================================================================
--- tests/wm.test
+++ tests/wm.test
@@ -2606,10 +2606,25 @@
     lappend res [winfo manager .f]
 } -cleanup {
     destroy .l .f.b .f
     unset res
 } -result {pack {} wm {}}
+test wm-forget-2.1 {bug [c77b426dc9] - panic with [menu]+[wm forget]} -setup {
+    catch {destroy .l .f.b .f}
+    set res {}
+} -body {
+    menu .m
+    .m post 100 100
+    update
+    lappend res [winfo ismapped .m]
+    wm forget .m
+    update
+    lappend res [winfo ismapped .m]
+} -cleanup {
+    destroy .m
+    unset res
+} -result {1 1}
 
 #
 # TESTFILE CLEANUP
 #
 

Index: unix/tkUnixWm.c
==================================================================
--- unix/tkUnixWm.c
+++ unix/tkUnixWm.c
@@ -1819,11 +1819,11 @@
     TCL_UNUSED(Tcl_Size),			/* Number of arguments. */
     TCL_UNUSED(Tcl_Obj *const *))	/* Argument objects. */
 {
     Tk_Window frameWin = (Tk_Window) winPtr;
 
-    if (Tk_IsTopLevel(frameWin)) {
+    if (Tk_IsTopLevel(frameWin) && Tk_IsManageable(frameWin)) {
 	TkFocusJoin(winPtr);
 	Tk_UnmapWindow(frameWin);
 	TkWmDeadWindow(winPtr);
 	winPtr->flags &=
 		~(TK_TOP_HIERARCHY|TK_TOP_LEVEL|TK_HAS_WRAPPER|TK_WIN_MANAGED);

Index: win/tkWinWm.c
==================================================================
--- win/tkWinWm.c
+++ win/tkWinWm.c
@@ -3617,11 +3617,11 @@
     TCL_UNUSED(Tcl_Size),		/* Number of arguments. */
     TCL_UNUSED(Tcl_Obj *const *))	/* Argument objects. */
 {
     Tk_Window frameWin = (Tk_Window) winPtr;
 
-    if (Tk_IsTopLevel(frameWin)) {
+    if (Tk_IsTopLevel(frameWin) && Tk_IsManageable(frameWin)) {
 	Tk_UnmapWindow(frameWin);
 	winPtr->flags &= ~(TK_TOP_HIERARCHY|TK_TOP_LEVEL|TK_HAS_WRAPPER|TK_WIN_MANAGED);
 	Tk_MakeWindowExist((Tk_Window)winPtr->parentPtr);
 	RemapWindows(winPtr, Tk_GetHWND(winPtr->parentPtr->window));