static struct wl_display *display;
static struct wl_event_loop *events;
-/*******************
- * Debug functions *
- *******************/
-static const char * cmd_term[] = { "st-wl", NULL };
-static const char * cmd_menu[] = { "dmenu_run-wl", NULL };
+static GtkWidget *window;
-static void cmd_exit(void *data, uint32_t time, uint32_t value, uint32_t state)
+/*****************
+ * Gtk Callbacks *
+ *****************/
+
+static void on_destroy(GtkWidget *widget, GdkEvent *event, gpointer user_data)
{
- if (state != WL_KEYBOARD_KEY_STATE_PRESSED)
- return;
+ printf("on_destroy\n");
+ sys_exit();
+}
- printf("cmd_exit\n");
- exit(0);
+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 void cmd_spawn(void *data, uint32_t time, uint32_t value, uint32_t state)
+static gboolean on_button(GtkWidget *widget, GdkEventButton *event, gpointer user_data)
{
- char **cmd = data;
- if (state != WL_KEYBOARD_KEY_STATE_PRESSED)
- return;
+ printf("on_button\n");
+ return TRUE;
+}
- printf("cmd_spawn: %s\n", cmd[0]);
- if (fork() == 0) {
- execvp(cmd[0], cmd);
- exit(0);
- }
+static gboolean on_move(GtkWidget *widget, GdkEventMotion *event, gpointer user_data)
+{
+ //printf("on_motion\n");
+ return TRUE;
}
-/*************
- * Callbacks *
- *************/
+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;
+}
+/*********************
+ * Wayland Callbacks *
+ *********************/
+
+#if 0
static void new_window(void)
{
printf("new_window\n");
{
printf("new_screen\n");
}
+#endif
+
+/***********************************
+ * Wayland Shared Memory Interface *
+ ***********************************/
+
+struct wl_global *shm_ref;
+
+static struct wl_shm_interface shm_iface = {
+ .create_pool = NULL,
+};
+
+static void shm_bind(struct wl_client *client, void *data, uint32_t version, uint32_t id)
+{
+ printf("shm_bind\n");
+
+ struct wl_resource *res = wl_resource_create(client, &wl_shm_interface, version, id);
+ wl_resource_set_implementation(res, &shm_iface, NULL, NULL);
+
+ wl_shm_send_format(res, WL_SHM_FORMAT_XRGB8888);
+ wl_shm_send_format(res, WL_SHM_FORMAT_ARGB8888);
+}
/********************
* System functions *
if (!(events = wl_display_get_event_loop(display)))
error("Unable to get event loop");
- /* Add input devices */
- (void)cmd_term;
- (void)cmd_menu;
- (void)cmd_exit;
- (void)cmd_spawn;
- (void)new_window;
- (void)new_screen;
+ /* Register interfaces */
+ shm_ref = wl_global_create(display, &wl_shm_interface, 1, NULL, &shm_bind);
+
+ /* Setup GTK display */
+ gtk_init(&conf_argc, &conf_argv);
+ window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+ gtk_widget_add_events(window,
+ GDK_KEY_PRESS_MASK |
+ GDK_BUTTON_PRESS_MASK |
+ GDK_BUTTON_RELEASE_MASK |
+ GDK_POINTER_MOTION_MASK);
+ g_signal_connect(window, "destroy", G_CALLBACK(on_destroy), NULL);
+ g_signal_connect(window, "key-press-event", G_CALLBACK(on_key), NULL);
+ g_signal_connect(window, "button-press-event", G_CALLBACK(on_button), NULL);
+ g_signal_connect(window, "motion-notify-event", G_CALLBACK(on_move), NULL);
+ g_timeout_add(1000/60, on_wayland, NULL);
+ gtk_widget_show(window);
return new0(win_t);
}
void sys_run(win_t *root)
{
printf("sys_run: %p\n", root);
- wl_display_run(display);
+ gtk_main();
}
void sys_exit(void)
{
printf("sys_exit\n");
- exit(0);
+ gtk_main_quit();
}
void sys_free(win_t *root)