diff --git a/pd/nw/dialog_canvas.html b/pd/nw/dialog_canvas.html
index 6e3559ae424901a87d39a8d7c2fcab75eb96c31e..f21a7a1f2187f59c7a0e0d0c60f320d2cb18e6a8 100644
--- a/pd/nw/dialog_canvas.html
+++ b/pd/nw/dialog_canvas.html
@@ -262,7 +262,7 @@
       </fieldset> 
 
     <div class="submit_buttons">
-      <button type="button" onClick="ok()" data-i18n="[title]iem.prop.ok_tt">
+      <button type="button" id="ok_button" onClick="ok()" data-i18n="[title]iem.prop.ok_tt">
         <span data-i18n="iem.prop.ok"></span>
       </button>
       <button type="button" onClick="apply()" data-i18n="[title]iem.prop.apply_tt">
@@ -295,6 +295,12 @@ var pd_garray_attrs;
 var new_array_dialog;
 
 function ok() {
+    // Put the focus on the "ok" button, to make sure we call the change
+    // method for an attribute. For some reason I don't need to do this
+    // in the iemgui dialog, but I haven't looked close to figure out why.
+    // A lot of this could probably be abstracted out, but I'm not sure of
+    // the best way to do that yet.
+    document.getElementById("ok_button").focus();
     apply();
     cancel();
 }
diff --git a/pd/src/g_array.c b/pd/src/g_array.c
index 682fcd4b5922bcd4f634c78ab983259188f7fc49..83c0efeebb92ff4496b94afd59a4346bfec0fe5f 100644
--- a/pd/src/g_array.c
+++ b/pd/src/g_array.c
@@ -746,9 +746,34 @@ void garray_arraydialog(t_garray *x, t_symbol *s, int argc, t_atom *argv)
         x->x_outlinecolor = outline;
         x->x_style = style;
         if (size != a->a_n)
+        {
             garray_resize(x, size);
+        }
         else
+        {
+            /* So, this next function call is here _solely_ to get the
+               the new array name to show up in the graph label if the user
+               happened to change it. Let me emphasize-- in order to
+               redraw array labels, we must call a function that redraws
+               not only the _entire_ array and its graph, but also redraws
+               the parent canvas in which the graph is displayed. There is
+               no interface I can find to just say, "redraw the label".
+
+               Worse, Pd redraws a single array at least 3 times, and maybe
+               even the graph and the containing glist-- it's hard to tell
+               because so much data is sent over the wire that I run out of
+               buffer in my terminal window. These are a side-effect of
+               garray_redraw, as well as the garray_resize branch above. (And 
+               don't forget that the canvas dialog callback probably causes
+               as many redraws as well.)
+
+               Until the Pd codebase handles redrawing in a sane fashion,
+               without depending on a vast array of side-effects, there's
+               simply no way to effectively maintain it. */
+            glist_redraw(x->x_glist);
             garray_redraw(x);
+        }
+
         //fprintf(stderr,"garray_arraydialog garray_redraw done\n");
         garray_select((t_gobj *)x,glist_getcanvas(x->x_glist),1);
         canvas_dirty(x->x_glist, 1);