diff --git a/gdk/wayland/gdkdisplay-wayland.c b/gdk/wayland/gdkdisplay-wayland.c index ee8e903f38..d83d364f48 100644 --- a/gdk/wayland/gdkdisplay-wayland.c +++ b/gdk/wayland/gdkdisplay-wayland.c @@ -889,3 +889,10 @@ _gdk_wayland_shm_surface_get_busy (cairo_surface_t *surface) GdkWaylandCairoSurfaceData *data = cairo_surface_get_user_data (surface, &gdk_wayland_cairo_key); return data->busy; } + +void +_gdk_wayland_shm_surface_clear (cairo_surface_t *surface) +{ + GdkWaylandCairoSurfaceData *data = cairo_surface_get_user_data (surface, &gdk_wayland_cairo_key); + memset (data->buf, 0, data->buf_length); +} diff --git a/gdk/wayland/gdkprivate-wayland.h b/gdk/wayland/gdkprivate-wayland.h index d6d2375429..a3146ead96 100644 --- a/gdk/wayland/gdkprivate-wayland.h +++ b/gdk/wayland/gdkprivate-wayland.h @@ -185,5 +185,6 @@ cairo_surface_t * _gdk_wayland_display_create_shm_surface (GdkWaylandDisplay *di struct wl_buffer *_gdk_wayland_shm_surface_get_wl_buffer (cairo_surface_t *surface); void _gdk_wayland_shm_surface_set_busy (cairo_surface_t *surface); gboolean _gdk_wayland_shm_surface_get_busy (cairo_surface_t *surface); +void _gdk_wayland_shm_surface_clear (cairo_surface_t *surface); #endif /* __GDK_PRIVATE_WAYLAND_H__ */ diff --git a/gdk/wayland/gdkwindow-wayland.c b/gdk/wayland/gdkwindow-wayland.c index 745deb9f67..461d1ce9d7 100644 --- a/gdk/wayland/gdkwindow-wayland.c +++ b/gdk/wayland/gdkwindow-wayland.c @@ -568,7 +568,23 @@ gdk_window_impl_wayland_begin_paint_region (GdkWindow *window, { GdkWindowImplWayland *impl = GDK_WINDOW_IMPL_WAYLAND (window->impl); gdk_wayland_window_ensure_cairo_surface (window); - return _gdk_wayland_shm_surface_get_busy (impl->cairo_surface); + + if (_gdk_wayland_shm_surface_get_busy (impl->cairo_surface)) + { + /* The surface is busy, so create a temporary surface which we paint + * to and hope that by the time we're done painting the surface isn't + * busy any more. */ + return TRUE; + } + else + { + /* Returning FALSE from begin_paint_region says to use the native + * backing surface, which is our SHM surface. We need to make sure + * to clear it before the code tries to paint to it to prevent + * artifacts from the last paint. */ + _gdk_wayland_shm_surface_clear (impl->cairo_surface); + return FALSE; + } } static void