[PD-cvs] packages/patches closeinitbang-0.40-0test03.patch, NONE, 1.1

Hans-Christoph Steiner eighthave at users.sourceforge.net
Mon Sep 18 15:21:33 CEST 2006


Update of /cvsroot/pure-data/packages/patches
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv503/patches

Added Files:
	closeinitbang-0.40-0test03.patch 
Log Message:
added IOhannes' closebang/initbang patch from the patch tracker, #1544041

--- NEW FILE: closeinitbang-0.40-0test03.patch ---
diff -Naur src.org/g_canvas.c src/g_canvas.c
--- g_canvas.c	2006-08-15 21:50:14.000000000 +0200
+++ g_canvas.c	2006-08-22 16:19:17.000000000 +0200
@@ -1040,6 +1040,52 @@
     canvas_loadbangabstractions(x);
     canvas_loadbangsubpatches(x);
 }
+/* JMZ:
+ * initbang is emitted after the canvas is done, but before the parent canvas is done
+ * therefore, initbangs cannot reach to the outlets
+ */
+void canvas_initbang(t_canvas *x)
+{
+    t_gobj *y;
+    t_symbol *s = gensym("initbang");
+    /* run "initbang" for all subpatches, but NOT for the child abstractions */
+    for (y = x->gl_list; y; y = y->g_next)
+      if (pd_class(&y->g_pd) == canvas_class)
+        {
+          if (!canvas_isabstraction((t_canvas *)y))
+            canvas_initbang((t_canvas *)y);
+        }
+
+    /* call the initbang()-method for objects that have one */
+    for (y = x->gl_list; y; y = y->g_next)
+      {
+        if ((pd_class(&y->g_pd) != canvas_class) && zgetfn(&y->g_pd, s))
+          {
+            pd_vmess(&y->g_pd, s, "");
+          }
+      }
+}
+/* JMZ:
+ * closebang is emitted before the canvas is destroyed
+ * and BEFORE subpatches/abstractions in this canvas are destroyed
+ */
+void canvas_closebang(t_canvas *x)
+{
+    t_gobj *y;
+    t_symbol *s = gensym("closebang");
+
+    /* call the closebang()-method for objects that have one 
+     * but NOT for subpatches/abstractions: these are called separately
+     * from g_graph:glist_delete()
+     */
+    for (y = x->gl_list; y; y = y->g_next)
+      {
+        if ((pd_class(&y->g_pd) != canvas_class) && zgetfn(&y->g_pd, s))
+          {
+            pd_vmess(&y->g_pd, s, "");
+          }
+      }
+}
 
     /* When you ask a canvas its size the result is 2 pixels more than what
     you gave it to open it; perhaps there's a 1-pixel border all around it
diff -Naur src.org/g_graph.c src/g_graph.c
--- g_graph.c	2006-03-01 03:00:13.000000000 +0100
+++ g_graph.c	2006-08-22 16:20:55.000000000 +0200
@@ -62,6 +62,9 @@
     return (ret);
 }
 
+/* JMZ: emit a closebang message */
+void canvas_closebang(t_canvas *x);
+
     /* delete an object from a glist and free it */
 void glist_delete(t_glist *x, t_gobj *y)
 {
@@ -71,7 +74,12 @@
     t_canvas *canvas = glist_getcanvas(x);
     int drawcommand = class_isdrawcommand(y->g_pd);
     int wasdeleting;
-    
+
+    if (pd_class(&y->g_pd) == canvas_class) {
+      /* JMZ: send a closebang to the canvas */
+      canvas_closebang((t_canvas *)y);
+    }
+ 
     wasdeleting = canvas_setdeleting(canvas, 1);
     if (x->gl_editor)
     {
diff -Naur src.org/m_class.c src/m_class.c
--- m_class.c	2006-08-12 07:06:47.000000000 +0200
+++ m_class.c	2006-08-22 16:19:17.000000000 +0200
@@ -509,6 +509,8 @@
 static int tryingalready;
 
 void canvas_popabstraction(t_canvas *x);
+void canvas_initbang(t_canvas *x);
+
 extern t_pd *newest;
 
 t_symbol* pathsearch(t_symbol *s,char* ext);
@@ -543,9 +545,11 @@
         {
             canvas_setargs(argc, argv);
             binbuf_evalfile(gensym(nameptr), gensym(dirbuf));
+            canvas_initbang((t_canvas *)(s__X.s_thing));/* JMZ*/
             if (s__X.s_thing != current)
                 canvas_popabstraction((t_canvas *)(s__X.s_thing));
             canvas_setargs(0, 0);
+
         }
         else error("%s: can't load abstraction within itself\n", s->s_name);
     }
diff -Naur src.org/x_misc.c src/x_misc.c
--- x_misc.c	2005-12-31 21:08:38.000000000 +0100
+++ x_misc.c	2006-08-22 16:19:17.000000000 +0200
@@ -111,6 +111,66 @@
         gensym("loadbang"), 0);
 }
 
+
+/* -------------------------- JMZ: initbang ------------------------------ */
+static t_class *initbang_class;
+
+typedef struct _initbang
+{
+    t_object x_obj;
+} t_initbang;
+
+static void *initbang_new(void)
+{
+    t_initbang *x = (t_initbang *)pd_new(initbang_class);
+    outlet_new(&x->x_obj, &s_bang);
+    return (x);
+}
+
+static void initbang_initbang(t_initbang *x)
+{
+  if (!sys_noloadbang) /* JMZ: hmm, not sure whether we should respect sys_noloadbang here... */
+        outlet_bang(x->x_obj.ob_outlet);
+}
+
+static void initbang_setup(void)
+{
+  initbang_class = class_new(gensym("initbang"), (t_newmethod)initbang_new, 0,
+        sizeof(t_initbang), CLASS_NOINLET, 0);
+    class_addmethod(initbang_class, (t_method)initbang_initbang,
+        gensym("initbang"), 0);
+}
+
+
+/* -------------------------- JMZ: closebang ------------------------------ */
+static t_class *closebang_class;
+
+typedef struct _closebang
+{
+    t_object x_obj;
+} t_closebang;
+
+static void *closebang_new(void)
+{
+    t_closebang *x = (t_closebang *)pd_new(closebang_class);
+    outlet_new(&x->x_obj, &s_bang);
+    return (x);
+}
+static void closebang_closebang(t_closebang *x)
+{
+  if (!sys_noloadbang) /* JMZ: hmm, not sure whether we should respect sys_noloadbang here... */
+        outlet_bang(x->x_obj.ob_outlet);
+}
+
+static void closebang_setup(void)
+{
+  closebang_class = class_new(gensym("closebang"), (t_newmethod)closebang_new, 0,
+        sizeof(t_closebang), CLASS_NOINLET, 0);
+    class_addmethod(closebang_class, (t_method)closebang_closebang,
+        gensym("closebang"), 0);
+}
+
+
 /* ------------- namecanvas (delete this later) --------------------- */
 static t_class *namecanvas_class;
 
@@ -314,6 +374,8 @@
 {
     random_setup();
     loadbang_setup();
+    initbang_setup();
+    closebang_setup();
     namecanvas_setup();
     serial_setup();
     cputime_setup();





More information about the Pd-cvs mailing list