aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIOhannes m zmölnig <zmoelnig@users.sourceforge.net>2009-10-12 10:04:32 +0000
committerIOhannes m zmölnig <zmoelnig@users.sourceforge.net>2009-10-12 10:04:32 +0000
commit915a3aa53d25d2306f3511993105b57447e7666c (patch)
treeb6e12a7808b76ca98161665da270904cea9d3a16
parent3dc69475304fc4d89b298bccec6692cfbe2af286 (diff)
added "delete" message to canvas, so we can delete objects by index
svn path=/trunk/externals/iem/iemguts/; revision=12580
-rw-r--r--src/canvasdelete.c59
1 files changed, 59 insertions, 0 deletions
diff --git a/src/canvasdelete.c b/src/canvasdelete.c
index 5f3f8d1..b404433 100644
--- a/src/canvasdelete.c
+++ b/src/canvasdelete.c
@@ -93,6 +93,8 @@ static void canvasdelete_free(t_canvasdelete*x)
}
+static void canvasdelete_canvasmethods(void);
+
void canvasdelete_setup(void)
{
canvasdelete_class = class_new(gensym("canvasdelete"),
@@ -100,4 +102,61 @@ void canvasdelete_setup(void)
sizeof(t_canvasdelete), 0,
A_DEFFLOAT, 0);
class_addbang(canvasdelete_class, (t_method)canvasdelete_bang);
+
+ canvasdelete_canvasmethods();
+}
+
+
+/* 'delete' message for the canvas */
+static int canvas_delete_docb(t_glist*glist, int index) {
+ /* this will crash Pd if the object to be deleted is on the stack
+ * workarounds:
+ * - use a clock (see above)
+ * - finally fix this in Pd
+ */
+ t_gobj*obj=NULL;
+ int i=index;
+ if(NULL==glist) {
+ return -1;
+ }
+ if(i<0) {
+ return -1;
+ }
+
+ obj=glist->gl_list;
+
+ while(i-- && obj) {
+ obj=obj->g_next;
+ }
+
+ if(obj) {
+ glist_delete(glist, obj);
+ }
+ else {
+ return -1;
+ }
+
+ return index;
+}
+
+static void canvas_delete_cb(t_canvas*x, t_symbol*s, int argc, t_atom*argv)
+{
+ int dspstate= canvas_suspend_dsp();
+ if(argc) {
+ while(argc--){
+ canvas_delete_docb(x, atom_getint(argv++));
+ }
+ }
+ canvas_resume_dsp(dspstate);
}
+
+
+static void canvasdelete_canvasmethods(void) {
+ if(NULL==canvas_class)return;
+ if(NULL==zgetfn(&canvas_class, gensym("delete"))) {
+ verbose(1, "adding 'delete' method to canvas");
+ class_addmethod(canvas_class, (t_method)canvas_delete_cb, gensym("delete"), A_GIMME, 0);
+ }
+
+}
+