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));