4 #include <wayland-server.h>
5 #include <tizen-remote-surface-server-protocol.h>
11 #include "libds-tizen/remote_surface.h"
12 #include <libds-tizen/tbm_server.h>
14 #define TIZEN_REMOTE_SURFACE_VERSION 6
16 static uint32_t global_resource_id = 1;
18 struct ds_tizen_remote_surface_manager
20 struct wl_global *global;
22 struct wl_listener destroy;
24 struct wl_list remote_providers;
25 struct wl_list remote_surfaces;
28 struct wl_signal destroy;
29 struct wl_signal new_provider;
30 struct wl_signal new_surface;
31 struct wl_signal bind_surface;
35 struct ds_tizen_remote_surface_client
37 struct ds_tizen_remote_surface_manager *remote_manager;
39 struct wl_resource *resource;
40 struct wl_client *wl_client;
43 struct wl_listener surface_destroy;
47 struct wl_signal destroy;
51 struct ds_tizen_remote_surface_provider
55 struct wl_resource *resource;
57 struct ds_surface *surface;
59 uint32_t input_event_filter;
62 unsigned int resource_id;
65 struct wl_listener surface_destroy;
69 struct wl_signal destroy;
70 struct wl_signal set_offscreen;
71 struct wl_signal set_input_event_filter;
75 struct ds_tizen_remote_surface
79 struct wl_resource *resource;
81 struct ds_surface *surface;
83 struct wl_resource *wl_tbm_resource;
86 struct ds_surface *owner_surface;
88 uint32_t changed_buffer_event_filter;
91 struct wl_listener surface_destroy;
92 struct wl_listener owner_surface_destroy;
93 struct wl_listener wl_tbm_resource_destroy;
97 struct wl_signal destroy;
98 struct wl_signal set_redirect;
99 struct wl_signal transfer_mouse_event;
100 struct wl_signal transfer_mouse_wheel_event;
101 struct wl_signal transfer_touch_event;
102 struct wl_signal transfer_touch_cancel_event;
103 struct wl_signal transfer_key_event;
104 struct wl_signal transfer_visibility_event;
105 struct wl_signal set_owner;
106 struct wl_signal new_region;
107 struct wl_signal buffer_release;
108 struct wl_signal set_remote_render;
109 struct wl_signal set_changed_buffer_event_filter;
110 struct wl_signal get_current_buffer;
114 struct ds_tizen_remote_surface_region
116 struct wl_resource *resource;
124 struct wl_signal destroy;
125 struct wl_signal set_geometry;
130 remote_surface_dummy_fd_get(void)
132 static const char template[] = "/libds_rsm_dummy_fdXXXXXX";
142 path = getenv("XDG_RUNTIME_DIR");
144 ds_err("fail to get XDG_RUNTIME_DIR");
148 name_size = strlen(path) + sizeof(template);
149 name = malloc(name_size);
151 ds_err("malloc() failed");
155 snprintf(name, name_size, "%s%s", path, template);
158 ds_err("mkstemp() failed");
163 flags = fcntl(fd, F_GETFD);
165 ds_err("fcntl(F_GETFD) failed");
171 if (fcntl(fd, F_SETFD, flags | FD_CLOEXEC) == -1) {
172 ds_err("fcntl(F_SETFD, FD_CLOEXEC) failed");
185 remote_surface_provider_handle_destroy(struct wl_client *wl_client,
186 struct wl_resource *resource)
188 wl_resource_destroy(resource);
192 remote_surface_provider_handle_set_offscreen(struct wl_client *wl_client,
193 struct wl_resource *provider_resource, uint32_t offscreen)
195 struct ds_tizen_remote_surface_provider *remote_provider;
197 remote_provider = wl_resource_get_user_data(provider_resource);
199 if (remote_provider->offscreen == offscreen)
202 remote_provider->offscreen = offscreen;
204 wl_signal_emit_mutable(&remote_provider->events.set_offscreen, remote_provider);
208 remote_surface_provider_handle_set_input_event_filter(struct wl_client *wl_client,
209 struct wl_resource *provider_resource, uint32_t event_filter)
211 struct ds_tizen_remote_surface_provider *remote_provider;
213 remote_provider = wl_resource_get_user_data(provider_resource);
215 if (remote_provider->input_event_filter == event_filter)
218 remote_provider->input_event_filter = event_filter;
220 wl_signal_emit_mutable(&remote_provider->events.set_input_event_filter, remote_provider);
223 static const struct tizen_remote_surface_provider_interface remote_surface_provider_impl =
225 .destroy = remote_surface_provider_handle_destroy,
226 .offscreen_set = remote_surface_provider_handle_set_offscreen,
227 .set_input_event_filter = remote_surface_provider_handle_set_input_event_filter,
231 remote_surface_provider_handle_surface_destroy(struct wl_listener *listener, void *data)
233 struct ds_tizen_remote_surface_provider *remote_provider;
235 remote_provider = wl_container_of(listener, remote_provider, listener.surface_destroy);
237 if (remote_provider->listener.surface_destroy.notify) {
238 wl_list_remove(&remote_provider->listener.surface_destroy.link);
239 remote_provider->listener.surface_destroy.notify = NULL;
242 remote_provider->surface = NULL;
246 remote_surface_provider_handle_resource_destroy(struct wl_resource *remote_provider_resource)
248 struct ds_tizen_remote_surface_provider *remote_provider;
250 remote_provider = wl_resource_get_user_data(remote_provider_resource);
252 ds_inf("remote_surface_provider:%p destroy", remote_provider);
254 if (remote_provider->listener.surface_destroy.notify) {
255 wl_list_remove(&remote_provider->listener.surface_destroy.link);
256 remote_provider->listener.surface_destroy.notify = NULL;
259 wl_list_remove(&remote_provider->link);
261 wl_signal_emit_mutable(&remote_provider->events.destroy, remote_provider);
263 free(remote_provider);
267 remote_surface_manager_handle_create_provider(struct wl_client *wl_client,
268 struct wl_resource *remote_surface_client_resource,
270 struct wl_resource *surface_resource)
272 struct ds_tizen_remote_surface_client *remote_client;
273 struct ds_tizen_remote_surface_provider *remote_provider;
274 struct ds_surface *surface;
276 remote_client = wl_resource_get_user_data(remote_surface_client_resource);
277 surface = ds_surface_from_resource(surface_resource);
279 remote_provider = calloc(1, sizeof *remote_provider);
280 if (!remote_provider) {
281 wl_client_post_no_memory(wl_client);
285 remote_provider->resource = wl_resource_create(wl_client, &tizen_remote_surface_provider_interface,
286 wl_resource_get_version(remote_client->resource), id);
287 if (!remote_provider->resource) {
288 wl_client_post_no_memory(wl_client);
289 free(remote_provider);
293 remote_provider->listener.surface_destroy.notify = remote_surface_provider_handle_surface_destroy;
294 ds_surface_add_destroy_listener(surface, &remote_provider->listener.surface_destroy);
295 remote_provider->surface = surface;
297 wl_resource_set_implementation(remote_provider->resource, &remote_surface_provider_impl,
298 remote_provider, remote_surface_provider_handle_resource_destroy);
300 ds_inf("remote_surface_provider:%p create", remote_provider);
302 wl_signal_init(&remote_provider->events.destroy);
303 wl_signal_init(&remote_provider->events.set_offscreen);
304 wl_signal_init(&remote_provider->events.set_input_event_filter);
306 wl_signal_emit_mutable(&remote_client->remote_manager->events.new_provider, remote_provider);
308 remote_provider->resource_id = global_resource_id++;
310 tizen_remote_surface_provider_send_resource_id(remote_provider->resource, remote_provider->resource_id);
312 wl_list_insert(&remote_client->remote_manager->remote_providers, &remote_provider->link);
316 remote_surface_handle_destroy(struct wl_client *wl_client,
317 struct wl_resource *resource)
319 wl_resource_destroy(resource);
323 remote_surface_handle_redirect(struct wl_client *wl_client,
324 struct wl_resource *remote_surface_resource)
326 struct ds_tizen_remote_surface *remote_surface;
328 remote_surface = wl_resource_get_user_data(remote_surface_resource);
330 remote_surface->redirect = true;
332 wl_signal_emit_mutable(&remote_surface->events.set_redirect, remote_surface);
336 remote_surface_handle_unredirect(struct wl_client *wl_client,
337 struct wl_resource *remote_surface_resource)
339 struct ds_tizen_remote_surface *remote_surface;
341 remote_surface = wl_resource_get_user_data(remote_surface_resource);
343 remote_surface->redirect = false;
345 wl_signal_emit_mutable(&remote_surface->events.set_redirect, remote_surface);
349 remote_surface_handle_transfer_mouse_event(struct wl_client *wl_client,
350 struct wl_resource *remote_surface_resource,
351 uint32_t event_type, int32_t device, int32_t button,
352 int32_t x, int32_t y, wl_fixed_t radius_x, wl_fixed_t radius_y,
353 wl_fixed_t pressure, wl_fixed_t angle, uint32_t clas, uint32_t subclas,
354 const char *identifier, uint32_t time)
356 struct ds_tizen_remote_surface *remote_surface;
357 struct ds_tizen_remote_surface_event_transfer_mouse event;
359 remote_surface = wl_resource_get_user_data(remote_surface_resource);
361 event.remote_surface = remote_surface;
362 event.event_type = event_type;
363 event.device = device;
364 event.button = button;
367 event.radius_x = radius_x;
368 event.radius_y = radius_y;
369 event.pressure = pressure;
372 event.subclas = subclas;
373 event.identifier = identifier;
376 wl_signal_emit_mutable(&remote_surface->events.transfer_mouse_event, &event);
380 remote_surface_handle_transfer_mouse_wheel(struct wl_client *wl_client,
381 struct wl_resource *remote_surface_resource,
382 uint32_t direction, int32_t z, uint32_t clas, uint32_t subclas,
383 const char *identifier, uint32_t time)
385 struct ds_tizen_remote_surface *remote_surface;
386 struct ds_tizen_remote_surface_event_transfer_mouse_wheel event;
388 remote_surface = wl_resource_get_user_data(remote_surface_resource);
390 event.remote_surface = remote_surface;
391 event.direction = direction;
394 event.subclas = subclas;
395 event.identifier = identifier;
398 wl_signal_emit_mutable(&remote_surface->events.transfer_mouse_wheel_event, &event);
402 remote_surface_handle_transfer_touch_event(struct wl_client *wl_client,
403 struct wl_resource *remote_surface_resource,
404 uint32_t event_type, int32_t device, int32_t button, int32_t x, int32_t y,
405 wl_fixed_t radius_x, wl_fixed_t radius_y, wl_fixed_t pressure, wl_fixed_t angle,
406 uint32_t clas, uint32_t subclas, const char *identifier, uint32_t time)
408 struct ds_tizen_remote_surface *remote_surface;
409 struct ds_tizen_remote_surface_event_transfer_touch event;
411 remote_surface = wl_resource_get_user_data(remote_surface_resource);
413 event.remote_surface = remote_surface;
414 event.event_type = event_type;
415 event.device = device;
416 event.button = button;
419 event.radius_x = radius_x;
420 event.radius_y = radius_y;
421 event.pressure = pressure;
424 event.subclas = subclas;
425 event.identifier = identifier;
428 wl_signal_emit_mutable(&remote_surface->events.transfer_touch_event, &event);
432 remote_surface_handle_transfer_touch_cancel(struct wl_client *wl_client,
433 struct wl_resource *remote_surface_resource)
435 struct ds_tizen_remote_surface *remote_surface;
436 struct ds_tizen_remote_surface_event_transfer_touch_cancel event;
438 remote_surface = wl_resource_get_user_data(remote_surface_resource);
440 event.remote_surface = remote_surface;
442 wl_signal_emit_mutable(&remote_surface->events.transfer_touch_cancel_event, &event);
446 remote_surface_handle_transfer_key_event(struct wl_client *wl_client,
447 struct wl_resource *remote_surface_resource,
448 uint32_t event_type, int32_t keycode, uint32_t clas, uint32_t subclas,
449 const char *identifier, uint32_t time)
451 struct ds_tizen_remote_surface *remote_surface;
452 struct ds_tizen_remote_surface_event_transfer_key event;
454 remote_surface = wl_resource_get_user_data(remote_surface_resource);
456 event.remote_surface = remote_surface;
457 event.event_type = event_type;
458 event.keycode = keycode;
460 event.subclas = subclas;
461 event.identifier = identifier;
464 wl_signal_emit_mutable(&remote_surface->events.transfer_key_event, &event);
468 remote_surface_handle_transfer_visibility(struct wl_client *wl_client,
469 struct wl_resource *remote_surface_resource,
470 uint32_t visibility_type)
472 struct ds_tizen_remote_surface *remote_surface;
473 struct ds_tizen_remote_surface_event_transfer_visibility event;
475 remote_surface = wl_resource_get_user_data(remote_surface_resource);
477 event.remote_surface = remote_surface;
478 event.visibility = visibility_type;
480 wl_signal_emit_mutable(&remote_surface->events.transfer_visibility_event, &event);
484 remote_surface_handle_owner_surface_destroy(struct wl_listener *listener, void *data)
486 struct ds_tizen_remote_surface *remote_surface;
488 remote_surface = wl_container_of(listener, remote_surface, listener.surface_destroy);
490 if (remote_surface->listener.owner_surface_destroy.notify) {
491 wl_list_remove(&remote_surface->listener.owner_surface_destroy.link);
492 remote_surface->listener.owner_surface_destroy.notify = NULL;
495 remote_surface->owner_surface = NULL;
499 remote_surface_handle_set_owner(struct wl_client *wl_client,
500 struct wl_resource *remote_surface_resource,
501 struct wl_resource *surface_resource)
503 struct ds_tizen_remote_surface *remote_surface;
504 struct ds_surface *surface;
506 remote_surface = wl_resource_get_user_data(remote_surface_resource);
507 surface = ds_surface_from_resource(surface_resource);
509 remote_surface->listener.owner_surface_destroy.notify = remote_surface_handle_owner_surface_destroy;
510 ds_surface_add_destroy_listener(surface, &remote_surface->listener.owner_surface_destroy);
511 remote_surface->owner_surface = surface;
513 wl_signal_emit_mutable(&remote_surface->events.set_owner, remote_surface);
517 remote_region_handle_destroy(struct wl_client *wl_client,
518 struct wl_resource *resource)
520 wl_resource_destroy(resource);
524 remote_region_handle_set_geometry(struct wl_client *wl_client,
525 struct wl_resource *remote_region_resource,
526 int32_t x, int32_t y, int32_t w, int32_t h)
528 struct ds_tizen_remote_surface_region *remote_region;
530 remote_region = wl_resource_get_user_data(remote_region_resource);
532 remote_region->x = x;
533 remote_region->y = y;
534 remote_region->w = w;
535 remote_region->h = h;
537 wl_signal_emit_mutable(&remote_region->events.set_geometry, remote_region);
540 static const struct tizen_remote_surface_region_interface remote_surface_region_impl =
542 .destroy = remote_region_handle_destroy,
543 .set_geometry = remote_region_handle_set_geometry,
547 remote_surface_region_handle_resource_destroy(struct wl_resource *remote_region_resource)
549 struct ds_tizen_remote_surface_region *remote_region;
551 remote_region = wl_resource_get_user_data(remote_region_resource);
553 ds_inf("remote_region:%p destroy", remote_region);
555 wl_signal_emit_mutable(&remote_region->events.destroy, remote_region);
561 remote_surface_handle_create_region(struct wl_client *wl_client,
562 struct wl_resource *remote_surface_resource,
565 struct ds_tizen_remote_surface *remote_surface;
566 struct ds_tizen_remote_surface_region *remote_region;
568 remote_surface = wl_resource_get_user_data(remote_surface_resource);
570 remote_region = calloc(1, sizeof *remote_region);
571 if (!remote_region) {
572 wl_client_post_no_memory(wl_client);
576 remote_region->resource = wl_resource_create(wl_client, &tizen_remote_surface_region_interface,
578 if (!remote_region->resource) {
579 wl_client_post_no_memory(wl_client);
584 wl_resource_set_implementation(remote_region->resource, &remote_surface_region_impl,
585 remote_region, remote_surface_region_handle_resource_destroy);
587 ds_inf("remote_surface_region:%p create", remote_region);
589 wl_signal_init(&remote_region->events.destroy);
590 wl_signal_init(&remote_region->events.set_geometry);
592 wl_signal_emit_mutable(&remote_surface->events.new_region, remote_region);
596 remote_surface_handle_release(struct wl_client *wl_client,
597 struct wl_resource *remote_surface_resource,
598 struct wl_resource *remote_buffer_resource)
600 struct ds_tizen_remote_surface *remote_surface;
601 struct ds_buffer *buffer;
602 struct ds_tizen_remote_surface_event_buffer_release event;
604 remote_surface = wl_resource_get_user_data(remote_surface_resource);
605 buffer = ds_buffer_from_resource(remote_buffer_resource);
607 event.remote_surface = remote_surface;
608 event.buffer = buffer;
610 wl_signal_emit_mutable(&remote_surface->events.buffer_release, &event);
614 remote_surface_handle_set_remote_render(struct wl_client *wl_client,
615 struct wl_resource *remote_surface_resource,
618 struct ds_tizen_remote_surface *remote_surface;
620 remote_surface = wl_resource_get_user_data(remote_surface_resource);
623 remote_surface->remote_render = true;
625 remote_surface->remote_render = false;
627 wl_signal_emit_mutable(&remote_surface->events.set_remote_render, remote_surface);
631 remote_surface_handle_set_changed_buffer_event_filter(struct wl_client *wl_client,
632 struct wl_resource *remote_surface_resource,
633 enum tizen_remote_surface_changed_buffer_event_filter filter)
635 struct ds_tizen_remote_surface *remote_surface;
637 remote_surface = wl_resource_get_user_data(remote_surface_resource);
639 remote_surface->changed_buffer_event_filter = filter;
641 wl_signal_emit_mutable(&remote_surface->events.set_changed_buffer_event_filter, remote_surface);
645 remote_surface_handle_get_current_buffer(struct wl_client *wl_client,
646 struct wl_resource *remote_surface_resource,
647 enum tizen_remote_surface_buffer_type buff_type,
650 struct ds_tizen_remote_surface *remote_surface;
651 struct ds_tizen_remote_surface_event_current_buffer event;
653 remote_surface = wl_resource_get_user_data(remote_surface_resource);
655 event.remote_surface = remote_surface;
656 event.buffer_type = buff_type;
657 event.request_serial = req_serial;
659 wl_signal_emit_mutable(&remote_surface->events.get_current_buffer, &event);
662 static const struct tizen_remote_surface_interface remote_surface_impl =
664 .destroy = remote_surface_handle_destroy,
665 .redirect = remote_surface_handle_redirect,
666 .unredirect = remote_surface_handle_unredirect,
667 .transfer_mouse_event = remote_surface_handle_transfer_mouse_event,
668 .transfer_mouse_wheel = remote_surface_handle_transfer_mouse_wheel,
669 .transfer_touch_event = remote_surface_handle_transfer_touch_event,
670 .transfer_touch_cancel = remote_surface_handle_transfer_touch_cancel,
671 .transfer_key_event = remote_surface_handle_transfer_key_event,
672 .transfer_visibility = remote_surface_handle_transfer_visibility,
673 .set_owner = remote_surface_handle_set_owner,
674 .create_region = remote_surface_handle_create_region,
675 .release = remote_surface_handle_release,
676 .set_remote_render = remote_surface_handle_set_remote_render,
677 .set_changed_buffer_event_filter = remote_surface_handle_set_changed_buffer_event_filter,
678 .get_current_buffer = remote_surface_handle_get_current_buffer,
682 remote_surface_handle_surface_destroy(struct wl_listener *listener, void *data)
684 struct ds_tizen_remote_surface *remote_surface;
686 remote_surface = wl_container_of(listener, remote_surface, listener.surface_destroy);
688 if (remote_surface->listener.surface_destroy.notify) {
689 wl_list_remove(&remote_surface->listener.surface_destroy.link);
690 remote_surface->listener.surface_destroy.notify = NULL;
693 remote_surface->surface = NULL;
697 remote_surface_handle_wl_tbm_resource_destroy(struct wl_listener *listener, void *data)
699 struct ds_tizen_remote_surface *remote_surface;
701 remote_surface = wl_container_of(listener, remote_surface, listener.wl_tbm_resource_destroy);
703 if (remote_surface->listener.wl_tbm_resource_destroy.notify) {
704 wl_list_remove(&remote_surface->listener.wl_tbm_resource_destroy.link);
705 remote_surface->listener.wl_tbm_resource_destroy.notify = NULL;
708 remote_surface->wl_tbm_resource = NULL;
712 remote_surface_handle_resource_destroy(struct wl_resource *remote_surface_resource)
714 struct ds_tizen_remote_surface *remote_surface;
716 remote_surface = wl_resource_get_user_data(remote_surface_resource);
718 ds_inf("remote_surface:%p destroy", remote_surface);
720 if (remote_surface->listener.surface_destroy.notify) {
721 wl_list_remove(&remote_surface->listener.surface_destroy.link);
722 remote_surface->listener.surface_destroy.notify = NULL;
725 if (remote_surface->listener.owner_surface_destroy.notify) {
726 wl_list_remove(&remote_surface->listener.owner_surface_destroy.link);
727 remote_surface->listener.owner_surface_destroy.notify = NULL;
730 wl_list_remove(&remote_surface->link);
732 wl_signal_emit_mutable(&remote_surface->events.destroy, remote_surface);
734 free(remote_surface);
738 remote_surface_manager_handle_create_surface(struct wl_client *wl_client,
739 struct wl_resource *remote_surface_client_resource,
741 uint32_t resource_id,
742 struct wl_resource *wl_tbm_resource)
744 struct ds_tizen_remote_surface_client *remote_client;
745 struct ds_tizen_remote_surface *remote_surface;
746 struct ds_surface *surface = NULL;
747 struct ds_tizen_remote_surface_provider *remote_provider;
749 remote_client = wl_resource_get_user_data(remote_surface_client_resource);
751 wl_list_for_each(remote_provider, &remote_client->remote_manager->remote_providers, link) {
752 if (remote_provider->resource_id == resource_id) {
753 surface = remote_provider->surface;
759 ds_err("fail to find ds_surface from resource_id:%d", resource_id);
763 remote_surface = calloc(1, sizeof *remote_surface);
764 if (!remote_surface) {
765 wl_client_post_no_memory(wl_client);
769 remote_surface->resource = wl_resource_create(wl_client, &tizen_remote_surface_interface,
770 wl_resource_get_version(remote_client->resource), id);
771 if (!remote_surface->resource) {
772 wl_client_post_no_memory(wl_client);
773 free(remote_surface);
777 remote_surface->listener.surface_destroy.notify = remote_surface_handle_surface_destroy;
778 ds_surface_add_destroy_listener(surface, &remote_surface->listener.surface_destroy);
779 remote_surface->surface = surface;
781 remote_surface->listener.wl_tbm_resource_destroy.notify = remote_surface_handle_wl_tbm_resource_destroy;
782 wl_resource_add_destroy_listener(wl_tbm_resource, &remote_surface->listener.wl_tbm_resource_destroy);
783 remote_surface->wl_tbm_resource = wl_tbm_resource;
785 wl_resource_set_implementation(remote_surface->resource, &remote_surface_impl,
786 remote_surface, remote_surface_handle_resource_destroy);
788 ds_inf("remote_surface:%p create", remote_surface);
790 wl_signal_init(&remote_surface->events.destroy);
791 wl_signal_init(&remote_surface->events.set_redirect);
792 wl_signal_init(&remote_surface->events.transfer_mouse_event);
793 wl_signal_init(&remote_surface->events.transfer_mouse_wheel_event);
794 wl_signal_init(&remote_surface->events.transfer_touch_event);
795 wl_signal_init(&remote_surface->events.transfer_touch_cancel_event);
796 wl_signal_init(&remote_surface->events.transfer_key_event);
797 wl_signal_init(&remote_surface->events.transfer_visibility_event);
798 wl_signal_init(&remote_surface->events.set_owner);
799 wl_signal_init(&remote_surface->events.new_region);
800 wl_signal_init(&remote_surface->events.buffer_release);
801 wl_signal_init(&remote_surface->events.set_remote_render);
802 wl_signal_init(&remote_surface->events.set_changed_buffer_event_filter);
803 wl_signal_init(&remote_surface->events.get_current_buffer);
805 wl_list_insert(&remote_client->remote_manager->remote_surfaces, &remote_surface->link);
807 wl_signal_emit_mutable(&remote_client->remote_manager->events.new_surface, remote_surface);
811 remote_surface_manager_handle_bind_surface(struct wl_client *wl_client,
812 struct wl_resource *remote_surface_client_resource,
813 struct wl_resource *surface_resource,
814 struct wl_resource *remote_surface_resource)
816 struct ds_tizen_remote_surface_manager_event_bind_surface event;
817 struct ds_tizen_remote_surface_client *remote_client;
818 struct ds_tizen_remote_surface *remote_surface;
819 struct ds_surface *surface;
821 remote_client = wl_resource_get_user_data(remote_surface_client_resource);
822 surface = ds_surface_from_resource(surface_resource);
823 remote_surface = wl_resource_get_user_data(surface_resource);
825 event.remote_surface = remote_surface;
826 event.surface = surface;
828 wl_signal_emit_mutable(&remote_client->remote_manager->events.bind_surface, &event);
832 remote_surface_manager_handle_destroy(struct wl_client *wl_client,
833 struct wl_resource *resource)
835 wl_resource_destroy(resource);
839 remote_surface_manager_handle_create_surface_with_wl_surface(struct wl_client *wl_client,
840 struct wl_resource *remote_client_resource,
842 uint32_t resource_id,
843 struct wl_resource *wl_tbm_resource,
844 struct wl_resource *surface_resource)
846 struct ds_tizen_remote_surface_client *remote_client;
847 struct ds_tizen_remote_surface *remote_surface;
848 struct ds_surface *surface = NULL, *owner_surface;
849 struct ds_tizen_remote_surface_provider *remote_provider;
851 remote_client = wl_resource_get_user_data(remote_client_resource);
852 owner_surface = ds_surface_from_resource(surface_resource);
854 wl_list_for_each(remote_provider, &remote_client->remote_manager->remote_providers, link) {
855 if (remote_provider->resource_id == resource_id) {
856 surface = remote_provider->surface;
862 ds_err("fail to find ds_surface from resource_id:%d", resource_id);
866 remote_surface = calloc(1, sizeof *remote_surface);
867 if (!remote_surface) {
868 wl_client_post_no_memory(wl_client);
872 remote_surface->resource = wl_resource_create(wl_client, &tizen_remote_surface_interface,
873 wl_resource_get_version(remote_client->resource), id);
874 if (!remote_surface->resource) {
875 wl_client_post_no_memory(wl_client);
876 free(remote_surface);
880 remote_surface->listener.owner_surface_destroy.notify = remote_surface_handle_owner_surface_destroy;
881 ds_surface_add_destroy_listener(owner_surface, &remote_surface->listener.owner_surface_destroy);
882 remote_surface->owner_surface = owner_surface;
884 remote_surface->listener.surface_destroy.notify = remote_surface_handle_surface_destroy;
885 ds_surface_add_destroy_listener(surface, &remote_surface->listener.surface_destroy);
886 remote_surface->surface = surface;
888 remote_surface->listener.wl_tbm_resource_destroy.notify = remote_surface_handle_wl_tbm_resource_destroy;
889 wl_resource_add_destroy_listener(wl_tbm_resource, &remote_surface->listener.wl_tbm_resource_destroy);
890 remote_surface->wl_tbm_resource = wl_tbm_resource;
892 wl_resource_set_implementation(remote_surface->resource, &remote_surface_impl,
893 remote_surface, remote_surface_handle_resource_destroy);
895 ds_inf("remote_surface:%p create", remote_surface);
897 wl_signal_init(&remote_surface->events.destroy);
898 wl_signal_init(&remote_surface->events.set_redirect);
899 wl_signal_init(&remote_surface->events.transfer_mouse_event);
900 wl_signal_init(&remote_surface->events.transfer_mouse_wheel_event);
901 wl_signal_init(&remote_surface->events.transfer_touch_event);
902 wl_signal_init(&remote_surface->events.transfer_touch_cancel_event);
903 wl_signal_init(&remote_surface->events.transfer_key_event);
904 wl_signal_init(&remote_surface->events.transfer_visibility_event);
905 wl_signal_init(&remote_surface->events.set_owner);
906 wl_signal_init(&remote_surface->events.new_region);
907 wl_signal_init(&remote_surface->events.buffer_release);
908 wl_signal_init(&remote_surface->events.set_remote_render);
909 wl_signal_init(&remote_surface->events.set_changed_buffer_event_filter);
910 wl_signal_init(&remote_surface->events.get_current_buffer);
912 wl_list_insert(&remote_client->remote_manager->remote_surfaces, &remote_surface->link);
914 wl_signal_emit_mutable(&remote_client->remote_manager->events.new_surface, remote_surface);
915 wl_signal_emit_mutable(&remote_surface->events.set_owner, remote_surface);
918 static const struct tizen_remote_surface_manager_interface remote_surface_manager_impl =
920 .create_provider = remote_surface_manager_handle_create_provider,
921 .create_surface = remote_surface_manager_handle_create_surface,
922 .bind_surface = remote_surface_manager_handle_bind_surface,
923 .destroy = remote_surface_manager_handle_destroy,
924 .create_surface_with_wl_surface = remote_surface_manager_handle_create_surface_with_wl_surface,
928 tizen_remote_surface_client_handle_resource_destroy(struct wl_resource *resource)
930 struct ds_tizen_remote_surface_client *remote_client;
932 remote_client = wl_resource_get_user_data(resource);
934 ds_inf("_tizen_remote_surface_client_handle_destroy (client:%p)", remote_client);
940 remote_surface_manager_bind(struct wl_client *wl_client, void *data, uint32_t version,
943 struct ds_tizen_remote_surface_manager *remote_manager = data;
944 struct ds_tizen_remote_surface_client *remote_client;
946 remote_client = calloc(1, sizeof *remote_client);
947 if (!remote_client) {
948 ds_err("calloc() failed. tizen_remote_surface_client");
949 wl_client_post_no_memory(wl_client);
953 ds_inf("tizen_remote_surface_client binds. (client:%p)", remote_client);
955 remote_client->remote_manager = remote_manager;
956 remote_client->wl_client = wl_client;
958 remote_client->resource = wl_resource_create(wl_client, &tizen_remote_surface_manager_interface,
959 MIN(version, TIZEN_REMOTE_SURFACE_VERSION), id);
960 if (!remote_client->resource) {
961 ds_err("tizen_remote_surface : wl_resource_create() failed.");
963 wl_client_post_no_memory(wl_client);
967 wl_resource_set_implementation(remote_client->resource, &remote_surface_manager_impl,
968 remote_client, tizen_remote_surface_client_handle_resource_destroy);
970 wl_signal_init(&remote_client->events.destroy);
974 remote_surface_manager_handle_display_destroy(struct wl_listener *listener, void *data)
976 struct ds_tizen_remote_surface_manager *remote_manager;
978 remote_manager = wl_container_of(listener, remote_manager, destroy);
980 ds_inf("Global destroy: remote_surface_manager(%p)", remote_manager);
982 wl_signal_emit_mutable(&remote_manager->events.destroy, remote_manager);
983 wl_list_remove(&remote_manager->destroy.link);
984 wl_global_destroy(remote_manager->global);
985 free(remote_manager);
988 WL_EXPORT struct ds_tizen_remote_surface_manager *
989 ds_tizen_remote_surface_manager_create(struct wl_display *display)
991 struct ds_tizen_remote_surface_manager *remote_manager;
993 remote_manager = calloc(1, sizeof *remote_manager);
994 if (!remote_manager) {
995 ds_err("calloc() failed.");
999 remote_manager->global = wl_global_create(display, &tizen_remote_surface_manager_interface,
1000 TIZEN_REMOTE_SURFACE_VERSION, remote_manager, remote_surface_manager_bind);
1001 if (!remote_manager->global) {
1002 ds_err("wl_global_create() failed. tizen_remote_surface_interface");
1003 free(remote_manager);
1007 remote_manager->destroy.notify = remote_surface_manager_handle_display_destroy;
1008 wl_display_add_destroy_listener(display, &remote_manager->destroy);
1010 wl_list_init(&remote_manager->remote_providers);
1011 wl_list_init(&remote_manager->remote_surfaces);
1013 wl_signal_init(&remote_manager->events.destroy);
1014 wl_signal_init(&remote_manager->events.new_provider);
1015 wl_signal_init(&remote_manager->events.new_surface);
1016 wl_signal_init(&remote_manager->events.bind_surface);
1018 ds_inf("Global created: tizen_remote_surface_manager(%p)", remote_manager);
1020 return remote_manager;
1024 ds_tizen_remote_surface_manager_add_destroy_listener(
1025 struct ds_tizen_remote_surface_manager *remote_manager,
1026 struct wl_listener *listener)
1028 wl_signal_add(&remote_manager->events.destroy, listener);
1032 ds_tizen_remote_surface_manager_add_new_provider_listener(
1033 struct ds_tizen_remote_surface_manager *remote_manager,
1034 struct wl_listener *listener)
1036 wl_signal_add(&remote_manager->events.new_provider, listener);
1040 ds_tizen_remote_surface_manager_add_new_surface_listener(
1041 struct ds_tizen_remote_surface_manager *remote_manager,
1042 struct wl_listener *listener)
1044 wl_signal_add(&remote_manager->events.new_surface, listener);
1048 ds_tizen_remote_surface_manager_add_bind_surface_listener(
1049 struct ds_tizen_remote_surface_manager *remote_manager,
1050 struct wl_listener *listener)
1052 wl_signal_add(&remote_manager->events.bind_surface, listener);
1056 ds_tizen_remote_surface_provider_add_destroy_listener(
1057 struct ds_tizen_remote_surface_provider *remote_provider,
1058 struct wl_listener *listener)
1060 wl_signal_add(&remote_provider->events.destroy, listener);
1064 ds_tizen_remote_surface_provider_add_set_offscreen_listener(
1065 struct ds_tizen_remote_surface_provider *remote_provider,
1066 struct wl_listener *listener)
1068 wl_signal_add(&remote_provider->events.set_offscreen, listener);
1072 ds_tizen_remote_surface_provider_add_set_input_event_filter_listener(
1073 struct ds_tizen_remote_surface_provider *remote_provider,
1074 struct wl_listener *listener)
1076 wl_signal_add(&remote_provider->events.set_input_event_filter, listener);
1080 ds_tizen_remote_surface_provider_get_offscreen(
1081 struct ds_tizen_remote_surface_provider *remote_provider)
1083 return remote_provider->offscreen;
1087 ds_tizen_remote_surface_provider_get_input_event_filter(
1088 struct ds_tizen_remote_surface_provider *remote_provider)
1090 return remote_provider->input_event_filter;
1094 ds_tizen_remote_surface_provider_send_visibility(
1095 struct ds_tizen_remote_surface_provider *remote_provider,
1096 enum ds_tizen_remote_surface_visibility_type visibility)
1098 tizen_remote_surface_provider_send_visibility(remote_provider->resource,
1103 ds_tizen_remote_surface_add_destroy_listener(
1104 struct ds_tizen_remote_surface *remote_surface,
1105 struct wl_listener *listener)
1107 wl_signal_add(&remote_surface->events.destroy, listener);
1110 struct wl_resource *
1111 ds_tizen_remote_surface_get_wl_tbm_resource(
1112 struct ds_tizen_remote_surface *remote_surface)
1114 return remote_surface->wl_tbm_resource;
1118 ds_tizen_remote_surface_add_set_redirect_listener(
1119 struct ds_tizen_remote_surface *remote_surface,
1120 struct wl_listener *listener)
1122 wl_signal_add(&remote_surface->events.set_redirect, listener);
1126 ds_tizen_remote_surface_get_redirect(
1127 struct ds_tizen_remote_surface *remote_surface)
1129 return remote_surface->redirect;
1133 ds_tizen_remote_surface_add_set_owner_listener(
1134 struct ds_tizen_remote_surface *remote_surface,
1135 struct wl_listener *listener)
1137 wl_signal_add(&remote_surface->events.set_owner, listener);
1140 WL_EXPORT struct ds_surface *
1141 ds_tizen_remote_surface_get_owner(
1142 struct ds_tizen_remote_surface *remote_surface)
1144 return remote_surface->owner_surface;
1148 ds_tizen_remote_surface_add_buffer_release_listener(
1149 struct ds_tizen_remote_surface *remote_surface,
1150 struct wl_listener *listener)
1152 wl_signal_add(&remote_surface->events.buffer_release, listener);
1156 ds_tizen_remote_surface_add_set_remote_render_listener(
1157 struct ds_tizen_remote_surface *remote_surface,
1158 struct wl_listener *listener)
1160 wl_signal_add(&remote_surface->events.set_remote_render, listener);
1164 ds_tizen_remote_surface_get_remote_render(
1165 struct ds_tizen_remote_surface *remote_surface)
1167 return remote_surface->remote_render;
1171 ds_tizen_remote_surface_add_set_changed_buffer_event_filter_listener(
1172 struct ds_tizen_remote_surface *remote_surface,
1173 struct wl_listener *listener)
1175 wl_signal_add(&remote_surface->events.set_changed_buffer_event_filter, listener);
1179 ds_tizen_remote_surface_get_changed_buffer_event_filter(
1180 struct ds_tizen_remote_surface *remote_surface,
1181 struct wl_listener *listener)
1183 return remote_surface->changed_buffer_event_filter;
1187 ds_tizen_remote_surface_add_get_current_buffer_listener(
1188 struct ds_tizen_remote_surface *remote_surface,
1189 struct wl_listener *listener)
1191 wl_signal_add(&remote_surface->events.get_current_buffer, listener);
1195 ds_tizen_remote_surface_send_changed_buffer(
1196 struct ds_tizen_remote_surface *remote_surface,
1197 struct ds_buffer *buffer,
1199 struct wl_array *options)
1202 struct ds_tbm_client_buffer *tbm_client_buffer;
1203 struct wl_resource *buffer_resource;
1205 version = wl_resource_get_version(remote_surface->resource);
1207 tbm_client_buffer = ds_tbm_client_buffer_from_buffer(buffer);
1208 if (!tbm_client_buffer) {
1209 ds_err("not support buffer");
1213 buffer_resource = ds_buffer_get_resource(buffer);
1214 if (!buffer_resource) {
1215 ds_err("buffer resource is null");
1219 if (version >= TIZEN_REMOTE_SURFACE_CHANGED_BUFFER_SINCE_VERSION) {
1220 tizen_remote_surface_send_changed_buffer(remote_surface->resource,
1221 TIZEN_REMOTE_SURFACE_BUFFER_TYPE_TBM,
1223 remote_surface_dummy_fd_get(),
1228 tizen_remote_surface_send_update_buffer(remote_surface->resource,
1235 ds_tizen_remote_surface_send_changed_buffer_image_file(
1236 struct ds_tizen_remote_surface *remote_surface,
1238 int image_file_size,
1240 struct wl_array *options)
1244 version = wl_resource_get_version(remote_surface->resource);
1246 if (version < TIZEN_REMOTE_SURFACE_CHANGED_BUFFER_SINCE_VERSION) {
1247 ds_err("not support remote_surface:%p version:%d", remote_surface, version);
1251 tizen_remote_surface_send_changed_buffer(remote_surface->resource,
1252 TIZEN_REMOTE_SURFACE_BUFFER_TYPE_IMAGE_FILE,
1261 ds_tizen_remote_surface_send_missing(
1262 struct ds_tizen_remote_surface *remote_surface)
1264 tizen_remote_surface_send_missing(remote_surface->resource);
1268 ds_tizen_remote_surface_send_input_event_filter(
1269 struct ds_tizen_remote_surface *remote_surface,
1270 uint32_t input_event_filter)
1272 tizen_remote_surface_send_input_event_filter(remote_surface->resource,
1273 input_event_filter);
1277 ds_tizen_remote_surface_add_new_region_listener(
1278 struct ds_tizen_remote_surface *remote_surface,
1279 struct wl_listener *listener)
1281 wl_signal_add(&remote_surface->events.new_region, listener);
1285 ds_tizen_remote_surface_region_add_destroy_listener(
1286 struct ds_tizen_remote_surface_region *remote_region,
1287 struct wl_listener *listener)
1289 wl_signal_add(&remote_region->events.destroy, listener);
1293 ds_tizen_remote_surface_region_add_set_geometry_listener(
1294 struct ds_tizen_remote_surface_region *remote_region,
1295 struct wl_listener *listener)
1297 wl_signal_add(&remote_region->events.set_geometry, listener);
1301 ds_tizen_remote_surface_region_get_geometry(
1302 struct ds_tizen_remote_surface_region *remote_region,
1303 int32_t *x,int32_t *y, int32_t *w, int32_t *h)
1305 if (x) *x = remote_region->x;
1306 if (y) *y = remote_region->y;
1307 if (w) *w = remote_region->w;
1308 if (h) *h = remote_region->h;