Update of /cvsroot/pure-data/externals/grill/flext/source
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv4329/source
Modified Files:
	flattr.cpp flbase.cpp flbase.h flclass.h flext.cpp fllib.cpp 
	flqueue.cpp flsupport.h flthr.cpp 
Log Message:
enabled FLEXT_(C)ADDMETHOD as an alias of FLEXT_(C)ADDBANG
bugfixes and optimizations, especially for DSP under Max/MSP
added thisParent type
attribute generation is now determined exclusively by the object class setup (not library as before).
avoid trying to send empty message bundles
- preprocessor symbol FLEXT_COMPATIBLE - if defined don't implement specialities of either PD or Max/MSP
small changes for attribute functions
- Max: fixed reported bug (#67), where list elements are distributed over inlets
Index: flqueue.cpp
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/flext/source/flqueue.cpp,v
retrieving revision 1.38
retrieving revision 1.39
diff -C2 -d -r1.38 -r1.39
*** flqueue.cpp	13 Feb 2006 19:40:08 -0000	1.38
--- flqueue.cpp	24 May 2006 12:20:57 -0000	1.39
***************
*** 379,387 ****
          clock_delay(qclk,0);
      #endif
- #elif FLEXT_SYS == FLEXT_SYS_JMAX
-     #if FLEXT_QMODE == 0
-         // this is dangerous because there may be other timers on this object!
-         fts_timebase_add_call(fts_get_timebase(), (fts_object_t *)thisHdr(), QTick, NULL, 0);
-     #endif
  #else
  #error Not implemented
--- 379,382 ----
***************
*** 411,414 ****
--- 406,410 ----
  #elif FLEXT_QMODE == 2
      LaunchThread(QWorker,NULL);
+     // very unelegant... but waiting should be ok, since happens only on loading
      while(!qustarted) Sleep(0.001);
  #elif FLEXT_QMODE == 0 && (FLEXT_SYS == FLEXT_SYS_PD || FLEXT_SYS == FLEXT_SYS_MAX)
Index: flbase.cpp
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/flext/source/flbase.cpp,v
retrieving revision 1.26
retrieving revision 1.27
diff -C2 -d -r1.26 -r1.27
*** flbase.cpp	26 Sep 2005 13:59:34 -0000	1.26
--- flbase.cpp	24 May 2006 12:20:57 -0000	1.27
***************
*** 45,49 ****
  int flext_obj::m_holdaargc = 0;
  const t_atom *flext_obj::m_holdaargv = NULL;
! bool flext_obj::process_attributes = false;
  
  bool flext_obj::initing = false;
--- 45,49 ----
  int flext_obj::m_holdaargc = 0;
  const t_atom *flext_obj::m_holdaargv = NULL;
! //bool flext_obj::process_attributes = false;
  
  bool flext_obj::initing = false;
***************
*** 51,55 ****
  bool flext_obj::init_ok;
  
! void flext_obj::ProcessAttributes(bool attr) { process_attributes = attr; }
  
  #if FLEXT_SYS == FLEXT_SYS_MAX
--- 51,55 ----
  bool flext_obj::init_ok;
  
! //void flext_obj::ProcessAttributes(bool attr) { process_attributes = attr; }
  
  #if FLEXT_SYS == FLEXT_SYS_MAX
Index: flsupport.h
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/flext/source/flsupport.h,v
retrieving revision 1.104
retrieving revision 1.105
diff -C2 -d -r1.104 -r1.105
*** flsupport.h	15 May 2006 23:03:52 -0000	1.104
--- flsupport.h	24 May 2006 12:20:57 -0000	1.105
***************
*** 1146,1152 ****
  	static void Sleep(double s);
  
- 	//! Sleep for a very short amount of time, just to let other threads wake up
- 	static void MiniSleep();
- 
  	/*! \brief Class encapsulating a timer with callback functionality.
  		This class can either be used with FLEXT_ADDTIMER or used as a base class with an overloaded virtual Work function.
--- 1146,1149 ----
Index: flext.cpp
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/flext/source/flext.cpp,v
retrieving revision 1.44
retrieving revision 1.45
diff -C2 -d -r1.44 -r1.45
*** flext.cpp	15 May 2006 23:03:52 -0000	1.44
--- flext.cpp	24 May 2006 12:20:57 -0000	1.45
***************
*** 181,185 ****
  	AddMessageMethods(c,IsDSP(id));
  
!     if(process_attributes) {
          AddMethod(id,0,"getattributes",cb_ListAttrib);
          AddMethod(id,0,"getmethods",cb_ListMethods);
--- 181,186 ----
  	AddMessageMethods(c,IsDSP(id));
  
!     if(HasAttributes(id)) {
! //    if(process_attributes) {
          AddMethod(id,0,"getattributes",cb_ListAttrib);
          AddMethod(id,0,"getmethods",cb_ListMethods);
Index: flbase.h
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/flext/source/flbase.h,v
retrieving revision 1.37
retrieving revision 1.38
diff -C2 -d -r1.37 -r1.38
*** flbase.h	15 May 2006 23:03:52 -0000	1.37
--- flbase.h	24 May 2006 12:20:57 -0000	1.38
***************
*** 115,119 ****
  			\note Use that in the static class setup function (also library setup function)
  		*/
! 		static void ProcessAttributes(bool attr); //{ process_attributes = attr; }
  
  		//! Virtual function called at creation time (but after the constructor)
--- 115,119 ----
  			\note Use that in the static class setup function (also library setup function)
  		*/
! //		static void ProcessAttributes(bool attr); //{ process_attributes = attr; }
  
  		//! Virtual function called at creation time (but after the constructor)
***************
*** 157,160 ****
--- 157,161 ----
  		static t_class *getClass(t_classid id);
  		
+         static bool HasAttributes(t_classid id);
          static bool IsDSP(t_classid id);
          static bool IsLib(t_classid id);
***************
*** 205,209 ****
          mutable flext_hdr *x_obj;        	
  
!         static bool	process_attributes;
  
      private:
--- 206,210 ----
          mutable flext_hdr *x_obj;        	
  
! //        static bool	process_attributes;
  
      private:
***************
*** 251,255 ****
  
  		// Definitions for library objects
! 		static void lib_init(const char *name,void setupfun(),bool attr);
  		static void obj_add(bool lib,bool dsp,bool attr,const char *idname,const char *names,void setupfun(t_classid),FLEXT_CLASSDEF(flext_obj) *(*newfun)(int,t_atom *),void (*freefun)(flext_hdr *),int argtp1,...);
  #if FLEXT_SYS == FLEXT_SYS_MAX
--- 252,256 ----
  
  		// Definitions for library objects
! 		static void lib_init(const char *name,void setupfun());
  		static void obj_add(bool lib,bool dsp,bool attr,const char *idname,const char *names,void setupfun(t_classid),FLEXT_CLASSDEF(flext_obj) *(*newfun)(int,t_atom *),void (*freefun)(flext_hdr *),int argtp1,...);
  #if FLEXT_SYS == FLEXT_SYS_MAX
***************
*** 308,311 ****
--- 309,313 ----
  public:     	    	    \
  typedef NEW_CLASS thisType;  \
+ typedef PARENT_CLASS thisParent;  \
  static FLEXT_CLASSDEF(flext_obj) *__init__(int argc,t_atom *argv);  \
  static void __free__(flext_hdr *hdr) {  	    	    	\
***************
*** 313,317 ****
  	hdr->flext_hdr::~flext_hdr(); \
  }   	    	\
! static void __setup__(t_classid classid) { PARENT_CLASS::__setup__(classid); }
  
  
--- 315,319 ----
  	hdr->flext_hdr::~flext_hdr(); \
  }   	    	\
! static void __setup__(t_classid classid) { thisParent::__setup__(classid); }
  
  
***************
*** 319,322 ****
--- 321,325 ----
  public:     	    	    \
  typedef NEW_CLASS thisType;  \
+ typedef PARENT_CLASS thisParent;  \
  static FLEXT_CLASSDEF(flext_obj) *__init__(int argc,t_atom *argv);  \
  static void __free__(flext_hdr *hdr) {  	    	    	\
***************
*** 325,330 ****
  }   	    	\
  static void __setup__(t_classid classid) { 	    	\
! 	PARENT_CLASS::__setup__(classid);    	    	\
! 	NEW_CLASS::SETUPFUN(classid); \
  }
  
--- 328,333 ----
  }   	    	\
  static void __setup__(t_classid classid) { 	    	\
! 	thisParent::__setup__(classid);    	    	\
! 	thisType::SETUPFUN(classid); \
  }
  
***************
*** 350,356 ****
  // specify that to define the library itself
  #if FLEXT_SYS == FLEXT_SYS_PD
! #define REAL_LIB_SETUP(NAME,SETUPFUN) extern "C" FLEXT_EXT void NAME##_setup() { flext_obj::lib_init(#NAME,SETUPFUN,FLEXT_ATTRIBUTES); }
  #elif FLEXT_SYS == FLEXT_SYS_MAX
! #define REAL_LIB_SETUP(NAME,SETUPFUN) extern "C" FLEXT_EXT int main() { flext_obj::lib_init(#NAME,SETUPFUN,FLEXT_ATTRIBUTES); return 0; }
  #else
  #error Platform not supported
--- 353,359 ----
  // specify that to define the library itself
  #if FLEXT_SYS == FLEXT_SYS_PD
! #define REAL_LIB_SETUP(NAME,SETUPFUN) extern "C" FLEXT_EXT void NAME##_setup() { flext_obj::lib_init(#NAME,SETUPFUN); }
  #elif FLEXT_SYS == FLEXT_SYS_MAX
! #define REAL_LIB_SETUP(NAME,SETUPFUN) extern "C" FLEXT_EXT int main() { flext_obj::lib_init(#NAME,SETUPFUN); return 0; }
  #else
  #error Platform not supported
Index: flattr.cpp
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/flext/source/flattr.cpp,v
retrieving revision 1.35
retrieving revision 1.36
diff -C2 -d -r1.35 -r1.36
*** flattr.cpp	11 Oct 2005 22:22:48 -0000	1.35
--- flattr.cpp	24 May 2006 12:20:57 -0000	1.36
***************
*** 236,243 ****
  	// search for matching attribute
  	AttrItem *a = FindAttrib(tag,false,true);
! 	if(a) 
! 		return SetAttrib(tag,a,argc,argv);
! 	else
! 		return true;
  }
  
--- 236,240 ----
  	// search for matching attribute
  	AttrItem *a = FindAttrib(tag,false,true);
! 	return a && SetAttrib(tag,a,argc,argv);
  }
  
Index: fllib.cpp
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/flext/source/fllib.cpp,v
retrieving revision 1.37
retrieving revision 1.38
diff -C2 -d -r1.37 -r1.38
*** fllib.cpp	15 May 2006 23:03:52 -0000	1.37
--- fllib.cpp	24 May 2006 12:20:57 -0000	1.38
***************
*** 164,167 ****
--- 164,168 ----
  
  t_class *flext_obj::getClass(t_classid cl) { return cl->clss; }
+ bool flext_obj::HasAttributes(t_classid cl) { return cl->attr; }
  bool flext_obj::IsDSP(t_classid cl) { return cl->dsp; }
  bool flext_obj::IsLib(t_classid cl) { return cl->lib != NULL; }
***************
*** 177,181 ****
  static flext_library *curlib = NULL;
  
! void flext_obj::lib_init(const char *name,void setupfun(),bool attr)
  {
  	// make new library instance
--- 178,182 ----
  static flext_library *curlib = NULL;
  
! void flext_obj::lib_init(const char *name,void setupfun())
  {
  	// make new library instance
***************
*** 184,189 ****
      flext::Setup();
  
- 	process_attributes = attr;
- 
  	// first register all classes
      try {
--- 185,188 ----
***************
*** 237,241 ****
  	else {
  		FLEXT_ASSERT(!curlib);
! 		process_attributes = attr;
  	}
  
--- 236,240 ----
  	else {
  		FLEXT_ASSERT(!curlib);
! //		process_attributes = attr;
  	}
  
***************
*** 270,274 ****
  	lo->lib = curlib;
  	lo->dsp = dsp;
! 	lo->attr = process_attributes;
  
  //	post("ADDCLASS %s,%s = %p -> LIBOBJ %p -> %p (lib=%i,dsp=%i)",idname,names,*cl,lo,lo->clss,lib?1:0,dsp?1:0);
--- 269,273 ----
  	lo->lib = curlib;
  	lo->dsp = dsp;
! 	lo->attr = attr;
  
  //	post("ADDCLASS %s,%s = %p -> LIBOBJ %p -> %p (lib=%i,dsp=%i)",idname,names,*cl,lo,lo->clss,lib?1:0,dsp?1:0);
Index: flthr.cpp
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/flext/source/flthr.cpp,v
retrieving revision 1.33
retrieving revision 1.34
diff -C2 -d -r1.33 -r1.34
*** flthr.cpp	6 Dec 2005 21:52:26 -0000	1.33
--- flthr.cpp	24 May 2006 12:20:57 -0000	1.34
***************
*** 645,648 ****
  #endif
  
- 
  #endif // FLEXT_THREADS
--- 645,647 ----
Index: flclass.h
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/flext/source/flclass.h,v
retrieving revision 1.68
retrieving revision 1.69
diff -C2 -d -r1.68 -r1.69
*** flclass.h	15 May 2006 23:03:52 -0000	1.68
--- flclass.h	24 May 2006 12:20:57 -0000	1.69
***************
*** 395,398 ****
--- 395,399 ----
      void AddMethodDef(int inlet,const char *tag = NULL) { AddMethodDef(inlet,MakeSymbol(tag)); }
  
+ 	void AddMethod(int inlet,bool (*m)(flext_base *)) { AddMethod(ThMeths(),inlet,sym_bang,(methfun)m,a_null); }
  	void AddMethod(int inlet,bool (*m)(flext_base *,int,t_atom *)) { AddMethod(ThMeths(),inlet,sym_list,(methfun)m,a_list,a_null); }
  	void AddMethod(int inlet,bool (*m)(flext_base *,int,const t_atom *)) { AddMethod(ThMeths(),inlet,sym_list,(methfun)m,a_list,a_null); }
***************
*** 443,446 ****
--- 444,448 ----
  	*/
  
+ 	static void AddMethod(t_classid c,int inlet,bool (*m)(flext_base *)) { AddMethod(ClMeths(c),inlet,sym_bang,(methfun)m,a_null); }
  	static void AddMethod(t_classid c,int inlet,bool (*m)(flext_base *,int,t_atom *)) { AddMethod(ClMeths(c),inlet,sym_list,(methfun)m,a_list,a_null); }
  	static void AddMethod(t_classid c,int inlet,bool (*m)(flext_base *,int,const t_atom *)) { AddMethod(ClMeths(c),inlet,sym_list,(methfun)m,a_list,a_null); }
***************
*** 621,624 ****
--- 623,633 ----
  	bool DumpAttrib(const char *attr) const { return DumpAttrib(MakeSymbol(attr)); }
  
+     // check for attribute symbol @
+ 	static int CheckAttrib(int argc,const t_atom *argv);
+     // check for attribute symbol @
+     static int CheckAttrib(const AtomList &args,int offset = 0) { return CheckAttrib(args.Count()-offset,args.Atoms()+offset)+offset; }
+ 
+ 	//! List attributes
+ 	bool ListAttrib() const;
  	//! List attributes
  	void ListAttrib(AtomList &a) const;
***************
*** 626,629 ****
--- 635,640 ----
  	bool GetAttrib(const t_symbol *s,AtomList &a) const;
  	//! Set an attribute value
+ 	bool SetAttrib(const t_symbol *s,int argc,const t_atom *argv);
+ 	//! Set an attribute value
  	bool SetAttrib(const t_symbol *s,const AtomList &a) { return SetAttrib(s,a.Count(),a.Atoms()); }
  
***************
*** 921,931 ****
  	AttrItem *FindAttrib(const t_symbol *tag,bool get,bool msg = false) const;
  
- 	static int CheckAttrib(int argc,const t_atom *argv);
  	bool InitAttrib(int argc,const t_atom *argv);
  
- 	bool ListAttrib() const;
  	bool DumpAttrib(const t_symbol *tag,AttrItem *a) const;
  	bool GetAttrib(const t_symbol *tag,AttrItem *a,AtomList &l) const;
- 	bool SetAttrib(const t_symbol *s,int argc,const t_atom *argv);
  	bool SetAttrib(const t_symbol *tag,AttrItem *a,int argc,const t_atom *argv);
  	bool SetAttrib(const t_symbol *tag,AttrItem *a,const AtomList &l) { return SetAttrib(tag,a,l.Count(),l.Atoms()); }
--- 932,939 ----