From: Andy Spencer Date: Mon, 29 Sep 2014 16:24:59 +0000 (+0000) Subject: Work on gtk interface X-Git-Url: http://pileus.org/git/?p=wmpus;a=commitdiff_plain;h=9391d9bf4c768065496e250f0c479b01186f0ca7 Work on gtk interface --- diff --git a/conf.c b/conf.c index 889bda6..bb4aff7 100644 --- 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 bd258d0..9a850db 100644 --- a/conf.h +++ b/conf.h @@ -13,6 +13,11 @@ * 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); diff --git a/makefile b/makefile index 385fb50..1bb8c93 100644 --- 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) diff --git a/sys-xwl.c b/sys-xwl.c index 1bccf13..3c8adef 100644 --- 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)