-
Notifications
You must be signed in to change notification settings - Fork 60
/
Copy pathMainLoop.hpp
45 lines (34 loc) · 1.05 KB
/
MainLoop.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#pragma once
#include <glibmm/main.h>
#include <gtkmm/application.h>
#include <thread>
#include <boost/signals2/signal.hpp>
class WindowGtk;
using ShutdownAction = std::function<void()>;
using IdleAction = std::function<bool()>;
using SignalStarted = boost::signals2::signal<void()>;
class MainLoop
{
public:
MainLoop(const std::string& name);
template <typename Callback>
static void pushToUiThread(Callback callback)
{
Glib::MainContext::get_default()->invoke([callback = std::move(callback)] {
callback();
return false;
});
}
static std::thread::id uiThreadId();
int run(WindowGtk& adaptor);
void quit();
SignalStarted& started();
void setShutdownAction(const ShutdownAction& action);
void setIdleAction(const IdleAction& action);
private:
Glib::RefPtr<Gtk::Application> parentApp_;
sigc::connection idleConnection_;
ShutdownAction shutdownAction_;
SignalStarted started_;
};
#define CHECK_UI_THREAD() assert(MainLoop::uiThreadId() == std::this_thread::get_id())