#define INCLUDED_UILIB_H
#include <string>
+#include <glib-object.h>
struct _GdkEventKey;
struct _GtkAccelGroup;
struct _GtkDialog;
struct _GtkEditable;
struct _GtkEntry;
+struct _GtkEntryCompletion;
struct _GtkFrame;
struct _GtkHBox;
struct _GtkHPaned;
struct _GtkTextView;
struct _GtkToggleButton;
struct _GtkToggleToolButton;
+struct _GtkToolbar;
struct _GtkToolButton;
struct _GtkToolItem;
struct _GtkTreeModel;
struct _GtkTreePath;
+struct _GtkTreeSelection;
struct _GtkTreeView;
struct _GtkTreeViewColumn;
struct _GtkVBox;
struct _GtkWindow;
struct _GTypeInstance;
+#if GTK_TARGET == 3
+struct _GtkGLArea;
+#endif
+
+#if GTK_TARGET == 2
+using _GtkGLArea = struct _GtkDrawingArea;
+#endif
+
struct ModalDialog;
namespace ui {
- void init(int argc, char *argv[]);
+ bool init(int *argc, char **argv[], char const *parameter_string, char const **error);
void main();
+ void process();
+
extern class Widget root;
enum class alert_type {
POPUP
};
+ enum class Shadow {
+ NONE,
+ IN,
+ OUT,
+ ETCHED_IN,
+ ETCHED_OUT
+ };
+
+ enum class Policy {
+ ALWAYS,
+ AUTOMATIC,
+ NEVER
+ };
+
namespace details {
enum class Convert {
};
}
+ extern struct Null {} null;
+
class Object :
public details::Convertible<Object, _GtkObject *, details::Convert::Explicit>,
public details::Convertible<Object, _GTypeInstance *, details::Convert::Explicit> {
public:
+ using self = Object *;
using native = _GtkObject *;
native _handle;
explicit operator void *() const
{ return _handle; }
+
+ void unref()
+ { g_object_unref(_handle); }
+
+ template<class Lambda>
+ gulong connect(char const *detailed_signal, Lambda &&c_handler, void *data);
+
+ template<class Lambda>
+ gulong connect(char const *detailed_signal, Lambda &&c_handler, Object data);
};
static_assert(sizeof(Object) == sizeof(Object::native), "object slicing");
#define WRAP(name, super, T, interfaces, ctors, methods) \
class name; \
- class I##name { \
+ class I##name : public details::Convertible<name, T *, details::Convert::Implicit> { \
public: \
using self = name *; \
methods \
}; \
- class name : public super, public details::Convertible<name, T *, details::Convert::Implicit>, public I##name, public details::Mixin<name, void interfaces>::type { \
+ class name : public super, public I##name, public details::Mixin<name, void interfaces>::type { \
public: \
using self = name *; \
using native = T *; \
explicit name(native h) : super(reinterpret_cast<super::native>(h)) {} \
+ explicit name(Null n) : name((native) nullptr) {} \
ctors \
}; \
inline bool operator<(name self, name other) { return self._handle < other._handle; } \
// https://developer.gnome.org/gtk2/stable/ch01.html
+ // GInterface
+
WRAP(CellEditable, Object, _GtkCellEditable, (),
,
);
void editable(bool value);
);
+ WRAP(TreeModel, Object, _GtkTreeModel, (),
+ ,
+ );
+
+ // GObject
+
WRAP(Widget, Object, _GtkWidget, (),
Widget();
,
WRAP(Container, Widget, _GtkContainer, (),
,
+ void add(Widget widget);
+
+ void remove(Widget widget);
+
+ template<class Lambda>
+ void foreach(Lambda &&lambda);
);
WRAP(Bin, Container, _GtkBin, (),
class AccelGroup;
WRAP(Window, Bin, _GtkWindow, (),
- Window();
Window(window_type type);
,
Window create_dialog_window(
,
);
- WRAP(Table, Widget, _GtkTable, (),
+ WRAP(Table, Container, _GtkTable, (),
Table(std::size_t rows, std::size_t columns, bool homogenous);
,
);
- WRAP(TextView, Widget, _GtkTextView, (),
+ WRAP(TextView, Container, _GtkTextView, (),
TextView();
,
);
+ WRAP(Toolbar, Container, _GtkToolbar, (),
+ ,
+ );
+
class TreeModel;
WRAP(TreeView, Widget, _GtkTreeView, (),
TreeView();
,
);
- WRAP(ListStore, Object, _GtkListStore, (),
+ WRAP(EntryCompletion, Object, _GtkEntryCompletion, (),
+ ,
+ );
+
+ WRAP(ListStore, Object, _GtkListStore, (ITreeModel),
,
void clear();
);
- WRAP(TreeModel, Widget, _GtkTreeModel, (),
+ WRAP(TreeSelection, Object, _GtkTreeSelection, (),
,
);
+ // GBoxed
+
WRAP(TreePath, Object, _GtkTreePath, (),
TreePath();
TreePath(const char *path);
,
);
+ // Custom
+
+ WRAP(GLArea, Widget, _GtkGLArea, (),
+ ,
+ guint on_render(GCallback pFunction, void *data);
+ );
+
#undef WRAP
+ // 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(widget));
+ };
+ gtk_container_foreach(this, cb, &lambda);
+ }
+
+#undef this
+
}
#endif