/* * 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 #include "overlay-client-protocol.h" struct overlay_client { GdkDisplay *gdk_display; struct wl_display *wl_display; struct wl_registry *wl_registry; GtkWidget *window; struct overlay *overlay; }; 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 apply_css (GtkWidget *widget, GtkStyleProvider *provider) { gtk_style_context_add_provider(gtk_widget_get_style_context(widget), provider, G_MAXUINT); if (GTK_IS_CONTAINER(widget)) gtk_container_forall(GTK_CONTAINER(widget), (GtkCallback) apply_css, provider); } static char * load_css(const char *filename) { int fd, len; static char buffer[4096]; fd = open(filename, O_RDONLY); len = read(fd, buffer, sizeof buffer - 1); buffer[len] = '\0'; close(fd); return buffer; } static void widget_realize_cb (GtkWidget *widget, void *data) { GdkWindow *window; struct wl_surface *surface; struct input_panel_surface *ip_surface; GdkWindow *gdk_window; struct overlay_client *client = data; gdk_window = gtk_widget_get_window(widget); gdk_wayland_window_set_use_custom_surface(gdk_window); surface = gdk_wayland_window_get_wl_surface(gdk_window); overlay_surface(client->overlay, surface); } static void overlay_activate(void *data, struct overlay *overlay) { struct overlay_client *client = data; GtkWidget *vbox, *label, *bbox, *button; GtkStyleProvider *provider; char *css; 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), 600, 300); g_signal_connect (client->window, "realize", G_CALLBACK (widget_realize_cb), client); gtk_container_set_border_width(GTK_CONTAINER(client->window), 30); 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); provider = GTK_STYLE_PROVIDER(gtk_css_provider_new ()); css = load_css("overlay.css"); gtk_css_provider_load_from_data(GTK_CSS_PROVIDER(provider), css, -1, NULL); apply_css(client->window, provider); 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; }