aboutsummaryrefslogtreecommitdiff
path: root/pd/src/g_graph.c
diff options
context:
space:
mode:
Diffstat (limited to 'pd/src/g_graph.c')
-rw-r--r--pd/src/g_graph.c18
1 files changed, 15 insertions, 3 deletions
diff --git a/pd/src/g_graph.c b/pd/src/g_graph.c
index b7ae4d81..8bb76ac0 100644
--- a/pd/src/g_graph.c
+++ b/pd/src/g_graph.c
@@ -113,10 +113,22 @@ void glist_delete(t_glist *x, t_gobj *y)
void glist_clear(t_glist *x)
{
t_gobj *y, *y2;
- int dspstate = canvas_suspend_dsp();
+ int dspstate = 0, suspended = 0;
+ t_symbol *dspsym = gensym("dsp");
while (y = x->gl_list)
+ {
+ /* to avoid unnecessary DSP resorting, we suspend DSP
+ only if we hit a patchable object. */
+ if (!suspended && pd_checkobject(&y->g_pd) && zgetfn(&y->g_pd, dspsym))
+ {
+ dspstate = canvas_suspend_dsp();
+ suspended = 1;
+ }
+ /* here's the real deletion. */
glist_delete(x, y);
- canvas_resume_dsp(dspstate);
+ }
+ if (suspended)
+ canvas_resume_dsp(dspstate);
}
void glist_retext(t_glist *glist, t_text *y)
@@ -618,7 +630,7 @@ void glist_redraw(t_glist *x)
glist_getcanvas(x), oc,
t.tr_lx1, t.tr_ly1, t.tr_lx2, t.tr_ly2);
}
- if (x->gl_owner)
+ if (x->gl_owner && glist_isvisible(x->gl_owner))
{
graph_vis(&x->gl_gobj, x->gl_owner, 0);
graph_vis(&x->gl_gobj, x->gl_owner, 1);