diff --git a/pd/doc/4.data.structures/pd-l2ork/ds-demos/curve-bbox.pd b/pd/doc/4.data.structures/pd-l2ork/ds-demos/curve-bbox.pd
deleted file mode 100644
index 70597c7670d7537977e426dafb4a109be1ef1459..0000000000000000000000000000000000000000
--- a/pd/doc/4.data.structures/pd-l2ork/ds-demos/curve-bbox.pd
+++ /dev/null
@@ -1,20 +0,0 @@
-#N struct curvebbox float x float y;
-#N canvas 0 19 619 300 10;
-#X obj 151 34 struct curvebbox float x float y;
-#X scalar curvebbox 71 53 \;;
-#X text 197 181 Short demo showing that Pd should find the correct
-bounding box for a transformed scalar in edit-mode.;
-#X text 197 221 Unfortunately it doesn't quite get it right for curves.
-You can see with rotation at some angles it doesn't include part of
-the curve.;
-#N canvas 433 184 450 300 (subpatch) 0;
-#X floatatom 163 116 5 0 0 0 - - -, f 5;
-#X obj 163 160 draw path M 20 120 C 20 30 40 50 60 70;
-#X msg 163 137 transform rotate \$1;
-#X connect 0 0 2 0;
-#X connect 2 0 1 0;
-#X restore 417 94 group;
-#X floatatom 408 21 5 0 0 0 - - -, f 5;
-#X msg 408 42 transform translate \$1 0;
-#X connect 5 0 6 0;
-#X connect 6 0 4 0;
diff --git a/pd/src/g_template.c b/pd/src/g_template.c
index f02bc835cfee007cd902346f56f870d268c68ec3..578b3e72558a2626381adb3753db248e5e68eef4 100644
--- a/pd/src/g_template.c
+++ b/pd/src/g_template.c
@@ -4262,48 +4262,15 @@ t_parentwidgetbehavior draw_widgetbehavior =
 
 static void svg_free_events(t_svg *x)
 {
-    /* This is pretty simplistic-- if the flag is set then we set the
-       event to zero and send the update to the GUI. */
-    if (x->x_events.e_focusin.a_flag == 1)
-    {
-        fielddesc_setfloat_const(&x->x_events.e_focusin.a_attr, 0);
-        svg_update(x, gensym("focusin"));
-    }
-    if (x->x_events.e_activate.a_flag == 1)
-    {
-        fielddesc_setfloat_const(&x->x_events.e_activate.a_attr, 0);
-        svg_update(x, gensym("focusout"));
-    }
-    if (x->x_events.e_click.a_flag == 1)
-    {
-        fielddesc_setfloat_const(&x->x_events.e_click.a_attr, 0);
-        svg_update(x, gensym("click"));
-    }
-    if (x->x_events.e_mousedown.a_flag == 1)
-    {
-        fielddesc_setfloat_const(&x->x_events.e_mousedown.a_attr, 0);
-        svg_update(x, gensym("mousedown"));
-    }
-    if (x->x_events.e_mouseup.a_flag == 1)
-    {
-        fielddesc_setfloat_const(&x->x_events.e_mouseup.a_attr, 0);
-        svg_update(x, gensym("mouseup"));
-    }
-    if (x->x_events.e_mouseover.a_flag == 1)
-    {
-        fielddesc_setfloat_const(&x->x_events.e_mouseover.a_attr, 0);
-        svg_update(x, gensym("mouseover"));
-    }
-    if (x->x_events.e_mousemove.a_flag == 1)
-    {
-        fielddesc_setfloat_const(&x->x_events.e_mousemove.a_attr, 0);
-        svg_update(x, gensym("mousemove"));
-    }
-    if (x->x_events.e_mouseout.a_flag == 1)
-    {
-        fielddesc_setfloat_const(&x->x_events.e_mouseout.a_attr, 0);
-        svg_update(x, gensym("mouseout"));
-    }
+    /* Right now all the events except for "drag" get automatically
+       garbage collected in the GUI.
+       The reason "drag" does not is that it's a kind of "meta-event"--
+       we keep a reference to the "draggable" object and check for it
+       on clicking the canvas. The benefit is there's a single, centralized
+       set of canvas events instead of event listeners for each scalar.
+       Drawback is that we have to manage destroying the "drag" references
+       in the GUI. But eventually all scalar events should be handled this
+       way... */
     if (x->x_events.e_drag.a_flag == 1)
     {
         fielddesc_setfloat_const(&x->x_events.e_drag.a_attr, 0);