]> Pileus Git - wmpus/commitdiff
Work on gtk interface
authorAndy Spencer <andy753421@gmail.com>
Mon, 29 Sep 2014 16:24:59 +0000 (16:24 +0000)
committerAndy Spencer <andy753421@gmail.com>
Mon, 29 Sep 2014 16:24:59 +0000 (16:24 +0000)
conf.c
conf.h
makefile
sys-xwl.c

diff --git a/conf.c b/conf.c
index 889bda6e4327839927c022626a816a186b61274b..bb4aff7ab71505d0b5a3ce015c989b1cdf7e0eaf 100644 (file)
--- a/conf.c
+++ b/conf.c
@@ -35,10 +35,12 @@ typedef struct {
        };
 } entry_t;
 
-/* Data */
+/* Global Data */
+int    conf_argc;
+char **conf_argv;
+
+/* Local Data */
 static void  *conf;
-static int    conf_argc;
-static char **conf_argv;
 static char   conf_path[256];
 
 /* Helpers */
diff --git a/conf.h b/conf.h
index bd258d09278d4e91ff15ad6e1f91574175ec6554..9a850dbf29645ae37af5ea5e043e92d6e1b14801 100644 (file)
--- a/conf.h
+++ b/conf.h
  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  */
 
+/* Global data */
+extern int    conf_argc;
+extern char **conf_argv;
+
+/* Functions */
 int conf_get_int(const char *key, int def);
 
 const char *conf_get_str(const char *key, const char *def);
index 385fb50f500da9300ece03a17d854e791ba44d07..1bb8c93fe918526364eec48f9c0fdd938989ea16 100644 (file)
--- a/makefile
+++ b/makefile
@@ -15,8 +15,8 @@ GCC       ?= gcc
 PROG      ?= wmpus
 LDFLAGS   += -lwayland-client -lwayland-server
 
-sys-xwl.o: CFLAGS  += $(shell pkg-config --cflags gtk+-2.0)
-wmpus:     LDFLAGS += $(shell pkg-config --libs gtk+-2.0)
+sys-xwl.o: CFLAGS  += $(shell pkg-config --cflags gtk+-3.0)
+wmpus:     LDFLAGS += $(shell pkg-config --libs   gtk+-3.0)
 endif
 
 ifeq ($(SYS),wl)
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)