diff -Nru gtk+3.0-3.4.1/debian/changelog gtk+3.0-3.4.1/debian/changelog --- gtk+3.0-3.4.1/debian/changelog 2012-04-16 04:29:20.000000000 -0400 +++ gtk+3.0-3.4.1/debian/changelog 2012-04-17 17:37:38.000000000 -0400 @@ -1,3 +1,11 @@ +gtk+3.0 (3.4.1-0ubuntu1+wayland2) precise; urgency=low + + * Patch to prefer X11 over Wayland output. + * Patches to remove cairo-gl dependency. + * Enable Wayland backend. + + -- Darxus Tue, 17 Apr 2012 21:48:49 -0400 + gtk+3.0 (3.4.1-0ubuntu1) precise-proposed; urgency=low * New upstream bug fix release: diff -Nru gtk+3.0-3.4.1/debian/control gtk+3.0-3.4.1/debian/control --- gtk+3.0-3.4.1/debian/control 2012-04-16 04:29:20.000000000 -0400 +++ gtk+3.0-3.4.1/debian/control 2012-04-17 17:38:57.000000000 -0400 @@ -34,7 +34,9 @@ x11proto-xext-dev, libcups2-dev (>= 1.2), gobject-introspection (>= 1.32.0), - libgirepository1.0-dev (>= 1.32.0) + libgirepository1.0-dev (>= 1.32.0), + libwayland-dev, + libxkbcommon-dev Build-Depends-Indep: docbook-xml, docbook-utils, libglib2.0-doc, diff -Nru gtk+3.0-3.4.1/debian/libgtk-3-0.symbols gtk+3.0-3.4.1/debian/libgtk-3-0.symbols --- gtk+3.0-3.4.1/debian/libgtk-3-0.symbols 2012-04-16 04:29:20.000000000 -0400 +++ gtk+3.0-3.4.1/debian/libgtk-3-0.symbols 2012-04-17 17:10:01.000000000 -0400 @@ -43,6 +43,7 @@ gdk_cursor_ref@Base 3.0.0 gdk_cursor_type_get_type@Base 3.0.0 gdk_cursor_unref@Base 3.0.0 + gdk_device_core_get_type@Base 3.4.1-0ubuntu1+wayland1 gdk_device_free_history@Base 3.0.0 gdk_device_get_associated_device@Base 3.0.0 gdk_device_get_axis@Base 3.0.0 @@ -66,6 +67,7 @@ gdk_device_grab_info_libgtk_only@Base 3.0.0 gdk_device_list_axes@Base 3.0.0 gdk_device_list_slave_devices@Base 3.0.0 + gdk_device_manager_core_get_type@Base 3.4.1-0ubuntu1+wayland1 gdk_device_manager_get_client_pointer@Base 3.0.0 gdk_device_manager_get_display@Base 3.0.0 gdk_device_manager_get_type@Base 3.0.0 @@ -349,6 +351,15 @@ gdk_visual_get_type@Base 3.0.0 gdk_visual_get_visual_type@Base 3.0.0 gdk_visual_type_get_type@Base 3.0.0 + gdk_wayland_app_launch_context_get_type@Base 3.4.1-0ubuntu1+wayland1 + gdk_wayland_device_clear_selection_content_libgtk_only@Base 3.4.1-0ubuntu1+wayland1 + gdk_wayland_device_get_selection_type_atoms_libgtk_only@Base 3.4.1-0ubuntu1+wayland1 + gdk_wayland_device_offer_selection_content_libgtk_only@Base 3.4.1-0ubuntu1+wayland1 + gdk_wayland_device_request_selection_content_libgtk_only@Base 3.4.1-0ubuntu1+wayland1 + gdk_wayland_display_broadcast_startup_message@Base 3.4.1-0ubuntu1+wayland1 + gdk_wayland_display_manager_get_type@Base 3.4.1-0ubuntu1+wayland1 + gdk_wayland_drag_context_get_type@Base 3.4.1-0ubuntu1+wayland1 + gdk_wayland_window_set_modal_hint@Base 3.4.1-0ubuntu1+wayland1 gdk_window_add_filter@Base 3.0.0 gdk_window_at_pointer@Base 3.0.0 gdk_window_attributes_type_get_type@Base 3.0.0 diff -Nru gtk+3.0-3.4.1/debian/patches/0001-wayland-Prefer-X11-backend-over-Wayland.patch gtk+3.0-3.4.1/debian/patches/0001-wayland-Prefer-X11-backend-over-Wayland.patch --- gtk+3.0-3.4.1/debian/patches/0001-wayland-Prefer-X11-backend-over-Wayland.patch 1969-12-31 19:00:00.000000000 -0500 +++ gtk+3.0-3.4.1/debian/patches/0001-wayland-Prefer-X11-backend-over-Wayland.patch 2012-04-17 16:24:09.000000000 -0400 @@ -0,0 +1,39 @@ +From ea78bcb7c5b7f7e8e9262e54ee2705b5bef76e69 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Kristian=20H=C3=B8gsberg?= +Date: Tue, 7 Feb 2012 09:08:48 -0500 +Subject: [PATCH] wayland: Prefer X11 backend over Wayland + +https://bugzilla.gnome.org/show_bug.cgi?id=674102 +--- + gdk/gdkdisplaymanager.c | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +diff --git a/gdk/gdkdisplaymanager.c b/gdk/gdkdisplaymanager.c +index 4334241..0a0ee85 100644 +--- a/gdk/gdkdisplaymanager.c ++++ b/gdk/gdkdisplaymanager.c +@@ -244,16 +244,16 @@ gdk_display_manager_get (void) + manager = g_object_new (gdk_win32_display_manager_get_type (), NULL); + else + #endif +-#ifdef GDK_WINDOWING_WAYLAND +- if (backend == NULL || strcmp (backend, "wayland") == 0) +- manager = g_object_new (gdk_wayland_display_manager_get_type (), NULL); +- else +-#endif + #ifdef GDK_WINDOWING_X11 + if (backend == NULL || strcmp (backend, "x11") == 0) + manager = g_object_new (gdk_x11_display_manager_get_type (), NULL); + else + #endif ++#ifdef GDK_WINDOWING_WAYLAND ++ if (backend == NULL || strcmp (backend, "wayland") == 0) ++ manager = g_object_new (gdk_wayland_display_manager_get_type (), NULL); ++ else ++#endif + #ifdef GDK_WINDOWING_BROADWAY + if (backend == NULL || strcmp (backend, "broadway") == 0) + manager = g_object_new (gdk_broadway_display_manager_get_type (), NULL); +-- +1.7.9.5 + diff -Nru gtk+3.0-3.4.1/debian/patches/0001-wayland-Remove-unused-member-from-struct.patch gtk+3.0-3.4.1/debian/patches/0001-wayland-Remove-unused-member-from-struct.patch --- gtk+3.0-3.4.1/debian/patches/0001-wayland-Remove-unused-member-from-struct.patch 1969-12-31 19:00:00.000000000 -0500 +++ gtk+3.0-3.4.1/debian/patches/0001-wayland-Remove-unused-member-from-struct.patch 2012-04-17 16:21:46.000000000 -0400 @@ -0,0 +1,34 @@ +From a8d03c9970334c3bdbebfede9bca010f607fa4af Mon Sep 17 00:00:00 2001 +From: Rob Bradford +Date: Wed, 4 Apr 2012 11:40:52 +0100 +Subject: [PATCH 1/7] wayland: Remove unused member from struct + +--- + gdk/wayland/gdkwindow-wayland.c | 4 ---- + 1 file changed, 4 deletions(-) + +diff --git a/gdk/wayland/gdkwindow-wayland.c b/gdk/wayland/gdkwindow-wayland.c +index 4f56ccb..b2d90af 100644 +--- a/gdk/wayland/gdkwindow-wayland.c ++++ b/gdk/wayland/gdkwindow-wayland.c +@@ -113,7 +113,6 @@ struct _GdkWindowImplWayland + */ + cairo_surface_t *server_surface; + +- GLuint texture; + uint32_t resize_edges; + + int focus_count; +@@ -866,9 +865,6 @@ gdk_wayland_window_destroy (GdkWindow *window, + NULL, NULL); + } + +- if (impl->texture) +- glDeleteTextures(1, &impl->texture); +- + if (!recursing && !foreign_destroy) + { + if (GDK_WINDOW_IMPL_WAYLAND (window->impl)->surface) +-- +1.7.9.5 + diff -Nru gtk+3.0-3.4.1/debian/patches/0002-wayland-Move-the-finalize-function-to-allow-a-clear-.patch gtk+3.0-3.4.1/debian/patches/0002-wayland-Move-the-finalize-function-to-allow-a-clear-.patch --- gtk+3.0-3.4.1/debian/patches/0002-wayland-Move-the-finalize-function-to-allow-a-clear-.patch 1969-12-31 19:00:00.000000000 -0500 +++ gtk+3.0-3.4.1/debian/patches/0002-wayland-Move-the-finalize-function-to-allow-a-clear-.patch 2012-04-17 16:21:46.000000000 -0400 @@ -0,0 +1,66 @@ +From d9ca1a86363f6f0409460912a810b544c9c00ce1 Mon Sep 17 00:00:00 2001 +From: Rob Bradford +Date: Wed, 4 Apr 2012 14:05:27 +0100 +Subject: [PATCH 2/7] wayland: Move the finalize function to allow a clear + logical block of code + +--- + gdk/wayland/gdkwindow-wayland.c | 35 ++++++++++++++++++----------------- + 1 file changed, 18 insertions(+), 17 deletions(-) + +diff --git a/gdk/wayland/gdkwindow-wayland.c b/gdk/wayland/gdkwindow-wayland.c +index b2d90af..c2a4e4c 100644 +--- a/gdk/wayland/gdkwindow-wayland.c ++++ b/gdk/wayland/gdkwindow-wayland.c +@@ -370,23 +370,6 @@ gdk_wayland_window_attach_image (GdkWindow *window) + } + + static void +-gdk_window_impl_wayland_finalize (GObject *object) +-{ +- GdkWindowImplWayland *impl; +- +- g_return_if_fail (GDK_IS_WINDOW_IMPL_WAYLAND (object)); +- +- impl = GDK_WINDOW_IMPL_WAYLAND (object); +- +- if (impl->cursor) +- g_object_unref (impl->cursor); +- if (impl->server_surface) +- cairo_surface_destroy (impl->server_surface); +- +- G_OBJECT_CLASS (_gdk_window_impl_wayland_parent_class)->finalize (object); +-} +- +-static void + gdk_wayland_cairo_surface_destroy (void *p) + { + GdkWaylandCairoSurfaceData *data = p; +@@ -464,6 +447,24 @@ gdk_wayland_window_ref_cairo_surface (GdkWindow *window) + return impl->cairo_surface; + } + ++ ++static void ++gdk_window_impl_wayland_finalize (GObject *object) ++{ ++ GdkWindowImplWayland *impl; ++ ++ g_return_if_fail (GDK_IS_WINDOW_IMPL_WAYLAND (object)); ++ ++ impl = GDK_WINDOW_IMPL_WAYLAND (object); ++ ++ if (impl->cursor) ++ g_object_unref (impl->cursor); ++ if (impl->server_surface) ++ cairo_surface_destroy (impl->server_surface); ++ ++ G_OBJECT_CLASS (_gdk_window_impl_wayland_parent_class)->finalize (object); ++} ++ + static void + gdk_wayland_window_configure (GdkWindow *window, + int width, int height, int edges) +-- +1.7.9.5 + diff -Nru gtk+3.0-3.4.1/debian/patches/0003-wayland-Move-the-buffer-creation-to-the-cairo-surfac.patch gtk+3.0-3.4.1/debian/patches/0003-wayland-Move-the-buffer-creation-to-the-cairo-surfac.patch --- gtk+3.0-3.4.1/debian/patches/0003-wayland-Move-the-buffer-creation-to-the-cairo-surfac.patch 1969-12-31 19:00:00.000000000 -0500 +++ gtk+3.0-3.4.1/debian/patches/0003-wayland-Move-the-buffer-creation-to-the-cairo-surfac.patch 2012-04-17 16:21:46.000000000 -0400 @@ -0,0 +1,38 @@ +From 6977ea0bd1aa91e757a08d2d6a8fcc2adb08588c Mon Sep 17 00:00:00 2001 +From: Rob Bradford +Date: Wed, 4 Apr 2012 14:05:57 +0100 +Subject: [PATCH 3/7] wayland: Move the buffer creation to the cairo surface + creation + +--- + gdk/wayland/gdkwindow-wayland.c | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +diff --git a/gdk/wayland/gdkwindow-wayland.c b/gdk/wayland/gdkwindow-wayland.c +index c2a4e4c..80ed791 100644 +--- a/gdk/wayland/gdkwindow-wayland.c ++++ b/gdk/wayland/gdkwindow-wayland.c +@@ -351,9 +351,6 @@ gdk_wayland_window_attach_image (GdkWindow *window) + /* Get a Wayland buffer from this new surface */ + data = cairo_surface_get_user_data (impl->cairo_surface, + &gdk_wayland_cairo_key); +- if (!data->buffer) +- data->buffer = +- wl_egl_pixmap_create_buffer(data->pixmap); + + if (impl->resize_edges & WL_SHELL_SURFACE_RESIZE_LEFT) + dx = server_width - data->width; +@@ -416,6 +413,10 @@ gdk_wayland_create_cairo_surface (GdkDisplayWayland *display, + if (cairo_surface_status (surface) != CAIRO_STATUS_SUCCESS) + fprintf (stderr, "create gl surface failed\n"); + ++ if (!data->buffer) ++ data->buffer = ++ wl_egl_pixmap_create_buffer(data->pixmap); ++ + return surface; + } + +-- +1.7.9.5 + diff -Nru gtk+3.0-3.4.1/debian/patches/0004-wayland-Add-support-for-rendering-into-an-SHM-buffer.patch gtk+3.0-3.4.1/debian/patches/0004-wayland-Add-support-for-rendering-into-an-SHM-buffer.patch --- gtk+3.0-3.4.1/debian/patches/0004-wayland-Add-support-for-rendering-into-an-SHM-buffer.patch 1969-12-31 19:00:00.000000000 -0500 +++ gtk+3.0-3.4.1/debian/patches/0004-wayland-Add-support-for-rendering-into-an-SHM-buffer.patch 2012-04-17 16:21:46.000000000 -0400 @@ -0,0 +1,320 @@ +From cdf5c2af628a1ca202cd8c6a8d3529b46718183b Mon Sep 17 00:00:00 2001 +From: Rob Bradford +Date: Wed, 4 Apr 2012 17:20:13 +0100 +Subject: [PATCH 4/7] wayland: Add support for rendering into an SHM buffer + with Cairo image backend + +The first version of this change included a bug that meant that if you don't +compile for any other backend then it wouldn't search for cairo. Credit for +identifying the bug goes to darxus@chaosreigns.com. + +Fixes: https://bugzilla.gnome.org/show_bug.cgi?id=672361 +--- + configure.ac | 9 ++- + gdk/wayland/gdkdisplay-wayland.c | 11 ++++ + gdk/wayland/gdkdisplay-wayland.h | 10 ++++ + gdk/wayland/gdkwindow-wayland.c | 121 +++++++++++++++++++++++++++++++++++++- + 4 files changed, 145 insertions(+), 6 deletions(-) + +diff --git a/configure.ac b/configure.ac +index 93cf281..8e1d691 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -379,13 +379,16 @@ else + fi + + if test "x$enable_wayland_backend" == "xyes"; then +- # Wayland uses cairo-gl +- cairo_backends="$cairo_backends cairo-gl" ++ # For the cairo image backend ++ cairo_backends="$cairo_backends cairo" + GDK_BACKENDS="$GDK_BACKENDS wayland" + have_gio_unix=yes + GDK_WINDOWING="$GDK_WINDOWING + #define GDK_WINDOWING_WAYLAND" +- WAYLAND_PACKAGES="wayland-client xkbcommon wayland-egl egl" ++ WAYLAND_PACKAGES="wayland-client xkbcommon " ++ if test "x$enable_wayland_cairo_gl" == "xyes"; then ++ WAYLAND_PACKAGES="$WAYLAND_PACKAGES wayland-egl egl" ++ fi + AM_CONDITIONAL(USE_WAYLAND, true) + else + AM_CONDITIONAL(USE_WAYLAND, false) +diff --git a/gdk/wayland/gdkdisplay-wayland.c b/gdk/wayland/gdkdisplay-wayland.c +index 6367bb0..1d81395 100644 +--- a/gdk/wayland/gdkdisplay-wayland.c ++++ b/gdk/wayland/gdkdisplay-wayland.c +@@ -17,7 +17,9 @@ + + #include "config.h" + ++#ifdef GDK_WAYLAND_USE_EGL + #include ++#endif + + #include + #include +@@ -145,6 +147,7 @@ gdk_display_handle_global(struct wl_display *display, uint32_t id, + } + } + ++#ifdef GDK_WAYLAND_USE_EGL + static gboolean + gdk_display_init_egl(GdkDisplay *display) + { +@@ -200,6 +203,7 @@ gdk_display_init_egl(GdkDisplay *display) + + return TRUE; + } ++#endif + + GdkDisplay * + _gdk_wayland_display_open (const gchar *display_name) +@@ -225,7 +229,12 @@ _gdk_wayland_display_open (const gchar *display_name) + wl_display_add_global_listener(display_wayland->wl_display, + gdk_display_handle_global, display_wayland); + ++#ifdef GDK_WAYLAND_USE_EGL + gdk_display_init_egl(display); ++#else ++ wl_display_iterate(wl_display, WL_DISPLAY_READABLE); ++ wl_display_roundtrip(wl_display); ++#endif + + display_wayland->event_source = + _gdk_wayland_display_event_source_new (display); +@@ -257,7 +266,9 @@ gdk_wayland_display_dispose (GObject *object) + display_wayland->event_source = NULL; + } + ++#ifdef GDK_WAYLAND_USE_EGL + eglTerminate(display_wayland->egl_display); ++#endif + + G_OBJECT_CLASS (_gdk_display_wayland_parent_class)->dispose (object); + } +diff --git a/gdk/wayland/gdkdisplay-wayland.h b/gdk/wayland/gdkdisplay-wayland.h +index a248125..ae456bc 100644 +--- a/gdk/wayland/gdkdisplay-wayland.h ++++ b/gdk/wayland/gdkdisplay-wayland.h +@@ -22,14 +22,19 @@ + #ifndef __GDK_DISPLAY_WAYLAND__ + #define __GDK_DISPLAY_WAYLAND__ + ++#include + #include + #include ++ ++#ifdef GDK_WAYLAND_USE_EGL + #include + #include + #include + #include + #include + #include ++#endif ++ + #include + #include + #include +@@ -76,15 +81,20 @@ struct _GdkDisplayWayland + struct wl_input_device *input_device; + struct wl_data_device_manager *data_device_manager; + GSource *event_source; ++ ++#ifdef GDK_WAYLAND_USE_EGL + EGLDisplay egl_display; + EGLContext egl_context; + cairo_device_t *cairo_device; ++#endif + + GdkCursor **cursors; + ++#ifdef GDK_WAYLAND_USE_EGL + PFNGLEGLIMAGETARGETTEXTURE2DOESPROC image_target_texture_2d; + PFNEGLCREATEIMAGEKHRPROC create_image; + PFNEGLDESTROYIMAGEKHRPROC destroy_image; ++#endif + }; + + struct _GdkDisplayWaylandClass +diff --git a/gdk/wayland/gdkwindow-wayland.c b/gdk/wayland/gdkwindow-wayland.c +index 80ed791..d2adc36 100644 +--- a/gdk/wayland/gdkwindow-wayland.c ++++ b/gdk/wayland/gdkwindow-wayland.c +@@ -33,6 +33,7 @@ + #include + #include + #include ++#include + + #include + +@@ -300,9 +301,14 @@ _gdk_wayland_display_create_window_impl (GdkDisplay *display, + static const cairo_user_data_key_t gdk_wayland_cairo_key; + + typedef struct _GdkWaylandCairoSurfaceData { ++#ifdef GDK_WAYLAND_USE_EGL + EGLImageKHR image; + GLuint texture; + struct wl_egl_pixmap *pixmap; ++#else ++ gpointer buf; ++ size_t buf_length; ++#endif + struct wl_buffer *buffer; + GdkDisplayWayland *display; + int32_t width, height; +@@ -366,6 +372,7 @@ gdk_wayland_window_attach_image (GdkWindow *window) + wl_surface_attach (impl->surface, data->buffer, dx, dy); + } + ++#ifdef GDK_WAYLAND_USE_EGL + static void + gdk_wayland_cairo_surface_destroy (void *p) + { +@@ -419,6 +426,100 @@ gdk_wayland_create_cairo_surface (GdkDisplayWayland *display, + + return surface; + } ++#else ++static struct wl_buffer * ++create_shm_buffer (struct wl_shm *shm, ++ int width, ++ int height, ++ uint32_t format, ++ size_t *buf_length, ++ void **data_out) ++{ ++ char filename[] = "/tmp/wayland-shm-XXXXXX"; ++ struct wl_buffer *buffer; ++ int fd, size, stride; ++ void *data; ++ ++ fd = mkstemp(filename); ++ if (fd < 0) { ++ fprintf(stderr, "open %s failed: %m\n", filename); ++ return NULL; ++ } ++ stride = width * 4; ++ size = stride * height; ++ if (ftruncate(fd, size) < 0) { ++ fprintf(stderr, "ftruncate failed: %m\n"); ++ close(fd); ++ return NULL; ++ } ++ ++ data = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); ++ unlink(filename); ++ ++ if (data == MAP_FAILED) { ++ fprintf(stderr, "mmap failed: %m\n"); ++ close(fd); ++ return NULL; ++ } ++ ++ buffer = wl_shm_create_buffer(shm, fd, ++ width, height, ++ stride, format); ++ ++ close(fd); ++ ++ *data_out = data; ++ *buf_length = size; ++ return buffer; ++} ++ ++static void ++gdk_wayland_cairo_surface_destroy (void *p) ++{ ++ GdkWaylandCairoSurfaceData *data = p; ++ ++ if (data->buffer) ++ wl_buffer_destroy(data->buffer); ++ ++ munmap(data->buf, data->buf_length); ++ g_free(data); ++} ++ ++static cairo_surface_t * ++gdk_wayland_create_cairo_surface (GdkDisplayWayland *display, ++ int width, int height) ++{ ++ GdkWaylandCairoSurfaceData *data; ++ cairo_surface_t *surface; ++ ++ data = g_new (GdkWaylandCairoSurfaceData, 1); ++ data->display = display; ++ data->buffer = NULL; ++ data->width = width; ++ data->height = height; ++ ++ data->buffer = create_shm_buffer (display->shm, ++ width, ++ height, ++ WL_SHM_FORMAT_XRGB8888, ++ &data->buf_length, ++ &data->buf); ++ ++ surface = cairo_image_surface_create_for_data (data->buf, ++ CAIRO_FORMAT_RGB24, ++ width, ++ height, ++ width * 4); ++ ++ cairo_surface_set_user_data (surface, &gdk_wayland_cairo_key, ++ data, gdk_wayland_cairo_surface_destroy); ++ ++ if (cairo_surface_status (surface) != CAIRO_STATUS_SUCCESS) ++ fprintf (stderr, "create image surface failed\n"); ++ ++ return surface; ++} ++#endif + + /* On this first call this creates a double reference - the first reference + * is held by the GdkWindowImplWayland struct - since unlike other backends +@@ -1360,10 +1461,13 @@ gdk_wayland_window_destroy_notify (GdkWindow *window) + } + + static void +-gdk_wayland_window_process_updates_recurse (GdkWindow *window, +- cairo_region_t *region) ++gdk_wayland_window_process_updates_recurse (GdkWindow *window, ++ cairo_region_t *region) + { + GdkWindowImplWayland *impl = GDK_WINDOW_IMPL_WAYLAND (window->impl); ++#ifndef GDK_WAYLAND_USE_EGL ++ GdkWaylandCairoSurfaceData *data = NULL; ++#endif + cairo_rectangle_int_t rect; + int i, n; + +@@ -1372,12 +1476,23 @@ gdk_wayland_window_process_updates_recurse (GdkWindow *window, + if (impl->cairo_surface) + gdk_wayland_window_attach_image (window); + ++#ifndef GDK_WAYLAND_USE_EGL ++ if (impl->server_surface) ++ data = cairo_surface_get_user_data (impl->server_surface, ++ &gdk_wayland_cairo_key); ++#endif ++ + n = cairo_region_num_rectangles(region); + for (i = 0; i < n; i++) + { + cairo_region_get_rectangle (region, i, &rect); ++#ifndef GDK_WAYLAND_USE_EGL ++ if (data && data->buffer) ++ wl_buffer_damage (data->buffer, ++ rect.x, rect.y, rect.width, rect.height); ++#endif + wl_surface_damage (impl->surface, +- rect.x, rect.y, rect.width, rect.height); ++ rect.x, rect.y, rect.width, rect.height); + } + + _gdk_window_process_updates_recurse (window, region); +-- +1.7.9.5 + diff -Nru gtk+3.0-3.4.1/debian/patches/0005-wayland-Force-an-expose-for-the-whole-area-when-scro.patch gtk+3.0-3.4.1/debian/patches/0005-wayland-Force-an-expose-for-the-whole-area-when-scro.patch --- gtk+3.0-3.4.1/debian/patches/0005-wayland-Force-an-expose-for-the-whole-area-when-scro.patch 1969-12-31 19:00:00.000000000 -0500 +++ gtk+3.0-3.4.1/debian/patches/0005-wayland-Force-an-expose-for-the-whole-area-when-scro.patch 2012-04-17 16:21:46.000000000 -0400 @@ -0,0 +1,40 @@ +From cddfcf1418f2983890895e5d3e072ad12d19d525 Mon Sep 17 00:00:00 2001 +From: Rob Bradford +Date: Thu, 19 Jan 2012 11:51:50 +0000 +Subject: [PATCH 5/7] wayland: Force an expose for the whole area when + scrolling + +--- + gdk/wayland/gdkwindow-wayland.c | 16 +--------------- + 1 file changed, 1 insertion(+), 15 deletions(-) + +diff --git a/gdk/wayland/gdkwindow-wayland.c b/gdk/wayland/gdkwindow-wayland.c +index d2adc36..c5da98e 100644 +--- a/gdk/wayland/gdkwindow-wayland.c ++++ b/gdk/wayland/gdkwindow-wayland.c +@@ -935,21 +935,7 @@ gdk_wayland_window_translate (GdkWindow *window, + gint dx, + gint dy) + { +- cairo_surface_t *surface; +- cairo_t *cr; +- +- surface = gdk_wayland_window_ref_cairo_surface (window->impl_window); +- cr = cairo_create (surface); +- cairo_surface_destroy (surface); +- +- gdk_cairo_region (cr, area); +- cairo_clip (cr); +- cairo_set_source_surface (cr, cairo_get_target (cr), dx, dy); +- cairo_push_group (cr); +- cairo_paint (cr); +- cairo_pop_group_to_source (cr); +- cairo_paint (cr); +- cairo_destroy (cr); ++ _gdk_window_invalidate_for_expose (window, area); + } + + static void +-- +1.7.9.5 + diff -Nru gtk+3.0-3.4.1/debian/patches/0006-wayland-Use-an-ARGB-buffer-for-the-Cairo-and-SHM-sur.patch gtk+3.0-3.4.1/debian/patches/0006-wayland-Use-an-ARGB-buffer-for-the-Cairo-and-SHM-sur.patch --- gtk+3.0-3.4.1/debian/patches/0006-wayland-Use-an-ARGB-buffer-for-the-Cairo-and-SHM-sur.patch 1969-12-31 19:00:00.000000000 -0500 +++ gtk+3.0-3.4.1/debian/patches/0006-wayland-Use-an-ARGB-buffer-for-the-Cairo-and-SHM-sur.patch 2012-04-17 16:21:46.000000000 -0400 @@ -0,0 +1,32 @@ +From 71ca53993eb3953222fb8c3f22c544e5ee89ca7a Mon Sep 17 00:00:00 2001 +From: Rob Bradford +Date: Thu, 12 Apr 2012 12:11:04 +0100 +Subject: [PATCH 6/7] wayland: Use an ARGB buffer for the Cairo and SHM + surface + +--- + gdk/wayland/gdkwindow-wayland.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/gdk/wayland/gdkwindow-wayland.c b/gdk/wayland/gdkwindow-wayland.c +index c5da98e..4ec77ff 100644 +--- a/gdk/wayland/gdkwindow-wayland.c ++++ b/gdk/wayland/gdkwindow-wayland.c +@@ -501,12 +501,12 @@ gdk_wayland_create_cairo_surface (GdkDisplayWayland *display, + data->buffer = create_shm_buffer (display->shm, + width, + height, +- WL_SHM_FORMAT_XRGB8888, ++ WL_SHM_FORMAT_ARGB8888, + &data->buf_length, + &data->buf); + + surface = cairo_image_surface_create_for_data (data->buf, +- CAIRO_FORMAT_RGB24, ++ CAIRO_FORMAT_ARGB32, + width, + height, + width * 4); +-- +1.7.9.5 + diff -Nru gtk+3.0-3.4.1/debian/patches/0007-build-Add-an-enable-flag-to-allow-enabling-Cairo-GL-.patch gtk+3.0-3.4.1/debian/patches/0007-build-Add-an-enable-flag-to-allow-enabling-Cairo-GL-.patch --- gtk+3.0-3.4.1/debian/patches/0007-build-Add-an-enable-flag-to-allow-enabling-Cairo-GL-.patch 1969-12-31 19:00:00.000000000 -0500 +++ gtk+3.0-3.4.1/debian/patches/0007-build-Add-an-enable-flag-to-allow-enabling-Cairo-GL-.patch 2012-04-17 16:21:46.000000000 -0400 @@ -0,0 +1,52 @@ +From ba81a3a14c6f6d58d08632c4a10c3f21fd3d1b73 Mon Sep 17 00:00:00 2001 +From: Rob Bradford +Date: Mon, 16 Apr 2012 15:29:44 +0100 +Subject: [PATCH 7/7] build: Add an enable flag to allow enabling Cairo GL + backend + +This change adds --enable-wayland-cairo-gl which turns on the define used in +the Wayland backend to determine whether to use EGL surfaces with Cairo GL or +whether to use the Cairo image backend with an SHM surface (the default). + +Part of the fix for: https://bugzilla.gnome.org/show_bug.cgi?id=672361 +--- + configure.ac | 16 ++++++++++++++-- + 1 file changed, 14 insertions(+), 2 deletions(-) + +diff --git a/configure.ac b/configure.ac +index 8e1d691..3cbfa03 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -316,6 +316,12 @@ AC_ARG_ENABLE(quartz-relocation, + [enable bundle-based relocation functions])], + [quartz_relocation=yes]) + ++AC_ARG_ENABLE(wayland-cairo-gl, ++ AS_HELP_STRING([--enable-wayland-cairo-gl], ++ [enable the use of Cairo GL in the Wayland backend]), ++ [enable_wayland_cairo_gl=yes]) ++ ++ + cairo_backends= + backend_immodules= + have_gio_unix=no +@@ -379,8 +385,14 @@ else + fi + + if test "x$enable_wayland_backend" == "xyes"; then +- # For the cairo image backend +- cairo_backends="$cairo_backends cairo" ++ if test "x$enable_wayland_cairo_gl" == "xyes"; then ++ # Wayland can use cairo-gl ++ cairo_backends="$cairo_backends cairo-gl" ++ AC_DEFINE(GDK_WAYLAND_USE_EGL, [1], [Whether to use EGL in Wayland backend]) ++ else ++ # For the cairo image backend ++ cairo_backends="$cairo_backends cairo" ++ fi + GDK_BACKENDS="$GDK_BACKENDS wayland" + have_gio_unix=yes + GDK_WINDOWING="$GDK_WINDOWING +-- +1.7.9.5 + diff -Nru gtk+3.0-3.4.1/debian/patches/series gtk+3.0-3.4.1/debian/patches/series --- gtk+3.0-3.4.1/debian/patches/series 2012-04-16 04:29:20.000000000 -0400 +++ gtk+3.0-3.4.1/debian/patches/series 2012-04-17 16:46:21.000000000 -0400 @@ -13,3 +13,11 @@ 099_eventbox_scroll_mask.patch 100_overlay_scrollbar_loading.patch git_gtkcellrenderer_grabbing_modifier.patch +0001-wayland-Remove-unused-member-from-struct.patch +0002-wayland-Move-the-finalize-function-to-allow-a-clear-.patch +0003-wayland-Move-the-buffer-creation-to-the-cairo-surfac.patch +0004-wayland-Add-support-for-rendering-into-an-SHM-buffer.patch +0005-wayland-Force-an-expose-for-the-whole-area-when-scro.patch +0006-wayland-Use-an-ARGB-buffer-for-the-Cairo-and-SHM-sur.patch +0007-build-Add-an-enable-flag-to-allow-enabling-Cairo-GL-.patch +0001-wayland-Prefer-X11-backend-over-Wayland.patch diff -Nru gtk+3.0-3.4.1/debian/rules gtk+3.0-3.4.1/debian/rules --- gtk+3.0-3.4.1/debian/rules 2012-04-16 04:29:20.000000000 -0400 +++ gtk+3.0-3.4.1/debian/rules 2012-04-17 16:46:56.000000000 -0400 @@ -53,7 +53,9 @@ DEB_CONFIGURE_EXTRA_FLAGS = \ --libdir=/$(LIBDIR) \ - --enable-test-print-backend + --enable-test-print-backend \ + --enable-wayland-backend \ + --enable-x11-backend DEB_CONFIGURE_FLAGS_shared = \ --enable-gtk-doc \