/** Safe cast from wl_output * * \param wo The wl_output to cast from. * \return The corresponding struct output, or NULL. * * This is safe to call with NULL. The returned pointer is non-NULL only * if the wl_output really has a struct output associated. */ struct output * output_from_wl_output(struct wl_output *wo) { const void *impl; if (!wo) return NULL; impl = wl_proxy_get_listener((struct wl_proxy *)wo); if (impl != &output_listener) return NULL; return wl_output_get_user_data(wo); }
int shm_buffer_resize(shm_buffer_t *buffer, uint32_t width, uint32_t height) { uint32_t new_stride = SHM_BUFFER_STRIDE(width, buffer->bytes); uint32_t new_size = new_stride * height; if (SHM_BUFFER_IS_BUSY(buffer)) { SHM_BUFFER_SET_PNDNG_RSZ(buffer); buffer->pending_width = width; buffer->pending_height = height; return SHM_BUFFER_BUSY; } SHM_BUFFER_CLEAR_PNDNG_RSZ(buffer); if (new_size > buffer->pool_size) { munmap(buffer->data, buffer->pool_size); ftruncate(buffer->fd, new_size); buffer->data = mmap(NULL, new_size, PROT_READ | PROT_WRITE, MAP_SHARED, buffer->fd, 0); // TODO: the buffer should be destroyed when -1 is return if (buffer->data == MAP_FAILED) return -1; wl_shm_pool_resize(buffer->shm_pool, new_size); buffer->pool_size = new_size; } const void *listener = wl_proxy_get_listener((struct wl_proxy*)buffer->buffer); wl_buffer_destroy(buffer->buffer); buffer->buffer = wl_shm_pool_create_buffer(buffer->shm_pool, 0, width, height, new_stride, buffer->format.wl_format); wl_buffer_add_listener(buffer->buffer, listener, buffer); buffer->height = height; buffer->stride = new_stride; return 0; }