5 #include <sys/socket.h>
9 #include <wayland-server.h>
10 #include <tizen-extension-server-protocol.h>
11 #include <libds/log.h>
14 #include "libds-tizen/embedded_compositor.h"
16 #define TIZEN_EMBEDDED_COMPOSITOR_VERSION 1
18 struct ds_tizen_embedded_compositor
20 struct wl_global *global;
22 struct wl_listener destroy;
25 struct wl_signal destroy;
29 struct ds_tizen_embedded_compositor_client
31 struct ds_tizen_embedded_compositor *embedded_compositor;
33 struct wl_resource *resource;
34 struct wl_client *wl_client;
37 static void embedded_compositor_handle_display_destroy(struct wl_listener *listener,
40 static void embedded_compositor_bind(struct wl_client *wl_client, void *data,
41 uint32_t version, uint32_t id);
43 WL_EXPORT struct ds_tizen_embedded_compositor *
44 ds_tizen_embedded_compositor_create(struct wl_display *display)
46 struct ds_tizen_embedded_compositor *embedded_compositor;
48 embedded_compositor = calloc(1, sizeof *embedded_compositor);
49 if (!embedded_compositor) {
50 ds_err("calloc() failed.");
54 embedded_compositor->global = wl_global_create(display, &tizen_embedded_compositor_interface,
55 TIZEN_EMBEDDED_COMPOSITOR_VERSION, embedded_compositor, embedded_compositor_bind);
56 if (!embedded_compositor->global) {
57 ds_err("wl_global_create() failed. tizen_embedded_compositor_interface");
58 free(embedded_compositor);
62 embedded_compositor->destroy.notify = embedded_compositor_handle_display_destroy;
63 wl_display_add_destroy_listener(display, &embedded_compositor->destroy);
65 wl_signal_init(&embedded_compositor->events.destroy);
67 ds_inf("Global created: tizen_embedded_compositor(%p)", embedded_compositor);
69 return embedded_compositor;
73 ds_tizen_embedded_compositor_add_destroy_listener(
74 struct ds_tizen_embedded_compositor *embedded_compositor,
75 struct wl_listener *listener)
77 wl_signal_add(&embedded_compositor->events.destroy, listener);
81 embedded_compositor_handle_display_destroy(struct wl_listener *listener, void *data)
83 struct ds_tizen_embedded_compositor *embedded_compositor;
85 embedded_compositor = wl_container_of(listener, embedded_compositor, destroy);
87 ds_inf("Global destroy: embedded_compositor(%p)", embedded_compositor);
89 wl_signal_emit_mutable(&embedded_compositor->events.destroy, embedded_compositor);
90 wl_list_remove(&embedded_compositor->destroy.link);
91 wl_global_destroy(embedded_compositor->global);
92 free(embedded_compositor);
96 embedded_compositor_handle_get_socket(struct wl_client *wl_client,
97 struct wl_resource *resource)
99 struct ds_tizen_embedded_compositor_client *client;
103 ds_inf("tizen_embedded_compositor: get_socket");
105 client = wl_resource_get_user_data(resource);
107 wl_client_get_credentials(client->wl_client, &pid, NULL, NULL);
109 sock_fd = socket(PF_LOCAL, SOCK_STREAM | SOCK_CLOEXEC, 0);
111 ds_err("Could not create socket: %m, (client=%p, pid=%d)", client, pid);
115 tizen_embedded_compositor_send_socket(resource, sock_fd);
117 ds_inf("tizen_embedded_compositor: (sock_fd,%d) sent! (client,%p) (pid,%d)",
118 sock_fd, client, pid);
124 embedded_compositor_handle_destroy(struct wl_client *wl_client,
125 struct wl_resource *resource)
127 wl_resource_destroy(resource);
130 static const struct tizen_embedded_compositor_interface embedded_compositor_impl =
132 embedded_compositor_handle_get_socket,
133 embedded_compositor_handle_destroy,
137 _tizen_embedded_compositor_client_handle_destroy(struct wl_resource *resource)
139 struct ds_tizen_embedded_compositor_client *client;
141 client = wl_resource_get_user_data(resource);
143 ds_inf("_tizen_embedded_compositor_client_handle_destroy (client:%p)", client);
149 embedded_compositor_bind(struct wl_client *wl_client, void *data, uint32_t version,
152 struct ds_tizen_embedded_compositor *embedded_compositor = data;
153 struct ds_tizen_embedded_compositor_client *client;
155 client = calloc(1, sizeof *client);
156 if (client == NULL) {
157 ds_err("calloc() failed. tizen_embedded_compositor");
158 wl_client_post_no_memory(wl_client);
162 ds_inf("tizen_embedded_compositor_client binds. (client:%p)", client);
164 client->embedded_compositor = embedded_compositor;
165 client->wl_client = wl_client;
167 client->resource = wl_resource_create(wl_client,
168 &tizen_embedded_compositor_interface,
169 MIN(version, TIZEN_EMBEDDED_COMPOSITOR_VERSION), id);
171 if (client->resource == NULL) {
172 ds_err("tizen_embedded_compositor : wl_resource_create() failed.");
174 wl_client_post_no_memory(wl_client);
178 wl_resource_set_implementation(client->resource, &embedded_compositor_impl,
179 client, _tizen_embedded_compositor_client_handle_destroy);