keyrouter: Fix wrong return value
[platform/core/uifw/libds-tizen.git] / src / libds / subcompositor.c
1 #include "libds/log.h"
2
3 #include "subcompositor.h"
4 #include "surface.h"
5
6 #define SUBCOMPOSITOR_VERSION 1
7
8 static void subcompositor_bind(struct wl_client *client, void *data,
9         uint32_t version, uint32_t id);
10
11 bool
12 ds_subcompositor_init(struct ds_subcompositor *subcomp,
13         struct wl_display *display)
14 {
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");
19         return false;
20     }
21
22     return true;
23 }
24
25 void
26 ds_subcompositor_finish(struct ds_subcompositor *subcomp)
27 {
28     wl_global_destroy(subcomp->global);
29 }
30
31 static void
32 subcompositor_handle_destroy(struct wl_client *client,
33         struct wl_resource *resource)
34 {
35     wl_resource_destroy(resource);
36 }
37
38 static void
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)
43 {
44     struct ds_surface *surface, *parent;
45
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));
54         return;
55     }
56
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));
63         return;
64     }
65
66     if (ds_surface_is_ancestor_of(surface, parent)) {
67         ds_inf("ds_surface(%p) is an ancestor of given parent(%p)",
68                 surface, parent);
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));
73         return;
74     }
75
76     ds_subsurface_create(resource, surface, parent,
77             wl_resource_get_version(resource), id);
78 }
79
80 static const struct wl_subcompositor_interface subcompositor_impl =
81 {
82     .destroy = subcompositor_handle_destroy,
83     .get_subsurface = subcompositor_handle_get_subsurface,
84 };
85
86 static void
87 subcompositor_bind(struct wl_client *client, void *data,
88         uint32_t version, uint32_t id)
89 {
90     struct ds_subcompositor *subcomp = data;
91     struct wl_resource *resource;
92
93     resource = wl_resource_create(client, &wl_subcompositor_interface, 1, id);
94     if (resource == NULL) {
95         wl_client_post_no_memory(client);
96         return;
97     }
98
99     wl_resource_set_implementation(resource, &subcompositor_impl,
100             subcomp, NULL);
101 }