diff --git a/pd/nw/pd_canvas.js b/pd/nw/pd_canvas.js
index 774f0825be5ad851cdfeb39edc33ffbdbd084a83..25d8bba6cb34db5117fc1767aaa6a99895385287 100644
--- a/pd/nw/pd_canvas.js
+++ b/pd/nw/pd_canvas.js
@@ -164,6 +164,23 @@ var canvas_events = (function() {
                 return 0;
             }
         },
+        grow_svg_for_element= function(elem) {
+            // See if an element overflows the svg bbox, and
+            // enlarge the svg to accommodate it
+            var svg = document.getElementById("patchsvg"),
+                elem_bbox = elem.getBoundingClientRect(),
+                svg_viewbox = svg.getAttribute("viewBox").split(" "),
+                w = Math.max(elem_bbox.left + elem_bbox.width, svg_viewbox[2]),
+                h = Math.max(elem_bbox.top + elem_bbox.height, svg_viewbox[3]);
+            svg.setAttribute("viewBox",
+                [Math.min(elem_bbox.left, svg_viewbox[0]),
+                 Math.min(elem_bbox.top, svg_viewbox[1]),
+                 w,
+                 h
+                ].join(" "));
+            svg.setAttribute("width", w);
+            svg.setAttribute("height", h);
+        },
         events = {
             mousemove: function(evt) {
                 //pdgui.post("x: " + evt.pageX + " y: " + evt.pageY +
@@ -429,6 +446,7 @@ var canvas_events = (function() {
                 evt.preventDefault();
                 document.execCommand("insertText", false,
                     evt.clipboardData.getData("text"));
+                grow_svg_for_element(textbox());
             },
             floating_text_click: function(evt) {
                 if (target_is_scrollbar(evt)) {