14 Semaphore (
const Semaphore&) =
delete;
15 Semaphore& operator= (
const Semaphore&) =
delete;
18 explicit Semaphore () noexcept {
const int err =
sem_init (&sem, 0, 0); g_return_if_fail (!err); }
19 void post () noexcept {
sem_post (&sem); }
28 void (*deleter) (
void*) = [] (
void *data) {
29 BWrap *self = (BWrap*) data;
30 self->deleter =
nullptr;
33 gboolean (*boolfunc) (
void*) = [] (
void *data) ->
int {
34 BWrap *self = (BWrap*) data;
37 gboolean (*truefunc) (
void*) = [] (
void *data) ->
int {
38 BWrap *self = (BWrap*) data;
42 gboolean (*falsefunc) (
void*) = [] (
void *data) ->
int {
43 BWrap *self = (BWrap*) data;
48 BWrap (
const BWrapFunc &fun) : func (fun) {}
50static BWrap* bwrap (
const BWrapFunc &fun) {
51 return new BWrap (fun);
54 return new BWrap ([fun]() { fun();
return false; });
67 char **argv =
nullptr;
68 gtk_init (&argc, &argv);
80 GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
82 if (wsetup.width > 0 && wsetup.height > 0)
83 gtk_window_set_resizable (GTK_WINDOW (window),
false);
84 if (wsetup.deleterequest_mt) {
85 BWrap *bw = vwrap (wsetup.deleterequest_mt);
86 g_signal_connect_data (window,
"delete-event", (GCallback) bw->truefunc, bw, (GClosureNotify) bw->deleter, G_CONNECT_SWAPPED);
88 GtkWidget *
socket = gtk_socket_new();
89 gtk_container_add (GTK_CONTAINER (window), socket);
90 gtk_widget_set_size_request (socket, wsetup.width, wsetup.height);
91 gtk_widget_realize (socket);
92 ulong windowid = gtk_socket_get_id (GTK_SOCKET (socket));
93 windows[windowid] = window;
94 gtk_widget_show_all (gtk_bin_get_child (GTK_BIN (window)));
95 gtk_window_set_title (GTK_WINDOW (window), wsetup.title.
c_str());
100destroy_window (ulong windowid)
102 auto it = windows.find (windowid);
103 if (it == windows.end())
return false;
104 GtkWidget *window = it->second;
106 gtk_widget_destroy (window);
111resize_window (ulong windowid,
int width,
int height)
113 auto it = windows.find (windowid);
114 if (it == windows.end())
return false;
115 GtkWidget *window = it->second;
116 gtk_widget_set_size_request (gtk_bin_get_child (GTK_BIN (window)), width, height);
121show_window (ulong windowid)
123 auto it = windows.find (windowid);
124 if (it == windows.end())
return false;
125 GtkWidget *window = it->second;
126 gtk_widget_show (window);
131hide_window (ulong windowid)
133 auto it = windows.find (windowid);
134 if (it == windows.end())
return false;
135 GtkWidget *window = it->second;
136 gtk_widget_hide (window);
140template<
typename Ret,
typename ...Args,
typename ...Params>
static Ret
141gtkidle_call (Ret (*func) (Params...), Args &&...args)
147 BWrap *bw = bwrap ([&sem, &ret, func, &args...] () ->
bool {
148 GDK_THREADS_ENTER ();
149 ret = func (std::forward<Args> (args)...);
150 GDK_THREADS_LEAVE ();
154 g_idle_add_full (G_PRIORITY_HIGH, bw->boolfunc, bw, bw->deleter);
165 return gtkidle_call (create_window, windowsetup);
167 .resize_window = [] (ulong windowid,
int width,
int height) {
168 return gtkidle_call (resize_window, windowid, width, height);
170 .show_window = [] (ulong windowid) {
171 gtkidle_call (show_window, windowid);
173 .hide_window = [] (ulong windowid) {
174 gtkidle_call (hide_window, windowid);
176 .destroy_window = [] (ulong windowid) {
177 gtkidle_call (destroy_window, windowid);
179 .threads_enter = gdk_threads_enter,
180 .threads_leave = gdk_threads_leave,
The Anklang C++ API namespace.