diff options
| author | Tiago Vignatti <tiago.vignatti@intel.com> | 2013-03-27 17:16:48 -0300 |
|---|---|---|
| committer | Tiago Vignatti <tiago.vignatti@intel.com> | 2013-03-27 17:31:53 -0300 |
| commit | 3939d1b707ccd8c89f771fb09bcd634025f4925d (patch) | |
| tree | 2062cb2a3aa76bb72c2c5caa06bac376ae90b6a7 | |
| parent | 0960a31743203c43bbd7455df167faa3302898d7 (diff) | |
| download | graynard-3939d1b707ccd8c89f771fb09bcd634025f4925d.tar.gz graynard-3939d1b707ccd8c89f771fb09bcd634025f4925d.zip | |
Fix background drawing
There's still some race happening though, which prevents the client of showing
anything.
Signed-off-by: Tiago Vignatti <tiago.vignatti@intel.com>
| -rw-r--r-- | shell/gtk-shell.c | 62 |
1 files changed, 45 insertions, 17 deletions
diff --git a/shell/gtk-shell.c b/shell/gtk-shell.c index 89fa956..5d7c089 100644 --- a/shell/gtk-shell.c +++ b/shell/gtk-shell.c @@ -6,7 +6,7 @@ #include "desktop-shell-client-protocol.h" -gchar *filename = "notfound.png"; +gchar *filename = "background.jpg"; struct desktop { struct wl_display *display; @@ -16,8 +16,10 @@ struct desktop { struct wl_surface *surface; GdkDisplay *gdk_display; - GdkWindow *gdk_window; - GtkWidget *widget; + + /* Background */ + GtkWidget *window; + GdkPixbuf *background; }; static void @@ -29,7 +31,7 @@ desktop_shell_configure(void *data, { struct desktop *desktop = wl_surface_get_user_data(surface); - gtk_window_resize(GTK_WINDOW(desktop->widget), width, height); + gtk_widget_set_size_request (desktop->window, width, height); } static void @@ -50,33 +52,59 @@ static const struct desktop_shell_listener listener = { desktop_shell_grab_cursor }; +/* Expose callback for the drawing area */ +static gboolean +draw_cb (GtkWidget *widget, cairo_t *cr, gpointer data) +{ + struct desktop *desktop = data; + + gdk_cairo_set_source_pixbuf (cr, desktop->background, 0, 0); + cairo_paint (cr); + + return TRUE; +} + +/* Destroy handler for the window */ +static void +destroy_cb (GObject *object, gpointer data) +{ + gtk_main_quit (); +} + static void background_create(struct desktop *desktop) { - GtkWidget *image; + GdkWindow *gdk_window; - desktop->widget = gtk_window_new(GTK_WINDOW_TOPLEVEL); + /* TODO: get the "right" directory */ + desktop->background = gdk_pixbuf_new_from_file (filename, NULL); + if (!desktop->background) { + g_message ("Could not load background."); + exit (EXIT_FAILURE); + } - /* XXX: this is actually not working */ - image = gtk_image_new_from_file(filename); + desktop->window = gtk_window_new(GTK_WINDOW_TOPLEVEL); - gtk_container_add (GTK_CONTAINER (desktop->widget), image); + g_signal_connect (desktop->window, "destroy", + G_CALLBACK (destroy_cb), NULL); - gtk_window_set_title(GTK_WINDOW(desktop->widget), "gtk shell"); - gtk_window_set_decorated(GTK_WINDOW(desktop->widget), FALSE); - gtk_widget_realize(desktop->widget); - desktop->gdk_window = gtk_widget_get_window(desktop->widget); + g_signal_connect (desktop->window, "draw", + G_CALLBACK (draw_cb), desktop); - gdk_wayland_window_set_use_custom_surface(desktop->gdk_window); + gtk_window_set_title(GTK_WINDOW(desktop->window), "gtk shell"); + gtk_window_set_decorated(GTK_WINDOW(desktop->window), FALSE); + gtk_widget_realize(desktop->window); - desktop->surface = - gdk_wayland_window_get_wl_surface(desktop->gdk_window); + gdk_window = gtk_widget_get_window(desktop->window); + gdk_wayland_window_set_use_custom_surface(gdk_window); + desktop->surface = gdk_wayland_window_get_wl_surface(gdk_window); wl_surface_set_user_data(desktop->surface, desktop); + desktop_shell_set_background(desktop->shell, desktop->output, desktop->surface); - gtk_widget_show_all(desktop->widget); + gtk_widget_show_all(desktop->window); } static void |
