#include <cstring>
#include "pbd/base_ui.h"
+#include "pbd/pthread_utils.h"
#include "pbd/error.h"
#include "pbd/compose.h"
#include "pbd/failed_constructor.h"
uint64_t BaseUI::rt_bit = 1;
BaseUI::RequestType BaseUI::CallSlot = BaseUI::new_request_type();
+BaseUI::RequestType BaseUI::Quit = BaseUI::new_request_type();
BaseUI::BaseUI (const string& str)
: run_loop_thread (0)
void
BaseUI::main_thread ()
{
+ set_event_loop_for_thread (this);
thread_init ();
_main_loop->run ();
}
BaseUI::run ()
{
/* to be called by UI's that need/want their own distinct, self-created event loop thread.
- Derived classes should have set up a handler for IO on request_channel.ios()
*/
_main_loop = MainLoop::create (MainContext::create());
request_channel.ios()->attach (_main_loop->get_context());
+
+ /* glibmm hack - drop the refptr to the IOSource now before it can hurt */
+ request_channel.drop_ios ();
+
run_loop_thread = Thread::create (mem_fun (*this, &BaseUI::main_thread), true);
}
void
BaseUI::quit ()
{
- _main_loop->quit ();
- run_loop_thread->join ();
+ if (_main_loop->is_running()) {
+ _main_loop->quit ();
+ run_loop_thread->join ();
+ }
}
bool