diff --git a/pd/src/x_connective.c b/pd/src/x_connective.c index d1d19c74abb95f4d8cbc9f6667a3af5d7b95eb67..5e7ec6b3d3a1b24d2aa92aec0dacbb36d2ca8e09 100644 --- a/pd/src/x_connective.c +++ b/pd/src/x_connective.c @@ -1132,7 +1132,6 @@ static void *trigger_new(t_symbol *s, int argc, t_atom *argv) static void trigger_list(t_trigger *x, t_symbol *s, int argc, t_atom *argv) { - //fprintf(stderr,"trigger_list %s\n", s->s_name); t_triggerout *u; int i; for (i = x->x_n, u = x->x_vec + i; u--, i--;) @@ -1143,7 +1142,7 @@ static void trigger_list(t_trigger *x, t_symbol *s, int argc, t_atom *argv) outlet_bang(u->u_outlet); else if (u->u_type == TR_SYMBOL) outlet_symbol(u->u_outlet, - (argc ? atom_getsymbol(argv) : &s_symbol)); + (argc ? atom_getsymbol(argv) : (s != NULL ? s : &s_symbol))); else if (u->u_type == TR_ANYTHING) outlet_anything(u->u_outlet, s, argc, argv); else if (u->u_type == TR_POINTER) @@ -1166,9 +1165,10 @@ static void trigger_list(t_trigger *x, t_symbol *s, int argc, t_atom *argv) static void trigger_anything(t_trigger *x, t_symbol *s, int argc, t_atom *argv) { - //fprintf(stderr,"trigger_anything %s\n", s->s_name); + //fprintf(stderr,"trigger_anything %s %d\n", s->s_name, argc); + t_atom *av2 = NULL; t_triggerout *u; - int i; + int i, j = 0; for (i = x->x_n, u = x->x_vec + i; u--, i--;) { if (u->u_type == TR_BANG) @@ -1186,10 +1186,69 @@ static void trigger_anything(t_trigger *x, t_symbol *s, int argc, t_atom *argv) { outlet_symbol(u->u_outlet, &u->u_sym); } + //else trigger_symbol(x, s); else { - trigger_symbol(x, s); - break; + // copying trigger_list behavior except that here we keep + // the outlet number and therefore avoid redundant printouts + if (u->u_type == TR_FLOAT) + { + //fprintf(stderr,"trigger_anything -> TR_FLOAT %d\n", argc); + outlet_float(u->u_outlet, (argc ? atom_getfloat(argv) : 0)); + } + else if (u->u_type == TR_BANG) + { + //fprintf(stderr,"trigger_anything -> TR_BANG %d\n", argc); + outlet_bang(u->u_outlet); + } + else if (u->u_type == TR_SYMBOL) + { + //fprintf(stderr,"trigger_anything -> TR_SYMBOL %d\n", argc); + outlet_symbol(u->u_outlet, + (s != NULL ? s : (argc ? atom_getsymbol(argv) : &s_symbol))); + } + else if (u->u_type == TR_ANYTHING) + { + //fprintf(stderr,"trigger_anything -> TR_ANYTHING %d\n", argc); + outlet_anything(u->u_outlet, s, argc, argv); + } + else if (u->u_type == TR_POINTER) + { + //fprintf(stderr,"trigger_anything -> TR_POINTER %d\n", argc); + if (!argc || argv->a_type != TR_POINTER) + pd_error(x, "unpack: bad pointer"); + else outlet_pointer(u->u_outlet, argv->a_w.w_gpointer); + } + else if (u->u_type == TR_STATIC_FLOAT) + { + //fprintf(stderr,"trigger_anything -> TR_STATIC_FLOAT %d\n", argc); + outlet_float(u->u_outlet, u->u_float); + } + else if (u->u_type == TR_STATIC_SYMBOL) + { + //fprintf(stderr,"trigger_anything -> TR_STATIC_SYMBOL %d\n", argc); + outlet_symbol(u->u_outlet, &u->u_sym); + } + else + { + // Ico: don't have to worry about zero element case (AFAICT) + av2 = (t_atom *)getbytes((argc + 1) * sizeof(t_atom)); + SETSYMBOL(av2, s); + if (argc == 0) + { + //fprintf(stderr,"trigger_anything -> symbol %d\n", argc); + outlet_list(u->u_outlet, &s_symbol, argc+1, av2); + } + else + { + for (j = 0; j < argc; j++) + av2[j + 1] = argv[j]; + //fprintf(stderr,"trigger_anything -> list %d\n", argc); + SETSYMBOL(av2, s); + outlet_list(u->u_outlet, &s_list, argc+1, av2); + } + freebytes(av2, (argc + 1) * sizeof(t_atom)); + } } } }