[PD-cvs] externals/grill/dynext/src main.cpp,1.6,1.7

Thomas Grill xovo at users.sourceforge.net
Sat Apr 16 23:36:32 CEST 2005


Update of /cvsroot/pure-data/externals/grill/dynext/src
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv7907/src

Modified Files:
	main.cpp 
Log Message:
query visibility status
- strip .pd from abstraction filenames
fixes for OSX
- open debug patcher on alt-click
cleanups
fixed several problems with sub-patchers and connecting
documentation
enabled reuse of object names


Index: main.cpp
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/dynext/src/main.cpp,v
retrieving revision 1.6
retrieving revision 1.7
diff -C2 -d -r1.6 -r1.7
*** main.cpp	19 Mar 2005 04:57:41 -0000	1.6
--- main.cpp	16 Apr 2005 21:36:30 -0000	1.7
***************
*** 46,50 ****
  	virtual ~dyn();
  
! 	void m_reset();
  	void m_reload(); // refresh objects/abstractions
  	void m_newobj(int argc,const t_atom *argv);
--- 46,50 ----
  	virtual ~dyn();
  
!     void m_reset() { DoExit(); DoInit(); }
  	void m_reload(); // refresh objects/abstractions
  	void m_newobj(int argc,const t_atom *argv);
***************
*** 64,88 ****
      static const t_symbol *k_obj,*k_msg,*k_text;
  
! 	class obj {
  	public:
! 		obj(unsigned long i,t_gobj *o): id(i),object(o),nxt(NULL) {}
  
! 		void Add(obj *o);
  
! 		unsigned long id;
  		t_gobj *object;
! 		obj *nxt;
! 	} *root;
  
  
! 	obj *Find(const t_symbol *n);
      t_glist *FindCanvas(const t_symbol *n);
! 	void Add(const t_symbol *n,t_gobj *o);
  
      t_gobj *New(const t_symbol *kind,int _argc_,const t_atom *_argv_,bool add = true);
- 	void Delete(t_gobj *o);
  
  	void ConnDis(bool conn,int argc,const t_atom *argv);
  
      virtual bool CbMethodResort(int n,const t_symbol *s,int argc,const t_atom *argv);
  	virtual bool CbDsp();
--- 64,102 ----
      static const t_symbol *k_obj,*k_msg,*k_text;
  
! 	class Obj {
  	public:
! 		Obj(t_glist *gl,t_gobj *o): glist(gl),object(o) {}
  
!         t_glist *AsGlist() const 
!         { 
!             return pd_class(&object->g_pd) == canvas_class?(t_glist *)object:NULL; 
!         }
  
!         t_glist *glist;
  		t_gobj *object;
! 	};
!     
!     typedef TablePtrMapOwned<const t_symbol *,Obj *> ObjMap;
!     ObjMap root;
  
+     typedef TablePtrMap<Obj *,const t_symbol *> GObjMap;
+     typedef TablePtrMapOwned<t_glist *,GObjMap *> GLstMap;
+     GLstMap groot;
  
!     Obj *Find(const t_symbol *n) { return root.find(n); }
      t_glist *FindCanvas(const t_symbol *n);
! 
!     Obj *Remove(const t_symbol *n);
!     bool Add(const t_symbol *n,t_glist *gl,t_gobj *o);
  
      t_gobj *New(const t_symbol *kind,int _argc_,const t_atom *_argv_,bool add = true);
  
  	void ConnDis(bool conn,int argc,const t_atom *argv);
  
+     void DoInit();
+     void DoExit();
+     void NewProxies();
+     void DelProxies();
+ 
      virtual bool CbMethodResort(int n,const t_symbol *s,int argc,const t_atom *argv);
  	virtual bool CbDsp();
***************
*** 292,296 ****
  
  dyn::dyn(int argc,const t_atom *argv):
- 	root(NULL),
  	canvas(NULL),
  	pxin(NULL),pxout(NULL),
--- 306,309 ----
***************
*** 308,313 ****
  	m_outlets = GetAInt(argv[3]);
  
- 	int i;
- 
  	// --- make a sub-canvas for dyn~ ------
  
--- 321,324 ----
***************
*** 324,329 ****
  	canvas_unsetcurrent(canvas);
  
! 	// --- create inlet proxies ------
  
  	pxin = new proxyin *[s_inlets+m_inlets];
  	for(i = 0; i < s_inlets+m_inlets; ++i) {
--- 335,377 ----
  	canvas_unsetcurrent(canvas);
  
!     DoInit();
! 
! 	AddInSignal("Messages (newobj,newmsg,newtext,del,conn,dis)");
! 	AddInSignal(s_inlets);
! 	AddInAnything(m_inlets);
! 	AddOutSignal(s_outlets);
! 	AddOutAnything(m_outlets);
! }
! 
! dyn::~dyn()
! {
! 	DoExit();
! 
! 	if(canvas) pd_free((t_pd *)canvas);
! }
! 
! void dyn::DoInit()
! {
!     // add to list of canvases
!     groot.insert(canvas,new GObjMap);
! 
!     NewProxies();
! }
! 
! void dyn::DoExit()
! {
!     // delete proxies
!     DelProxies();
!     // remove all objects
!     glist_clear(canvas);
!     // remove all names
!     groot.clear();
!     root.clear();
! }
  
+ void dyn::NewProxies()
+ {
+ 	// --- create inlet proxies ------
+     int i;
  	pxin = new proxyin *[s_inlets+m_inlets];
  	for(i = 0; i < s_inlets+m_inlets; ++i) {
***************
*** 367,399 ****
          }
      }
- 
- 	AddInSignal("Messages (newobj,newmsg,newtext,del,conn,dis)");
- 	AddInSignal(s_inlets);
- 	AddInAnything(m_inlets);
- 	AddOutSignal(s_outlets);
- 	AddOutAnything(m_outlets);
  }
  
! dyn::~dyn()
  {
! 	m_reset();
! 
! 	if(canvas) pd_free((t_pd *)canvas);
! 
  	if(pxin) delete[] pxin;
  	if(pxout) delete[] pxout;
  }
  
- 
- void dyn::obj::Add(obj *o) {	if(nxt) nxt->Add(o); else nxt = o; }
- 
- dyn::obj *dyn::Find(const t_symbol *n)
- {
-     unsigned long id = *(unsigned long *)n;
- 	obj *o;
- 	for(o = root; o && o->id != id; o = o->nxt) {}
- 	return o;
- }
- 
  t_glist *dyn::FindCanvas(const t_symbol *n)
  {
--- 415,429 ----
          }
      }
  }
  
! void dyn::DelProxies()
  {
!     int i;
! 	for(i = 0; i < s_inlets+m_inlets; ++i) glist_delete(canvas,(t_gobj *)pxin[i]);
  	if(pxin) delete[] pxin;
+ 	for(i = 0; i < s_outlets+m_outlets; ++i) glist_delete(canvas,(t_gobj *)pxout[i]);
  	if(pxout) delete[] pxout;
  }
  
  t_glist *dyn::FindCanvas(const t_symbol *n)
  {
***************
*** 401,424 ****
          return canvas;
      else {
!         obj *o = Find(n);
!         if(o && pd_class(&o->object->g_pd) == canvas_class) 
!             return (t_glist *)o->object;
!         else 
!             return NULL;
      }
  }
  
- void dyn::Add(const t_symbol *n,t_gobj *ob)
- {
-     unsigned long id = *(unsigned long *)n;
- 	obj *o = new obj(id,ob);
- 	if(root) root->Add(o); else root = o;
- }
- 
- void dyn::Delete(t_gobj *o)
- {
- 	glist_delete(canvas,o);
- }
- 
  static t_gobj *GetLast(t_glist *gl)
  {
--- 431,440 ----
          return canvas;
      else {
!         Obj *o = Find(n);
!         t_glist *gl = o->AsGlist();
!         return gl && groot.find(gl)?(t_glist *)o->object:NULL;
      }
  }
  
  static t_gobj *GetLast(t_glist *gl)
  {
***************
*** 434,451 ****
      t_gobj *newest = NULL;
      const char *err = NULL;
- 	int argc = 0;
- 	t_atom *argv = NULL;
      const t_symbol *name = NULL,*canv = NULL;
      t_glist *glist = NULL;
  
  	if(_argc_ >= 4 && CanbeInt(_argv_[0]) && CanbeInt(_argv_[1]) && IsSymbol(_argv_[2]) && IsSymbol(_argv_[3])) {
          canv = GetSymbol(_argv_[2]);
          name = GetSymbol(_argv_[3]);
  
!         argc = _argc_-2;
!         argv = new t_atom[argc];
! 		SetInt(argv[0],GetAInt(_argv_[0]));
! 		SetInt(argv[1],GetAInt(_argv_[1]));
!         for(int i = 0; i < argc-2; ++i) SetAtom(argv[i+2],_argv_[i+4]);
  	}
  	else if(_argc_ >= 3 && IsSymbol(_argv_[0]) && IsSymbol(_argv_[1])) {
--- 450,466 ----
      t_gobj *newest = NULL;
      const char *err = NULL;
      const t_symbol *name = NULL,*canv = NULL;
      t_glist *glist = NULL;
  
+     AtomListStatic<16> args;
+ 
  	if(_argc_ >= 4 && CanbeInt(_argv_[0]) && CanbeInt(_argv_[1]) && IsSymbol(_argv_[2]) && IsSymbol(_argv_[3])) {
          canv = GetSymbol(_argv_[2]);
          name = GetSymbol(_argv_[3]);
  
!         args(_argc_-2);
! 		SetInt(args[0],GetAInt(_argv_[0]));
! 		SetInt(args[1],GetAInt(_argv_[1]));
!         for(int i = 0; i < _argc_; ++i) SetAtom(args[i+2],_argv_[i+4]);
  	}
  	else if(_argc_ >= 3 && IsSymbol(_argv_[0]) && IsSymbol(_argv_[1])) {
***************
*** 453,473 ****
          name = GetSymbol(_argv_[1]);
  
!         argc = _argc_;
!         argv = new t_atom[argc];
  		// random position if not given
! 		SetInt(argv[0],rand()%600);
! 		SetInt(argv[1],50+rand()%400);
!         for(int i = 0; i < argc-2; ++i) SetAtom(argv[i+2],_argv_[i+2]);
  	}
  
! 	if(argv) {
! 		if(add && (!name || name == sym_dot || Find(name))) 
! 			err = "Object name is already present";
          else if(!canv || !(glist = FindCanvas(canv)))
  			err = "Canvas could not be found";
          else {
              // convert abstraction filenames
!             if(stripext && kind == k_obj && argc >= 3 && IsSymbol(argv[2])) {
!                 const char *c = GetString(argv[2]);
                  int l = strlen(c);
                  // check end of string for .pd file extension
--- 468,487 ----
          name = GetSymbol(_argv_[1]);
  
!         args(_argc_);
  		// random position if not given
! 		SetInt(args[0],rand()%600);
! 		SetInt(args[1],50+rand()%400);
!         for(int i = 0; i < _argc_-2; ++i) SetAtom(args[i+2],_argv_[i+2]);
  	}
  
! 	if(args.Count()) {
!         if(name == sym_dot)
! 			err = ". cannot be redefined";
          else if(!canv || !(glist = FindCanvas(canv)))
  			err = "Canvas could not be found";
          else {
              // convert abstraction filenames
!             if(stripext && kind == k_obj && args.Count() >= 3 && IsSymbol(args[2])) {
!                 const char *c = GetString(args[2]);
                  int l = strlen(c);
                  // check end of string for .pd file extension
***************
*** 477,481 ****
                      if(l > sizeof tmp-1) t = new char[l+1];
                      memcpy(tmp,c,l-3); tmp[l-3] = 0;
!                     SetString(argv[2],tmp);
                      if(tmp != t) delete[] t;
                  }
--- 491,495 ----
                      if(l > sizeof tmp-1) t = new char[l+1];
                      memcpy(tmp,c,l-3); tmp[l-3] = 0;
!                     SetString(args[2],tmp);
                      if(tmp != t) delete[] t;
                  }
***************
*** 486,490 ****
  
              t_gobj *last = GetLast(glist);
!             pd_typedmess((t_pd *)glist,(t_symbol *)kind,argc,argv);
              newest = GetLast(glist);
  
--- 500,504 ----
  
              t_gobj *last = GetLast(glist);
!             pd_typedmess((t_pd *)glist,(t_symbol *)kind,args.Count(),args.Atoms());
              newest = GetLast(glist);
  
***************
*** 510,514 ****
  			if(newest) {
  				// add to database
! 				if(add) Add(name,newest);
  
  				// send loadbang (if it is an abstraction)
--- 524,531 ----
  			if(newest) {
  				// add to database
!                 if(add) {
!                     bool ok = Add(name,glist,newest);
!                     FLEXT_ASSERT(ok);
!                 }
  
  				// send loadbang (if it is an abstraction)
***************
*** 530,535 ****
  			canvas_unsetcurrent(glist); 
  		}
- 
-         delete[] argv;
  	}
  	else 
--- 547,550 ----
***************
*** 541,555 ****
  }
  
! 
! void dyn::m_reset()
  {
! 	obj *o = root;
! 	while(o) {
! 		Delete(o->object);
! 		obj *n = o->nxt;
! 		delete o; 
! 		o = n;
! 	}
! 	root = NULL; 
  }
  
--- 556,615 ----
  }
  
! dyn::Obj *dyn::Remove(const t_symbol *n)
  {
!     // see if there's already an object of the same name
!     Obj *prv = root.remove(n);
!     if(prv) {
!         t_glist *pl = prv->glist;
!         // get canvas map
!         GObjMap *gm = groot.find(pl);
!         FLEXT_ASSERT(gm);
!         // remove object from canvas map
!         gm->erase(prv);
! 
!         // non-NULL if object itself is a glist
!         t_glist *gl = prv->AsGlist();
!         if(gl) {
!             GObjMap *gm = groot.remove(gl);
!             // if it's a loaded abstraction it need not be in our list
!             if(gm) {
!                 // remove all objects in canvas map
!                 for(GObjMap::iterator it(*gm); it; ++it) {
!                     Obj *r = Remove(it.data());
!                     FLEXT_ASSERT(r);
!                     delete r;
!                 }
!                 // delete canvas map
!                 delete gm;
!             }
!         }
!     }
!     return prv;
! }
! 
! bool dyn::Add(const t_symbol *n,t_glist *gl,t_gobj *o) 
! { 
!     // remove previous name entry
!     Obj *prv = Remove(n);
!     if(prv) delete prv;
! 
!     // get canvas map
!     GObjMap *gm = groot.find(gl);
!     // if none existing create one
!     if(!gm) return false;
! 
!     // insert object to canvas map
!     Obj *obj = new Obj(gl,o);
!     gm->insert(obj,n);
!     // insert object to object map
!     root.insert(n,obj); 
! 
!     t_glist *nl = obj->AsGlist();
!     if(nl) {
!         FLEXT_ASSERT(!groot.find(nl));
!         groot.insert(nl,new GObjMap);
!     }
! 
!     return true;
  }
  
***************
*** 594,609 ****
  void dyn::m_del(const t_symbol *n)
  {
! 	unsigned long id = *(unsigned long *)n;
! 
!     obj *p = NULL,*o = root;
! 	for(; o && o->id != id; p = o,o = o->nxt) {}
! 
! 	if(o) {
! 		if(p) p->nxt = o->nxt; else root = o->nxt;
! 
! 		Delete(o->object);
! 		delete o;
! 	}
! 	else
  		post("%s - del: object not found",thisName());
  }
--- 654,663 ----
  void dyn::m_del(const t_symbol *n)
  {
!     Obj *obj = Remove(n);
!     if(obj) {
!         glist_delete(obj->glist,obj->object);
!         delete obj;
!     }
!     else
  		post("%s - del: object not found",thisName());
  }
***************
*** 645,650 ****
  
  	t_text *s_obj,*d_obj;
  	if(s_n) {
! 		obj *s_o = Find(s_n);
  		if(!s_o) { 
  			post("%s - connect: source \"%s\" not found",thisName(),GetString(s_n));
--- 699,705 ----
  
  	t_text *s_obj,*d_obj;
+     t_glist *s_cnv,*d_cnv;
  	if(s_n) {
! 		Obj *s_o = Find(s_n);
  		if(!s_o) { 
  			post("%s - connect: source \"%s\" not found",thisName(),GetString(s_n));
***************
*** 652,655 ****
--- 707,711 ----
  		}
  		s_obj = (t_text *)s_o->object;
+         s_cnv = s_o->glist;
  	}
  	else if(s_x < 0 && s_x >= s_inlets+m_inlets) {
***************
*** 659,667 ****
  	else {
  		s_obj = &pxin[s_x]->obj;
  		s_x = 0; // always 0 for proxy
  	}
  
  	if(d_n) {
! 		obj *d_o = Find(d_n);
  		if(!d_o) { 
  			post("%s - connect: destination \"%s\" not found",thisName(),GetString(d_n));
--- 715,724 ----
  	else {
  		s_obj = &pxin[s_x]->obj;
+         s_cnv = canvas;
  		s_x = 0; // always 0 for proxy
  	}
  
  	if(d_n) {
! 		Obj *d_o = Find(d_n);
  		if(!d_o) { 
  			post("%s - connect: destination \"%s\" not found",thisName(),GetString(d_n));
***************
*** 669,672 ****
--- 726,730 ----
  		}
  		d_obj = (t_text *)d_o->object;
+         d_cnv = d_o->glist;
  	}
  	else if(d_x < 0 && d_x >= s_outlets+m_outlets) {
***************
*** 676,694 ****
  	else  {
  		d_obj = &pxout[d_x]->obj;
  		d_x = 0; // always 0 for proxy
  	}
  
  #ifndef NO_VIS
! 	int s_oix = canvas_getindex(canvas,&s_obj->te_g);
! 	int d_oix = canvas_getindex(canvas,&d_obj->te_g);
  #endif
  
      if(conn) {
! 		if(!canvas_isconnected(canvas,(t_text *)s_obj,s_x,(t_text *)d_obj,d_x)) {
  #ifdef NO_VIS
  			if(!obj_connect(s_obj, s_x, d_obj, d_x))
  				post("%s - connect: connection could not be made",thisName());
  #else
! 			canvas_connect(canvas,s_oix,s_x,d_oix,d_x);
  #endif
  		}
--- 734,758 ----
  	else  {
  		d_obj = &pxout[d_x]->obj;
+         d_cnv = canvas;
  		d_x = 0; // always 0 for proxy
  	}
  
+     if(s_cnv != d_cnv) {
+         post("%s - connect: objects \"%s\" and \"%s\" are not on same canvas",thisName(),GetString(s_n),GetString(d_n));
+         return;
+     }
+ 
  #ifndef NO_VIS
! 	int s_oix = canvas_getindex(s_cnv,&s_obj->te_g);
! 	int d_oix = canvas_getindex(d_cnv,&d_obj->te_g);
  #endif
  
      if(conn) {
! 		if(!canvas_isconnected(s_cnv,(t_text *)s_obj,s_x,(t_text *)d_obj,d_x)) {
  #ifdef NO_VIS
  			if(!obj_connect(s_obj, s_x, d_obj, d_x))
  				post("%s - connect: connection could not be made",thisName());
  #else
! 			canvas_connect(s_cnv,s_oix,s_x,d_oix,d_x);
  #endif
  		}
***************
*** 698,704 ****
  		obj_disconnect(s_obj, s_x, d_obj, d_x);
  #else
! 		canvas_disconnect(canvas,s_oix,s_x,d_oix,d_x);
  #endif
  	}
  }
  
--- 762,770 ----
  		obj_disconnect(s_obj, s_x, d_obj, d_x);
  #else
! 		canvas_disconnect(s_cnv,s_oix,s_x,d_oix,d_x);
  #endif
  	}
+ 
+ //    canvas_fixlinesfor(s_cnv,(t_text *)s_x);
  }
  
***************
*** 722,726 ****
  		post("%s - Syntax: send name message [args]",thisName());
  	else {
! 		obj *o = Find(GetSymbol(argv[0]));
  		if(!o)
  			post("%s - send: object \"%s\" not found",thisName(),GetString(argv[0]));
--- 788,792 ----
  		post("%s - Syntax: send name message [args]",thisName());
  	else {
! 		Obj *o = Find(GetSymbol(argv[0]));
  		if(!o)
  			post("%s - send: object \"%s\" not found",thisName(),GetString(argv[0]));





More information about the Pd-cvs mailing list