3 #include "subcompositor.h"
6 #define SUBCOMPOSITOR_VERSION 1
8 static void subcompositor_bind(struct wl_client *client, void *data,
9 uint32_t version, uint32_t id);
12 ds_subcompositor_init(struct ds_subcompositor *subcomp,
13 struct wl_display *display)
15 subcomp->global = wl_global_create(display, &wl_subcompositor_interface,
16 SUBCOMPOSITOR_VERSION, subcomp, subcompositor_bind);
17 if (!subcomp->global) {
18 ds_log_errno(DS_ERR, "Could not create global");
26 ds_subcompositor_finish(struct ds_subcompositor *subcomp)
28 wl_global_destroy(subcomp->global);
32 subcompositor_handle_destroy(struct wl_client *client,
33 struct wl_resource *resource)
35 wl_resource_destroy(resource);
39 subcompositor_handle_get_subsurface(struct wl_client *client,
40 struct wl_resource *resource, uint32_t id,
41 struct wl_resource *surface_resource,
42 struct wl_resource *parent_resource)
44 struct ds_surface *surface, *parent;
46 surface = ds_surface_from_resource(surface_resource);
47 parent = ds_surface_from_resource(parent_resource);
48 if (surface == parent) {
49 ds_inf("ds_surface(%p) cannot be its own parent", surface);
50 wl_resource_post_error(resource,
51 WL_SUBCOMPOSITOR_ERROR_BAD_SURFACE,
52 "%d: wl_surface@%d cannot be its own parent",
53 id, wl_resource_get_id(surface_resource));
57 if (ds_surface_is_subsurface(surface)) {
58 ds_inf("ds_surface(%p) is already a sub-surface", surface);
59 wl_resource_post_error(resource,
60 WL_SUBCOMPOSITOR_ERROR_BAD_SURFACE,
61 "%d: wl_surface@%d is already a sub-surface",
62 id, wl_resource_get_id(surface_resource));
66 if (ds_surface_is_ancestor_of(surface, parent)) {
67 ds_inf("ds_surface(%p) is an ancestor of given parent(%p)",
69 wl_resource_post_error(resource,
70 WL_SUBCOMPOSITOR_ERROR_BAD_SURFACE,
71 "%d: wl_surface@%d is an ancestor of parent",
72 id, wl_resource_get_id(surface_resource));
76 ds_subsurface_create(resource, surface, parent,
77 wl_resource_get_version(resource), id);
80 static const struct wl_subcompositor_interface subcompositor_impl =
82 .destroy = subcompositor_handle_destroy,
83 .get_subsurface = subcompositor_handle_get_subsurface,
87 subcompositor_bind(struct wl_client *client, void *data,
88 uint32_t version, uint32_t id)
90 struct ds_subcompositor *subcomp = data;
91 struct wl_resource *resource;
93 resource = wl_resource_create(client, &wl_subcompositor_interface, 1, id);
94 if (resource == NULL) {
95 wl_client_post_no_memory(client);
99 wl_resource_set_implementation(resource, &subcompositor_impl,