From 3de1e98a5a4f066615869a961f982ed932ccaa6b Mon Sep 17 00:00:00 2001 From: Kristian Høgsberg Date: Wed, 13 Feb 2013 21:47:35 -0500 Subject: Add example of GTK+ based overlay client --- Makefile.am | 9 ++- configure.ac | 1 + gtk-overlay-client.c | 177 +++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 186 insertions(+), 1 deletion(-) create mode 100644 gtk-overlay-client.c 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 +#include +#include +#include +#include + +#include +#include + +#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, + ®istry_listener, client); + client->window = NULL; + + gtk_main(); + + return 0; +} -- cgit v1.2.3