]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/dispatcher.cc
Issue 5167/6: Changes: show \markup xxx = ... \etc assignments
[lilypond.git] / lily / dispatcher.cc
index 7f6e0cb70b9bed7f14a78048c4db9c4ade169bcb..b1b076759f83b8a7e1a655d84054957b84afb4c5 100644 (file)
@@ -21,8 +21,9 @@
 #include "input.hh"
 #include "international.hh"
 #include "warn.hh"
+#include "lily-imports.hh"
 
-const char Dispatcher::type_p_name_[] = "ly:dispatcher?";
+const char * const Dispatcher::type_p_name_ = "ly:dispatcher?";
 
 Dispatcher::~Dispatcher ()
 {
@@ -41,7 +42,7 @@ Dispatcher::Dispatcher ()
 }
 
 SCM
-Dispatcher::mark_smob ()
+Dispatcher::mark_smob () const
 {
   scm_gc_mark (dispatchers_);
   scm_gc_mark (listen_classes_);
@@ -49,11 +50,10 @@ Dispatcher::mark_smob ()
 }
 
 int
-Dispatcher::print_smob (SCM p, scm_print_state *)
+Dispatcher::print_smob (SCM p, scm_print_state *) const
 {
   scm_puts ("#<Dispatcher ", p);
-  scm_write (scm_call_1 (ly_lily_module_constant ("hash-table->alist"),
-                         listeners_), p);
+  scm_write (Lily::hash_table_to_alist (listeners_), p);
   scm_puts (">", p);
   return 1;
 }
@@ -75,7 +75,7 @@ Event dispatching:
 void
 Dispatcher::dispatch (SCM sev)
 {
-  Stream_event *ev = Stream_event::unsmob (sev);
+  Stream_event *ev = unsmob<Stream_event> (sev);
   SCM class_list = ev->get_property ("class");
   if (!scm_is_pair (class_list))
     {
@@ -218,7 +218,8 @@ Dispatcher::add_listener (SCM callback, SCM ev_class)
 inline void
 Dispatcher::internal_add_listener (SCM callback, SCM ev_class, int priority)
 {
-  SCM list = scm_hashq_ref (listeners_, ev_class, SCM_EOL);
+  SCM handle = scm_hashq_create_handle_x (listeners_, ev_class, SCM_EOL);
+  SCM list = scm_cdr (handle);
   // if ev_class is not yet listened to, we go through our list of
   // source dispatchers and register ourselves there with the priority
   // we have reserved for this dispatcher.  The priority system
@@ -234,35 +235,36 @@ Dispatcher::internal_add_listener (SCM callback, SCM ev_class, int priority)
       for (SCM disp = dispatchers_; scm_is_pair (disp); disp = scm_cdr (disp))
         {
           int priority = scm_to_int (scm_cdar (disp));
-          Dispatcher *d = Dispatcher::unsmob (scm_caar (disp));
+          Dispatcher *d = unsmob<Dispatcher> (scm_caar (disp));
           d->internal_add_listener (GET_LISTENER (Dispatcher, dispatch).smobbed_copy (),
                                     ev_class, priority);
         }
       listen_classes_ = scm_cons (ev_class, listen_classes_);
     }
   SCM entry = scm_cons (scm_from_int (priority), callback);
-  list = scm_merge (list, scm_list_1 (entry), ly_lily_module_constant ("car<"));
-  scm_hashq_set_x (listeners_, ev_class, list);
+  list = scm_merge (list, scm_list_1 (entry), Lily::car_less);
+  scm_set_cdr_x (handle, list);
 }
 
 void
 Dispatcher::remove_listener (Listener l, SCM ev_class)
 {
-  SCM list = scm_hashq_ref (listeners_, ev_class, SCM_EOL);
+  SCM handle = scm_hashq_get_handle (listeners_, ev_class);
 
-  if (scm_is_null (list))
+  if (scm_is_false (handle))
     {
       programming_error ("remove_listener called with incorrect class.");
       return;
     }
 
+  SCM list = scm_cdr (handle);
   // We just remove the listener once.
   bool first = true;
 
   SCM dummy = scm_cons (SCM_EOL, list);
   SCM e = dummy;
   while (scm_is_pair (scm_cdr (e)))
-    if (*Listener::unsmob (scm_cdadr (e)) == l && first)
+    if (*unsmob<Listener> (scm_cdadr (e)) == l && first)
       {
         scm_set_cdr_x (e, scm_cddr (e));
         first = false;
@@ -271,7 +273,7 @@ Dispatcher::remove_listener (Listener l, SCM ev_class)
     else
       e = scm_cdr (e);
   list = scm_cdr (dummy);
-  scm_hashq_set_x (listeners_, ev_class, list);
+  scm_set_cdr_x (handle, list);
 
   if (first)
     warning (_ ("Attempting to remove nonexisting listener."));
@@ -280,7 +282,7 @@ Dispatcher::remove_listener (Listener l, SCM ev_class)
       /* Unregister with all dispatchers. */
       for (SCM disp = dispatchers_; scm_is_pair (disp); disp = scm_cdr (disp))
         {
-          Dispatcher *d = Dispatcher::unsmob (scm_caar (disp));
+          Dispatcher *d = unsmob<Dispatcher> (scm_caar (disp));
           d->remove_listener (GET_LISTENER (Dispatcher, dispatch), ev_class);
         }
       listen_classes_ = scm_delq_x (ev_class, listen_classes_);