+ // global
+
+ enum class alert_response {
+ OK,
+ CANCEL,
+ YES,
+ NO,
+ };
+
+ enum class alert_type {
+ OK,
+ OKCANCEL,
+ YESNO,
+ YESNOCANCEL,
+ NOYES,
+ };
+
+ enum class alert_icon {
+ Default,
+ Error,
+ Warning,
+ Question,
+ Asterisk,
+ };
+
+ extern class Window root;
+
+ alert_response alert(
+ Window parent,
+ std::string text,
+ std::string title = RADIANT_NAME,
+ alert_type type = alert_type::OK,
+ alert_icon icon = alert_icon::Default
+ );
+
+ // callbacks
+
+ namespace {
+ using GtkCallback = void (*)(_GtkWidget *, void *);
+ extern "C" {
+ void gtk_container_foreach(_GtkContainer *, GtkCallback, void *);
+ }
+ }
+
+#define this (*static_cast<self>(this))
+
+ template<class Lambda>
+ gulong Object::connect(char const *detailed_signal, Lambda &&c_handler, void *data)
+ {
+ return g_signal_connect(G_OBJECT(this), detailed_signal, c_handler, data);
+ }
+
+ template<class Lambda>
+ gulong Object::connect(char const *detailed_signal, Lambda &&c_handler, Object data)
+ {
+ return g_signal_connect(G_OBJECT(this), detailed_signal, c_handler, (_GtkObject *) data);
+ }
+
+ template<class Lambda>
+ void IContainer::foreach(Lambda &&lambda)
+ {
+ GtkCallback cb = [](_GtkWidget *widget, void *data) -> void {
+ using Function = typename std::decay<Lambda>::type;
+ Function *f = static_cast<Function *>(data);
+ (*f)(Widget::from(widget));
+ };
+ gtk_container_foreach(this, cb, &lambda);
+ }
+
+ namespace {
+ extern "C" {
+ void gtk_list_store_insert_with_values(_GtkListStore *, _GtkTreeIter *, gint position, ...);
+ }
+ }
+
+ template<class... T>
+ void IListStore::append(T... args) {
+ static_assert(sizeof...(args) % 2 == 0, "received an odd number of arguments");
+ gtk_list_store_insert_with_values(this, NULL, -1, args..., -1);
+ }
+
+#undef this
+