+/*****************
+ * Gtk Callbacks *
+ *****************/
+
+static void on_destroy(GtkWidget *widget, GdkEvent *event, gpointer user_data)
+{
+ printf("on_destroy\n");
+ sys_exit();
+}
+
+static gboolean on_key(GtkWidget *widget, GdkEventKey *event, gpointer user_data)
+{
+ printf(g_ascii_isprint(event->keyval)
+ ? "on_key: '%c'\n"
+ : "on_key: 0x%X\n",
+ event->keyval);
+ if (event->keyval == GDK_KEY_q)
+ sys_exit();
+ if (event->keyval == GDK_KEY_t)
+ g_spawn_command_line_async("st-wl", NULL);
+ return TRUE;
+}
+
+static gboolean on_button(GtkWidget *widget, GdkEventButton *event, gpointer user_data)
+{
+ printf("on_button\n");
+ return TRUE;
+}
+
+static gboolean on_move(GtkWidget *widget, GdkEventMotion *event, gpointer user_data)
+{
+ return TRUE;
+}
+
+static void on_size(GtkWidget *widget, GtkAllocation *alloc, gpointer user_data)
+{
+ printf("on_size - %dx%d\n", alloc->width, alloc->height);
+ root->w = alloc->width;
+ root->h = alloc->height;
+}
+
+static gboolean on_draw(GtkWidget *widget, cairo_t *cairo, gpointer user_data)
+{
+ printf("on_draw\n");
+
+ wm_update(); // Hacks for now
+
+ list_t *bottom = list_last(windows);
+ for (list_t *cur = bottom; cur; cur = cur->prev) {
+ win_t *win = cur->data;
+ sys_buf_t *buf = win->sys->buf;
+ if (buf == NULL)
+ continue;
+ printf(" win = %p", win);
+ cairo_surface_mark_dirty(buf->surface);
+ cairo_set_source_surface(cairo, buf->surface, win->x, win->y);
+ cairo_paint(cairo);
+ }
+
+ return TRUE;
+}
+
+static gboolean on_wayland(gpointer user_data)
+{
+ // TODO - convert to polled execution
+ wl_display_flush_clients(display);
+ wl_event_loop_dispatch(events, 0);
+ return TRUE;
+}
+