static struct wl_resource * wl_data_source_send_offer(struct wl_data_source *source, struct wl_resource *target) { struct wl_data_offer *offer; char **p; offer = malloc(sizeof *offer); if (offer == NULL) return NULL; offer->resource.destroy = destroy_data_offer; offer->resource.object.id = 0; offer->resource.object.interface = &wl_data_offer_interface; offer->resource.object.implementation = (void (**)(void)) &data_offer_interface; offer->resource.data = offer; wl_signal_init(&offer->resource.destroy_signal); offer->source = source; offer->source_destroy_listener.notify = destroy_offer_data_source; wl_signal_add(&source->resource.destroy_signal, &offer->source_destroy_listener); wl_client_add_resource(target->client, &offer->resource); wl_data_device_send_data_offer(target, &offer->resource); wl_array_for_each(p, &source->mime_types) wl_data_offer_send_offer(&offer->resource, *p); return &offer->resource; }
static void create_data_source(struct wl_client *client, struct wl_resource *resource, uint32_t id) { struct wl_data_source *source; source = malloc(sizeof *source); if (source == NULL) { wl_resource_post_no_memory(resource); return; } source->resource.destroy = destroy_data_source; source->resource.object.id = id; source->resource.object.interface = &wl_data_source_interface; source->resource.object.implementation = (void (**)(void)) &data_source_interface; source->resource.data = source; wl_list_init(&source->resource.destroy_listener_list); source->offer_interface = &data_offer_interface; source->cancel = data_source_cancel; wl_array_init(&source->mime_types); wl_client_add_resource(client, &source->resource); }
static void get_shell_surface (struct wl_client *client, struct wl_resource *resource, uint32_t id, struct wl_resource *surface_resource) { CoglandSurface *surface = surface_resource->data; CoglandShellSurface *shell_surface = g_new0 (CoglandShellSurface, 1); if (surface->has_shell_surface) { wl_resource_post_error (surface_resource, WL_DISPLAY_ERROR_INVALID_OBJECT, "wl_shell::get_shell_surface already requested"); return; } shell_surface->resource.destroy = destroy_shell_surface; shell_surface->resource.object.id = id; shell_surface->resource.object.interface = &wl_shell_surface_interface; shell_surface->resource.object.implementation = (void (**) (void)) &cogl_shell_surface_interface; shell_surface->resource.data = shell_surface; shell_surface->surface = surface; shell_surface->surface_destroy_listener.func = shell_handle_surface_destroy; wl_list_insert (surface->wayland_surface.resource.destroy_listener_list.prev, &shell_surface->surface_destroy_listener.link); surface->has_shell_surface = TRUE; wl_client_add_resource (client, &shell_surface->resource); }
static void cogland_compositor_create_surface (struct wl_client *wayland_client, struct wl_compositor *wayland_compositor, guint32 wayland_id) { CoglandCompositor *compositor = container_of (wayland_compositor, CoglandCompositor, wayland_compositor); CoglandSurface *surface = g_slice_new0 (CoglandSurface); surface->compositor = compositor; surface->wayland_surface.resource.destroy = cogland_surface_resource_destroy_cb; surface->wayland_surface.resource.object.id = wayland_id; surface->wayland_surface.resource.object.interface = &wl_surface_interface; surface->wayland_surface.resource.object.implementation = (void (**)(void)) &cogland_surface_interface; surface->wayland_surface.client = wayland_client; wl_client_add_resource (wayland_client, &surface->wayland_surface.resource); compositor->surfaces = g_list_prepend (compositor->surfaces, surface); }
static void drm_create_buffer(struct wl_client *client, struct wl_resource *resource, uint32_t id, uint32_t name, int32_t width, int32_t height, uint32_t stride, uint32_t format) { struct wl_drm *drm = resource->data; struct wl_drm_buffer *buffer; switch (format) { case WL_DRM_FORMAT_ARGB8888: case WL_DRM_FORMAT_XRGB8888: break; default: wl_resource_post_error(resource, WL_DRM_ERROR_INVALID_FORMAT, "invalid format"); return; } buffer = calloc(1, sizeof *buffer); if (buffer == NULL) { wl_resource_post_no_memory(resource); return; } buffer->drm = drm; buffer->buffer.width = width; buffer->buffer.height = height; buffer->format = format; buffer->driver_buffer = drm->callbacks->reference_buffer(drm->user_data, name, width, height, stride, format); if (buffer->driver_buffer == NULL) { wl_resource_post_error(resource, WL_DRM_ERROR_INVALID_NAME, "invalid name"); return; } buffer->buffer.resource.object.id = id; buffer->buffer.resource.object.interface = &wl_buffer_interface; buffer->buffer.resource.object.implementation = (void (**)(void)) &drm_buffer_interface; buffer->buffer.resource.data = buffer; buffer->buffer.resource.destroy = destroy_buffer; buffer->buffer.resource.client = resource->client; wl_client_add_resource(resource->client, &buffer->buffer.resource); }
static void create_buffer(struct wl_client *client, struct wl_resource *resource, uint32_t id, uint32_t name, int fd, int32_t width, int32_t height, uint32_t format, int32_t offset0, int32_t stride0, int32_t offset1, int32_t stride1, int32_t offset2, int32_t stride2) { struct wl_drm *drm = resource->data; struct wl_drm_buffer *buffer; buffer = calloc(1, sizeof *buffer); if (buffer == NULL) { wl_resource_post_no_memory(resource); return; } buffer->drm = drm; buffer->buffer.width = width; buffer->buffer.height = height; buffer->format = format; buffer->offset[0] = offset0; buffer->stride[0] = stride0; buffer->offset[1] = offset1; buffer->stride[1] = stride1; buffer->offset[2] = offset2; buffer->stride[2] = stride2; drm->callbacks->reference_buffer(drm->user_data, name, fd, buffer); if (buffer->driver_buffer == NULL) { wl_resource_post_error(resource, WL_DRM_ERROR_INVALID_NAME, "invalid name"); return; } buffer->buffer.resource.object.id = id; buffer->buffer.resource.object.interface = &wl_buffer_interface; buffer->buffer.resource.object.implementation = (void (**)(void)) &drm_buffer_interface; buffer->buffer.resource.data = buffer; buffer->buffer.resource.destroy = destroy_buffer; buffer->buffer.resource.client = resource->client; wl_client_add_resource(resource->client, &buffer->buffer.resource); }
static void drm_create_buffer(struct wl_client *client, struct wl_drm *drm, uint32_t id, uint32_t name, int32_t width, int32_t height, uint32_t stride, struct wl_visual *visual) { struct wl_drm_buffer *buffer; buffer = calloc(1, sizeof *buffer); if (buffer == NULL) { wl_client_post_no_memory(client); return; } buffer->drm = drm; buffer->buffer.width = width; buffer->buffer.height = height; buffer->buffer.visual = visual; buffer->buffer.client = client; if (!visual || visual->object.interface != &wl_visual_interface) { wl_client_post_error(client, &drm->object, WL_DRM_ERROR_INVALID_VISUAL, "invalid visual"); free(buffer); return; } buffer->driver_buffer = drm->callbacks->reference_buffer(drm->user_data, name, width, height, stride, visual); if (buffer->driver_buffer == NULL) { wl_client_post_error(client, &drm->object, WL_DRM_ERROR_INVALID_NAME, "invalid name"); return; } buffer->buffer.resource.object.id = id; buffer->buffer.resource.object.interface = &wl_buffer_interface; buffer->buffer.resource.object.implementation = (void (**)(void)) &drm_buffer_interface; buffer->buffer.resource.destroy = destroy_buffer; wl_client_add_resource(client, &buffer->buffer.resource); }
static void cogland_surface_frame (struct wl_client *client, struct wl_resource *surface_resource, uint32_t callback_id) { CoglandFrameCallback *callback; CoglandSurface *surface = surface_resource->data; callback = g_slice_new0 (CoglandFrameCallback); callback->compositor = surface->compositor; callback->node.data = callback; callback->resource.object.interface = &wl_callback_interface; callback->resource.object.id = callback_id; callback->resource.destroy = destroy_frame_callback; callback->resource.data = callback; wl_client_add_resource (client, &callback->resource); g_queue_push_tail_link (&surface->compositor->frame_callbacks, &callback->node); }
static void server_wlegl_create_handle(struct wl_client *client, struct wl_resource *resource, uint32_t id, int32_t num_fds, struct wl_array *ints) { server_wlegl *wlegl = server_wlegl_from(resource); server_wlegl_handle *handle; if (num_fds < 0) { wl_resource_post_error(resource, ANDROID_WLEGL_ERROR_BAD_VALUE, "num_fds is negative: %d", num_fds); return; } handle = server_wlegl_handle_create(id); wl_array_copy(&handle->ints, ints); handle->num_fds = num_fds; wl_client_add_resource(client, &handle->resource); }
static struct wl_resource * wl_data_source_send_offer(struct wl_data_source *source, struct wl_resource *target) { struct wl_data_offer *offer; char **p, **end; offer = malloc(sizeof *offer); if (offer == NULL) return NULL; offer->resource.destroy = destroy_data_offer; offer->resource.object.id = 0; offer->resource.object.interface = &wl_data_offer_interface; offer->resource.object.implementation = (void (**)(void)) source->offer_interface; offer->resource.data = offer; wl_list_init(&offer->resource.destroy_listener_list); offer->source = source; offer->source_destroy_listener.func = destroy_offer_data_source; wl_list_insert(&source->resource.destroy_listener_list, &offer->source_destroy_listener.link); wl_client_add_resource(target->client, &offer->resource); wl_resource_post_event(target, WL_DATA_DEVICE_DATA_OFFER, &offer->resource); end = source->mime_types.data + source->mime_types.size; for (p = source->mime_types.data; p < end; p++) wl_resource_post_event(&offer->resource, WL_DATA_OFFER_OFFER, *p); return &offer->resource; }