From 96927b34154d7a234eaaf2702027034b6c0395dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= Date: Wed, 2 Mar 2016 14:26:16 +0800 Subject: [PATCH] wayland: Don't access the cursor wl_buffer when updating the sprite We may have released the wl_buffer already when doing this, which means we should not try to access the wl_buffer content. Regarding the cursor texture this is not an issue since we can just use the texture created in apply_pending_state(). The hw cursor however will only be realized if the surface is already using the the buffer (surface->using_buffer == true). This will, at the moment, effectively disable hardware cursors for SHM buffers. https://bugzilla.gnome.org/show_bug.cgi?id=762828 --- src/wayland/meta-wayland-pointer.c | 29 +++++++++++++---------------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/src/wayland/meta-wayland-pointer.c b/src/wayland/meta-wayland-pointer.c index 4fb32bb..89dd2cd 100644 --- a/src/wayland/meta-wayland-pointer.c +++ b/src/wayland/meta-wayland-pointer.c @@ -967,28 +967,25 @@ update_cursor_sprite_texture (MetaWaylandSurface *surface) MetaWaylandSurfaceRoleCursor *cursor_role = META_WAYLAND_SURFACE_ROLE_CURSOR (surface->role); MetaCursorSprite *cursor_sprite = cursor_role->cursor_sprite; - ClutterBackend *clutter_backend = clutter_get_default_backend (); - CoglContext *cogl_context = - clutter_backend_get_cogl_context (clutter_backend); - CoglTexture *texture; + + g_return_if_fail (!surface->buffer || surface->buffer->texture); if (surface->buffer) { - struct wl_resource *buffer; - - buffer = surface->buffer->resource; - texture = cogl_wayland_texture_2d_new_from_buffer (cogl_context, - buffer, - NULL); - meta_cursor_sprite_set_texture (cursor_sprite, - texture, + surface->buffer->texture, cursor_role->hot_x * surface->scale, cursor_role->hot_y * surface->scale); - meta_cursor_renderer_realize_cursor_from_wl_buffer (cursor_renderer, - cursor_sprite, - buffer); - cogl_object_unref (texture); + + if (surface->using_buffer) + { + struct wl_resource *buffer; + + buffer = surface->buffer->resource; + meta_cursor_renderer_realize_cursor_from_wl_buffer (cursor_renderer, + cursor_sprite, + buffer); + } } else { -- 2.7.1