diff --git a/pd/nw/pdgui.js b/pd/nw/pdgui.js
index 607b28e7925b80ae9d484b469c564f1f529906b6..4367166d373b3bdac0fb6192dcbd5d71ba61ba77 100644
--- a/pd/nw/pdgui.js
+++ b/pd/nw/pdgui.js
@@ -1427,10 +1427,13 @@ function canvas_map(name) {
 }
 
 function gui_canvas_erase_all_gobjs(cid) {
-    var svg_elem = get_item(cid, "patchsvg"),
+    var svg_elem,
         elem;
-    while (elem = svg_elem.firstChild) {
-        svg_elem.removeChild(elem);
+    if (patchwin[cid]) {
+        svg_elem = get_item(cid, "patchsvg");
+        while (elem = svg_elem.firstChild) {
+            svg_elem.removeChild(elem);
+        }
     }
 }
 
@@ -1807,43 +1810,53 @@ function add_gobj_to_svg(svg, gobj) {
 // creation, in which case a flag to toggle the offset would be appropriate.
 
 function gui_gobj_new(cid, tag, type, xpos, ypos, is_toplevel) {
-    var svg = get_item(cid, "patchsvg"), // id for the svg element
+    var svg,
         g,
         transform_string;
-    xpos += 0.5;
-    ypos += 0.5;
-    transform_string = "matrix(1,0,0,1," + xpos + "," + ypos + ")",
-    g = create_item(cid, "g", {
+    if (patchwin[cid]) {
+        svg = get_item(cid, "patchsvg"), // id for the svg element
+        xpos += 0.5;
+        ypos += 0.5;
+        transform_string = "matrix(1,0,0,1," + xpos + "," + ypos + ")",
+        g = create_item(cid, "g", {
             id: tag + "gobj",
             transform: transform_string,
             class: type + (is_toplevel !== 0 ? "" : " gop")
-    });
-    add_gobj_to_svg(svg, g);
-    // hm... why returning g and not the return value of appendChild?
-    return g;
+        });
+        add_gobj_to_svg(svg, g);
+        // hm... why returning g and not the return value of appendChild?
+        return g;
+    }
 }
 
 function gui_text_draw_border(cid, tag, bgcolor, isbroken, x1, y1, x2, y2) {
-    var g = get_gobj(cid, tag),
+    var g,
         rect;
-    // isbroken means either
-    //     a) the object couldn't create or
-    //     b) the box is empty
-    rect = create_item(cid, "rect", {
-        width: x2 - x1,
-        height: y2 - y1,
-        //"shape-rendering": "crispEdges",
-        class: "border"
-    });
-    if (isbroken === 1) {
-        rect.classList.add("broken_border");
+    if (patchwin[cid]) {
+        g = get_gobj(cid, tag),
+        // isbroken means either
+        //     a) the object couldn't create or
+        //     b) the box is empty
+        rect = create_item(cid, "rect", {
+            width: x2 - x1,
+            height: y2 - y1,
+            //"shape-rendering": "crispEdges",
+            class: "border"
+        });
+        if (isbroken === 1) {
+            rect.classList.add("broken_border");
+        }
+        g.appendChild(rect);
     }
-    g.appendChild(rect);
 }
 
 function gui_gobj_draw_io(cid, parenttag, tag, x1, y1, x2, y2, basex, basey,
     type, i, is_signal, is_iemgui) {
-    var xlet_class, xlet_id, rect, g = get_gobj(cid, parenttag);
+    var xlet_class, xlet_id, rect, g;
+    if (!patchwin[cid]) {
+        return;
+    }
+    g = get_gobj(cid, parenttag);
     if (is_iemgui) {
         xlet_class = "xlet_iemgui";
         // We have an inconsistency here.  We're setting the tag using
@@ -1933,8 +1946,12 @@ function message_border_points(width, height) {
 }
 
 function gui_message_draw_border(cid, tag, width, height) {
-    var g = get_gobj(cid, tag),
+    var g,
         polygon;
+    if (!patchwin[cid]) {
+        return;
+    }
+    g = get_gobj(cid, tag);
     polygon = create_item(cid, "polygon", {
         points: message_border_points(width, height),
         fill: "none",
@@ -2225,8 +2242,12 @@ function gobj_font_y_kludge(fontsize) {
 
 function gui_text_new(canvasname, myname, type, isselected, left_margin, font_height, text, font) {
     var lines, i, len, tspan,
-        g = get_gobj(canvasname, myname),
+        g,
         svg_text;
+    if (!patchwin[canvasname]) {
+        return;
+    }
+    g = get_gobj(canvasname, myname),
     svg_text = create_item(canvasname, "text", {
         // Maybe it's just me, but the svg spec's explanation of how
         // text x/y and tspan x/y interact is difficult to understand.
@@ -2444,8 +2465,12 @@ function gui_canvas_hide_selection(cid) {
 // iemguis
 
 function gui_bng_new(cid, tag, cx, cy, radius) {
-    var g = get_gobj(cid, tag),
-        circle = create_item(cid, "circle", {
+    var g, circle;
+    if (!patchwin[cid]) {
+        return;
+    }
+    g = get_gobj(cid, tag);
+    circle = create_item(cid, "circle", {
             cx: cx,
             cy: cy,
             r: radius,
@@ -2479,9 +2504,13 @@ function gui_bng_configure(cid, tag, color, cx, cy, r) {
 }
 
 function gui_toggle_new(cid, tag, color, width, state, p1,p2,p3,p4,p5,p6,p7,p8,basex,basey) {
-    var g = get_gobj(cid, tag),
+    var g,
         points_array,
         cross1, cross2;
+    if (!patchwin[cid]) {
+        return;
+    }
+    g = get_gobj(cid, tag);
     points_array = [p1 - basex, p2 - basey,
                     p3 - basex, p4 - basey
     ];
@@ -2569,9 +2598,13 @@ function numbox_data_string(w, h) {
 function gui_numbox_new(cid, tag, color, x, y, w, h, is_toplevel) {
     // numbox doesn't have a standard iemgui border,
     // so we must create its gobj manually
-    var g = gui_gobj_new(cid, tag, "iemgui", x, y, is_toplevel),
+    var g,
         data,
         border;
+    if (!patchwin[cid]) {
+        return;
+    }
+    g = gui_gobj_new(cid, tag, "iemgui", x, y, is_toplevel);
     data = numbox_data_string(w, h);
     border = create_item(cid, "path", {
         d: data,
@@ -2628,8 +2661,12 @@ function gui_numbox_update_text_position(cid, tag, x, y) {
 }
 
 function gui_slider_new(cid, tag, color, p1, p2, p3, p4, basex, basey) {
-    var g = get_gobj(cid, tag),
+    var g,
         indicator;
+    if (!patchwin[cid]) {
+        return;
+    }
+    g = get_gobj(cid, tag);
     indicator = create_item(cid, "line", {
         x1: p1 - basex,
         y1: p2 - basey,
@@ -2667,8 +2704,12 @@ function gui_slider_indicator_color(cid, tag, color) {
 }
 
 function gui_radio_new(cid, tag, p1, p2, p3, p4, i, basex, basey) {
-    var g = get_gobj(cid, tag),
+    var g,
         cell;
+    if (!patchwin[cid]) {
+        return;
+    }
+    g = get_gobj(cid, tag);
     cell = create_item(cid, "line", {
         x1: p1 - basex,
         y1: p2 - basey,
@@ -2881,8 +2922,12 @@ function gui_vumeter_update_peak(cid,tag,color,p1,p2,p3,p4,basex,basey) {
 }
 
 function gui_iemgui_base_color(cid, tag, color) {
-    var g = get_gobj(cid, tag),
+    var g,
         b;
+    if (!patchwin[cid]) {
+        return;
+    }
+    g = get_gobj(cid, tag);
     if (g) {
         b = g.querySelector(".border");
         configure_item(b, { fill: color });
@@ -2942,8 +2987,12 @@ function iemgui_fontfamily(name) {
 
 function gui_iemgui_label_new(cid, tag, x, y, color, text, fontname, fontweight,
     fontsize) {
-    var g = get_gobj(cid, tag),
+    var g,
         svg_text, text_node;
+    if (!patchwin[cid]) {
+        return;
+    }
+    g = get_gobj(cid, tag);
     svg_text = create_item(cid, "text", {
         // x and y need to be relative to baseline instead of nw anchor
         x: x,
@@ -3027,8 +3076,12 @@ function gui_iemgui_label_font(cid, tag, fontname, fontweight, fontsize) {
 
 // Show or hide little handle for dragging around iemgui labels
 function gui_iemgui_label_show_drag_handle(cid, tag, state, x, y, cnv_resize) {
-    var gobj = get_gobj(cid, tag),
+    var gobj,
         rect;
+    if (!patchwin[cid]) {
+        return;
+    }
+    gobj = get_gobj(cid, tag);
     if (state !== 0) {
         // Here we use a "line" shape so that we can control its color
         // using the "border" class (for iemguis) or the "gop_rect" class
@@ -3066,6 +3119,9 @@ function gui_iemgui_label_show_drag_handle(cid, tag, state, x, y, cnv_resize) {
 
 function gui_mycanvas_new(cid,tag,color,x1,y1,x2_vis,y2_vis,x2,y2) {
     var rect_vis, rect, g;
+    if (!patchwin[cid]) {
+        return;
+    }
     rect_vis = create_item(cid, "rect", {
         width: x2_vis - x1,
         height: y2_vis - y1,
@@ -3123,11 +3179,11 @@ function gui_scalar_new(cid, tag, isselected, t1, t2, t3, t4, t5, t6,
     is_toplevel) {
     // we should probably use gui_gobj_new here, but we"re doing some initial
     // scaling that normal gobjs don't need...
-    var svg = get_item(cid, "patchsvg"), // id for the svg in the DOM
-        matrix,
-        transform_string,
-        g,
-        selection_rect;
+    var svg, matrix, transform_string, g, selection_rect;
+    if (!patchwin[cid]) {
+        return;
+    }
+    svg = get_item(cid, "patchsvg"), // id for the svg in the DOM
     matrix = [t1,t2,t3,t4,t5,t6];
     transform_string = "matrix(" + matrix.join() + ")";
     g = create_item(cid, "g", {
@@ -3192,8 +3248,12 @@ function gui_scalar_draw_select_rect(cid, tag, state, x1, y1, x2, y2, basex, bas
 }
 
 function gui_scalar_draw_group(cid, tag, parent_tag, attr_array) {
-    var parent_elem = get_item(cid, parent_tag),
+    var parent_elem,
         g;
+    if (!patchwin[cid]) {
+        return;
+    }
+    parent_elem = get_item(cid, parent_tag);
     if (attr_array === undefined) {
         attr_array = [];
     }
@@ -3314,8 +3374,12 @@ function gui_draw_configure_all(cid, tag, attr_array) {
 
 // Plots for arrays and data structures
 function gui_plot_vis(cid, basex, basey, data_array, attr_array, tag_array) {
-    var g = get_item(cid, tag_array[0]),
+    var g,
         p;
+    if (!patchwin[cid]) {
+        return;
+    }
+    g = get_item(cid, tag_array[0]),
     p = create_item(cid, "path", {
         d: data_array.join(" "),
         id: tag_array[1],
@@ -3430,6 +3494,9 @@ function gui_drawimage_new(obj_tag, file_path, canvasdir, flags) {
         files,
         ext,
         img; // dummy image to measure width and height
+    if (!patchwin[cid]) {
+        return;
+    }
     image_seq = flags & drawsprite;
     if (!path.isAbsolute(file_path)) {
         file_path = path.join(canvasdir, file_path);
@@ -4235,9 +4302,14 @@ function gui_graph_tick_label(cid, tag, x, y, text, font, font_size, font_weight
 }
 
 function gui_canvas_drawredrect(cid, x1, y1, x2, y2) {
-    var svgelem = get_item(cid, "patchsvg"),
-        g = gui_gobj_new(cid, cid, "gop_rect", x1, y1, 1),
+    var svgelem,
+        g,
         r;
+    if (!patchwin[cid]) {
+        return;
+    }
+    svgelem = get_item(cid, "patchsvg");
+    g = gui_gobj_new(cid, cid, "gop_rect", x1, y1, 1);
     r = create_item(cid, "rect", {
         width: x2 - x1,
         height: y2 - y1,