1 #include <tizen-extension-server-protocol.h>
2 #include "screenshooter.h"
5 static const struct tizen_screenmirror_interface _screenmirror_interface;
8 ds_tizen_screenmirror_add_destroy_listener(struct ds_tizen_screenmirror *mirror,
9 struct wl_listener *listener)
11 wl_signal_add(&mirror->events.destroy, listener);
15 ds_tizen_screenmirror_add_set_stretch_listener(struct ds_tizen_screenmirror *mirror,
16 struct wl_listener *listener)
18 wl_signal_add(&mirror->events.set_stretch, listener);
22 ds_tizen_screenmirror_add_queue_listener(struct ds_tizen_screenmirror *mirror,
23 struct wl_listener *listener)
25 wl_signal_add(&mirror->events.queue, listener);
29 ds_tizen_screenmirror_add_dequeue_listener(struct ds_tizen_screenmirror *mirror,
30 struct wl_listener *listener)
32 wl_signal_add(&mirror->events.dequeue, listener);
36 ds_tizen_screenmirror_add_start_listener(struct ds_tizen_screenmirror *mirror,
37 struct wl_listener *listener)
39 wl_signal_add(&mirror->events.start, listener);
43 ds_tizen_screenmirror_add_stop_listener(struct ds_tizen_screenmirror *mirror,
44 struct wl_listener *listener)
46 wl_signal_add(&mirror->events.stop, listener);
50 ds_tizen_screenmirror_add_auto_rotation_listener(struct ds_tizen_screenmirror *mirror,
51 struct wl_listener *listener)
53 wl_signal_add(&mirror->events.set_auto_rotation, listener);
57 ds_tizen_screenmirror_send_content(struct ds_tizen_screenmirror *mirror,
58 enum ds_tizen_screenmirror_content content)
60 if (content == DS_TIZEN_SCREENMIRROR_CONTENT_NORMAL)
61 tizen_screenmirror_send_content(mirror->resource, TIZEN_SCREENMIRROR_CONTENT_NORMAL);
62 else if (content == DS_TIZEN_SCREENMIRROR_CONTENT_VIDEO)
63 tizen_screenmirror_send_content(mirror->resource, TIZEN_SCREENMIRROR_CONTENT_VIDEO);
67 ds_tizen_screenmirror_send_dequeued(struct ds_tizen_screenmirror *mirror,
68 struct ds_buffer *buffer)
70 struct wl_resource *wl_buffer;
72 wl_buffer = ds_buffer_get_resource(buffer);
73 tizen_screenmirror_send_dequeued(mirror->resource, wl_buffer);
77 ds_tizen_screenmirror_send_stop(struct ds_tizen_screenmirror *mirror)
79 tizen_screenmirror_send_stop(mirror->resource);
83 ds_tizen_screenmirror_destroy(struct ds_tizen_screenmirror *mirror)
88 if (mirror->client_destroy_listener.notify)
89 wl_list_remove(&mirror->client_destroy_listener.link);
90 mirror->client_destroy_listener.notify = NULL;
93 wl_resource_set_destructor(mirror->resource, NULL);
95 wl_signal_emit_mutable(&mirror->events.destroy, NULL);
96 //should be called buffer_dequeued from server(ds_tizen_screenmirror_send_dequeued)
102 screenmirror_handle_resource_destroy(struct wl_resource *resource)
104 struct ds_tizen_screenmirror *mirror = wl_resource_get_user_data(resource);
105 ds_tizen_screenmirror_destroy(mirror);
109 screenmirror_handle_client_destroy(struct wl_listener *listener, void *data)
111 struct ds_tizen_screenmirror *mirror = wl_container_of(listener, mirror, client_destroy_listener);
112 ds_tizen_screenmirror_destroy(mirror);
115 struct ds_tizen_screenmirror *
116 ds_tizen_screenmirror_create(struct ds_tizen_screenshooter_client *client,
117 int version, uint32_t id)
119 struct ds_tizen_screenmirror *mirror;
121 mirror = calloc(1, sizeof *mirror);
123 ds_err("screenmirror create fail : memory alloc failed");
127 mirror->resource = wl_resource_create(client->client, &tizen_screenmirror_interface,
129 if (mirror->resource == NULL) {
130 ds_err("screenmirror wl_resource create fail : memory alloc failed");
135 wl_signal_init(&mirror->events.destroy);
136 wl_signal_init(&mirror->events.set_stretch);
137 wl_signal_init(&mirror->events.queue);
138 wl_signal_init(&mirror->events.dequeue);
139 wl_signal_init(&mirror->events.start);
140 wl_signal_init(&mirror->events.stop);
141 wl_signal_init(&mirror->events.set_auto_rotation);
143 wl_resource_set_implementation(mirror->resource, &_screenmirror_interface,
144 mirror, screenmirror_handle_resource_destroy);
147 ds_inf("create : tizen_screenmirror(%p)", mirror);
149 mirror->client_destroy_listener.notify = screenmirror_handle_client_destroy;
150 wl_client_add_destroy_listener(client->client, &mirror->client_destroy_listener);
156 _tizen_screenmirror_handle_destroy(struct wl_client *client, struct wl_resource *resource)
158 ds_inf("_tizen_screenmirror_handle_destroy (res:%p)", resource);
159 wl_resource_destroy(resource);
163 _tizen_screenmirror_handle_set_stretch(struct wl_client *client, struct wl_resource *resource, uint32_t stretch)
165 struct ds_tizen_screenmirror *mirror = wl_resource_get_user_data(resource);
166 enum ds_tizen_screenmirror_stretch ds_stretch;
168 if (stretch > TIZEN_SCREENMIRROR_STRETCH_FULLY) {
169 ds_err("set stretch error : not supported stretch(%d)", stretch);
172 if (stretch == TIZEN_SCREENMIRROR_STRETCH_KEEP_RATIO)
173 ds_stretch = DS_TIZEN_SCREENMIRROR_STRETCH_KEEP_RATIO;
175 ds_stretch = DS_TIZEN_SCREENMIRROR_STRETCH_FULLY;
177 wl_signal_emit_mutable(&mirror->events.set_stretch, &ds_stretch);
181 _tizen_screenmirror_handle_queue(struct wl_client *client, struct wl_resource *resource, struct wl_resource *wl_buffer)
183 struct ds_tizen_screenmirror *mirror;
184 struct ds_buffer *buffer;
186 mirror = wl_resource_get_user_data(resource);
187 buffer = ds_buffer_from_resource(wl_buffer);
189 ds_err("ds_buffer_from_resource fail");
193 wl_signal_emit_mutable(&mirror->events.queue, &buffer);
197 _tizen_screenmirror_handle_dequeue(struct wl_client *client, struct wl_resource *resource, struct wl_resource *wl_buffer)
199 struct ds_tizen_screenmirror *mirror;
200 struct ds_buffer *buffer;
202 mirror = wl_resource_get_user_data(resource);
203 buffer = ds_buffer_from_resource(wl_buffer);
205 ds_err("ds_buffer_from_resource fail");
209 wl_signal_emit_mutable(&mirror->events.dequeue, &buffer);
213 _tizen_screenmirror_handle_start(struct wl_client *client, struct wl_resource *resource)
215 struct ds_tizen_screenmirror *mirror;
217 mirror = wl_resource_get_user_data(resource);
218 wl_signal_emit_mutable(&mirror->events.start, NULL);
222 _tizen_screenmirror_handle_stop(struct wl_client *client, struct wl_resource *resource)
224 struct ds_tizen_screenmirror *mirror;
226 mirror = wl_resource_get_user_data(resource);
227 wl_signal_emit_mutable(&mirror->events.stop, NULL);
231 _tizen_screenmirror_handle_set_auto_rotation(struct wl_client *client, struct wl_resource *resource, uint32_t set)
233 struct ds_tizen_screenmirror *mirror;
235 mirror = wl_resource_get_user_data(resource);
236 wl_signal_emit_mutable(&mirror->events.set_auto_rotation, &set);
239 static const struct tizen_screenmirror_interface _screenmirror_interface = {
240 _tizen_screenmirror_handle_destroy,
241 _tizen_screenmirror_handle_set_stretch,
242 _tizen_screenmirror_handle_queue,
243 _tizen_screenmirror_handle_dequeue,
244 _tizen_screenmirror_handle_start,
245 _tizen_screenmirror_handle_stop,
246 _tizen_screenmirror_handle_set_auto_rotation