summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKristian Høgsberg <krh@bitplanet.net>2013-02-13 21:47:35 -0500
committerKristian Høgsberg <krh@bitplanet.net>2013-02-13 22:10:06 -0500
commit3de1e98a5a4f066615869a961f982ed932ccaa6b (patch)
treec5fd386765d56fda8cb5a74c1eb61aa4e55d4a54
parent90657356ac83b0c735e7dbbbd750023da69a0da7 (diff)
Add example of GTK+ based overlay client
-rw-r--r--Makefile.am9
-rw-r--r--configure.ac1
-rw-r--r--gtk-overlay-client.c177
3 files changed, 186 insertions, 1 deletions
diff --git a/Makefile.am b/Makefile.am
index e3b11ba..882ac21 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1,4 +1,4 @@
-libexec_PROGRAMS = weston-overlay
+libexec_PROGRAMS = weston-overlay weston-gtk-overlay
weston_overlay_CPPFLAGS = $(CLIENT_CFLAGS)
weston_overlay_LDADD = $(CLIENT_LIBS)
@@ -7,6 +7,13 @@ weston_overlay_SOURCES = \
overlay-client-protocol.h \
overlay-protocol.c
+weston_gtk_overlay_CPPFLAGS = $(GTK_CLIENT_CFLAGS)
+weston_gtk_overlay_LDADD = $(GTK_CLIENT_LIBS)
+weston_gtk_overlay_SOURCES = \
+ gtk-overlay-client.c \
+ overlay-client-protocol.h \
+ overlay-protocol.c
+
moduledir = @libdir@/weston
module_LTLIBRARIES = \
overlay.la
diff --git a/configure.ac b/configure.ac
index b6b746a..75fb05b 100644
--- a/configure.ac
+++ b/configure.ac
@@ -18,6 +18,7 @@ LT_INIT([disable-static])
PKG_PROG_PKG_CONFIG()
PKG_CHECK_MODULES([CLIENT], [wayland-client >= 1.0.2])
+PKG_CHECK_MODULES([GTK_CLIENT], [wayland-client >= 1.0.2 gtk+-3.0 >= 3.7])
PKG_CHECK_MODULES([PLUGIN], [pixman-1 xkbcommon])
WAYLAND_PREFIX=`$PKG_CONFIG --variable=prefix wayland-client`
diff --git a/gtk-overlay-client.c b/gtk-overlay-client.c
new file mode 100644
index 0000000..ba35c62
--- /dev/null
+++ b/gtk-overlay-client.c
@@ -0,0 +1,177 @@
+/*
+ * Copyright © 2013 Intel Corporation
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that copyright
+ * notice and this permission notice appear in supporting documentation, and
+ * that the name of the copyright holders not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission. The copyright holders make no representations
+ * about the suitability of this software for any purpose. It is provided "as
+ * is" without express or implied warranty.
+ *
+ * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include <string.h>
+#include <wayland-client.h>
+
+#include <gtk/gtk.h>
+#include <gdk/gdkwayland.h>
+
+#include "overlay-client-protocol.h"
+
+struct overlay_client {
+ GdkWindow *gdk_window;
+ GdkDisplay *gdk_display;
+ struct wl_display *wl_display;
+ struct wl_registry *wl_registry;
+ GtkWidget *window;
+ struct overlay *overlay;
+ struct wl_surface *wl_surface;
+};
+
+static void
+tell_me_more(GtkWidget *widget, gpointer data)
+{
+ struct overlay_client *client = data;
+
+ gtk_widget_destroy(client->window);
+ client->window = NULL;
+}
+
+static void
+dismiss(GtkWidget *widget, gpointer data)
+{
+ struct overlay_client *client = data;
+
+ gtk_widget_destroy(client->window);
+ client->window = NULL;
+}
+
+static void
+overlay_activate(void *data, struct overlay *overlay)
+{
+ struct overlay_client *client = data;
+ GtkWidget *vbox, *label, *bbox, *button;
+
+ if (client->window) {
+ printf("overlay already active\n");
+ return;
+ }
+
+ printf("got activate event, creating overlay\n");
+
+ client->window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+ gtk_window_set_title(GTK_WINDOW(client->window), "Hello");
+ gtk_window_set_decorated(GTK_WINDOW(client->window), FALSE);
+ gtk_window_set_default_size(GTK_WINDOW(client->window), 400, 200);
+
+ gtk_container_set_border_width(GTK_CONTAINER(client->window), 10);
+
+ vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 8);
+ gtk_container_add(GTK_CONTAINER(client->window), vbox);
+
+ label = gtk_label_new("Welcome to the secret overlay");
+ gtk_box_pack_start(GTK_BOX(vbox), label, TRUE, FALSE, 0);
+
+ bbox = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL);
+ gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox), GTK_BUTTONBOX_END);
+ gtk_box_set_spacing (GTK_BOX (bbox), 20);
+
+ gtk_box_pack_start(GTK_BOX(vbox), bbox, FALSE, FALSE, 0);
+
+ button = gtk_button_new_with_label("Tell me more");
+ g_signal_connect(button, "clicked", G_CALLBACK(tell_me_more), client);
+ gtk_container_add(GTK_CONTAINER(bbox), button);
+
+ button = gtk_button_new_with_label("Dismiss");
+ g_signal_connect(button, "clicked", G_CALLBACK(dismiss), client);
+ gtk_container_add(GTK_CONTAINER(bbox), button);
+
+ gtk_widget_realize(client->window);
+
+ client->gdk_window = gtk_widget_get_window(client->window);
+
+ gdk_wayland_window_set_custom(client->gdk_window);
+
+ client->wl_surface =
+ gdk_wayland_window_get_wl_surface(client->gdk_window);
+
+ overlay_surface(client->overlay, client->wl_surface);
+
+ gtk_widget_show_all(client->window);
+}
+
+static void
+overlay_done(void *data, struct overlay *overlay)
+{
+ struct overlay_client *client = data;
+
+ printf("got done event, destroying overlay\n");
+
+ gtk_widget_destroy(client->window);
+ client->window = NULL;
+}
+
+static const struct overlay_listener listener = {
+ overlay_activate,
+ overlay_done
+};
+
+static void
+registry_handle_global(void *data, struct wl_registry *registry,
+ uint32_t name, const char *interface, uint32_t version)
+{
+ struct overlay_client *client = data;
+
+ if (strcmp(interface, "overlay") == 0) {
+ client->overlay = wl_registry_bind(registry, name,
+ &overlay_interface, 1);
+ overlay_add_listener(client->overlay, &listener, client);
+ }
+}
+
+static void
+registry_handle_global_remove(void *data, struct wl_registry *registry,
+ uint32_t name)
+{
+}
+
+static const struct wl_registry_listener registry_listener = {
+ registry_handle_global,
+ registry_handle_global_remove
+};
+
+int
+main(int argc, char *argv[])
+{
+ struct overlay_client *client;
+
+ gtk_init(&argc, &argv);
+
+ client = malloc(sizeof *client);
+
+ client->gdk_display = gdk_display_get_default();
+ client->wl_display =
+ gdk_wayland_display_get_wl_display(client->gdk_display);
+
+ client->wl_registry = wl_display_get_registry(client->wl_display);
+ wl_registry_add_listener(client->wl_registry,
+ &registry_listener, client);
+ client->window = NULL;
+
+ gtk_main();
+
+ return 0;
+}