aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile5
-rw-r--r--Makefile.common8
-rw-r--r--ViCious/cyclone/snapfiles7
-rw-r--r--bin/Append-help.pd4
-rw-r--r--bin/Clip-help.pd3
-rw-r--r--bin/Clip~-help.pd3
-rw-r--r--bin/Line~-help.pd10
-rw-r--r--bin/Scope~-help.pd4
-rw-r--r--bin/Snapshot~-help.pd8
-rw-r--r--bin/Table-help.pd11
-rw-r--r--bin/keepme1
-rw-r--r--bin/notes.txt14
-rw-r--r--cyclone/build_counter4
-rw-r--r--cyclone/cyclone-help.include7
-rw-r--r--cyclone/hammer/Table.c57
-rw-r--r--cyclone/hammer/capture.c8
-rw-r--r--cyclone/hammer/coll.c111
-rw-r--r--cyclone/hammer/prob.c3
-rw-r--r--cyclone/hammer/seq.c72
-rw-r--r--cyclone/notes.txt10
-rw-r--r--cyclone/sickle/capture.c7
-rw-r--r--cyclone/sickle/matrix.c30
-rw-r--r--shared/common/binport.c10
-rw-r--r--shared/hammer/file.c71
-rw-r--r--shared/hammer/file.h3
-rw-r--r--shared/notes.txt8
-rw-r--r--test/cyclone/matrix-test.pd10
-rw-r--r--toxy/tot.c2
-rw-r--r--toxy/toxy-help.include1
-rw-r--r--toxy/widget.c2
30 files changed, 375 insertions, 119 deletions
diff --git a/Makefile b/Makefile
index 86c1ce4..45d67c6 100644
--- a/Makefile
+++ b/Makefile
@@ -32,9 +32,12 @@ rootsnap:
do ( if [ -d $$i ] ; then tar -X $$i/$$i-test.exclude -rf \
$(ALLSRC_TAR) test/$$i/* ; fi ) ; done
@for i in $(RELEASE_DIRS) ; \
+ do ( if [ -d $$i ] ; then tar -T $$i/$$i-help.include -rf \
+ $(ALLSRC_TAR) ; fi ) ; done
+ @for i in $(RELEASE_DIRS) ; \
do ( if [ -d $$i ] ; then tar -X $$i/$$i-vicious.exclude -rf \
$(ALLSRC_TAR) ViCious/$$i/* ; fi ) ; done
- tar -rf $(ALLSRC_TAR) bin/keepme
+ tar -rf $(ALLSRC_TAR) bin/notes.txt
gzip -f $(ALLSRC_TAR)
fullsnap: snap rootsnap
diff --git a/Makefile.common b/Makefile.common
index 018a5ef..d106e40 100644
--- a/Makefile.common
+++ b/Makefile.common
@@ -308,9 +308,11 @@ stestrelease: emptydeps define_build
$(SRC_TAR)
cd $(ROOT_DIR); tar -X $(BASE_DIR)/$(BASE_NAME)-test.exclude -rf \
$(SRC_TAR) test/$(BASE_NAME)/*
+ cd $(ROOT_DIR); tar -T $(BASE_DIR)/$(BASE_NAME)-help.include -rf \
+ $(SRC_TAR)
+ cd $(ROOT_DIR); tar -rf $(SRC_TAR) bin/notes.txt
cd $(ROOT_DIR); tar -X $(BASE_DIR)/$(BASE_NAME)-vicious.exclude -rf \
$(SRC_TAR) ViCious/$(BASE_DIR)/*
- cd $(ROOT_DIR); tar -rf $(SRC_TAR) bin/keepme
cd $(ROOT_DIR); gzip -f $(SRC_TAR)
brelease: define_build
@@ -321,6 +323,8 @@ btestrelease: define_build
cd $(ROOT_DIR); tar -cf $(BIN_TAR) $(REL_EXTERNS)
cd $(ROOT_DIR); tar -X $(BASE_DIR)/$(BASE_NAME)-test.exclude -rf \
$(BIN_TAR) test/$(BASE_NAME)/*
+ cd $(ROOT_DIR); tar -T $(BASE_DIR)/$(BASE_NAME)-help.include -rf \
+ $(BIN_TAR)
cd $(ROOT_DIR); gzip -f $(BIN_TAR)
rellibs:
@@ -347,6 +351,8 @@ testrelease: stestrelease btestrelease
$(ALL_TAR)
cd $(ROOT_DIR); tar -X $(BASE_DIR)/$(BASE_NAME)-test.exclude -rf \
$(ALL_TAR) test/$(BASE_NAME)/*
+ cd $(ROOT_DIR); tar -T $(BASE_DIR)/$(BASE_NAME)-help.include -rf \
+ $(ALL_TAR)
cd $(ROOT_DIR); tar -X $(BASE_DIR)/$(BASE_NAME)-vicious.exclude -rf \
$(ALL_TAR) ViCious/$(BASE_DIR)/*
cd $(ROOT_DIR); gzip -f $(ALL_TAR)
diff --git a/ViCious/cyclone/snapfiles b/ViCious/cyclone/snapfiles
index d2b2a2f..dcc83e8 100644
--- a/ViCious/cyclone/snapfiles
+++ b/ViCious/cyclone/snapfiles
@@ -5,6 +5,13 @@ SNAPFILES = \
miXed\bin\dummies.dll \
miXed\bin\maxmode.dll \
miXed\bin\cyclist.exe \
+ miXed\bin\Append-help.pd \
+ miXed\bin\Clip-help.pd \
+ miXed\bin\Clip~-help.pd \
+ miXed\bin\Line~-help.pd \
+ miXed\bin\Scope~-help.pd \
+ miXed\bin\Snapshot~-help.pd \
+ miXed\bin\Table-help.pd \
miXed\ViCious\cyclone\makefile \
miXed\ViCious\cyclone\objects \
miXed\ViCious\cyclone\snapfiles \
diff --git a/bin/Append-help.pd b/bin/Append-help.pd
new file mode 100644
index 0000000..8f50c9a
--- /dev/null
+++ b/bin/Append-help.pd
@@ -0,0 +1,4 @@
+#N canvas 50 50 600 400 12;
+#X text 10 10 Append clone works on messages (arrays of atoms) \, unlike the;
+#X text 10 30 internal append of Pd \, which works on data structures (lists;
+#X text 10 50 of scalars).;
diff --git a/bin/Clip-help.pd b/bin/Clip-help.pd
new file mode 100644
index 0000000..70578ac
--- /dev/null
+++ b/bin/Clip-help.pd
@@ -0,0 +1,3 @@
+#N canvas 50 50 600 400 12;
+#X text 10 10 Clip clone \, unlike the clip built into Pd \, handles lists;
+#X text 10 30 of floats.;
diff --git a/bin/Clip~-help.pd b/bin/Clip~-help.pd
new file mode 100644
index 0000000..04e55a7
--- /dev/null
+++ b/bin/Clip~-help.pd
@@ -0,0 +1,3 @@
+#N canvas 50 50 600 400 12;
+#X text 10 10 Clip~ clone \, unlike the clip~ built into Pd \, accepts;
+#X text 10 30 signal input in range inlets for sample-accurate control.;
diff --git a/bin/Line~-help.pd b/bin/Line~-help.pd
new file mode 100644
index 0000000..5759c13
--- /dev/null
+++ b/bin/Line~-help.pd
@@ -0,0 +1,10 @@
+#N canvas 50 50 600 400 12;
+#X text 10 10 Line~ clone \, unlike the line~ built into Pd;
+#X text 10 30 .;
+#X text 30 30 accepts lists of unlimited size: schedules as many;
+#X text 30 50 segments as there are pairs of floats in the input \;;
+#X text 10 70 .;
+#X text 30 70 sample-accurately starts successive segments \;;
+#X text 10 90 .;
+#X text 30 90 when last target is reached \, sends a bang through;
+#X text 30 110 the right outlet.;
diff --git a/bin/Scope~-help.pd b/bin/Scope~-help.pd
new file mode 100644
index 0000000..2a5b28c
--- /dev/null
+++ b/bin/Scope~-help.pd
@@ -0,0 +1,4 @@
+#N canvas 50 50 600 400 12;
+#X text 10 10 Scope~ clone's main purpose is quick \, preliminary;
+#X text 10 30 verification of other tilde clones. One can run MSP;
+#X text 10 50 patches alongside their Pd imports and watch the scope~s.;
diff --git a/bin/Snapshot~-help.pd b/bin/Snapshot~-help.pd
new file mode 100644
index 0000000..f91d50c
--- /dev/null
+++ b/bin/Snapshot~-help.pd
@@ -0,0 +1,8 @@
+#N canvas 50 50 600 400 12;
+#X text 10 10 Snapshot~ clone \, unlike the snapshot~ built into Pd;
+#X text 10 30 .;
+#X text 30 30 optionally replaces external triggering source with an;
+#X text 30 50 internal clock \;;
+#X text 10 70 .;
+#X text 30 70 reports value of an element at a settable offset in the;
+#X text 30 90 signal vector.;
diff --git a/bin/Table-help.pd b/bin/Table-help.pd
new file mode 100644
index 0000000..a73ea93
--- /dev/null
+++ b/bin/Table-help.pd
@@ -0,0 +1,11 @@
+#N canvas 50 50 600 400 12;
+#X text 10 10 Table clone's main purpose is sucking data from tables;
+#X text 10 30 embedded in Max patches.;
+#X text 10 90 Nevertheless \, most table features are supported: changing;
+#X text 10 110 size and contents \, traversal \, file i/o \, all queries;
+#X text 10 130 (including 'quantile' and 'bang') and dumping.;
+#X text 10 160 Tables with the same name share the same contents.;
+#X text 10 220 Table elements are 32-bit integers \, although some operations;
+#X text 10 240 (like embedding and editing) lose precision due to the;
+#X text 10 260 unavoidable int-to-float conversion.;
+#X text 10 290 Editing is textual \, not graphical.;
diff --git a/bin/keepme b/bin/keepme
deleted file mode 100644
index 8b13789..0000000
--- a/bin/keepme
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/bin/notes.txt b/bin/notes.txt
new file mode 100644
index 0000000..a12f918
--- /dev/null
+++ b/bin/notes.txt
@@ -0,0 +1,14 @@
+Keeping help files and binaries in the same directory ensures opening
+proper patches for clashing clones on crippled file systems.
+
+TODO for help files
+ * simple guide into importing
+ * describe compatibility mode
+ * detailed notes for any clone with incompatibilities
+
+DONE for help files
+
+with cyclone alpha53
+ * short notes about main differences between clashing clones (Append,
+ Clip, Clip~, Line~, Scope~, Snapshot~, Table) and the corresponding
+ internal Pd classes.
diff --git a/cyclone/build_counter b/cyclone/build_counter
index 55027b1..a0a93b7 100644
--- a/cyclone/build_counter
+++ b/cyclone/build_counter
@@ -1,7 +1,7 @@
#define CYCLONE_VERSION "0.1"
#define CYCLONE_RELEASE "alpha"
-#define CYCLONE_BUILD 52
+#define CYCLONE_BUILD 53
#if 0
-CYCLONE_SNAPSHOT = 0.1-alpha52
+CYCLONE_SNAPSHOT = 0.1-alpha53
#endif
diff --git a/cyclone/cyclone-help.include b/cyclone/cyclone-help.include
new file mode 100644
index 0000000..549df46
--- /dev/null
+++ b/cyclone/cyclone-help.include
@@ -0,0 +1,7 @@
+bin/Append-help.pd
+bin/Clip-help.pd
+bin/Clip~-help.pd
+bin/Line~-help.pd
+bin/Scope~-help.pd
+bin/Snapshot~-help.pd
+bin/Table-help.pd
diff --git a/cyclone/hammer/Table.c b/cyclone/hammer/Table.c
index a120f13..00043f0 100644
--- a/cyclone/hammer/Table.c
+++ b/cyclone/hammer/Table.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2004 krzYszcz and others.
+/* Copyright (c) 2004-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. */
@@ -225,10 +225,48 @@ static int tablecommon_quantile(t_tablecommon *cc, float f)
return (ndx);
}
+static void tablecommon_fromatoms(t_tablecommon *cc, int ac, t_atom *av)
+{
+ int i, size = 0, nsyms = 0;
+ t_atom *ap;
+ int *ptr;
+ cc->c_increation = 1;
+ for (i = 0, ap = av; i < ac; i++, ap++)
+ {
+ if (ap->a_type == A_FLOAT)
+ size++;
+ else if (ap->a_type == A_SYMBOL)
+ nsyms++, size++;
+ }
+ if (size < ac)
+ loud_warning(0, "Table", "%d invalid atom%s ignored",
+ ac - size, (ac - size > 1 ? "s" : ""));
+ if (nsyms)
+ loud_warning(0, "Table", "%d symbol%s bashed to zero",
+ nsyms, (nsyms > 1 ? "s" : ""));
+ tablecommon_setlength(cc, size);
+ size = cc->c_length;
+ ptr = cc->c_table;
+ for (i = 0; i < ac; i++, av++)
+ {
+ if (av->a_type == A_FLOAT)
+ *ptr++ = (int)av->a_w.w_float;
+ else if (av->a_type == A_SYMBOL)
+ *ptr++ = 0;
+ else
+ continue;
+ if (size-- == 1)
+ break;
+ }
+ while (size--)
+ *ptr++ = 0;
+ cc->c_increation = 0;
+}
+
+/* FIXME keep int precision: save/load directly, not through a bb */
/* LATER binary files */
static void tablecommon_doread(t_tablecommon *cc, t_symbol *fn, t_canvas *cv)
{
- /* FIXME */
t_binbuf *bb = binbuf_new();
int ac;
t_atom *av;
@@ -249,8 +287,8 @@ static void tablecommon_doread(t_tablecommon *cc, t_symbol *fn, t_canvas *cv)
av->a_type == A_SYMBOL &&
av->a_w.w_symbol == gensym("table"))
{
+ tablecommon_fromatoms(cc, ac - 1, av + 1);
post("Table: %s read successful", fn->s_name); /* CHECKME */
- /* FIXME */
}
#if 0 /* FIXME */
else /* CHECKME complaint */
@@ -325,7 +363,7 @@ static void table_embedhook(t_pd *z, t_binbuf *bb, t_symbol *bindsym)
static void tablecommon_editorhook(t_pd *z, t_symbol *s, int ac, t_atom *av)
{
- /* FIXME */
+ tablecommon_fromatoms((t_tablecommon *)z, ac, av);
}
static void tablecommon_free(t_tablecommon *cc)
@@ -754,7 +792,7 @@ static int tablecommon_editorappend(t_tablecommon *cc,
*bp++ = ' ', cnt++;
cnt += sprintf(bp, "%d", v);
if (col + cnt > 80)
- buf[0] = '\n', col = cnt;
+ buf[0] = '\n', col = cnt - 1; /* assuming col > 0 */
else
col += cnt;
hammereditor_append(cc->c_filehandle, buf);
@@ -763,22 +801,19 @@ static int tablecommon_editorappend(t_tablecommon *cc,
static void table_open(t_table *x)
{
- /* FIXME */
t_tablecommon *cc = x->x_common;
char buf[MAXPDSTRING];
int *bp = cc->c_table;
int count = cc->c_length, col = 0;
- /* LATER prepend "table: " */
- hammereditor_open(cc->c_filehandle,
- /* CHECKED default name is plain `Untitled' */
- x->x_name ? x->x_name->s_name : "Untitled");
+ hammereditor_open(cc->c_filehandle, (x->x_name ? x->x_name->s_name : 0), 0);
while (count--)
col = tablecommon_editorappend(cc, *bp++, buf, col);
+ hammereditor_setdirty(cc->c_filehandle, 0);
}
static void table_wclose(t_table *x)
{
- /* FIXME */
+ hammereditor_close(x->x_common->c_filehandle, 1);
}
static void table_click(t_table *x, t_floatarg xpos, t_floatarg ypos,
diff --git a/cyclone/hammer/capture.c b/cyclone/hammer/capture.c
index b36c421..7598a59 100644
--- a/cyclone/hammer/capture.c
+++ b/cyclone/hammer/capture.c
@@ -1,4 +1,4 @@
-/* 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. */
@@ -87,7 +87,7 @@ static int capture_formatint(int i, char *buf, int col,
*bp++ = ' ', cnt++;
cnt += sprintf(bp, fmt, i);
if (col + cnt > maxcol)
- buf[0] = '\n', col = cnt;
+ buf[0] = '\n', col = cnt - 1; /* assuming col > 0 */
else
col += cnt;
return (col);
@@ -102,7 +102,7 @@ static int capture_formatfloat(float f, char *buf, int col,
*bp++ = ' ', cnt++;
cnt += sprintf(bp, fmt, f);
if (col + cnt > maxcol)
- buf[0] = '\n', col = cnt;
+ buf[0] = '\n', col = cnt - 1; /* assuming col > 0 */
else
col += cnt;
return (col);
@@ -194,7 +194,7 @@ static void capture_open(t_capture *x)
{
int count = x->x_count;
char buf[MAXPDSTRING];
- hammereditor_open(x->x_filehandle, "t_capture"); /* CHECKED */
+ hammereditor_open(x->x_filehandle, "Capture", ""); /* CHECKED */
if (count < x->x_bufsize)
{
float *bp = x->x_buffer;
diff --git a/cyclone/hammer/coll.c b/cyclone/hammer/coll.c
index a0644c8..fc81b30 100644
--- a/cyclone/hammer/coll.c
+++ b/cyclone/hammer/coll.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. */
@@ -9,10 +9,8 @@
#include "common/loud.h"
#include "hammer/file.h"
-/* FIXME sort -1 -1, sort 1 crashes in pd large */
-/* FIXME sort crashes after (corrupt?) transfers from the editor */
+/* LATER profile for the bottlenecks of insertion and sorting */
/* LATER make sure that ``reentrancy protection hack'' is really working... */
-/* CHECKME default fname for 'write' -- c_filename, x_name, nothing? */
#ifdef KRZYSZCZ
//#define COLL_DEBUG
@@ -42,7 +40,7 @@ typedef struct _collcommon
int c_selfmodified;
int c_entered; /* a counter, LATER rethink */
int c_embedflag; /* common field (CHECKED in 'TEXT' files) */
- t_symbol *c_filename;
+ t_symbol *c_filename; /* CHECKED common for all, read and write */
t_canvas *c_lastcanvas;
t_hammerfile *c_filehandle;
t_collelem *c_first;
@@ -98,20 +96,27 @@ static void collelem_free(t_collelem *ep)
}
/* CHECKME again... apparently c74 is not able to fix this for good */
-/* result: 1 for ep1 < ep2, otherwise 0 (symbols are less then floats) */
-static int collelem_less(t_collelem *ep1, t_collelem *ep2, int ndx)
+/* result: 1 for ep1 < ep2, 0 for ep1 >= ep2, all symbols are < any float */
+static int collelem_less(t_collelem *ep1, t_collelem *ep2, int ndx, int swap)
{
+ int isless;
+ if (swap)
+ {
+ t_collelem *ep = ep1;
+ ep1 = ep2;
+ ep2 = ep;
+ }
if (ndx < 0)
{
if (ep1->e_symkey)
- return (ep2->e_symkey ?
- strcmp(ep1->e_symkey->s_name,
- ep2->e_symkey->s_name) < 0
- : 1); /* CHECKED incompatible with 4.07, but consistent */
+ isless =
+ (ep2->e_symkey ? strcmp(ep1->e_symkey->s_name,
+ ep2->e_symkey->s_name) < 0
+ : 1); /* CHECKED incompatible with 4.07, but consistent */
else if (ep2->e_symkey)
- return (0); /* CHECKED incompatible with 4.07, but consistent */
+ isless = 0; /* CHECKED incompatible with 4.07, but consistent */
else
- return (ep1->e_numkey < ep2->e_numkey); /* CHECKED in 4.07 */
+ isless = (ep1->e_numkey < ep2->e_numkey); /* CHECKED in 4.07 */
}
else
{
@@ -122,25 +127,25 @@ static int collelem_less(t_collelem *ep1, t_collelem *ep2, int ndx)
if (ap1->a_type == A_FLOAT)
{
if (ap2->a_type == A_FLOAT)
- return (ap1->a_w.w_float < ap2->a_w.w_float);
+ isless = (ap1->a_w.w_float < ap2->a_w.w_float);
else if (ap2->a_type == A_SYMBOL)
- return (0);
+ isless = 0;
else
- return (1);
+ isless = 1;
}
else if (ap1->a_type == A_SYMBOL)
{
if (ap2->a_type == A_FLOAT)
- return (1);
+ isless = 1;
else if (ap2->a_type == A_SYMBOL)
- return (strcmp(ap1->a_w.w_symbol->s_name,
- ap2->a_w.w_symbol->s_name) < 0);
+ isless = (strcmp(ap1->a_w.w_symbol->s_name,
+ ap2->a_w.w_symbol->s_name) < 0);
else
- return (1);
+ isless = 1;
}
- else
- return (0);
+ else isless = 0;
}
+ return (isless);
}
static t_collelem *collcommon_numkey(t_collcommon *cc, int numkey)
@@ -379,10 +384,10 @@ static void collcommon_renumber(t_collcommon *cc, int startkey)
}
/* LATER choose a better algo, after coll's storage structures stabilize.
- Note, that even the simple insertion sort below (n-square) might prove
- better for dlls, than theoretically efficient algo (nlogn) which requires
+ Note, that even the simple insertion sort below (n-square) might prove better
+ for bi-directional lists, than theoretically efficient algo (nlogn) requiring
random access emulation. Avoiding recursion is not a bad idea, too. */
-static void collcommon_sort(t_collcommon *cc, int asc, int ndx)
+static void collcommon_sort(t_collcommon *cc, int descending, int ndx)
{
t_collelem *min = cc->c_first;
t_collelem *ep;
@@ -391,7 +396,8 @@ static void collcommon_sort(t_collcommon *cc, int asc, int ndx)
cc->c_increation = 1;
/* search for a sentinel element */
do
- if (collelem_less(ep, min, ndx) == asc) min = ep;
+ if (collelem_less(ep, min, ndx, descending))
+ min = ep;
while (ep = ep->e_next);
/* prepend it */
collcommon_swaplinks(cc, cc->c_first, min);
@@ -401,9 +407,12 @@ static void collcommon_sort(t_collcommon *cc, int asc, int ndx)
{
t_collelem *next = ep->e_next;
for (min = ep->e_prev;
- collelem_less(ep, min, ndx) == asc;
+ min && /* LATER remove */
+ collelem_less(ep, min, ndx, descending);
min = min->e_prev);
- if (ep != min->e_next)
+ if (!min) /* LATER remove */
+ loudbug_bug("collcommon_sort");
+ else if (ep != min->e_next)
{
collcommon_takeout(cc, ep);
collcommon_putafter(cc, ep, min);
@@ -457,12 +466,17 @@ static t_collelem *collcommon_tonumkey(t_collcommon *cc, int numkey,
{
collcommon_putbefore(cc, new, old);
do
- if (old->e_hasnumkey) old->e_numkey++; /* LATER rethink */
+ if (old->e_hasnumkey)
+ /* CHECKED incremented up to the last one; incompatible:
+ elements with numkey == 0 not incremented (a bug?) */
+ old->e_numkey++;
while (old = old->e_next);
}
else
{
- int closestkey = 0; /* LATER rethink */
+ /* CHECKED negative numkey always put before the last element,
+ zero numkey always becomes the new head */
+ int closestkey = 0;
t_collelem *closest = 0, *ep;
for (ep = cc->c_first; ep; ep = ep->e_next)
{
@@ -501,7 +515,7 @@ static t_collelem *collcommon_tosymkey(t_collcommon *cc, t_symbol *symkey,
return (new);
}
-static int collcommon_fromlist(t_collcommon *cc, int ac, t_atom *av)
+static int collcommon_fromatoms(t_collcommon *cc, int ac, t_atom *av)
{
int hasnumkey = 0, numkey;
t_symbol *symkey = 0;
@@ -565,7 +579,7 @@ static int collcommon_fromlist(t_collcommon *cc, int ac, t_atom *av)
static int collcommon_frombinbuf(t_collcommon *cc, t_binbuf *bb)
{
- return (collcommon_fromlist(cc, binbuf_getnatom(bb), binbuf_getvec(bb)));
+ return (collcommon_fromatoms(cc, binbuf_getnatom(bb), binbuf_getvec(bb)));
}
static void collcommon_doread(t_collcommon *cc, t_symbol *fn, t_canvas *cv)
@@ -730,7 +744,7 @@ static void coll_embedhook(t_pd *z, t_binbuf *bb, t_symbol *bindsym)
static void collcommon_editorhook(t_pd *z, t_symbol *s, int ac, t_atom *av)
{
- int nlines = collcommon_fromlist((t_collcommon *)z, ac, av);
+ int nlines = collcommon_fromatoms((t_collcommon *)z, ac, av);
if (nlines < 0)
loud_error(0, "coll: editing error in line %d", 1 - nlines);
}
@@ -1169,7 +1183,7 @@ static void coll_sort(t_coll *x, t_floatarg f1, t_floatarg f2)
int dir, ndx;
if (loud_checkint((t_pd *)x, f1, &dir, gensym("sort")) &&
loud_checkint((t_pd *)x, f2, &ndx, gensym("sort")))
- collcommon_sort(x->x_common, (dir < 0 ? 1 : 0),
+ collcommon_sort(x->x_common, (dir < 0 ? 0 : 1),
(ndx < 0 ? -1 : (ndx ? ndx - 1 : 0)));
}
@@ -1298,9 +1312,12 @@ static void coll_min(t_coll *x, t_floatarg f)
if (loud_checkint((t_pd *)x, f, &ndx, gensym("min")))
{
t_collelem *found;
- if (ndx <= 0)
- ndx = 0; /* LATER consider complaining, CHECKME */
- else ndx--;
+ if (ndx > 0)
+ ndx--;
+ /* LATER consider complaining: */
+ else if (ndx < 0)
+ return; /* CHECKED silently rejected */
+ /* else CHECKED silently defaults to 1 */
if (found = coll_firsttyped(x, ndx, A_FLOAT))
{
t_float result = found->e_data[ndx].a_w.w_float;
@@ -1327,9 +1344,12 @@ static void coll_max(t_coll *x, t_floatarg f)
if (loud_checkint((t_pd *)x, f, &ndx, gensym("max")))
{
t_collelem *found;
- if (ndx <= 0)
- ndx = 0; /* LATER consider complaining, CHECKME */
- else ndx--;
+ if (ndx > 0)
+ ndx--;
+ /* LATER consider complaining: */
+ else if (ndx < 0)
+ return; /* CHECKED silently rejected */
+ /* else CHECKED silently defaults to 1 */
if (found = coll_firsttyped(x, ndx, A_FLOAT))
{
t_float result = found->e_data[ndx].a_w.w_float;
@@ -1383,7 +1403,7 @@ static void coll_write(t_coll *x, t_symbol *s)
if (s && s != &s_)
collcommon_dowrite(cc, s, x->x_canvas);
else
- hammerpanel_save(cc->c_filehandle, 0, 0); /* CHECKME default name */
+ hammerpanel_save(cc->c_filehandle, 0, 0); /* CHECKED no default name */
}
static void coll_readagain(t_coll *x)
@@ -1401,7 +1421,7 @@ static void coll_writeagain(t_coll *x)
if (cc->c_filename)
collcommon_dowrite(cc, 0, 0);
else
- hammerpanel_save(cc->c_filehandle, 0, 0); /* CHECKME default name */
+ hammerpanel_save(cc->c_filehandle, 0, 0); /* CHECKED no default name */
}
static void coll_filetype(t_coll *x, t_symbol *s)
@@ -1431,9 +1451,8 @@ static void coll_open(t_coll *x)
int i, natoms, newline;
t_atom *ap;
char buf[MAXPDSTRING];
- /* LATER prepend "coll: " */
hammereditor_open(cc->c_filehandle,
- x->x_name ? x->x_name->s_name : "Untitled");
+ (x->x_name ? x->x_name->s_name : "Untitled"), "coll");
collcommon_tobinbuf(cc, bb);
natoms = binbuf_getnatom(bb);
ap = binbuf_getvec(bb);
@@ -1453,10 +1472,12 @@ static void coll_open(t_coll *x)
hammereditor_append(cc->c_filehandle, buf);
ap++;
}
+ hammereditor_setdirty(cc->c_filehandle, 0);
binbuf_free(bb);
}
-/* asking and storing the changes -- CHECKME close window, and 'wclose' */
+/* CHECKED if there was any editing, both close window and 'wclose'
+ ask and replace the contents. LATER debug. */
static void coll_wclose(t_coll *x)
{
hammereditor_close(x->x_common->c_filehandle, 1);
diff --git a/cyclone/hammer/prob.c b/cyclone/hammer/prob.c
index 2794858..83960eb 100644
--- a/cyclone/hammer/prob.c
+++ b/cyclone/hammer/prob.c
@@ -244,12 +244,13 @@ static void prob__silent(t_prob *x)
}
}
+/* CHECKED not available, LATER full editing */
static void prob_click(t_prob *x, t_floatarg xpos, t_floatarg ypos,
t_floatarg shift, t_floatarg ctrl, t_floatarg alt)
{
t_probtrans *state;
char buf[64];
- hammereditor_open(x->x_filehandle, "prob");
+ hammereditor_open(x->x_filehandle, 0, 0);
for (state = x->x_translist; state; state = state->tr_nextstate)
{
t_probtrans *trans;
diff --git a/cyclone/hammer/seq.c b/cyclone/hammer/seq.c
index 030a7ab..26027c0 100644
--- a/cyclone/hammer/seq.c
+++ b/cyclone/hammer/seq.c
@@ -860,26 +860,22 @@ mfwritefailed:
return (result);
}
-/* FIXME */
-/* CHECKED absolute timestamps, semi-terminated, verified */
-static int seq_frombinbuf(t_seq *x, t_binbuf *bb)
+/* CHECKED text file input: absolute timestamps, semi-terminated, verified */
+static int seq_fromatoms(t_seq *x, int ac, t_atom *av, int abstime)
{
- int nevents = 0;
- int ac = binbuf_getnatom(bb);
- t_atom *av = binbuf_getvec(bb);
- while (ac--)
- if (av++->a_type == A_SEMI) /* FIXME parsing */
+ int i, nevents = 0;
+ t_atom *ap;
+ for (i = 0, ap = av; i < ac; i++, ap++)
+ if (ap->a_type == A_SEMI) /* FIXME parsing */
nevents++;
if (nevents)
{
t_seqevent *ep;
float prevtime = 0;
- int i = -1;
if (!seq_dogrowing(x, nevents, 0))
return (0);
+ i = -1;
nevents = 0;
- ac = binbuf_getnatom(bb);
- av = binbuf_getvec(bb);
ep = x->x_sequence;
while (ac--)
{
@@ -887,8 +883,12 @@ static int seq_frombinbuf(t_seq *x, t_binbuf *bb)
{
if (i < 0)
{
- ep->e_delta = av->a_w.w_float - prevtime;
- prevtime = av->a_w.w_float;
+ if (abstime)
+ {
+ ep->e_delta = av->a_w.w_float - prevtime;
+ prevtime = av->a_w.w_float;
+ }
+ else ep->e_delta = av->a_w.w_float;
i = 0;
}
else if (i < 4)
@@ -945,7 +945,8 @@ static void seq_textread(t_seq *x, char *path)
}
else
{
- int nlines = seq_frombinbuf(x, bb);
+ int nlines = /* CHECKED absolute timestamps */
+ seq_fromatoms(x, binbuf_getnatom(bb), binbuf_getvec(bb), 1);
if (nlines < 0)
/* CHECKED "bad MIDI file (truncated)" alert, even if a text file */
loud_error((t_pd *)x, "bad text file (truncated)");
@@ -1047,11 +1048,13 @@ static void seq_write(t_seq *x, t_symbol *s)
canvas_getdir(x->x_canvas), x->x_defname);
}
-static void seq_eventstring(t_seq *x, char *buf, t_seqevent *ep)
+static void seq_eventstring(t_seq *x, char *buf, t_seqevent *ep, int editable)
{
unsigned char *bp = ep->e_bytes;
int i;
- if (*bp < 128 || *bp == 247)
+ if (editable)
+ sprintf(buf, "%g", ep->e_delta);
+ else if (*bp < 128 || *bp == 247)
sprintf(buf, "(%g)->", ep->e_delta);
else
sprintf(buf, "(%g)", ep->e_delta);
@@ -1079,9 +1082,8 @@ static void seq_print(t_seq *x)
truncated = 0;
endpost();
while (nevents--)
- {
- /* CHECKED bytes are space-separated, no semi */
- seq_eventstring(x, buf, ep);
+ { /* CHECKED bytes are space-separated, no semi */
+ seq_eventstring(x, buf, ep, 0);
post(buf);
ep++;
}
@@ -1090,22 +1092,28 @@ static void seq_print(t_seq *x)
else post(" no sequence"); /* CHECKED */
}
-static void seq_properties(t_gobj *z, t_glist *glist)
+static void seq_editorhook(t_pd *z, t_symbol *s, int ac, t_atom *av)
+{
+ seq_fromatoms((t_seq *)z, ac, av, 0);
+}
+
+static void seq_click(t_seq *x, t_floatarg xpos, t_floatarg ypos,
+ t_floatarg shift, t_floatarg ctrl, t_floatarg alt)
{
- t_seq *x = (t_seq *)z;
t_seqevent *ep = x->x_sequence;
int nevents = x->x_nevents;
char buf[MAXPDSTRING+2];
- sprintf(buf, "seq: %s", (x->x_defname && x->x_defname != &s_ ?
- x->x_defname->s_name : "<anonymous>"));
- hammereditor_open(x->x_filehandle, buf);
+ hammereditor_open(x->x_filehandle,
+ (x->x_defname && x->x_defname != &s_ ?
+ x->x_defname->s_name : "<anonymous>"), 0);
while (nevents--)
- {
- seq_eventstring(x, buf, ep);
- strcat(buf, "\n");
+ { /* LATER rethink sysex continuation */
+ seq_eventstring(x, buf, ep, 1);
+ strcat(buf, ";\n");
hammereditor_append(x->x_filehandle, buf);
ep++;
}
+ hammereditor_setdirty(x->x_filehandle, 0);
}
static void seq_free(t_seq *x)
@@ -1129,8 +1137,8 @@ static void *seq_new(t_symbol *s)
warned = 1;
}
x->x_canvas = canvas_getcurrent();
- x->x_filehandle = hammerfile_new((t_pd *)x, 0,
- seq_readhook, seq_writehook, 0);
+ x->x_filehandle = hammerfile_new((t_pd *)x, 0, seq_readhook, seq_writehook,
+ seq_editorhook);
x->x_timescale = 1.;
x->x_newtimescale = 1.;
x->x_prevtime = 0.;
@@ -1188,6 +1196,7 @@ void seq_setup(void)
class_addmethod(seq_class, (t_method)seq_print,
gensym("print"), 0);
+ /* incompatible extensions */
class_addmethod(seq_class, (t_method)seq_pause,
gensym("pause"), 0);
class_addmethod(seq_class, (t_method)seq_continue,
@@ -1200,8 +1209,9 @@ void seq_setup(void)
gensym("cd"), A_DEFSYM, 0);
class_addmethod(seq_class, (t_method)seq_pwd,
gensym("pwd"), A_SYMBOL, 0);
-
- forky_setpropertiesfn(seq_class, seq_properties);
+ class_addmethod(seq_class, (t_method)seq_click,
+ gensym("click"),
+ A_FLOAT, A_FLOAT, A_FLOAT, A_FLOAT, A_FLOAT, 0);
hammerfile_setup(seq_class, 0);
fitter_setup(seq_class, 0);
}
diff --git a/cyclone/notes.txt b/cyclone/notes.txt
index 6f83d33..8b93d15 100644
--- a/cyclone/notes.txt
+++ b/cyclone/notes.txt
@@ -5,6 +5,16 @@ TODO for cyclone
DONE for cyclone
+alpha53
+ * matrix~: incompatible message 'set'
+ * coll:
+ . fixed descending order of 'sort' (a leaking sentinel bug)
+ . ignoring negative indices in 'min' and 'max'
+ . editor fixes (close by wm, dirty flag, title)
+ * Table: reading from file, reading from editor, editor fixes
+ * seq: editor fixes, editor bound to click (should bind to "open" too...)
+ * prob, capture, capture~: viewer fixes
+
alpha52
* compatibility mode interface in maxmode object:
messages 'set', 'get' (reply through the second outlet)
diff --git a/cyclone/sickle/capture.c b/cyclone/sickle/capture.c
index 089c21e..8f8f5a0 100644
--- a/cyclone/sickle/capture.c
+++ b/cyclone/sickle/capture.c
@@ -1,4 +1,4 @@
-/* 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. */
@@ -54,7 +54,7 @@ static int capture_formatfloat(t_capture *x, float f, char *buf, int col,
else
cnt += sprintf(bp, "%d", (int)f);
if (col + cnt > maxcol)
- buf[0] = '\n', col = cnt;
+ buf[0] = '\n', col = cnt - 1; /* assuming col > 0 */
else
col += cnt;
return (col);
@@ -144,7 +144,7 @@ static void capture_open(t_capture *x)
int count = x->x_count;
char buf[MAXPDSTRING];
int nindices = (x->x_nindices > 0 ? x->x_nindices : x->x_nblock);
- hammereditor_open(x->x_filehandle, "Signal Capture"); /* CHECKED */
+ hammereditor_open(x->x_filehandle, "Signal Capture", ""); /* CHECKED */
if (x->x_mode == 'f' || count < x->x_bufsize)
{
float *bp = x->x_buffer;
@@ -169,6 +169,7 @@ static void capture_open(t_capture *x)
}
}
+/* CHECKED without asking and storing the changes */
static void capture_wclose(t_capture *x)
{
hammereditor_close(x->x_filehandle, 0);
diff --git a/cyclone/sickle/matrix.c b/cyclone/sickle/matrix.c
index a0772dc..a1c1ef4 100644
--- a/cyclone/sickle/matrix.c
+++ b/cyclone/sickle/matrix.c
@@ -9,7 +9,7 @@
#include "sickle/sic.h"
#ifdef KRZYSZCZ
-#define MATRIX_DEBUG
+//#define MATRIX_DEBUG
#endif
#define MATRIX_DEFGAIN 0. /* CHECKED */
@@ -124,6 +124,32 @@ static void matrix_clear(t_matrix *x)
x->x_cells[i] = 0;
}
+static void matrix_set(t_matrix *x, t_floatarg f1, t_floatarg f2)
+{
+ int i, onoff;
+ float gain = f1;
+ static int warned = 0;
+ if (fittermax_get() && !warned)
+ {
+ fittermax_warning(*(t_pd *)x, "'set' not supported in Max");
+ warned = 1;
+ }
+ onoff = (gain < -MATRIX_GAINEPSILON || gain > MATRIX_GAINEPSILON);
+ for (i = 0; i < x->x_ncells; i++)
+ x->x_cells[i] = onoff;
+ if (x->x_gains)
+ {
+ float ramp = (f2 < MATRIX_MINRAMP ? 0. : f2);
+ for (i = 0; i < x->x_ncells; i++)
+ {
+ if (onoff) /* LATER rethink */
+ x->x_gains[i] = gain;
+ x->x_ramps[i] = ramp;
+ matrix_retarget(x, i);
+ }
+ }
+}
+
/* CHECKED c74's refman and help patch are wrong about int pairs --
the actual syntax is "[dis]connect indx ondx1 [ondx2 [ondx3..." */
static void matrix_connect(t_matrix *x, t_symbol *s, int ac, t_atom *av)
@@ -543,6 +569,8 @@ void matrix_tilde_setup(void)
class_addlist(matrix_class, matrix_list);
class_addmethod(matrix_class, (t_method)matrix_clear,
gensym("clear"), 0);
+ class_addmethod(matrix_class, (t_method)matrix_set,
+ gensym("set"), A_FLOAT, A_DEFFLOAT, 0);
class_addmethod(matrix_class, (t_method)matrix_connect,
gensym("connect"), A_GIMME, 0);
class_addmethod(matrix_class, (t_method)matrix_connect,
diff --git a/shared/common/binport.c b/shared/common/binport.c
index 1df9571..90cf251 100644
--- a/shared/common/binport.c
+++ b/shared/common/binport.c
@@ -96,6 +96,7 @@ enum {
BINPORT_NULLTYPE,
BINPORT_INTTYPE = 1, BINPORT_FLOATTYPE, BINPORT_SYMTYPE,
BINPORT_DEFINTTYPE = 5, BINPORT_DEFFLOATTYPE, BINPORT_DEFSYMTYPE,
+ BINPORT_DEFDOLLSYMTYPE = 9,
BINPORT_SEMITYPE = 10, BINPORT_COMMATYPE,
BINPORT_DOLLARTYPE, BINPORT_DOLLSYMTYPE
};
@@ -535,6 +536,15 @@ static int binport_nextatom(t_binport *bp, t_atom *ap)
if (!binport_setbysymtable(bp, ap, opval))
goto badbin;
break;
+ case BINPORT_DEFDOLLSYMTYPE: /* half-byte #symbol id */
+ if (!binport_setbysymtable(bp, ap, opval))
+ goto badbin;
+ sprintf(buf, "#%s", ap->a_w.w_symbol->s_name);
+#ifdef BINPORT_DEBUG
+ binport_warning(buf);
+#endif
+ ap->a_w.w_symbol = gensym(buf);
+ break;
case BINPORT_SEMITYPE:
/* LATER warn about nonzero opval */
ap->a_type = A_SEMI;
diff --git a/shared/hammer/file.c b/shared/hammer/file.c
index ecb5006..c671946 100644
--- a/shared/hammer/file.c
+++ b/shared/hammer/file.c
@@ -58,17 +58,20 @@ static t_hammerfile *hammerfile_getproxy(t_pd *master)
return (0);
}
-/* FIXME somehow plug the "save changes" dialog into close-by-wm */
-/* FIXME dirty condition */
static void hammereditor_guidefs(void)
{
- sys_gui("proc hammereditor_open {name geometry title} {\n");
+ sys_gui("proc hammereditor_open {name geometry title sendable} {\n");
sys_gui(" if {[winfo exists $name]} {\n");
sys_gui(" $name.text delete 1.0 end\n");
sys_gui(" } else {\n");
sys_gui(" toplevel $name\n");
sys_gui(" wm title $name $title\n");
sys_gui(" wm geometry $name $geometry\n");
+ sys_gui(" if {$sendable} {\n");
+ sys_gui(" wm protocol $name WM_DELETE_WINDOW \\\n");
+ sys_gui(" [concat hammereditor_close $name 1]\n");
+ sys_gui(" bind $name <<Modified>> \"hammereditor_dodirty $name\"\n");
+ sys_gui(" }\n");
sys_gui(" text $name.text -relief raised -bd 2 \\\n");
sys_gui(" -font -*-courier-medium--normal--12-* \\\n");
sys_gui(" -yscrollcommand \"$name.scroll set\" -background lightgrey\n");
@@ -78,6 +81,23 @@ static void hammereditor_guidefs(void)
sys_gui(" }\n");
sys_gui("}\n");
+ sys_gui("proc hammereditor_dodirty {name} {\n");
+ sys_gui(" if {[catch {$name.text edit modified} dirty]} {set dirty 0}\n");
+ sys_gui(" set title [wm title $name]\n");
+ sys_gui(" set dt [string equal -length 1 $title \"*\"]\n");
+ sys_gui(" if {$dirty} {\n");
+ sys_gui(" if {$dt == 0} {wm title $name *$title}\n");
+ sys_gui(" } else {\n");
+ sys_gui(" if {$dt} {wm title $name [string range $title 1 end]}\n");
+ sys_gui(" }\n");
+ sys_gui("}\n");
+
+ sys_gui("proc hammereditor_setdirty {name flag} {\n");
+ sys_gui(" if {[winfo exists $name]} {\n");
+ sys_gui(" catch {$name.text edit modified $flag}\n");
+ sys_gui(" }\n");
+ sys_gui("}\n");
+
sys_gui("proc hammereditor_doclose {name} {\n");
sys_gui(" destroy $name\n");
sys_gui("}\n");
@@ -91,10 +111,9 @@ static void hammereditor_guidefs(void)
/* FIXME make it more reliable */
sys_gui("proc hammereditor_send {name} {\n");
sys_gui(" if {[winfo exists $name]} {\n");
- sys_gui(" set ii [$name.text index [concat end - 1 lines]]\n");
sys_gui(" pd [concat miXed$name clear \\;]\n");
sys_gui(" for {set i 1} \\\n");
- sys_gui(" {[$name.text compare $i.end < $ii]} \\\n");
+ sys_gui(" {[$name.text compare $i.end < end]} \\\n");
sys_gui(" {incr i 1} {\n");
sys_gui(" set lin [$name.text get $i.0 $i.end]\n");
sys_gui(" if {$lin != \"\"} {\n");
@@ -110,38 +129,56 @@ static void hammereditor_guidefs(void)
sys_gui("proc hammereditor_close {name ask} {\n");
sys_gui(" if {[winfo exists $name]} {\n");
- sys_gui(" set dirty $ask\n"); /* FIXME */
- sys_gui(" if {$dirty == 0} {hammereditor_doclose $name} else {\n");
+ sys_gui(" if {[catch {$name.text edit modified} dirty]} {set dirty 0}\n");
+ sys_gui(" if {$ask && $dirty} {\n");
sys_gui(" set title [wm title $name]\n");
+ sys_gui(" if {[string equal -length 1 $title \"*\"]} {\n");
+ sys_gui(" set title [string range $title 1 end]\n");
+ sys_gui(" }\n");
sys_gui(" set answer [tk_messageBox \\-type yesnocancel \\\n");
sys_gui(" \\-icon question \\\n");
sys_gui(" \\-message [concat Save changes to $title?]]\n");
sys_gui(" if {$answer == \"yes\"} {hammereditor_send $name}\n");
sys_gui(" if {$answer != \"cancel\"} {hammereditor_doclose $name}\n");
- sys_gui(" }\n");
+ sys_gui(" } else {hammereditor_doclose $name}\n");
sys_gui(" }\n");
sys_gui("}\n");
}
-void hammereditor_open(t_hammerfile *f, char *title)
+/* null owner defaults to class name, pass "" to supress */
+void hammereditor_open(t_hammerfile *f, char *title, char *owner)
{
- if (!title) title = class_getname(*f->f_master);
- sys_vgui("hammereditor_open .%x %dx%d {%s}\n", (int)f, 600, 340, title);
+ if (!owner)
+ owner = class_getname(*f->f_master);
+ if (!*owner)
+ owner = 0;
+ if (!title)
+ {
+ title = owner;
+ owner = 0;
+ }
+ if (owner)
+ sys_vgui("hammereditor_open .%x %dx%d {%s: %s} %d\n",
+ (int)f, 600, 340, owner, title, (f->f_editorfn != 0));
+ else
+ sys_vgui("hammereditor_open .%x %dx%d {%s} %d\n",
+ (int)f, 600, 340, (title ? title : "Untitled"),
+ (f->f_editorfn != 0));
}
static void hammereditor_tick(t_hammerfile *f)
{
- sys_vgui("hammereditor_close .%x %d\n", (int)f, 1);
+ sys_vgui("hammereditor_close .%x 1\n", (int)f);
}
void hammereditor_close(t_hammerfile *f, int ask)
{
- if (ask)
+ if (ask && f->f_editorfn)
/* hack: deferring modal dialog creation in order to allow for
a message box redraw to happen -- LATER investigate */
clock_delay(f->f_editorclock, 0);
else
- sys_vgui("hammereditor_close .%x %d\n", (int)f, 0);
+ sys_vgui("hammereditor_close .%x 0\n", (int)f);
}
void hammereditor_append(t_hammerfile *f, char *contents)
@@ -150,6 +187,12 @@ void hammereditor_append(t_hammerfile *f, char *contents)
sys_vgui("hammereditor_append .%x {%s}\n", (int)f, contents);
}
+void hammereditor_setdirty(t_hammerfile *f, int flag)
+{
+ if (f->f_editorfn)
+ sys_vgui("hammereditor_setdirty .%x %d\n", (int)f, flag);
+}
+
static void hammereditor_clear(t_hammerfile *f)
{
if (f->f_editorfn)
diff --git a/shared/hammer/file.h b/shared/hammer/file.h
index 13be3b8..7e68cdc 100644
--- a/shared/hammer/file.h
+++ b/shared/hammer/file.h
@@ -11,9 +11,10 @@ EXTERN_STRUCT _hammerfile;
typedef void (*t_hammerfilefn)(t_pd *, t_symbol *, int, t_atom *);
typedef void (*t_hammerembedfn)(t_pd *, t_binbuf *, t_symbol *);
-void hammereditor_open(t_hammerfile *f, char *title);
+void hammereditor_open(t_hammerfile *f, char *title, char *owner);
void hammereditor_close(t_hammerfile *f, int ask);
void hammereditor_append(t_hammerfile *f, char *contents);
+void hammereditor_setdirty(t_hammerfile *f, int flag);
void hammerpanel_open(t_hammerfile *f, t_symbol *inidir);
void hammerpanel_setopendir(t_hammerfile *f, t_symbol *dir);
t_symbol *hammerpanel_getopendir(t_hammerfile *f);
diff --git a/shared/notes.txt b/shared/notes.txt
index 44c0c11..de093b8 100644
--- a/shared/notes.txt
+++ b/shared/notes.txt
@@ -5,6 +5,14 @@ TODO for root and shared
DONE for root and shared
+with cyclone alpha53
+ * binport: added half-byte #symbol id
+ * hammereditor:
+ . fixed closing by window manager
+ . dirty flag bound, shown and observed (unless in viewer mode)
+ . title specification simplified and standardized
+ . bug fix: incomplete transfer from editor
+
with cyclone alpha52
* fragile: class name resolution based on voluntary mutation and raising
* fitter: mirroring removed
diff --git a/test/cyclone/matrix-test.pd b/test/cyclone/matrix-test.pd
index 23ba18a..1a6642c 100644
--- a/test/cyclone/matrix-test.pd
+++ b/test/cyclone/matrix-test.pd
@@ -77,7 +77,7 @@
#X obj 306 179 print;
#X msg 26 138 dump;
#X msg 23 101 dumptarget;
-#N canvas 179 79 698 356 lists 0;
+#N canvas 179 79 698 356 lists 1;
#X obj 363 29 osc~ 220;
#X obj 450 29 osc~ 230;
#X obj 362 73 matrix~ 3 2 1;
@@ -109,6 +109,10 @@
#X obj 361 117 *~ 0.01;
#X obj 443 117 *~ 0.01;
#X msg 174 29 ramp 0;
+#X msg 608 57 0;
+#X msg 609 87 1;
+#X floatatom 541 108 5 0 0 0 - - -;
+#X msg 541 133 set \$1 1000;
#X connect 0 0 2 0;
#X connect 1 0 2 1;
#X connect 2 0 28 0;
@@ -137,6 +141,10 @@
#X connect 28 0 3 0;
#X connect 29 0 3 1;
#X connect 30 0 2 0;
+#X connect 31 0 33 0;
+#X connect 32 0 33 0;
+#X connect 33 0 34 0;
+#X connect 34 0 2 0;
#X restore 413 221 pd lists;
#X connect 0 0 8 0;
#X connect 1 0 0 0;
diff --git a/toxy/tot.c b/toxy/tot.c
index 65bfe9a..ef2c978 100644
--- a/toxy/tot.c
+++ b/toxy/tot.c
@@ -259,7 +259,7 @@ static void tot_click(t_tot *x, t_floatarg xpos, t_floatarg ypos,
char *head = scriptlet_getcontents(x->x_persistent, &nleft);
char buf[MAXPDSTRING + 1];
buf[MAXPDSTRING] = 0;
- hammereditor_open(x->x_filehandle, "scriptlet editor");
+ hammereditor_open(x->x_filehandle, "scriptlet editor", 0);
while (nleft > 0)
{
if (nleft > MAXPDSTRING)
diff --git a/toxy/toxy-help.include b/toxy/toxy-help.include
new file mode 100644
index 0000000..289c81c
--- /dev/null
+++ b/toxy/toxy-help.include
@@ -0,0 +1 @@
+bin/plustot-help.pd
diff --git a/toxy/widget.c b/toxy/widget.c
index 9481b89..c0bffd8 100644
--- a/toxy/widget.c
+++ b/toxy/widget.c
@@ -468,7 +468,7 @@ static void widget_properties(t_gobj *z, t_glist *glist)
char buf[MAXPDSTRING + 1];
buf[MAXPDSTRING] = 0;
sprintf(buf, "%s %s", x->x_type->s_name, x->x_name->s_name);
- hammereditor_open(x->x_filehandle, buf);
+ hammereditor_open(x->x_filehandle, buf, 0);
while (nleft > 0)
{
if (nleft > MAXPDSTRING)