]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/include/translator.icc
Issue 4835: Move Callback_wrapper class to separate file and simplify
[lilypond.git] / lily / include / translator.icc
index 9f4def39e08712c86975a0f3ea2234aff6d6c8bd..250a92313724f9ab1a7afb0778085dcb7f9eb73b 100644 (file)
@@ -20,7 +20,7 @@
 #ifndef TRANSLATOR_ICC
 #define TRANSLATOR_ICC
 
-#include "listener.hh"
+#include "callback.hh"
 #include "std-vector.hh"
 #include "translator.hh"
 
@@ -48,7 +48,7 @@
   /* end define */
 
 #define DEFINE_TRANSLATOR_LISTENER_LIST(T) \
-  translator_listener_record *T::listener_list_;        \
+  Protected_scm T::listener_list_ (SCM_EOL);    \
   /* end define */
 
 #define DEFINE_ACKNOWLEDGERS(classname) \
     return Translator::static_translator_description (grobs, desc, listener_list_, read, write); \
   }
 
-#define ADD_TRANSLATOR(classname, desc, grobs, read, write)             \
+#define ADD_TRANSLATOR_FAMILY(classname)                                \
   IMPLEMENT_FETCH_PRECOMPUTABLE_METHODS (classname);                    \
+  DEFINE_ACKNOWLEDGERS(classname)                                       \
+
+#define ADD_TRANSLATOR(classname, desc, grobs, read, write)             \
+  ADD_TRANSLATOR_FAMILY (classname)                                     \
   ADD_THIS_TRANSLATOR (classname);                                      \
   DEFINE_TRANSLATOR_DOC(classname, desc, grobs, read, write)            \
-  DEFINE_ACKNOWLEDGERS(classname) \
-  DEFINE_TRANSLATOR_LISTENER_LIST(classname) \
+  DEFINE_TRANSLATOR_LISTENER_LIST(classname)                            \
 
 #define IMPLEMENT_FETCH_PRECOMPUTABLE_METHODS(T)                        \
   void                                                                  \
@@ -135,27 +138,12 @@ generic_get_acknowledger (SCM sym,
 void                                                    \
 cl :: _internal_declare_ ## m ()                        \
 {                                                       \
-  static translator_listener_record r;                  \
-  add_translator_listener (&listener_list_, &r, _get_ ## m ## _listener, #m); \
-}                                                       \
-                                                        \
-ADD_SCM_INIT_FUNC (cl ## _declare_event_ ## m, cl::_internal_declare_ ## m);    \
-                                                        \
-Listener                                                \
- cl :: _get_ ## m ## _listener (void *me, SCM unused)   \
-{                                                       \
-  cl *obj = (cl *) me;                                  \
-  (void) unused; \
-  return obj->GET_LISTENER (_listen_scm_ ## m);         \
-}                                                       \
-                                                        \
-IMPLEMENT_LISTENER (cl, _listen_scm_ ## m)              \
-void                                                    \
-cl::_listen_scm_ ## m (SCM sev)                         \
-{                                                       \
-  Stream_event *ev = Stream_event::unsmob (sev);         \
-  protect_event (sev);                                  \
-  listen_ ## m (ev);                                    \
-}
+  listener_list_ = scm_acons                                            \
+    (event_class_symbol (#m),                                           \
+     Callback_wrapper::make_smob                                        \
+     <trampoline <cl, &cl::listen_ ## m> > (), listener_list_);         \
+}                                                                       \
+                                                                        \
+ADD_SCM_INIT_FUNC (cl ## _declare_event_ ## m, cl::_internal_declare_ ## m);
 
 #endif /* TRANSLATOR_ICC */