diff --git a/src/g_canvas.c b/src/g_canvas.c
index 3384ece3e6fcafb9fb0dd4ade7741c8a0ed322d2..972580d067ac83070e9483fbd582b55e4fd4bb3a 100644
--- a/src/g_canvas.c
+++ b/src/g_canvas.c
@@ -875,7 +875,11 @@ void glist_menu_open(t_glist *x)
                     /* redraw ourself in parent window (blanked out this time) */
             gobj_vis(&x->gl_gobj, gl2, 1);
         }
-    }
+    } else {
+        if (x->gl_editor)
+            canvas_destroy_editor(x);
+		x->gl_havewindow = 1;
+	}
     canvas_vis(x, 1);
 }
 
@@ -987,7 +991,7 @@ void canvas_deletelinesfor(t_canvas *x, t_text *text)
     {
         if (t.tr_ob == text || t.tr_ob2 == text)
         {
-            if (x->gl_editor)
+            if (x->gl_editor && glist_isvisible(glist_getcanvas(x)))
             {
                 sys_vgui(".x%lx.c delete l%lx\n",
                     glist_getcanvas(x), oc);
diff --git a/src/g_editor.c b/src/g_editor.c
index da73d6881811b30fac9977b852f3b022a813fd39..0469067937ca02e1120ce4c8e0742d453f0f0d00 100644
--- a/src/g_editor.c
+++ b/src/g_editor.c
@@ -3455,7 +3455,14 @@ void canvas_menuclose(t_canvas *x, t_floatarg fforce)
         g = glist_finddirty(x);
         if (g)
         {
-            vmess(&g->gl_pd, gensym("menu-open"), "");
+			if (!glist_istoplevel(g) && g->gl_env) {
+				/* if this is an abstraction */
+            	vmess(&g->gl_pd, gensym("menu-open"), "");
+			} else {
+				/* is this even necessary? */
+	            canvas_vis(g, 1);
+			}
+            //vmess(&g->gl_pd, gensym("menu-open"), "");
 			if (!glist_istoplevel(g) && g->gl_env) {
 				/* if this is an abstraction */
             	sys_vgui("pdtk_canvas_menuclose .x%lx {.x%lx menuclose 2;}\n",