]> Pileus Git - wmpus/blobdiff - sys-xwl.c
Work on gtk interface
[wmpus] / sys-xwl.c
index 1bccf13def827eb5f194b466dd27ed22b27671db..3c8adef0b9ca9f322a871c34d08305985e0fa30a 100644 (file)
--- a/sys-xwl.c
+++ b/sys-xwl.c
@@ -38,38 +38,56 @@ struct win_sys {
 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");
@@ -79,6 +97,28 @@ static void new_screen(void)
 {
        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 *
@@ -137,13 +177,23 @@ win_t *sys_init(void)
        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);
 }
@@ -151,13 +201,13 @@ win_t *sys_init(void)
 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)