diff options
Diffstat (limited to 'cyclone/hammer')
-rw-r--r-- | cyclone/hammer/comment.c | 69 | ||||
-rw-r--r-- | cyclone/hammer/seq.c | 1 | ||||
-rw-r--r-- | cyclone/hammer/testmess.c | 158 |
3 files changed, 168 insertions, 60 deletions
diff --git a/cyclone/hammer/comment.c b/cyclone/hammer/comment.c index 8f885a6..6a52bb8 100644 --- a/cyclone/hammer/comment.c +++ b/cyclone/hammer/comment.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2002-2004 krzYszcz and others. +/* Copyright (c) 2002-2005 krzYszcz and others. * For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. */ @@ -77,7 +77,7 @@ static void comment_draw(t_comment *x) { char buf[COMMENT_OUTBUFSIZE], *outbuf, *outp; int cvid = (int)x->x_canvas; - int reqsize = x->x_textbufsize + 350; /* FIXME estimation */ + int reqsize = x->x_textbufsize + 250; /* FIXME estimation */ if (reqsize > COMMENT_OUTBUFSIZE) { #ifdef COMMENT_DEBUG @@ -88,30 +88,15 @@ static void comment_draw(t_comment *x) } else outbuf = buf; outp = outbuf; - if (x->x_encoding) - sprintf(outp, "set tt [comment_entext %s {%.*s}]\n", - x->x_encoding->s_name, x->x_textbufsize, x->x_textbuf); - else - sprintf(outp, "set tt {%.*s}\n", x->x_textbufsize, x->x_textbuf); - outp += strlen(outp); - sprintf(outp, ".x%x.c create text %f %f -text $tt \ - -tags {%s %s} -font {%s %d} -fill %s", cvid, + sprintf(outp, "comment_draw %s .x%x.c %s %s %f %f %s %d %s %s {%.*s} %d\n", + x->x_bindsym->s_name, cvid, x->x_texttag, x->x_tag, (float)(text_xpix((t_text *)x, x->x_glist) + COMMENT_LMARGIN), (float)(text_ypix((t_text *)x, x->x_glist) + COMMENT_TMARGIN), - x->x_texttag, x->x_tag, x->x_fontfamily->s_name, x->x_fontsize, + x->x_fontfamily->s_name, x->x_fontsize, (glist_isselected(x->x_glist, &x->x_glist->gl_gobj) ? - "blue" : x->x_color)); - outp += strlen(outp); - if (x->x_pixwidth) - sprintf(outp, " -width %d -anchor nw\n", x->x_pixwidth); - else - strcpy(outp, " -anchor nw\n"); - outp += strlen(outp); - sprintf(outp, "comment_bbox %s .x%x.c %s\n", - x->x_bindsym->s_name, cvid, x->x_texttag); - outp += strlen(outp); - sprintf(outp, ".x%x.c bind %s <Button> {comment_click %s %%W %%x %%y %s}\n", - cvid, x->x_texttag, x->x_bindsym->s_name, x->x_texttag); + "blue" : x->x_color), + (x->x_encoding ? x->x_encoding->s_name : "\"\""), + x->x_textbufsize, x->x_textbuf, x->x_pixwidth); x->x_bbpending = 1; sys_gui(outbuf); if (outbuf != buf) freebytes(outbuf, reqsize); @@ -132,17 +117,9 @@ static void comment_update(t_comment *x) } else outbuf = buf; outp = outbuf; - if (x->x_encoding) - sprintf(outp, "set tt [comment_entext %s {%.*s}]\n", - x->x_encoding->s_name, x->x_textbufsize, x->x_textbuf); - else - sprintf(outp, "set tt {%.*s}\n", x->x_textbufsize, x->x_textbuf); - outp += strlen(outp); - if (x->x_pixwidth) - sprintf(outp, ".x%x.c itemconfig %s -text $tt -width %d\n", - cvid, x->x_texttag, x->x_pixwidth); - else - sprintf(outp, ".x%x.c itemconfig %s -text $tt\n", cvid, x->x_texttag); + sprintf(outp, "comment_update .x%x.c %s %s {%.*s} %d\n", cvid, + x->x_texttag, (x->x_encoding ? x->x_encoding->s_name : "\"\""), + x->x_textbufsize, x->x_textbuf, x->x_pixwidth); outp += strlen(outp); if (x->x_active) { @@ -846,8 +823,24 @@ void comment_setup(void) /* LATER think how to conditionally (FORKY_VERSION >= 38) replace puts with pdtk_post */ sys_gui("proc comment_entext {enc tt} {\n\ - set rr [catch {encoding convertfrom $enc $tt} tt1]\n\ - if {$rr == 0} {concat $tt1} else {\n\ - puts stderr [concat tcl/tk error: $tt1]\n\ - concat $tt}}\n"); + if {$enc == \"\"} {concat $tt} else {\n\ + set rr [catch {encoding convertfrom $enc $tt} tt1]\n\ + if {$rr == 0} {concat $tt1} else {\n\ + puts stderr [concat tcl/tk error: $tt1]\n\ + concat $tt}}}\n"); + + sys_gui("proc comment_draw {tgt cv tag1 tag2 x y fnm fsz clr enc tt wd} {\n\ + set tt1 [comment_entext $enc $tt]\n\ + if {$wd > 0} {\n\ + $cv create text $x $y -text $tt1 -tags [list $tag1 $tag2] \ + -font [list $fnm $fsz] -fill $clr -width $wd -anchor nw} else {\n\ + $cv create text $x $y -text $tt1 -tags [list $tag1 $tag2] \ + -font [list $fnm $fsz] -fill $clr -anchor nw}\n\ + comment_bbox $tgt $cv $tag1\n\ + $cv bind $tag1 <Button> [list comment_click $tgt %W %x %y $tag1]}\n"); + + sys_gui("proc comment_update {cv tag enc tt wd} {\n\ + set tt1 [comment_entext $enc $tt]\n\ + if {$wd > 0} {$cv itemconfig $tag -text $tt1 -width $wd} else {\n\ + $cv itemconfig $tag -text $tt1}}\n"); } diff --git a/cyclone/hammer/seq.c b/cyclone/hammer/seq.c index 26027c0..38b0769 100644 --- a/cyclone/hammer/seq.c +++ b/cyclone/hammer/seq.c @@ -861,6 +861,7 @@ mfwritefailed: } /* CHECKED text file input: absolute timestamps, semi-terminated, verified */ +/* FIXME prevent loading .pd files... */ static int seq_fromatoms(t_seq *x, int ac, t_atom *av, int abstime) { int i, nevents = 0; diff --git a/cyclone/hammer/testmess.c b/cyclone/hammer/testmess.c index a6e8fe4..862e0f1 100644 --- a/cyclone/hammer/testmess.c +++ b/cyclone/hammer/testmess.c @@ -1,9 +1,15 @@ -/* Copyright (c) 2002-2003 krzYszcz and others. +/* Copyright (c) 2002-2005 krzYszcz and others. * For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. */ +#include <stdio.h> #include <string.h> #include "m_pd.h" +#include "unstable/fragile.h" + +#ifdef MSW +#define snprintf _snprintf +#endif #define TESTMESS_INISIZE 4 /* LATER rethink */ #define TESTMESS_STACKSIZE 256 @@ -183,49 +189,157 @@ static void testmess_anything(t_testmess *x, t_symbol *s, int ac, t_atom *av) x->x_messfun(x, s, ac, av); } -static void testmess_set(t_testmess *x, t_floatarg f1, t_floatarg f2) +static void testmess_setnumbers(t_testmess *x, int natoms, int start) { - int natoms = (int)f1; - if (natoms > 0 && testmess_makeroom(x, natoms * 2, 0)) + if (natoms <= 0) + natoms = 100; + if (testmess_makeroom(x, natoms * 2, 0)) { t_atom *ap; - int i = (int)f2;; testmess_setnatoms(x, natoms); ap = x->x_message; while (natoms--) { - SETFLOAT(ap, i); - i++; ap++; + SETFLOAT(ap, (t_float)start); + start++; ap++; } } } -static void testmess_free(t_testmess *x) +#define FRAGILE_HASHSIZE 1024 + +static int fragile_hash(t_symbol *s) { - if (x->x_messbuf != x->x_messini) - freebytes(x->x_messbuf, x->x_size * sizeof(*x->x_messbuf)); + unsigned int hash1 = 0, hash2 = 0; + char *ptr = s->s_name; + while (*ptr) + { + hash1 += *ptr++; + hash2 += hash1; + } + return (hash2 & (FRAGILE_HASHSIZE-1)); } -static void *testmess_new(t_symbol *s, t_floatarg f) +int fragile_symbol_count(void) { - t_testmess *x = (t_testmess *)pd_new(testmess_class); - x->x_appendmode = 1; - x->x_tailwise = 0; - if (s == gensym("stack")) - x->x_method = s, x->x_messfun = testmess_stackmess; - else if (s == gensym("heap")) - x->x_method = s, x->x_messfun = testmess_heapmess; + return (100); +} + +void fragile_getsymbols(t_atom *av) +{ + t_symbol *s = gensym("#N"); + int i; + for (i = 0, s -= fragile_hash(s); i < FRAGILE_HASHSIZE; i++, s++) + { + if (s->s_name) + { + t_symbol *s1; + for (s1 = s; s1; s1 = s1->s_next) + printf("%s\n", s1->s_name); + } + } +} + +static void testmess_setnames(t_testmess *x, t_symbol *s, + int natoms, int nchars) +{ + if (!s) + s = &s_; + if (*s->s_name == 'c') + { + natoms = fragile_class_count(); + if (natoms > 0 && testmess_makeroom(x, natoms * 2, 0)) + { + testmess_setnatoms(x, natoms); + fragile_class_getnames(x->x_message); + } + } + else + { + if (natoms <= 0) + natoms = 100; + if (nchars <= 0) + nchars = 10; + if (testmess_makeroom(x, natoms * 2, 0)) + { + char buf[MAXPDSTRING], fmt[16]; + int i = 0; + t_atom *ap; + testmess_setnatoms(x, natoms); + ap = x->x_message; + sprintf(fmt, "%%.%dx", nchars); + while (natoms--) + { + snprintf(buf, MAXPDSTRING-1, fmt, i); + SETSYMBOL(ap, gensym(buf)); + i++; ap++; + } + } + } +} + +static void testmess_set(t_testmess *x, t_symbol *s, int ac, t_atom *av) +{ + t_symbol *csym = 0, *msym = 0; + t_float f1 = 0., f2 = 0.; + if (ac) + { + if (av->a_type == A_SYMBOL) + csym = av->a_w.w_symbol; + else if (av->a_type == A_FLOAT) + f1 = av->a_w.w_float; + if (ac > 1) + { + if (av[1].a_type == A_SYMBOL) + msym = av[1].a_w.w_symbol; + else if (av[1].a_type == A_FLOAT) + { + if (csym) + f1 = av[1].a_w.w_float; + else + f2 = av[1].a_w.w_float; + if (ac > 2) + { + if (av[2].a_type == A_SYMBOL) + msym = av[2].a_w.w_symbol; + else if (csym && av[2].a_type == A_FLOAT) + f2 = av[2].a_w.w_float; + } + } + } + } + if (msym == gensym("stack")) + x->x_method = msym, x->x_messfun = testmess_stackmess; + else if (msym == gensym("heap")) + x->x_method = msym, x->x_messfun = testmess_heapmess; else { x->x_method = gensym("prealloc"); x->x_messfun = testmess_premess; x->x_tailwise = x->x_appendmode; } + testmess_setnatoms(x, 0); + if (csym) + testmess_setnames(x, csym, (int)f1, (int)f2); + else + testmess_setnumbers(x, (int)f1, (int)f2); +} + +static void testmess_free(t_testmess *x) +{ + if (x->x_messbuf != x->x_messini) + freebytes(x->x_messbuf, x->x_size * sizeof(*x->x_messbuf)); +} + +static void *testmess_new(t_symbol *s, int ac, t_atom *av) +{ + t_testmess *x = (t_testmess *)pd_new(testmess_class); + x->x_appendmode = 1; + x->x_tailwise = 0; x->x_size = TESTMESS_INISIZE; x->x_messbuf = x->x_messini; outlet_new((t_object *)x, &s_anything); - testmess_setnatoms(x, 0); - testmess_set(x, f, 0); + testmess_set(x, s, ac, av); return (x); } @@ -235,11 +349,11 @@ void testmess_setup(void) (t_newmethod)testmess_new, (t_method)testmess_free, sizeof(t_testmess), 0, - A_DEFFLOAT, A_DEFSYM, 0); + A_GIMME, 0); class_addbang(testmess_class, testmess_bang); class_addfloat(testmess_class, testmess_float); class_addsymbol(testmess_class, testmess_symbol); class_addanything(testmess_class, testmess_anything); class_addmethod(testmess_class, (t_method)testmess_set, - gensym("set"), A_FLOAT, A_DEFFLOAT, 0); + gensym("set"), A_GIMME, 0); } |