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.