window: Simplify the shm surface management

We can destroy a shm wl_buffer immediately after sending it to the server.
Kristian Høgsberg 13 years ago
parent fe0444a9a9
commit 6e2a8d74b5
  1. 43
      clients/window.c

@ -131,7 +131,7 @@ struct window {
struct input *keyboard_device;
enum window_buffer_type buffer_type;
cairo_surface_t *cairo_surface, *pending_surface;
cairo_surface_t *cairo_surface;
struct wl_shm_pool *pool;
size_t pool_size;
@ -710,25 +710,6 @@ display_get_pointer_surface(struct display *display, int pointer,
return cairo_surface_reference(surface);
}
static void
window_attach_surface(struct window *window);
static void
free_surface(void *data, struct wl_callback *callback, uint32_t time)
{
struct window *window = data;
wl_callback_destroy(callback);
cairo_surface_destroy(window->pending_surface);
window->pending_surface = NULL;
if (window->cairo_surface)
window_attach_surface(window);
}
static const struct wl_callback_listener free_surface_listener = {
free_surface
};
static void
window_get_resize_dx_dy(struct window *window, int *x, int *y)
{
@ -751,7 +732,6 @@ window_attach_surface(struct window *window)
{
struct display *display = window->display;
struct wl_buffer *buffer;
struct wl_callback *cb;
#ifdef HAVE_CAIRO_EGL
struct egl_window_surface_data *data;
#endif
@ -771,21 +751,18 @@ window_attach_surface(struct window *window)
case WINDOW_BUFFER_TYPE_EGL_IMAGE:
#endif
case WINDOW_BUFFER_TYPE_SHM:
if (window->pending_surface != NULL)
return;
window->pending_surface = window->cairo_surface;
window->cairo_surface = NULL;
buffer =
display_get_buffer_for_surface(display,
window->pending_surface);
window->cairo_surface);
window_get_resize_dx_dy(window, &x, &y);
wl_surface_attach(window->surface, buffer, x, y);
wl_surface_damage(window->surface, 0, 0,
window->allocation.width,
window->allocation.height);
window->server_allocation = window->allocation;
cb = wl_display_sync(display->display);
wl_callback_add_listener(cb, &free_surface_listener, window);
cairo_surface_destroy(window->cairo_surface);
window->cairo_surface = NULL;
break;
default:
return;
@ -804,10 +781,6 @@ window_attach_surface(struct window *window)
wl_region_destroy(window->opaque_region);
window->opaque_region = NULL;
}
wl_surface_damage(window->surface, 0, 0,
window->allocation.width,
window->allocation.height);
}
void
@ -932,8 +905,6 @@ window_destroy(struct window *window)
if (window->cairo_surface != NULL)
cairo_surface_destroy(window->cairo_surface);
if (window->pending_surface != NULL)
cairo_surface_destroy(window->pending_surface);
free(window->title);
free(window);

Loading…
Cancel
Save