dnd: work around cairo-gl brokenness
authorAnder Conselvan de Oliveira <ander.conselvan.de.oliveira@intel.com>
Fri, 25 May 2012 13:03:06 +0000 (16:03 +0300)
committerKristian Høgsberg <krh@bitplanet.net>
Sat, 26 May 2012 03:28:59 +0000 (23:28 -0400)
If cairo-gl is used, display_create_surface() will create an
wl_egl_window for each surface and this will result in errors if this
surface is used as a source. Also, one can't get a wl_buffer for such
a surface wich led to crashes when trying to do so for the drag icon.

This patch works around both problems by forcing the item and drag icon
surfaces to use shm.

clients/dnd.c
clients/window.c
clients/window.h

index 32dec96..de1ca47 100644 (file)
@@ -106,7 +106,8 @@ item_create(struct display *display, int x, int y, int seed)
 
        rect.width = item_width;
        rect.height = item_height;
-       item->surface = display_create_surface(display, NULL, &rect, 0);
+       item->surface =
+               display_create_surface(display, NULL, &rect, SURFACE_SHM);
 
        item->x = x;
        item->y = y;
@@ -322,7 +323,8 @@ create_drag_cursor(struct dnd_drag *dnd_drag,
 
        rectangle.width = item_width + 2 * pointer->width;
        rectangle.height = item_height + 2 * pointer->height;
-       surface = display_create_surface(dnd->display, NULL, &rectangle, 0);
+       surface = display_create_surface(dnd->display, NULL, &rectangle,
+                                        SURFACE_SHM);
 
        cr = cairo_create(surface);
        cairo_translate(cr, pointer->width, pointer->height);
index 4c94d16..bab5d76 100644 (file)
@@ -618,7 +618,7 @@ display_create_surface(struct display *display,
        if (check_size(rectangle) < 0)
                return NULL;
 #ifdef HAVE_CAIRO_EGL
-       if (display->dpy)
+       if (display->dpy && !(flags & SURFACE_SHM))
                return display_create_egl_window_surface(display,
                                                         surface,
                                                         flags,
index e1a9aa2..7e968d0 100644 (file)
@@ -112,6 +112,7 @@ display_get_image_for_egl_image_surface(struct display *display,
 #endif
 
 #define SURFACE_OPAQUE 0x01
+#define SURFACE_SHM    0x02
 
 cairo_surface_t *
 display_create_surface(struct display *display,