remove virtual inheritance of sigc::trackable by Receiver and AbstractUI<T>, done...
authorPaul Davis <paul@linuxaudiosystems.com>
Mon, 14 May 2012 17:07:53 +0000 (17:07 +0000)
committerPaul Davis <paul@linuxaudiosystems.com>
Mon, 14 May 2012 17:07:53 +0000 (17:07 +0000)
git-svn-id: svn://localhost/ardour2/branches/3.0@12264 d708f5d6-7413-0410-9779-e7cbd77b26cf

libs/ardour/midi_ui.cc
libs/gtkmm2ext/gtk_ui.cc
libs/gtkmm2ext/gtkmm2ext/gtk_ui.h
libs/pbd/base_ui.cc
libs/pbd/pbd/base_ui.h
libs/pbd/pbd/receiver.h
libs/pbd/wscript
libs/surfaces/control_protocol/control_protocol/control_protocol.h

index 770a3714575db47e53427c97d79a6a25dfca3e62..78da32e4273472449e6b023f889c24e3e5854c4b 100644 (file)
@@ -45,7 +45,7 @@ MidiControlUI* MidiControlUI::_instance = 0;
 #include "pbd/abstract_ui.cc"  /* instantiate the template */
 
 MidiControlUI::MidiControlUI (Session& s)
-       : AbstractUI<MidiUIRequest> (_("midiui"))
+       : AbstractUI<MidiUIRequest> (X_("midiui"))
        , _session (s)
 {
        MIDI::Manager::instance()->PortsChanged.connect_same_thread (rebind_connection, boost::bind (&MidiControlUI::change_midi_ports, this));
index 3ec752af02a6dc60adadf896d0bfd56dced6173a..11b06b78ffe4595fbb9e4cf1102d252e56e20bab 100644 (file)
@@ -64,6 +64,8 @@ BaseUI::RequestType Gtkmm2ext::AddTimeout = BaseUI::new_request_type();
 
 UI::UI (string namestr, int *argc, char ***argv)
        : AbstractUI<UIRequest> (namestr)
+       , _receiver (*this)
+         
 {
        theMain = new Main (argc, argv);
 
@@ -252,10 +254,10 @@ UI::load_rcfile (string path, bool themechange)
 void
 UI::run (Receiver &old_receiver)
 {
-       listen_to (error);
-       listen_to (info);
-       listen_to (warning);
-       listen_to (fatal);
+       _receiver.listen_to (error);
+       _receiver.listen_to (info);
+       _receiver.listen_to (warning);
+       _receiver.listen_to (fatal);
 
        /* stop the old receiver (text/console) once we hit the first idle */
 
@@ -266,7 +268,7 @@ UI::run (Receiver &old_receiver)
        theMain->run ();
        _active = false;
        stopping ();
-       hangup ();
+       _receiver.hangup ();
        return;
 }
 
index bba3fb6fdf6b62f03b465e6830636b1dd2163ec1..4bf82fb1aa034cc7063af3728fc440c9b259f3e3 100644 (file)
@@ -88,8 +88,21 @@ struct UIRequest : public BaseUI::BaseRequestObject {
     }
 };
 
-class UI : public Receiver, public AbstractUI<UIRequest>
+class UI : public AbstractUI<UIRequest>
 {
+  private:
+       class MyReceiver : public Receiver {
+         public:
+               MyReceiver (UI& ui) : _ui (ui) {}
+               void receive (Transmitter::Channel chn, const char *msg) {
+                       _ui.receive (chn, msg);
+               }
+         private:
+               UI& _ui;
+       };
+
+       MyReceiver _receiver;
+
   public:
        UI (std::string name, int *argc, char **argv[]);
        virtual ~UI ();
@@ -183,6 +196,7 @@ class UI : public Receiver, public AbstractUI<UIRequest>
        bool color_picked;
 
        void do_request (UIRequest*);
+
 };
 
 } /* namespace */
index 31f956f4cf9bb65758a010ef23c7534361f59c70..c246a50656701ecb2022050396a801d680f322c9 100644 (file)
@@ -74,11 +74,22 @@ void
 BaseUI::main_thread ()
 {
        DEBUG_TRACE (DEBUG::EventLoop, string_compose ("%1: event loop running in thread %2\n", name(), pthread_self()));
+       std::cerr << string_compose ("%1: event loop running in thread %2\n", name(), pthread_self());
        set_event_loop_for_thread (this);
        thread_init ();
+       _main_loop->get_context()->signal_idle().connect (sigc::mem_fun (*this, &BaseUI::signal_running));
        _main_loop->run ();
 }
 
+bool
+BaseUI::signal_running ()
+{
+       Glib::Mutex::Lock lm (_run_lock);
+       _running.signal ();
+       
+       return false; // don't call it again
+}
+
 void
 BaseUI::run ()
 {
@@ -91,7 +102,11 @@ BaseUI::run ()
        /* glibmm hack - drop the refptr to the IOSource now before it can hurt */
        request_channel.drop_ios ();
 
+       Glib::Mutex::Lock lm (_run_lock);
        run_loop_thread = Thread::create (mem_fun (*this, &BaseUI::main_thread), true);
+       std::cerr << "wait for " << name() << " thread to start\n";
+       _running.wait (_run_lock);
+       std::cerr << "\tthread now running\n";
 }
 
 void
index 414c9970d979e5c3cc038988f86d3fe74ed00b0f..65a9f27b49225b915fdad28c25881457b7535b99 100644 (file)
@@ -41,7 +41,7 @@
  */
 
 
-class BaseUI : virtual public sigc::trackable, public PBD::EventLoop
+class BaseUI : public sigc::trackable, public PBD::EventLoop
 {
   public:
        BaseUI (const std::string& name);
@@ -76,6 +76,14 @@ class BaseUI : virtual public sigc::trackable, public PBD::EventLoop
 
        Glib::RefPtr<Glib::MainLoop> _main_loop;
        Glib::Thread*                 run_loop_thread;
+       Glib::Mutex                  _run_lock;
+       Glib::Cond                   _running;
+
+       /* this signals _running from within the event loop,
+          from an idle callback 
+       */
+
+       bool signal_running ();
 
        /** Derived UI objects can implement thread_init()
         * which will be called by the event loop thread
index 5e32c7d67fd818cc05815c4b8046b03786a0e314..32fb84fa38e28c99e8e8e5bc6d2b932978ab1c1b 100644 (file)
@@ -28,7 +28,7 @@
 
 class strstream;
 
-class Receiver : virtual public sigc::trackable
+class Receiver : public sigc::trackable
 {
   public:
        Receiver ();
index 069936b28f37528b9739ea4c3cf04a53a5ba0b6b..60799f0116b28b5de925bf60a1ae5f216c24d309 100644 (file)
@@ -142,6 +142,7 @@ def build(bld):
         testobj.includes     = obj.includes + ['test', '../pbd']
         testobj.uselib       = 'CPPUNIT XML SNDFILE'
         testobj.use          = 'libpbd'
+        testobj.name         = 'libpbd-tests'
         if sys.platform != 'darwin':
             testobj.linkflags    = ['-lrt']
 
index 6021f189fe483b0a7c1bbe33ce780991e7a4d738..155c9236dade0d7f0092ed6ee5878e70660366cb 100644 (file)
@@ -39,7 +39,8 @@ class Route;
 class Session;
 class Bundle;
 
-class ControlProtocol : public PBD::Stateful, public PBD::ScopedConnectionList, public BasicUI {
+class ControlProtocol : public PBD::Stateful, public PBD::ScopedConnectionList, public BasicUI
+{
   public:
        ControlProtocol (Session&, std::string name);
        virtual ~ControlProtocol();