diff --git a/pd/src/g_all_guis.h b/pd/src/g_all_guis.h index fed1c127aeb9b6f0f6d1014c8767c32f2a78d7d9..10653984f4f2888a1831c2a9e9d795316e631b40 100644 --- a/pd/src/g_all_guis.h +++ b/pd/src/g_all_guis.h @@ -215,6 +215,7 @@ typedef struct _iemgui int label_offset_y; int label_vis; int x_vis; /* is the object drawn? */ + int x_changed; /* has the value changed so that we need to do graphic update */ } t_iemgui; typedef struct _iemguidummy diff --git a/pd/src/g_bang.c b/pd/src/g_bang.c index 9e8a6e3803dff59bc0da08e2822e851da872acda..c906457fa922854ef2d3fa1978d65d0db413ca90 100644 --- a/pd/src/g_bang.c +++ b/pd/src/g_bang.c @@ -35,13 +35,17 @@ static t_class *bng_class; /* widget helper functions */ -void bng_draw_update(t_bng *x, t_glist *glist) +void bng_draw_update(t_gobj *xgobj, t_glist *glist) { + t_bng *x = (t_bng *)xgobj; + if (x->x_gui.x_changed != x->x_flashed) { if(glist_isvisible(glist)) - { - sys_vgui(".x%lx.c itemconfigure %lxBUT -fill #%6.6x\n", glist_getcanvas(glist), x, - x->x_flashed?x->x_gui.x_fcol:x->x_gui.x_bcol); - } + { + sys_vgui(".x%lx.c itemconfigure %lxBUT -fill #%6.6x\n", glist_getcanvas(glist), x, + x->x_flashed?x->x_gui.x_fcol:x->x_gui.x_bcol); + } + x->x_gui.x_changed = x->x_flashed; + } } void bng_draw_new(t_bng *x, t_glist *glist) @@ -492,7 +496,8 @@ static void bng__motionhook(t_scalehandle *sh, void bng_draw(t_bng *x, t_glist *glist, int mode) { if(mode == IEM_GUI_DRAW_MODE_UPDATE) - bng_draw_update(x, glist); + sys_queuegui((t_gobj*)x, x->x_gui.x_glist, bng_draw_update); + //bng_draw_update(x, glist); else if(mode == IEM_GUI_DRAW_MODE_MOVE) bng_draw_move(x, glist); else if(mode == IEM_GUI_DRAW_MODE_NEW) { @@ -875,6 +880,7 @@ static void *bng_new(t_symbol *s, int argc, t_atom *argv) x->x_gui.label_vis = 0; x->x_gui.x_obj.te_iemgui = 1; + x->x_gui.x_changed = 0; return (x); } diff --git a/pd/src/g_editor.c b/pd/src/g_editor.c index 3e2613bd823acc70f21b97a6b443994413173ab4..df773a0b6b5e84d582aac8ab50131883392c2e76 100644 --- a/pd/src/g_editor.c +++ b/pd/src/g_editor.c @@ -17,6 +17,7 @@ Original Pure-Data source copyright (c) 1997-2001 Miller Puckette and others. #include "g_undo.h" #include "x_preset.h" #include <string.h> +#include <math.h> #include "g_all_guis.h" void glist_readfrombinbuf(t_glist *x, t_binbuf *b, char *filename, @@ -3351,11 +3352,24 @@ void canvas_sort_selection_according_to_location(t_canvas *x) } void canvas_drawconnection(t_canvas *x, int lx1, int ly1, int lx2, int ly2, t_int tag, int issignal) { + int ymax = 0; int halfx = (lx2 - lx1)/2; int halfy = (ly2 - ly1)/2; - int yoff = abs((halfy+halfy)/2); - if (yoff < 2) yoff = 2; - if (yoff > 20) yoff = 20; + //int yoff = (abs(halfx)+abs(halfy))/2; + int yoff = abs(halfy); + //if (yoff < 2) yoff = 2; + if (halfy >= 0) { + //second object is below the first + if (abs(halfx) <=10) { + ymax = abs(halfy * pow((halfx/10.0),2)); + if (ymax > 10) ymax = 10; + } + else ymax = 10; + } else { + //second object is above the first + ymax = 20; + } + if (yoff > ymax) yoff = ymax; /*sys_vgui(".x%lx.c create polyline %d %d %d %d -stroke %s -strokewidth %s -tags {l%lx all_cords}\n", x, lx1, ly1, lx2, ly2, (issignal ? "$signal_cord" : "$msg_cord"), @@ -3373,11 +3387,25 @@ void canvas_drawconnection(t_canvas *x, int lx1, int ly1, int lx2, int ly2, t_in } void canvas_updateconnection(t_canvas *x, int lx1, int ly1, int lx2, int ly2, t_int tag) { + int ymax = 0; int halfx = (lx2 - lx1)/2; int halfy = (ly2 - ly1)/2; - int yoff = abs((halfy+halfy)/2); - if (yoff < 2) yoff = 2; - if (yoff > 20) yoff = 20; + //int yoff = (abs(halfx)+abs(halfy))/2; + int yoff = abs(halfy); + //if (yoff < 2) yoff = 2; + if (halfy >= 0) { + //second object is below the first + if (abs(halfx) <=10) { + ymax = abs(halfy * pow((halfx/10.0),2)); + if (ymax > 10) ymax = 10; + } + else ymax = 10; + } else { + //second object is above the first + ymax = 20; + } + //fprintf(stderr,"pow%f halfx%d yoff%d ymax%d\n", pow((halfx/10.0),2), halfx, yoff, ymax); + if (yoff > ymax) yoff = ymax; if (tag) { //sys_vgui(".x%lx.c coords l%lx %d %d %d %d\n", x, tag, lx1, ly1, lx2, ly2); //bezier curves FTW diff --git a/pd/src/g_hdial.c b/pd/src/g_hdial.c index d0232355a54c31edf20a212e040b27cd87c18334..5cd5f158a53bdb9383043a8fbdbb9fd3bc90bdc6 100644 --- a/pd/src/g_hdial.c +++ b/pd/src/g_hdial.c @@ -652,13 +652,15 @@ static void hradio_set(t_hradio *x, t_floatarg f) old = x->x_on_old; x->x_on_old = x->x_on; x->x_on = i; - (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE); + if (x->x_on != x->x_on_old) + (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE); x->x_on_old = old; } else { x->x_on = i; - (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE); + if (x->x_on != x->x_on_old) + (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE); } } @@ -724,7 +726,8 @@ static void hradio_fout(t_hradio *x, t_floatarg f) { x->x_on_old = x->x_on; x->x_on = i; - (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE); + if (i != x->x_on_old) + (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE); outlet_float(x->x_gui.x_obj.ob_outlet, x->x_on); if(x->x_gui.x_fsf.x_snd_able && x->x_gui.x_snd->s_thing) pd_float(x->x_gui.x_snd->s_thing, x->x_on); @@ -772,7 +775,8 @@ static void hradio_float(t_hradio *x, t_floatarg f) { x->x_on_old = x->x_on; x->x_on = i; - (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE); + if (i != x->x_on_old) + (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE); if (x->x_gui.x_fsf.x_put_in2out) { outlet_float(x->x_gui.x_obj.ob_outlet, x->x_on); diff --git a/pd/src/g_hslider.c b/pd/src/g_hslider.c index 5f7ce63861a566cb89795a35d94374525a366ca6..9f1da8bcd21e57512e904a4cdaef78dfea5835d1 100644 --- a/pd/src/g_hslider.c +++ b/pd/src/g_hslider.c @@ -38,6 +38,7 @@ static t_class *hslider_class; static void hslider_draw_update(t_gobj *client, t_glist *glist) { t_hslider *x = (t_hslider *)client; + if (x->x_gui.x_changed == 0) return; t_canvas *canvas=glist_getcanvas(glist); int ypos=text_ypix(&x->x_gui.x_obj, glist); @@ -64,6 +65,7 @@ static void hslider_draw_update(t_gobj *client, t_glist *glist) } } } + x->x_gui.x_changed = 0; } static void hslider_draw_new(t_hslider *x, t_glist *glist) @@ -634,8 +636,11 @@ static void hslider_set(t_hslider *x, t_floatarg f) /* bugfix */ else g = (f - x->x_min) / x->x_k; x->x_val = (int)(100.0*g + 0.49999); - x->x_pos = x->x_val; - (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE); + if (x->x_pos != x->x_val) { + x->x_pos = x->x_val; + x->x_gui.x_changed = 1; + (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE); + } } static void hslider_bang(t_hslider *x) @@ -724,6 +729,7 @@ static void hslider_motion(t_hslider *x, t_floatarg dx, t_floatarg dy) } if(old != x->x_val) { + x->x_gui.x_changed = 1; (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE); hslider_bang(x); } @@ -738,8 +744,11 @@ static void hslider_click(t_hslider *x, t_floatarg xpos, t_floatarg ypos, x->x_val = 100*x->x_gui.x_w - 100; if(x->x_val < 0) x->x_val = 0; - x->x_pos = x->x_val; - (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE); + if (x->x_pos != x->x_val) { + x->x_pos = x->x_val; + x->x_gui.x_changed = 1; + (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE); + } hslider_bang(x); glist_grab(x->x_gui.x_glist, &x->x_gui.x_obj.te_g, (t_glistmotionfn)hslider_motion, 0, xpos, ypos); @@ -970,6 +979,7 @@ static void *hslider_new(t_symbol *s, int argc, t_atom *argv) x->x_gui.label_vis = 0; x->x_gui.x_obj.te_iemgui = 1; + x->x_gui.x_changed = 0; return (x); } diff --git a/pd/src/g_numbox.c b/pd/src/g_numbox.c index 8972b6452ddb8431844538d2676728260ba5a2cf..2d5d5ed97897019c764ec354586840d119342a9f 100644 --- a/pd/src/g_numbox.c +++ b/pd/src/g_numbox.c @@ -139,6 +139,9 @@ void my_numbox_ftoa(t_my_numbox *x) static void my_numbox_draw_update(t_gobj *client, t_glist *glist) { t_my_numbox *x = (t_my_numbox *)client; + if (x->x_gui.x_changed == 0) { + return; + } if (glist_isvisible(glist)) { if(x->x_gui.x_fsf.x_change) @@ -183,6 +186,7 @@ static void my_numbox_draw_update(t_gobj *client, t_glist *glist) x->x_buf[0] = 0; } } + x->x_gui.x_changed = 0; } static void my_numbox_draw_new(t_my_numbox *x, t_glist *glist) @@ -758,6 +762,7 @@ static void my_numbox_save(t_gobj *z, t_binbuf *b) { x->x_gui.x_fsf.x_change = 0; clock_unset(x->x_clock_reset); + x->x_gui.x_changed = 1; sys_queuegui(x, x->x_gui.x_glist, my_numbox_draw_update); } binbuf_addv(b, "ssiisiiffiisssiiiiiiifii", gensym("#X"),gensym("obj"), @@ -822,6 +827,7 @@ static void my_numbox_properties(t_gobj *z, t_glist *owner) { x->x_gui.x_fsf.x_change = 0; clock_unset(x->x_clock_reset); + x->x_gui.x_changed = 1; sys_queuegui(x, x->x_gui.x_glist, my_numbox_draw_update); } @@ -914,6 +920,7 @@ static void my_numbox_dialog(t_my_numbox *x, t_symbol *s, int argc, static void my_numbox_motion(t_my_numbox *x, t_floatarg dx, t_floatarg dy) { double k2=1.0; + int old = x->x_val; if(x->x_gui.x_fsf.x_finemoved) k2 = 0.01; @@ -922,9 +929,12 @@ static void my_numbox_motion(t_my_numbox *x, t_floatarg dx, t_floatarg dy) else x->x_val -= k2*dy; my_numbox_clip(x); - sys_queuegui(x, x->x_gui.x_glist, my_numbox_draw_update); - my_numbox_bang(x); - clock_unset(x->x_clock_reset); + if (old != x->x_val) { + x->x_gui.x_changed = 1; + sys_queuegui(x, x->x_gui.x_glist, my_numbox_draw_update); + my_numbox_bang(x); + } + clock_unset(x->x_clock_reset); } static void my_numbox_click(t_my_numbox *x, t_floatarg xpos, t_floatarg ypos, @@ -960,6 +970,7 @@ static int my_numbox_newclick(t_gobj *z, struct _glist *glist, x->x_gui.x_fsf.x_change = 0; clock_unset(x->x_clock_reset); x->x_buf[0] = 0; + x->x_gui.x_changed = 1; sys_queuegui(x, x->x_gui.x_glist, my_numbox_draw_update); } } @@ -968,9 +979,12 @@ static int my_numbox_newclick(t_gobj *z, struct _glist *glist, static void my_numbox_set(t_my_numbox *x, t_floatarg f) { - x->x_val = f; - my_numbox_clip(x); - sys_queuegui(x, x->x_gui.x_glist, my_numbox_draw_update); + if (x->x_val != f) { + x->x_val = f; + my_numbox_clip(x); + x->x_gui.x_changed = 1; + sys_queuegui(x, x->x_gui.x_glist, my_numbox_draw_update); + } } static void my_numbox_log_height(t_my_numbox *x, t_floatarg lh) @@ -1033,6 +1047,7 @@ static void my_numbox_range(t_my_numbox *x, t_symbol *s, int ac, t_atom *av) if(my_numbox_check_minmax(x, (double)atom_getfloatarg(0, ac, av), (double)atom_getfloatarg(1, ac, av))) { + x->x_gui.x_changed = 1; sys_queuegui(x, x->x_gui.x_glist, my_numbox_draw_update); /*my_numbox_bang(x);*/ } @@ -1074,6 +1089,7 @@ static void my_numbox_log(t_my_numbox *x) x->x_lin0_log1 = 1; if(my_numbox_check_minmax(x, x->x_min, x->x_max)) { + x->x_gui.x_changed = 1; sys_queuegui(x, x->x_gui.x_glist, my_numbox_draw_update); /*my_numbox_bang(x);*/ } @@ -1109,6 +1125,7 @@ static void my_numbox_key(void *z, t_floatarg fkey) { x->x_gui.x_fsf.x_change = 0; clock_unset(x->x_clock_reset); + x->x_gui.x_changed = 1; sys_queuegui(x, x->x_gui.x_glist, my_numbox_draw_update); return; } @@ -1119,6 +1136,7 @@ static void my_numbox_key(void *z, t_floatarg fkey) { buf[0] = c; strcat(x->x_buf, buf); + x->x_gui.x_changed = 1; sys_queuegui(x, x->x_gui.x_glist, my_numbox_draw_update); } } @@ -1129,6 +1147,7 @@ static void my_numbox_key(void *z, t_floatarg fkey) if(sl < 0) sl = 0; x->x_buf[sl] = 0; + x->x_gui.x_changed = 1; sys_queuegui(x, x->x_gui.x_glist, my_numbox_draw_update); } else if((c=='\n')||(c==13)) @@ -1139,6 +1158,7 @@ static void my_numbox_key(void *z, t_floatarg fkey) clock_unset(x->x_clock_reset); my_numbox_clip(x); my_numbox_bang(x); + x->x_gui.x_changed = 1; sys_queuegui(x, x->x_gui.x_glist, my_numbox_draw_update); } clock_delay(x->x_clock_reset, 3000); @@ -1280,6 +1300,7 @@ static void *my_numbox_new(t_symbol *s, int argc, t_atom *argv) x->x_tmpfontsize = 0; x->x_gui.x_obj.te_iemgui = 1; + x->x_gui.x_changed = 0; return (x); } diff --git a/pd/src/g_toggle.c b/pd/src/g_toggle.c index b063836926ce48633c0422b4112a3f089002a047..2f7771627c634ab398ac21fe00e5e8b635bb3382 100644 --- a/pd/src/g_toggle.c +++ b/pd/src/g_toggle.c @@ -36,17 +36,21 @@ static t_class *toggle_class; /* widget helper functions */ -void toggle_draw_update(t_toggle *x, t_glist *glist) +void toggle_draw_update(t_gobj *xgobj, t_glist *glist) { - if(glist_isvisible(glist)) - { - t_canvas *canvas=glist_getcanvas(glist); - - sys_vgui(".x%lx.c itemconfigure %lxX1 -stroke #%6.6x\n", canvas, x, - (x->x_on!=0.0)?x->x_gui.x_fcol:x->x_gui.x_bcol); - sys_vgui(".x%lx.c itemconfigure %lxX2 -stroke #%6.6x\n", canvas, x, - (x->x_on!=0.0)?x->x_gui.x_fcol:x->x_gui.x_bcol); - } + t_toggle *x = (t_toggle *)xgobj; + if (x->x_gui.x_changed) { + if(glist_isvisible(glist)) + { + t_canvas *canvas=glist_getcanvas(glist); + + sys_vgui(".x%lx.c itemconfigure %lxX1 -stroke #%6.6x\n", canvas, x, + (x->x_on!=0.0)?x->x_gui.x_fcol:x->x_gui.x_bcol); + sys_vgui(".x%lx.c itemconfigure %lxX2 -stroke #%6.6x\n", canvas, x, + (x->x_on!=0.0)?x->x_gui.x_fcol:x->x_gui.x_bcol); + } + x->x_gui.x_changed = 0; + } } void toggle_draw_new(t_toggle *x, t_glist *glist) @@ -495,7 +499,8 @@ static void toggle__motionhook(t_scalehandle *sh, void toggle_draw(t_toggle *x, t_glist *glist, int mode) { if(mode == IEM_GUI_DRAW_MODE_UPDATE) - toggle_draw_update(x, glist); + sys_queuegui((t_gobj*)x, x->x_gui.x_glist, toggle_draw_update); + //toggle_draw_update(x, glist); else if(mode == IEM_GUI_DRAW_MODE_MOVE) toggle_draw_move(x, glist); else if(mode == IEM_GUI_DRAW_MODE_NEW) { @@ -572,6 +577,7 @@ static void toggle_properties(t_gobj *z, t_glist *owner) static void toggle_bang(t_toggle *x) { + x->x_gui.x_changed = 1; x->x_on = (x->x_on==0.0)?x->x_nonzero:0.0; (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE); outlet_float(x->x_gui.x_obj.ob_outlet, x->x_on); @@ -624,6 +630,7 @@ static int toggle_newclick(t_gobj *z, struct _glist *glist, int xpix, int ypix, static void toggle_set(t_toggle *x, t_floatarg f) { + if (x->x_on != f) x->x_gui.x_changed = 1; x->x_on = f; if(f != 0.0) x->x_nonzero = f; @@ -798,6 +805,8 @@ static void *toggle_new(t_symbol *s, int argc, t_atom *argv) x->x_gui.x_obj.te_iemgui = 1; + x->x_gui.x_changed = 1; + return (x); } diff --git a/pd/src/g_vdial.c b/pd/src/g_vdial.c index 08d347057c5b351332984a30c41564c00e42180c..cbf3997ed10ff689ddd13dd2d755dfa9ad97197d 100644 --- a/pd/src/g_vdial.c +++ b/pd/src/g_vdial.c @@ -642,13 +642,15 @@ static void vradio_set(t_vradio *x, t_floatarg f) old = x->x_on_old; x->x_on_old = x->x_on; x->x_on = i; - (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE); + if (x->x_on != x->x_on_old) + (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE); x->x_on_old = old; } else { x->x_on = i; - (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE); + if (x->x_on != x->x_on_old) + (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE); } } @@ -715,7 +717,8 @@ static void vradio_fout(t_vradio *x, t_floatarg f) { x->x_on_old = x->x_on; x->x_on = i; - (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE); + if (x->x_on != x->x_on_old) + (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE); outlet_float(x->x_gui.x_obj.ob_outlet, x->x_on); if (x->x_gui.x_fsf.x_snd_able && x->x_gui.x_snd->s_thing) pd_float(x->x_gui.x_snd->s_thing, x->x_on); @@ -763,7 +766,8 @@ static void vradio_float(t_vradio *x, t_floatarg f) { x->x_on_old = x->x_on; x->x_on = i; - (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE); + if (x->x_on != x->x_on_old) + (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE); if (x->x_gui.x_fsf.x_put_in2out) { outlet_float(x->x_gui.x_obj.ob_outlet, x->x_on); diff --git a/pd/src/g_vslider.c b/pd/src/g_vslider.c index 92991fd392f6a948a827a6907c5fbe5bfc9fa786..1947d68b0c2b92ab43dfa1b5f7be720e212be3a0 100644 --- a/pd/src/g_vslider.c +++ b/pd/src/g_vslider.c @@ -38,6 +38,7 @@ static t_class *vslider_class; static void vslider_draw_update(t_gobj *client, t_glist *glist) { t_vslider *x = (t_vslider *)client; + if (x->x_gui.x_changed == 0) return; t_canvas *canvas=glist_getcanvas(glist); if (glist_isvisible(glist)) { @@ -64,6 +65,7 @@ static void vslider_draw_update(t_gobj *client, t_glist *glist) } } } + x->x_gui.x_changed = 0; } static void vslider_draw_new(t_vslider *x, t_glist *glist) @@ -706,8 +708,8 @@ static void vslider_motion(t_vslider *x, t_floatarg dx, t_floatarg dy) x->x_pos -= 50; x->x_pos -= x->x_pos%100; } - if(old != x->x_val) - { + if(old != x->x_val) { + x->x_gui.x_changed = 1; (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE); vslider_bang(x); } @@ -722,8 +724,11 @@ static void vslider_click(t_vslider *x, t_floatarg xpos, t_floatarg ypos, x->x_val = 100*x->x_gui.x_h - 100; if(x->x_val < 0) x->x_val = 0; - x->x_pos = x->x_val; - (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE); + if (x->x_pos != x->x_val) { + x->x_pos = x->x_val; + x->x_gui.x_changed = 1; + (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE); + } vslider_bang(x); glist_grab(x->x_gui.x_glist, &x->x_gui.x_obj.te_g, (t_glistmotionfn)vslider_motion, 0, xpos, ypos); @@ -769,8 +774,11 @@ static void vslider_set(t_vslider *x, t_floatarg f) else g = (f - x->x_min) / x->x_k; x->x_val = (int)(100.0*g + 0.49999); - x->x_pos = x->x_val; - (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE); + if(x->x_pos != x->x_val) { + x->x_pos = x->x_val; + x->x_gui.x_changed = 1; + (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE); + } } static void vslider_float(t_vslider *x, t_floatarg f) @@ -959,6 +967,7 @@ static void *vslider_new(t_symbol *s, int argc, t_atom *argv) x->x_gui.label_vis = 0; x->x_gui.x_obj.te_iemgui = 1; + x->x_gui.x_changed = 0; return (x); } diff --git a/pd/src/g_vumeter.c b/pd/src/g_vumeter.c index c3c5ab9c93df7e8b9bec488671f7da3df607b1a2..97d0c6b17ab2a40db3b4faa9acb4e4cd03f27ba7 100644 --- a/pd/src/g_vumeter.c +++ b/pd/src/g_vumeter.c @@ -686,6 +686,8 @@ static void vu__motionhook(t_scalehandle *sh, void vu_draw(t_vu *x, t_glist *glist, int mode) { //fprintf(stderr,"vu_draw %d\n", mode); + if(mode == IEM_GUI_DRAW_MODE_UPDATE) + sys_queuegui((t_gobj*)x, x->x_gui.x_glist, vu_draw_update); if(mode == IEM_GUI_DRAW_MODE_MOVE) vu_draw_move(x, glist); else if(mode == IEM_GUI_DRAW_MODE_NEW) { diff --git a/pd/src/m_pd.c b/pd/src/m_pd.c index 14b3870add9656441546713059f2ea9fd2f13d60..34786ef026a2c0bd02a2e0d4059b25e7ea5999cb 100644 --- a/pd/src/m_pd.c +++ b/pd/src/m_pd.c @@ -78,6 +78,7 @@ typedef struct _bindlist } t_bindlist; static int change_bindlist_via_graph = 0; +static t_bindlist *change_bindlist = NULL; static void bindlist_cleanup(t_bindlist *x) { @@ -109,69 +110,87 @@ static void bindlist_cleanup(t_bindlist *x) static void bindlist_bang(t_bindlist *x) { t_bindelem *e; + int save = change_bindlist_via_graph; + t_bindlist *save_bindlist = change_bindlist; change_bindlist_via_graph = 1; for (e = x->b_list; e; e = e->e_next) if (e->e_who != NULL) pd_bang(e->e_who); if (change_bindlist_via_graph > 1) bindlist_cleanup(x); - change_bindlist_via_graph = 0; + change_bindlist_via_graph = save; + change_bindlist = save_bindlist; } static void bindlist_float(t_bindlist *x, t_float f) { t_bindelem *e; + int save = change_bindlist_via_graph; + t_bindlist *save_bindlist = change_bindlist; change_bindlist_via_graph = 1; for (e = x->b_list; e; e = e->e_next) if (e->e_who != NULL) pd_float(e->e_who, f); if (change_bindlist_via_graph > 1) bindlist_cleanup(x); - change_bindlist_via_graph = 0; + change_bindlist_via_graph = save; + change_bindlist = save_bindlist; } static void bindlist_symbol(t_bindlist *x, t_symbol *s) { t_bindelem *e; + int save = change_bindlist_via_graph; + t_bindlist *save_bindlist = change_bindlist; change_bindlist_via_graph = 1; for (e = x->b_list; e; e = e->e_next) if (e->e_who != NULL) pd_symbol(e->e_who, s); if (change_bindlist_via_graph > 1) bindlist_cleanup(x); - change_bindlist_via_graph = 0; + change_bindlist_via_graph = save; + change_bindlist = save_bindlist; } static void bindlist_pointer(t_bindlist *x, t_gpointer *gp) { t_bindelem *e; + int save = change_bindlist_via_graph; + t_bindlist *save_bindlist = change_bindlist; change_bindlist_via_graph = 1; for (e = x->b_list; e; e = e->e_next) if (e->e_who != NULL) pd_pointer(e->e_who, gp); if (change_bindlist_via_graph > 1) bindlist_cleanup(x); - change_bindlist_via_graph = 0; + change_bindlist_via_graph = save; + change_bindlist = save_bindlist; } static void bindlist_list(t_bindlist *x, t_symbol *s, int argc, t_atom *argv) { t_bindelem *e; + int save = change_bindlist_via_graph; + t_bindlist *save_bindlist = change_bindlist; change_bindlist_via_graph = 1; for (e = x->b_list; e; e = e->e_next) if (e->e_who != NULL) pd_list(e->e_who, s, argc, argv); if (change_bindlist_via_graph > 1) bindlist_cleanup(x); - change_bindlist_via_graph = 0; + change_bindlist_via_graph = save; + change_bindlist = save_bindlist; } static void bindlist_anything(t_bindlist *x, t_symbol *s, int argc, t_atom *argv) { t_bindelem *e; + int save = change_bindlist_via_graph; + t_bindlist *save_bindlist = change_bindlist; change_bindlist_via_graph = 1; for (e = x->b_list; e; e = e->e_next) if (e->e_who != NULL) pd_typedmess(e->e_who, s, argc, argv); if (change_bindlist_via_graph > 1) bindlist_cleanup(x); - change_bindlist_via_graph = 0; + change_bindlist_via_graph = save; + change_bindlist = save_bindlist; } void m_pd_setup(void) @@ -247,9 +266,10 @@ void pd_unbind(t_pd *x, t_symbol *s) t_bindlist *b = (t_bindlist *)s->s_thing; t_bindelem *e, *e2; + int delayed = change_bindlist_via_graph && change_bindlist==b; if ((e = b->b_list)->e_who == x) { - if (change_bindlist_via_graph) { + if (delayed) { change_bindlist_via_graph++; e->e_delayed_free = 1; } else { @@ -263,7 +283,7 @@ void pd_unbind(t_pd *x, t_symbol *s) { if (change_bindlist_via_graph) { change_bindlist_via_graph++; - e2->e_delayed_free = 0; + e2->e_delayed_free = 1; } else { e->e_next = e2->e_next; freebytes(e2, sizeof(t_bindelem)); @@ -273,15 +293,18 @@ void pd_unbind(t_pd *x, t_symbol *s) } int count_valid = 0; + t_bindelem *e1 = NULL; for (e = b->b_list; e; e = e->e_next) { - if (e->e_who != NULL) + if (e->e_who != NULL && !e->e_delayed_free) { count_valid++; + e1 = e; + } } if (count_valid == 1) { - s->s_thing = b->b_list->e_who; - if (!change_bindlist_via_graph) { + s->s_thing = e1->e_who; + if (!delayed) { freebytes(b->b_list, sizeof(t_bindelem)); pd_free(&b->b_pd); }