aboutsummaryrefslogtreecommitdiff
path: root/cyclone/hammer
diff options
context:
space:
mode:
authorN.N. <krzyszcz@users.sourceforge.net>2005-03-12 00:19:13 +0000
committerN.N. <krzyszcz@users.sourceforge.net>2005-03-12 00:19:13 +0000
commit3573488ef227bd7719eae892c72784cace95ffd4 (patch)
tree025299aeb3ad4574da705d836a396483cab229be /cyclone/hammer
parent1eef182b31a4cb2f55e26e7527469fc2902368a3 (diff)
cyclone alpha54 and toxy alpha16 (see notes.txt for cyclone, toxy and shared)
svn path=/trunk/externals/miXed/; revision=2618
Diffstat (limited to 'cyclone/hammer')
-rw-r--r--cyclone/hammer/comment.c69
-rw-r--r--cyclone/hammer/seq.c1
-rw-r--r--cyclone/hammer/testmess.c158
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);
}