4 #include <wayland-server.h>
5 #include <tizen-extension-server-protocol.h>
10 #include "libds-tizen/policy.h"
12 #define TIZEN_POLICY_VERSION 11
13 #define TIZEN_POLICY_PRIVILEGE_SET_NOTIFICATION_LEVEL \
14 "http://tizen.org/privilege/window.priority.set"
15 #define TIZEN_POLICY_PRIVILEGE_SET_SCREEN_MODE \
16 "http://tizen.org/privilege/display"
18 struct ds_tizen_policy
20 struct wl_global *global;
22 struct wl_list clients;
24 struct wl_listener destroy;
29 struct wl_signal destroy;
30 struct wl_signal new_surface;
31 struct wl_signal activate_below_by_univeral_id;
32 struct wl_signal lower_by_universal_id;
33 struct wl_signal set_transient_for;
34 struct wl_signal unset_transient_for;
35 struct wl_signal place_subsurface_below_parent;
36 struct wl_signal set_subsurface_stand_alone;
37 struct wl_signal set_background_state;
38 struct wl_signal unset_background_state;
39 struct wl_signal activate_above_by_universal_id;
40 struct wl_signal set_appid;
41 struct wl_signal set_transient_for_below;
45 struct ds_tizen_policy_client
47 struct ds_tizen_policy *policy;
49 struct wl_resource *resource;
50 struct wl_client *wl_client;
54 struct wl_list policy_surfaces;
56 struct wl_list link; // ds_tizen_policy::clients
59 struct ds_tizen_policy_surface
61 struct ds_tizen_policy_client *client;
63 struct ds_surface *surface;
67 struct wl_list visibilities;
68 struct wl_list positions;
69 struct wl_list subsurface_watchers;
75 enum ds_tizen_policy_stack_mode stack_mode;
79 struct wl_signal destroy;
80 struct wl_signal new_visibility;
81 struct wl_signal new_position;
82 struct wl_signal activate;
83 struct wl_signal raise;
84 struct wl_signal lower;
85 struct wl_signal set_focus_skip;
86 struct wl_signal unset_focus_skip;
87 struct wl_signal set_role;
88 struct wl_signal set_window_type;
89 struct wl_signal set_conformant;
90 struct wl_signal unset_conformant;
91 struct wl_signal get_conformant;
92 struct wl_signal set_notification_level;
93 struct wl_signal set_window_screen_mode;
94 struct wl_signal get_subsurface;
95 struct wl_signal iconify;
96 struct wl_signal uniconify;
97 struct wl_signal add_aux_hint;
98 struct wl_signal change_aux_hint;
99 struct wl_signal delete_aux_hint;
100 struct wl_signal get_supported_aux_hints;
101 struct wl_signal set_floating_mode;
102 struct wl_signal unset_floating_mode;
103 struct wl_signal set_stack_mode;
104 struct wl_signal new_subsurface_watcher;
105 struct wl_signal set_parent;
106 struct wl_signal ack_conformant_region;
107 struct wl_signal set_video;
108 struct wl_signal show;
109 struct wl_signal hide;
110 struct wl_signal set_parent_with_below;
113 struct wl_list link; // ds_tizen_policy_client::policy_surfaces
116 struct ds_tizen_policy_visibility
118 struct ds_tizen_policy_surface *policy_surface;
120 struct wl_resource *resource;
123 struct wl_signal destroy;
126 struct wl_list link; // ds_tizen_policy_surface::visibilities
129 struct ds_tizen_policy_position
131 struct ds_tizen_policy_surface *policy_surface;
133 struct wl_resource *resource;
136 struct wl_signal destroy;
137 struct wl_signal set;
140 struct wl_list link; // ds_tizen_policy_surface::positions
143 struct ds_tizen_policy_subsurface_watcher
145 struct ds_tizen_policy_surface *policy_surface;
147 struct wl_resource *resource;
150 struct wl_signal destroy;
153 struct wl_list link; // ds_tizen_policy_surface::subsurface_watchers
156 static void policy_handle_display_destroy(struct wl_listener *listener,
159 static void policy_bind(struct wl_client *wl_client, void *data,
160 uint32_t version, uint32_t id);
162 static struct ds_tizen_policy_surface *tizen_policy_client_find_policy_surface(
163 struct ds_tizen_policy_client *client,
164 struct ds_surface *surface);
166 static struct ds_tizen_policy_surface *tizen_policy_client_get_surface(
167 struct wl_resource *resource,
168 struct wl_resource *surface_resource);
170 WL_EXPORT struct ds_tizen_policy *
171 ds_tizen_policy_create(struct wl_display *display)
173 struct ds_tizen_policy *policy;
175 policy = calloc(1, sizeof *policy);
177 ds_err("calloc() failed.");
181 policy->global = wl_global_create(display, &tizen_policy_interface,
182 TIZEN_POLICY_VERSION, policy, policy_bind);
183 if (!policy->global) {
184 ds_err("wl_global_create() failed. tizen_policy_interface");
189 wl_list_init(&policy->clients);
191 policy->destroy.notify = policy_handle_display_destroy;
192 wl_display_add_destroy_listener(display, &policy->destroy);
194 policy->use_security = tizen_security_init();
195 if (!policy->use_security) {
196 ds_inf("tizen_security_init() is not successful. "
197 "policy works without security.");
200 wl_signal_init(&policy->events.destroy);
201 wl_signal_init(&policy->events.new_surface);
202 wl_signal_init(&policy->events.activate_below_by_univeral_id);
203 wl_signal_init(&policy->events.lower_by_universal_id);
204 wl_signal_init(&policy->events.set_transient_for);
205 wl_signal_init(&policy->events.unset_transient_for);
206 wl_signal_init(&policy->events.place_subsurface_below_parent);
207 wl_signal_init(&policy->events.set_subsurface_stand_alone);
208 wl_signal_init(&policy->events.set_background_state);
209 wl_signal_init(&policy->events.unset_background_state);
210 wl_signal_init(&policy->events.activate_above_by_universal_id);
211 wl_signal_init(&policy->events.set_appid);
212 wl_signal_init(&policy->events.set_transient_for_below);
214 ds_inf("Global created: tizen_policy(%p)", policy);
220 ds_tizen_policy_add_destroy_listener(
221 struct ds_tizen_policy *policy,
222 struct wl_listener *listener)
224 wl_signal_add(&policy->events.destroy, listener);
228 ds_tizen_policy_add_new_surface_listener(
229 struct ds_tizen_policy *policy,
230 struct wl_listener *listener)
232 wl_signal_add(&policy->events.new_surface, listener);
236 ds_tizen_policy_add_activate_below_by_univeral_id_listener(
237 struct ds_tizen_policy *policy,
238 struct wl_listener *listener)
240 wl_signal_add(&policy->events.activate_below_by_univeral_id, listener);
244 ds_tizen_policy_add_lower_by_universal_id_listener(
245 struct ds_tizen_policy *policy,
246 struct wl_listener *listener)
248 wl_signal_add(&policy->events.lower_by_universal_id, listener);
252 ds_tizen_policy_add_set_transient_for_listener(
253 struct ds_tizen_policy *policy,
254 struct wl_listener *listener)
256 wl_signal_add(&policy->events.set_transient_for, listener);
260 ds_tizen_policy_add_unset_transient_for_listener(
261 struct ds_tizen_policy *policy,
262 struct wl_listener *listener)
264 wl_signal_add(&policy->events.unset_transient_for, listener);
268 ds_tizen_policy_add_place_subsurface_below_parent_listener(
269 struct ds_tizen_policy *policy,
270 struct wl_listener *listener)
272 wl_signal_add(&policy->events.place_subsurface_below_parent, listener);
276 ds_tizen_policy_add_set_subsurface_stand_alone_listener(
277 struct ds_tizen_policy *policy,
278 struct wl_listener *listener)
280 wl_signal_add(&policy->events.set_subsurface_stand_alone, listener);
284 ds_tizen_policy_add_set_background_state_listener(
285 struct ds_tizen_policy *policy,
286 struct wl_listener *listener)
288 wl_signal_add(&policy->events.set_background_state, listener);
292 ds_tizen_policy_add_unset_background_state_listener(
293 struct ds_tizen_policy *policy,
294 struct wl_listener *listener)
296 wl_signal_add(&policy->events.unset_background_state, listener);
300 ds_tizen_policy_add_activate_above_by_universal_id_listener(
301 struct ds_tizen_policy *policy,
302 struct wl_listener *listener)
304 wl_signal_add(&policy->events.activate_above_by_universal_id, listener);
308 ds_tizen_policy_add_set_appid_listener(
309 struct ds_tizen_policy *policy,
310 struct wl_listener *listener)
312 wl_signal_add(&policy->events.set_appid, listener);
316 ds_tizen_policy_add_set_transient_for_below_listener(
317 struct ds_tizen_policy *policy,
318 struct wl_listener *listener)
320 wl_signal_add(&policy->events.set_transient_for_below, listener);
324 ds_tizen_policy_surface_add_destroy_listener(
325 struct ds_tizen_policy_surface *policy_surface,
326 struct wl_listener *listener)
328 wl_signal_add(&policy_surface->events.destroy, listener);
332 ds_tizen_policy_surface_add_new_visibility_listener(
333 struct ds_tizen_policy_surface *policy_surface,
334 struct wl_listener *listener)
336 wl_signal_add(&policy_surface->events.new_visibility, listener);
340 ds_tizen_policy_surface_add_new_position_listener(
341 struct ds_tizen_policy_surface *policy_surface,
342 struct wl_listener *listener)
344 wl_signal_add(&policy_surface->events.new_position, listener);
348 ds_tizen_policy_surface_add_activate_listener(
349 struct ds_tizen_policy_surface *policy_surface,
350 struct wl_listener *listener)
352 wl_signal_add(&policy_surface->events.activate, listener);
356 ds_tizen_policy_surface_add_raise_listener(
357 struct ds_tizen_policy_surface *policy_surface,
358 struct wl_listener *listener)
360 wl_signal_add(&policy_surface->events.raise, listener);
364 ds_tizen_policy_surface_add_lower_listener(
365 struct ds_tizen_policy_surface *policy_surface,
366 struct wl_listener *listener)
368 wl_signal_add(&policy_surface->events.lower, listener);
372 ds_tizen_policy_surface_add_set_focus_skip_listener(
373 struct ds_tizen_policy_surface *policy_surface,
374 struct wl_listener *listener)
376 wl_signal_add(&policy_surface->events.set_focus_skip, listener);
380 ds_tizen_policy_surface_add_unset_focus_skip_listener(
381 struct ds_tizen_policy_surface *policy_surface,
382 struct wl_listener *listener)
384 wl_signal_add(&policy_surface->events.unset_focus_skip, listener);
388 ds_tizen_policy_surface_add_set_role_listener(
389 struct ds_tizen_policy_surface *policy_surface,
390 struct wl_listener *listener)
392 wl_signal_add(&policy_surface->events.set_role, listener);
396 ds_tizen_policy_surface_add_set_window_type_listener(
397 struct ds_tizen_policy_surface *policy_surface,
398 struct wl_listener *listener)
400 wl_signal_add(&policy_surface->events.set_window_type, listener);
404 ds_tizen_policy_surface_add_set_conformant_listener(
405 struct ds_tizen_policy_surface *policy_surface,
406 struct wl_listener *listener)
408 wl_signal_add(&policy_surface->events.set_conformant, listener);
412 ds_tizen_policy_surface_add_unset_conformant_listener(
413 struct ds_tizen_policy_surface *policy_surface,
414 struct wl_listener *listener)
416 wl_signal_add(&policy_surface->events.unset_conformant, listener);
420 ds_tizen_policy_surface_add_get_conformant_listener(
421 struct ds_tizen_policy_surface *policy_surface,
422 struct wl_listener *listener)
424 wl_signal_add(&policy_surface->events.get_conformant, listener);
428 ds_tizen_policy_surface_add_set_notification_level_listener(
429 struct ds_tizen_policy_surface *policy_surface,
430 struct wl_listener *listener)
432 wl_signal_add(&policy_surface->events.set_notification_level, listener);
436 ds_tizen_policy_surface_add_set_window_screen_mode_listener(
437 struct ds_tizen_policy_surface *policy_surface,
438 struct wl_listener *listener)
440 wl_signal_add(&policy_surface->events.set_window_screen_mode, listener);
444 ds_tizen_policy_surface_add_get_subsurface_listener(
445 struct ds_tizen_policy_surface *policy_surface,
446 struct wl_listener *listener)
448 wl_signal_add(&policy_surface->events.get_subsurface, listener);
452 ds_tizen_policy_surface_add_iconify_listener(
453 struct ds_tizen_policy_surface *policy_surface,
454 struct wl_listener *listener)
456 wl_signal_add(&policy_surface->events.iconify, listener);
460 ds_tizen_policy_surface_add_uniconify_listener(
461 struct ds_tizen_policy_surface *policy_surface,
462 struct wl_listener *listener)
464 wl_signal_add(&policy_surface->events.uniconify, listener);
468 ds_tizen_policy_surface_add_add_aux_hint_listener(
469 struct ds_tizen_policy_surface *policy_surface,
470 struct wl_listener *listener)
472 wl_signal_add(&policy_surface->events.add_aux_hint, listener);
476 ds_tizen_policy_surface_add_change_aux_hint_listener(
477 struct ds_tizen_policy_surface *policy_surface,
478 struct wl_listener *listener)
480 wl_signal_add(&policy_surface->events.change_aux_hint, listener);
484 ds_tizen_policy_surface_add_delete_aux_hint_listener(
485 struct ds_tizen_policy_surface *policy_surface,
486 struct wl_listener *listener)
488 wl_signal_add(&policy_surface->events.delete_aux_hint, listener);
492 ds_tizen_policy_surface_add_get_supported_aux_hints_listener(
493 struct ds_tizen_policy_surface *policy_surface,
494 struct wl_listener *listener)
496 wl_signal_add(&policy_surface->events.get_supported_aux_hints, listener);
500 ds_tizen_policy_surface_add_set_floating_mode_listener(
501 struct ds_tizen_policy_surface *policy_surface,
502 struct wl_listener *listener)
504 wl_signal_add(&policy_surface->events.set_floating_mode, listener);
508 ds_tizen_policy_surface_add_unset_floating_mode_listener(
509 struct ds_tizen_policy_surface *policy_surface,
510 struct wl_listener *listener)
512 wl_signal_add(&policy_surface->events.unset_floating_mode, listener);
516 ds_tizen_policy_surface_add_set_stack_mode_listener(
517 struct ds_tizen_policy_surface *policy_surface,
518 struct wl_listener *listener)
520 wl_signal_add(&policy_surface->events.set_stack_mode, listener);
524 ds_tizen_policy_surface_add_new_subsurface_watcher_listener(
525 struct ds_tizen_policy_surface *policy_surface,
526 struct wl_listener *listener)
528 wl_signal_add(&policy_surface->events.new_subsurface_watcher, listener);
532 ds_tizen_policy_surface_add_set_parent_listener(
533 struct ds_tizen_policy_surface *policy_surface,
534 struct wl_listener *listener)
536 wl_signal_add(&policy_surface->events.set_parent, listener);
540 ds_tizen_policy_surface_add_ack_conformant_region_listener(
541 struct ds_tizen_policy_surface *policy_surface,
542 struct wl_listener *listener)
544 wl_signal_add(&policy_surface->events.ack_conformant_region, listener);
548 ds_tizen_policy_surface_add_set_video_listener(
549 struct ds_tizen_policy_surface *policy_surface,
550 struct wl_listener *listener)
552 wl_signal_add(&policy_surface->events.set_video, listener);
556 ds_tizen_policy_surface_add_show_listener(
557 struct ds_tizen_policy_surface *policy_surface,
558 struct wl_listener *listener)
560 wl_signal_add(&policy_surface->events.show, listener);
564 ds_tizen_policy_surface_add_hide_listener(
565 struct ds_tizen_policy_surface *policy_surface,
566 struct wl_listener *listener)
568 wl_signal_add(&policy_surface->events.hide, listener);
572 ds_tizen_policy_surface_add_set_parent_with_below_listener(
573 struct ds_tizen_policy_surface *policy_surface,
574 struct wl_listener *listener)
576 wl_signal_add(&policy_surface->events.set_parent_with_below, listener);
580 ds_tizen_policy_visibility_add_destroy_listener(
581 struct ds_tizen_policy_visibility *visibility,
582 struct wl_listener *listener)
584 wl_signal_add(&visibility->events.destroy, listener);
588 ds_tizen_policy_position_add_destroy_listener(
589 struct ds_tizen_policy_position *position,
590 struct wl_listener *listener)
592 wl_signal_add(&position->events.destroy, listener);
596 ds_tizen_policy_position_add_set_listener(
597 struct ds_tizen_policy_position *position,
598 struct wl_listener *listener)
600 wl_signal_add(&position->events.set, listener);
604 ds_tizen_policy_subsurface_watcher_add_destroy_listener(
605 struct ds_tizen_policy_subsurface_watcher *subsurface_watcher,
606 struct wl_listener *listener)
608 wl_signal_add(&subsurface_watcher->events.destroy, listener);
612 ds_tizen_policy_surface_send_conformant(struct ds_tizen_policy_surface *policy_surface,
615 tizen_policy_send_conformant(policy_surface->client->resource,
616 ds_surface_get_wl_resource(policy_surface->surface), active);
620 ds_tizen_policy_surface_send_conformant_area(struct ds_tizen_policy_surface *policy_surface,
621 enum ds_tizen_policy_conformant_part part, bool visible,
622 int32_t x, int32_t y, int32_t w, int32_t h)
624 uint32_t conformant_part;
627 case DS_TIZEN_POLICY_CONFORMANT_PART_INDICATOR:
628 conformant_part = TIZEN_POLICY_CONFORMANT_PART_INDICATOR;
630 case DS_TIZEN_POLICY_CONFORMANT_PART_KEYBOARD:
631 conformant_part = TIZEN_POLICY_CONFORMANT_PART_KEYBOARD;
633 case DS_TIZEN_POLICY_CONFORMANT_PART_CLIPBOARD:
634 conformant_part = TIZEN_POLICY_CONFORMANT_PART_CLIPBOARD;
637 ds_err("Not supported conformant_part(%d)", part);
641 if (wl_resource_get_version(policy_surface->client->resource) >=
642 TIZEN_POLICY_CONFORMANT_REGION_SINCE_VERSION) {
643 tizen_policy_send_conformant_area(policy_surface->client->resource,
644 ds_surface_get_wl_resource(policy_surface->surface), conformant_part, visible,
647 ds_err("client does not support TIZEN_POLICY_CONFORMANT_REGION."
648 "client version(%d) < server version(%d)",
649 wl_resource_get_version(policy_surface->client->resource),
650 TIZEN_POLICY_CONFORMANT_REGION_SINCE_VERSION);
655 ds_tizen_policy_surface_send_notification_done(struct ds_tizen_policy_surface *policy_surface,
656 enum ds_tizen_policy_notification_level level,
657 enum ds_tizen_policy_error_state state)
659 uint32_t notification_level;
660 uint32_t error_state;
663 case DS_TIZEN_POLICY_NOTIFICATION_LEVEL_1:
664 notification_level = TIZEN_POLICY_LEVEL_1;
666 case DS_TIZEN_POLICY_NOTIFICATION_LEVEL_2:
667 notification_level = TIZEN_POLICY_LEVEL_2;
669 case DS_TIZEN_POLICY_NOTIFICATION_LEVEL_3:
670 notification_level = TIZEN_POLICY_LEVEL_3;
672 case DS_TIZEN_POLICY_NOTIFICATION_LEVEL_NONE:
673 notification_level = TIZEN_POLICY_LEVEL_NONE;
675 case DS_TIZEN_POLICY_NOTIFICATION_LEVEL_DEFAULT:
676 notification_level = TIZEN_POLICY_LEVEL_DEFAULT;
678 case DS_TIZEN_POLICY_NOTIFICATION_LEVEL_MEDIUM:
679 notification_level = TIZEN_POLICY_LEVEL_MEDIUM;
681 case DS_TIZEN_POLICY_NOTIFICATION_LEVEL_HIGH:
682 notification_level = TIZEN_POLICY_LEVEL_HIGH;
684 case DS_TIZEN_POLICY_NOTIFICATION_LEVEL_TOP:
685 notification_level = TIZEN_POLICY_LEVEL_TOP;
688 ds_err("Not supported notification_level(%d)", level);
693 case DS_TIZEN_POLICY_ERROR_STATE_NONE:
694 error_state = TIZEN_POLICY_ERROR_STATE_NONE;
696 case DS_TIZEN_POLICY_ERROR_STATE_PERMISSION_DENIED:
697 error_state = TIZEN_POLICY_ERROR_STATE_PERMISSION_DENIED;
700 ds_err("Not supported error_state(%d)", state);
704 tizen_policy_send_notification_done(policy_surface->client->resource,
705 ds_surface_get_wl_resource(policy_surface->surface),
706 notification_level, error_state);
710 ds_tizen_policy_surface_send_window_screen_mode_done(struct ds_tizen_policy_surface *policy_surface,
711 enum ds_tizen_policy_window_screen_mode mode,
712 enum ds_tizen_policy_error_state state)
714 uint32_t window_screen_mode;
715 uint32_t error_state;
718 case DS_TIZEN_POLICY_WINDOW_SCREEN_MODE_DEFAULT:
719 window_screen_mode = TIZEN_POLICY_MODE_DEFAULT;
721 case DS_TIZEN_POLICY_WINDOW_SCREEN_MODE_ALWAYS_ON:
722 window_screen_mode = TIZEN_POLICY_MODE_ALWAYS_ON;
725 ds_err("Not supported window_screen_mode(%d)", mode);
730 case DS_TIZEN_POLICY_ERROR_STATE_NONE:
731 error_state = TIZEN_POLICY_ERROR_STATE_NONE;
733 case DS_TIZEN_POLICY_ERROR_STATE_PERMISSION_DENIED:
734 error_state = TIZEN_POLICY_ERROR_STATE_PERMISSION_DENIED;
737 ds_err("Not supported error_state(%d)", state);
741 tizen_policy_send_window_screen_mode_done(policy_surface->client->resource,
742 ds_surface_get_wl_resource(policy_surface->surface),
743 window_screen_mode, error_state);
747 ds_tizen_policy_surface_send_iconify_state_changed(struct ds_tizen_policy_surface *policy_surface,
748 bool iconified, bool force)
750 tizen_policy_send_iconify_state_changed(policy_surface->client->resource,
751 ds_surface_get_wl_resource(policy_surface->surface), iconified, force);
755 ds_tizen_policy_surface_send_supported_aux_hints(struct ds_tizen_policy_surface *policy_surface,
756 struct wl_array *hints, uint32_t force)
762 ds_tizen_policy_surface_send_allowed_aux_hint(struct ds_tizen_policy_surface *policy_surface,
769 ds_tizen_policy_surface_send_aux_message(struct ds_tizen_policy_surface *policy_surface,
770 const char *key, const char *value, struct wl_array *options)
776 ds_tizen_policy_surface_send_conformant_region(struct ds_tizen_policy_surface *policy_surface,
777 enum ds_tizen_policy_conformant_part part, bool visible,
778 int32_t x, int32_t y, int32_t w, int32_t h, uint32_t serial)
780 uint32_t conformant_part;
783 case DS_TIZEN_POLICY_CONFORMANT_PART_INDICATOR:
784 conformant_part = TIZEN_POLICY_CONFORMANT_PART_INDICATOR;
786 case DS_TIZEN_POLICY_CONFORMANT_PART_KEYBOARD:
787 conformant_part = TIZEN_POLICY_CONFORMANT_PART_KEYBOARD;
789 case DS_TIZEN_POLICY_CONFORMANT_PART_CLIPBOARD:
790 conformant_part = TIZEN_POLICY_CONFORMANT_PART_CLIPBOARD;
793 ds_err("Not supported conformant_part(%d)", part);
797 tizen_policy_send_conformant_region(policy_surface->client->resource,
798 ds_surface_get_wl_resource(policy_surface->surface), conformant_part, visible,
803 ds_tizen_policy_surface_send_interactive_move_done(struct ds_tizen_policy_surface *policy_surface,
804 int32_t x, int32_t y, uint32_t w, uint32_t h)
810 ds_tizen_policy_surface_send_interactive_resize_done(struct ds_tizen_policy_surface *policy_surface,
811 int32_t x, int32_t y, uint32_t w, uint32_t h)
817 tizen_policy_visibility_get_type(enum ds_tizen_policy_visibility_type type)
822 case DS_TIZEN_POLICY_VISIBILITY_TYPE_UNOBSCURED:
823 vis_type = TIZEN_VISIBILITY_VISIBILITY_UNOBSCURED;
825 case DS_TIZEN_POLICY_VISIBILITY_TYPE_PARTIALLY_OBSCURED:
826 vis_type = TIZEN_VISIBILITY_VISIBILITY_PARTIALLY_OBSCURED;
828 case DS_TIZEN_POLICY_VISIBILITY_TYPE_FULLY_OBSCURED:
829 vis_type = TIZEN_VISIBILITY_VISIBILITY_FULLY_OBSCURED;
831 case DS_TIZEN_POLICY_VISIBILITY_TYPE_PRE_UNOBSCURED:
832 vis_type = TIZEN_VISIBILITY_VISIBILITY_PRE_UNOBSCURED;
835 ds_err("Not supported visible type (%d)", type);
836 vis_type = DS_TIZEN_POLICY_VISIBILITY_TYPE_UNKNOWN;
844 ds_tizen_policy_visibility_send_notify(
845 struct ds_tizen_policy_visibility *visibility,
846 enum ds_tizen_policy_visibility_type type)
850 vis_type = tizen_policy_visibility_get_type(type);
851 if (vis_type == DS_TIZEN_POLICY_VISIBILITY_TYPE_UNKNOWN)
854 tizen_visibility_send_notify(visibility->resource, vis_type);
858 ds_tizen_policy_visibility_send_changed(
859 struct ds_tizen_policy_visibility *visibility,
860 enum ds_tizen_policy_visibility_type type, uint32_t option)
864 vis_type = tizen_policy_visibility_get_type(type);
865 if (vis_type == DS_TIZEN_POLICY_VISIBILITY_TYPE_UNKNOWN)
868 tizen_visibility_send_changed(visibility->resource, vis_type, option);
872 ds_tizen_policy_position_send_changed(
873 struct ds_tizen_policy_position *position, int32_t x, int32_t y)
875 tizen_position_send_changed(position->resource, x, y);
878 WL_EXPORT struct ds_surface *
879 ds_tizen_policy_surface_get_surface(struct ds_tizen_policy_surface *policy_surface)
881 return policy_surface->surface;
885 ds_tizen_policy_surface_get_conformant(struct ds_tizen_policy_surface *policy_surface)
887 return policy_surface->conformant;
891 ds_tizen_policy_surface_get_opaque_state(struct ds_tizen_policy_surface *policy_surface)
893 return policy_surface->opaque_state;
897 ds_tizen_policy_surface_get_iconified(struct ds_tizen_policy_surface *policy_surface)
899 return policy_surface->iconified;
903 ds_tizen_policy_surface_get_floating_mode(struct ds_tizen_policy_surface *policy_surface)
905 return policy_surface->floating_mode;
908 WL_EXPORT enum ds_tizen_policy_stack_mode
909 ds_tizen_policy_surface_get_stack_mode(struct ds_tizen_policy_surface *policy_surface)
911 return policy_surface->stack_mode;
914 static struct ds_tizen_policy_surface *
915 tizen_policy_client_find_policy_surface(struct ds_tizen_policy_client *client,
916 struct ds_surface *surface)
918 struct ds_tizen_policy_surface *policy_surface;
920 wl_list_for_each(policy_surface, &client->policy_surfaces, link) {
921 if (surface == policy_surface->surface)
922 return policy_surface;
928 static struct ds_tizen_policy_surface *
929 tizen_policy_client_get_surface(struct wl_resource *resource,
930 struct wl_resource *surface_resource)
932 struct ds_tizen_policy_client *client;
933 struct ds_tizen_policy_surface *policy_surface;
934 struct ds_surface *surface;
936 client = wl_resource_get_user_data(resource);
937 surface = ds_surface_from_resource(surface_resource);
939 policy_surface = tizen_policy_client_find_policy_surface(client, surface);
941 return policy_surface;
943 policy_surface = calloc(1, sizeof *policy_surface);
944 if (policy_surface == NULL) {
945 ds_err("calloc() failed. tizen_policy");
949 policy_surface->client = client;
950 policy_surface->surface = surface;
951 wl_client_get_credentials(client->wl_client, &policy_surface->pid, &policy_surface->uid, NULL);
953 wl_list_init(&policy_surface->visibilities);
954 wl_list_init(&policy_surface->positions);
955 wl_list_init(&policy_surface->subsurface_watchers);
957 wl_signal_init(&policy_surface->events.destroy);
958 wl_signal_init(&policy_surface->events.new_visibility);
959 wl_signal_init(&policy_surface->events.new_position);
960 wl_signal_init(&policy_surface->events.activate);
961 wl_signal_init(&policy_surface->events.raise);
962 wl_signal_init(&policy_surface->events.lower);
963 wl_signal_init(&policy_surface->events.set_focus_skip);
964 wl_signal_init(&policy_surface->events.unset_focus_skip);
965 wl_signal_init(&policy_surface->events.set_role);
966 wl_signal_init(&policy_surface->events.set_window_type);
967 wl_signal_init(&policy_surface->events.set_conformant);
968 wl_signal_init(&policy_surface->events.unset_conformant);
969 wl_signal_init(&policy_surface->events.get_conformant);
970 wl_signal_init(&policy_surface->events.set_notification_level);
971 wl_signal_init(&policy_surface->events.set_window_screen_mode);
972 wl_signal_init(&policy_surface->events.get_subsurface);
973 wl_signal_init(&policy_surface->events.iconify);
974 wl_signal_init(&policy_surface->events.uniconify);
975 wl_signal_init(&policy_surface->events.add_aux_hint);
976 wl_signal_init(&policy_surface->events.change_aux_hint);
977 wl_signal_init(&policy_surface->events.delete_aux_hint);
978 wl_signal_init(&policy_surface->events.get_supported_aux_hints);
979 wl_signal_init(&policy_surface->events.set_floating_mode);
980 wl_signal_init(&policy_surface->events.unset_floating_mode);
981 wl_signal_init(&policy_surface->events.set_stack_mode);
982 wl_signal_init(&policy_surface->events.new_subsurface_watcher);
983 wl_signal_init(&policy_surface->events.set_parent);
984 wl_signal_init(&policy_surface->events.ack_conformant_region);
985 wl_signal_init(&policy_surface->events.set_video);
986 wl_signal_init(&policy_surface->events.show);
987 wl_signal_init(&policy_surface->events.hide);
988 wl_signal_init(&policy_surface->events.set_parent_with_below);
990 wl_list_insert(&client->policy_surfaces, &policy_surface->link);
992 struct ds_tizen_policy_event_new_surface event = {
993 .policy = client->policy,
994 .policy_surface = policy_surface,
996 wl_signal_emit_mutable(&client->policy->events.new_surface, &event);
998 return policy_surface;
1002 policy_handle_display_destroy(struct wl_listener *listener, void *data)
1004 struct ds_tizen_policy *policy;
1006 policy = wl_container_of(listener, policy, destroy);
1008 ds_inf("Global destroy: policy(%p)", policy);
1010 wl_signal_emit_mutable(&policy->events.destroy, policy);
1012 if (policy->use_security)
1013 tizen_security_finish();
1015 wl_list_remove(&policy->destroy.link);
1016 wl_global_destroy(policy->global);
1021 visibility_handle_destroy(struct wl_client *wl_client,
1022 struct wl_resource *resource)
1024 wl_resource_destroy(resource);
1027 static const struct tizen_visibility_interface visibility_impl =
1029 visibility_handle_destroy,
1033 _tizen_policy_visibility_handle_destroy(struct wl_resource *resource)
1035 struct ds_tizen_policy_visibility *visibility;
1037 visibility = wl_resource_get_user_data(resource);
1039 ds_inf("_tizen_policy_visibility_handle_destroy (visibility:%p)",
1042 wl_signal_emit_mutable(&visibility->events.destroy, visibility);
1043 wl_list_remove(&visibility->link);
1048 policy_handle_get_visibility(struct wl_client *wl_client, struct wl_resource *resource,
1049 uint32_t id, struct wl_resource *surface_resource)
1051 struct ds_tizen_policy_surface *policy_surface;
1052 struct ds_tizen_policy_visibility *visibility;
1054 policy_surface = tizen_policy_client_get_surface(resource, surface_resource);
1055 if (policy_surface == NULL) {
1056 ds_err("tizen_policy_client_get_surface() failed.");
1057 wl_client_post_no_memory(wl_client);
1061 visibility = calloc(1, sizeof *visibility);
1062 if (visibility == NULL) {
1063 ds_err("calloc() failed. tizen_policy");
1067 visibility->policy_surface = policy_surface;
1068 wl_signal_init(&visibility->events.destroy);
1070 wl_list_insert(&policy_surface->visibilities, &visibility->link);
1072 visibility->resource = wl_resource_create(wl_client,
1073 &tizen_visibility_interface, wl_resource_get_version(resource),
1075 if (visibility->resource == NULL) {
1076 ds_err("tizen_policy : wl_resource_create() failed.");
1077 wl_list_remove(&visibility->link);
1079 wl_client_post_no_memory(wl_client);
1083 wl_resource_set_implementation(visibility->resource,
1084 &visibility_impl, visibility,
1085 _tizen_policy_visibility_handle_destroy);
1087 struct ds_tizen_policy_surface_event_new_visibility event = {
1088 .policy_surface = policy_surface,
1089 .visibility = visibility,
1091 wl_signal_emit_mutable(&policy_surface->events.new_visibility, &event);
1095 position_handle_destroy(struct wl_client *wl_client, struct wl_resource *resource)
1097 wl_resource_destroy(resource);
1101 position_handle_set(struct wl_client *wl_client, struct wl_resource *resource,
1102 int32_t x, int32_t y)
1104 struct ds_tizen_policy_position *position;
1106 position = wl_resource_get_user_data(resource);
1108 struct ds_tizen_policy_event_position_set event = {
1109 .position = position,
1113 wl_signal_emit_mutable(&position->events.set, &event);
1116 static const struct tizen_position_interface position_impl =
1118 position_handle_destroy,
1119 position_handle_set,
1123 _tizen_policy_position_handle_destroy(struct wl_resource *resource)
1125 struct ds_tizen_policy_position *position;
1127 position = wl_resource_get_user_data(resource);
1129 ds_inf("_tizen_policy_position_handle_destroy (position:%p)",
1132 wl_signal_emit_mutable(&position->events.destroy, position);
1133 wl_list_remove(&position->link);
1138 policy_handle_get_position(struct wl_client *wl_client, struct wl_resource *resource,
1139 uint32_t id, struct wl_resource *surface_resource)
1141 struct ds_tizen_policy_surface *policy_surface;
1142 struct ds_tizen_policy_position *position;
1144 policy_surface = tizen_policy_client_get_surface(resource, surface_resource);
1145 if (policy_surface == NULL) {
1146 ds_err("tizen_policy_client_get_surface() failed.");
1147 wl_client_post_no_memory(wl_client);
1151 position = calloc(1, sizeof *position);
1152 if (position == NULL) {
1153 ds_err("calloc() failed. tizen_policy");
1157 position->policy_surface = policy_surface;
1158 wl_signal_init(&position->events.destroy);
1159 wl_signal_init(&position->events.set);
1161 wl_list_insert(&policy_surface->positions, &position->link);
1163 position->resource = wl_resource_create(wl_client,
1164 &tizen_position_interface, wl_resource_get_version(resource),
1166 if (position->resource == NULL) {
1167 ds_err("tizen_policy : wl_resource_create() failed.");
1168 wl_list_remove(&position->link);
1170 wl_client_post_no_memory(wl_client);
1174 wl_resource_set_implementation(position->resource,
1175 &position_impl, position,
1176 _tizen_policy_position_handle_destroy);
1178 struct ds_tizen_policy_surface_event_new_position event = {
1179 .policy_surface = policy_surface,
1180 .position = position,
1182 wl_signal_emit_mutable(&policy_surface->events.new_position, &event);
1186 policy_handle_activate(struct wl_client *wl_client,
1187 struct wl_resource *resource, struct wl_resource *surface_resource)
1189 struct ds_tizen_policy_surface *policy_surface;
1191 policy_surface = tizen_policy_client_get_surface(resource, surface_resource);
1192 if (policy_surface == NULL) {
1193 ds_err("tizen_policy_client_get_surface() failed.");
1194 wl_client_post_no_memory(wl_client);
1198 struct ds_tizen_policy_surface_event_activate event = {
1199 .policy_surface = policy_surface,
1201 wl_signal_emit_mutable(&policy_surface->events.activate, &event);
1205 policy_handle_activate_below_by_res_id(struct wl_client *wl_client,
1206 struct wl_resource *resource, uint32_t universal_id,
1207 uint32_t below_universal_id)
1209 struct ds_tizen_policy_client *client;
1211 client = wl_resource_get_user_data(resource);
1213 struct ds_tizen_policy_event_activate_below_by_univeral_id event = {
1214 .policy = client->policy,
1215 .universal_id = universal_id,
1216 .below_universal_id = below_universal_id,
1218 wl_signal_emit_mutable(&client->policy->events.activate_below_by_univeral_id, &event);
1222 policy_handle_raise(struct wl_client *wl_client, struct wl_resource *resource,
1223 struct wl_resource *surface_resource)
1225 struct ds_tizen_policy_surface *policy_surface;
1227 policy_surface = tizen_policy_client_get_surface(resource, surface_resource);
1228 if (policy_surface == NULL) {
1229 ds_err("tizen_policy_client_get_surface() failed.");
1230 wl_client_post_no_memory(wl_client);
1234 struct ds_tizen_policy_surface_event_raise event = {
1235 .policy_surface = policy_surface,
1237 wl_signal_emit_mutable(&policy_surface->events.raise, &event);
1241 policy_handle_lower(struct wl_client *wl_client, struct wl_resource *resource,
1242 struct wl_resource *surface_resource)
1244 struct ds_tizen_policy_surface *policy_surface;
1246 policy_surface = tizen_policy_client_get_surface(resource, surface_resource);
1247 if (policy_surface == NULL) {
1248 ds_err("tizen_policy_client_get_surface() failed.");
1249 wl_client_post_no_memory(wl_client);
1253 struct ds_tizen_policy_surface_event_lower event = {
1254 .policy_surface = policy_surface,
1256 wl_signal_emit_mutable(&policy_surface->events.lower, &event);
1260 policy_handle_lower_by_res_id(struct wl_client *wl_client,
1261 struct wl_resource *resource, uint32_t universal_id)
1263 struct ds_tizen_policy_client *client;
1265 client = wl_resource_get_user_data(resource);
1267 struct ds_tizen_policy_event_lower_by_universal_id event = {
1268 .policy = client->policy,
1269 .universal_id = universal_id,
1271 wl_signal_emit_mutable(&client->policy->events.lower_by_universal_id, &event);
1275 policy_handle_set_focus_skip(struct wl_client *wl_client,
1276 struct wl_resource *resource, struct wl_resource *surface_resource)
1278 struct ds_tizen_policy_surface *policy_surface;
1280 policy_surface = tizen_policy_client_get_surface(resource, surface_resource);
1281 if (policy_surface == NULL) {
1282 ds_err("tizen_policy_client_get_surface() failed.");
1283 wl_client_post_no_memory(wl_client);
1287 struct ds_tizen_policy_surface_event_set_focus_skip event = {
1288 .policy_surface = policy_surface,
1290 wl_signal_emit_mutable(&policy_surface->events.set_focus_skip, &event);
1294 policy_handle_unset_focus_skip(struct wl_client *wl_client,
1295 struct wl_resource *resource, struct wl_resource *surface_resource)
1297 struct ds_tizen_policy_surface *policy_surface;
1299 policy_surface = tizen_policy_client_get_surface(resource, surface_resource);
1300 if (policy_surface == NULL) {
1301 ds_err("tizen_policy_client_get_surface() failed.");
1302 wl_client_post_no_memory(wl_client);
1306 struct ds_tizen_policy_surface_event_unset_focus_skip event = {
1307 .policy_surface = policy_surface,
1309 wl_signal_emit_mutable(&policy_surface->events.unset_focus_skip, &event);
1313 policy_handle_set_role(struct wl_client *wl_client, struct wl_resource *resource,
1314 struct wl_resource *surface_resource, const char *role)
1316 struct ds_tizen_policy_surface *policy_surface;
1318 policy_surface = tizen_policy_client_get_surface(resource, surface_resource);
1319 if (policy_surface == NULL) {
1320 ds_err("tizen_policy_client_get_surface() failed.");
1321 wl_client_post_no_memory(wl_client);
1325 struct ds_tizen_policy_surface_event_set_role event = {
1326 .policy_surface = policy_surface,
1329 wl_signal_emit_mutable(&policy_surface->events.set_role, &event);
1333 policy_handle_set_type(struct wl_client *wl_client, struct wl_resource *resource,
1334 struct wl_resource *surface_resource, uint32_t type)
1336 struct ds_tizen_policy_surface *policy_surface;
1337 enum ds_tizen_policy_window_type win_type;
1339 policy_surface = tizen_policy_client_get_surface(resource, surface_resource);
1340 if (policy_surface == NULL) {
1341 ds_err("tizen_policy_client_get_surface() failed.");
1342 wl_client_post_no_memory(wl_client);
1347 case TIZEN_POLICY_WIN_TYPE_NONE:
1348 win_type = DS_TIZEN_POLICY_WINDOW_TYPE_NONE;
1350 case TIZEN_POLICY_WIN_TYPE_TOPLEVEL:
1351 win_type = DS_TIZEN_POLICY_WINDOW_TYPE_TOPLEVEL;
1353 case TIZEN_POLICY_WIN_TYPE_FULLSCREEN:
1354 win_type = DS_TIZEN_POLICY_WINDOW_TYPE_FULLLSCREEN;
1356 case TIZEN_POLICY_WIN_TYPE_MAXIMIZED:
1357 win_type = DS_TIZEN_POLICY_WINDOW_TYPE_MAXIMIZED;
1359 case TIZEN_POLICY_WIN_TYPE_TRANSIENT:
1360 win_type = DS_TIZEN_POLICY_WINDOW_TYPE_TRANSIENT;
1362 case TIZEN_POLICY_WIN_TYPE_MENU:
1363 win_type = DS_TIZEN_POLICY_WINDOW_TYPE_MENU;
1365 case TIZEN_POLICY_WIN_TYPE_DND:
1366 win_type = DS_TIZEN_POLICY_WINDOW_TYPE_DND;
1368 case TIZEN_POLICY_WIN_TYPE_CUSTOM:
1369 win_type = DS_TIZEN_POLICY_WINDOW_TYPE_CUSTOM;
1371 case TIZEN_POLICY_WIN_TYPE_NOTIFICATION:
1372 win_type = DS_TIZEN_POLICY_WINDOW_TYPE_NOTIFICATION;
1374 case TIZEN_POLICY_WIN_TYPE_UTILITY:
1375 win_type = DS_TIZEN_POLICY_WINDOW_TYPE_UTILITY;
1377 case TIZEN_POLICY_WIN_TYPE_DIALOG:
1378 win_type = DS_TIZEN_POLICY_WINDOW_TYPE_DIALOG;
1380 case TIZEN_POLICY_WIN_TYPE_DOCK:
1381 win_type = DS_TIZEN_POLICY_WINDOW_TYPE_DOCK;
1383 case TIZEN_POLICY_WIN_TYPE_SPLASH:
1384 win_type = DS_TIZEN_POLICY_WINDOW_TYPE_SPLASH;
1386 case TIZEN_POLICY_WIN_TYPE_DESKTOP:
1387 win_type = DS_TIZEN_POLICY_WINDOW_TYPE_DESKTOP;
1390 win_type = DS_TIZEN_POLICY_WINDOW_TYPE_NONE;
1394 struct ds_tizen_policy_surface_event_set_window_type event = {
1395 .policy_surface = policy_surface,
1396 .win_type = win_type,
1398 wl_signal_emit_mutable(&policy_surface->events.set_window_type, &event);
1402 policy_handle_set_conformant(struct wl_client *wl_client,
1403 struct wl_resource *resource, struct wl_resource *surface_resource)
1405 struct ds_tizen_policy_surface *policy_surface;
1407 policy_surface = tizen_policy_client_get_surface(resource, surface_resource);
1408 if (policy_surface == NULL) {
1409 ds_err("tizen_policy_client_get_surface() failed.");
1410 wl_client_post_no_memory(wl_client);
1414 if (!policy_surface->conformant)
1415 policy_surface->conformant = true;
1417 struct ds_tizen_policy_surface_event_set_conformant event = {
1418 .policy_surface = policy_surface,
1420 wl_signal_emit_mutable(&policy_surface->events.set_conformant, &event);
1424 policy_handle_unset_conformant(struct wl_client *wl_client,
1425 struct wl_resource *resource, struct wl_resource *surface_resource)
1427 struct ds_tizen_policy_surface *policy_surface;
1429 policy_surface = tizen_policy_client_get_surface(resource, surface_resource);
1430 if (policy_surface == NULL) {
1431 ds_err("tizen_policy_client_get_surface() failed.");
1432 wl_client_post_no_memory(wl_client);
1436 if (policy_surface->conformant)
1437 policy_surface->conformant = false;
1439 struct ds_tizen_policy_surface_event_unset_conformant event = {
1440 .policy_surface = policy_surface,
1442 wl_signal_emit_mutable(&policy_surface->events.unset_conformant, &event);
1446 policy_handle_get_conformant(struct wl_client *wl_client,
1447 struct wl_resource *resource, struct wl_resource *surface_resource)
1449 struct ds_tizen_policy_surface *policy_surface;
1451 policy_surface = tizen_policy_client_get_surface(resource, surface_resource);
1452 if (policy_surface == NULL) {
1453 ds_err("tizen_policy_client_get_surface() failed.");
1454 wl_client_post_no_memory(wl_client);
1458 struct ds_tizen_policy_surface_event_get_conformant event = {
1459 .policy_surface = policy_surface,
1461 wl_signal_emit_mutable(&policy_surface->events.get_conformant, &event);
1465 policy_handle_set_notification_level(struct wl_client *wl_client,
1466 struct wl_resource *resource, struct wl_resource *surface_resource,
1469 struct ds_tizen_policy_surface *policy_surface;
1470 enum ds_tizen_policy_notification_level noti_level;
1473 policy_surface = tizen_policy_client_get_surface(resource, surface_resource);
1474 if (policy_surface == NULL) {
1475 ds_err("tizen_policy_client_get_surface() failed.");
1476 wl_client_post_no_memory(wl_client);
1480 ret = tizen_security_check_privilege(policy_surface->pid, policy_surface->uid,
1481 TIZEN_POLICY_PRIVILEGE_SET_NOTIFICATION_LEVEL);
1483 ds_err("tizen_security_check_privilege() failed. "
1484 "Privilege Denied on set_notification_level.");
1486 tizen_policy_send_notification_done(resource, surface_resource,
1487 -1, TIZEN_POLICY_ERROR_STATE_PERMISSION_DENIED);
1493 case TIZEN_POLICY_LEVEL_1:
1494 noti_level = DS_TIZEN_POLICY_NOTIFICATION_LEVEL_1;
1496 case TIZEN_POLICY_LEVEL_2:
1497 noti_level = DS_TIZEN_POLICY_NOTIFICATION_LEVEL_2;
1499 case TIZEN_POLICY_LEVEL_3:
1500 noti_level = DS_TIZEN_POLICY_NOTIFICATION_LEVEL_3;
1502 case TIZEN_POLICY_LEVEL_NONE:
1503 noti_level = DS_TIZEN_POLICY_NOTIFICATION_LEVEL_NONE;
1505 case TIZEN_POLICY_LEVEL_DEFAULT:
1506 noti_level = DS_TIZEN_POLICY_NOTIFICATION_LEVEL_DEFAULT;
1508 case TIZEN_POLICY_LEVEL_MEDIUM:
1509 noti_level = DS_TIZEN_POLICY_NOTIFICATION_LEVEL_MEDIUM;
1511 case TIZEN_POLICY_LEVEL_HIGH:
1512 noti_level = DS_TIZEN_POLICY_NOTIFICATION_LEVEL_HIGH;
1514 case TIZEN_POLICY_LEVEL_TOP:
1515 noti_level = DS_TIZEN_POLICY_NOTIFICATION_LEVEL_TOP;
1518 noti_level = DS_TIZEN_POLICY_NOTIFICATION_LEVEL_NONE;
1522 struct ds_tizen_policy_surface_event_set_notification_level event = {
1523 .policy_surface = policy_surface,
1524 .level = noti_level,
1526 wl_signal_emit_mutable(&policy_surface->events.set_notification_level, &event);
1530 policy_handle_set_transient_for(struct wl_client *wl_client,
1531 struct wl_resource *resource, uint32_t child_id, uint32_t parent_id)
1533 struct ds_tizen_policy_client *client;
1535 client = wl_resource_get_user_data(resource);
1537 struct ds_tizen_policy_event_set_transient_for event = {
1538 .policy = client->policy,
1539 .child_universal_id = child_id,
1540 .parent_universal_id = parent_id,
1542 wl_signal_emit_mutable(&client->policy->events.set_transient_for, &event);
1544 tizen_policy_send_transient_for_done(resource, child_id);
1548 policy_handle_unset_transient_for(struct wl_client *wl_client,
1549 struct wl_resource *resource, uint32_t child_id)
1551 struct ds_tizen_policy_client *client;
1553 client = wl_resource_get_user_data(resource);
1555 struct ds_tizen_policy_event_unset_transient_for event = {
1556 .policy = client->policy,
1557 .child_universal_id = child_id,
1559 wl_signal_emit_mutable(&client->policy->events.unset_transient_for, &event);
1563 policy_handle_set_window_screen_mode(struct wl_client *wl_client,
1564 struct wl_resource *resource, struct wl_resource *surface_resource,
1567 struct ds_tizen_policy_surface *policy_surface;
1568 enum ds_tizen_policy_window_screen_mode screen_mode;
1571 policy_surface = tizen_policy_client_get_surface(resource, surface_resource);
1572 if (policy_surface == NULL) {
1573 ds_err("tizen_policy_client_get_surface() failed.");
1574 wl_client_post_no_memory(wl_client);
1578 ret = tizen_security_check_privilege(policy_surface->pid, policy_surface->uid,
1579 TIZEN_POLICY_PRIVILEGE_SET_SCREEN_MODE);
1581 ds_err("tizen_security_check_privilege() failed. "
1582 "Privilege Denied on set_window_screen_mode.");
1584 tizen_policy_send_notification_done(resource, surface_resource,
1585 -1, TIZEN_POLICY_ERROR_STATE_PERMISSION_DENIED);
1591 case TIZEN_POLICY_MODE_DEFAULT:
1592 screen_mode = DS_TIZEN_POLICY_WINDOW_SCREEN_MODE_DEFAULT;
1594 case TIZEN_POLICY_MODE_ALWAYS_ON:
1595 screen_mode = DS_TIZEN_POLICY_WINDOW_SCREEN_MODE_ALWAYS_ON;
1598 screen_mode = DS_TIZEN_POLICY_WINDOW_SCREEN_MODE_DEFAULT;
1602 struct ds_tizen_policy_surface_event_set_window_screen_mode event = {
1603 .policy_surface = policy_surface,
1604 .mode = screen_mode,
1606 wl_signal_emit_mutable(&policy_surface->events.set_window_screen_mode, &event);
1610 policy_handle_place_subsurface_below_parent(struct wl_client *wl_client,
1611 struct wl_resource *resource, struct wl_resource *subsurface_resource)
1613 struct ds_tizen_policy_client *client;
1614 struct ds_subsurface *subsurface;
1616 client = wl_resource_get_user_data(resource);
1617 subsurface = ds_subsurface_from_resource(subsurface_resource);
1619 struct ds_tizen_policy_event_place_subsurface_below_parent event = {
1620 .policy = client->policy,
1621 .subsurface = subsurface,
1623 wl_signal_emit_mutable(
1624 &client->policy->events.place_subsurface_below_parent,
1629 policy_handle_set_subsurface_stand_alone(struct wl_client *wl_client,
1630 struct wl_resource *resource, struct wl_resource *subsurface_resource)
1632 struct ds_tizen_policy_client *client;
1633 struct ds_subsurface *subsurface;
1635 client = wl_resource_get_user_data(resource);
1636 subsurface = ds_subsurface_from_resource(subsurface_resource);
1638 struct ds_tizen_policy_event_set_subsurface_stand_alone event = {
1639 .policy = client->policy,
1640 .subsurface = subsurface,
1642 wl_signal_emit_mutable(
1643 &client->policy->events.set_subsurface_stand_alone,
1648 policy_handle_get_subsurface(struct wl_client *wl_client,
1649 struct wl_resource *resource, uint32_t id,
1650 struct wl_resource *surface_resource, uint32_t parent_id)
1652 struct ds_tizen_policy_surface *policy_surface;
1654 policy_surface = tizen_policy_client_get_surface(resource, surface_resource);
1655 if (policy_surface == NULL) {
1656 ds_err("tizen_policy_client_get_surface() failed.");
1657 wl_client_post_no_memory(wl_client);
1661 // TODO: How to create the ds_subsurface with a parent_universal_id.
1663 struct ds_tizen_policy_surface_event_get_subsurface event = {
1664 .policy_surface = policy_surface,
1665 .parent_universal_id = parent_id,
1667 wl_signal_emit_mutable(&policy_surface->events.get_subsurface, &event);
1671 policy_handle_set_opaque_state(struct wl_client *wl_client,
1672 struct wl_resource *resource, struct wl_resource *surface_resource,
1675 struct ds_tizen_policy_surface *policy_surface;
1677 policy_surface = tizen_policy_client_get_surface(resource, surface_resource);
1678 if (policy_surface == NULL) {
1679 ds_err("tizen_policy_client_get_surface() failed.");
1680 wl_client_post_no_memory(wl_client);
1684 if (policy_surface->opaque_state != state)
1685 policy_surface->opaque_state = state;
1689 policy_handle_iconify(struct wl_client *wl_client, struct wl_resource *resource,
1690 struct wl_resource *surface_resource)
1692 struct ds_tizen_policy_surface *policy_surface;
1694 policy_surface = tizen_policy_client_get_surface(resource, surface_resource);
1695 if (policy_surface == NULL) {
1696 ds_err("tizen_policy_client_get_surface() failed.");
1697 wl_client_post_no_memory(wl_client);
1701 if (!policy_surface->iconified)
1702 policy_surface->iconified = true;
1704 struct ds_tizen_policy_surface_event_iconify event = {
1705 .policy_surface = policy_surface,
1707 wl_signal_emit_mutable(&policy_surface->events.iconify, &event);
1711 policy_handle_uniconify(struct wl_client *wl_client, struct wl_resource *resource,
1712 struct wl_resource *surface_resource)
1714 struct ds_tizen_policy_surface *policy_surface;
1716 policy_surface = tizen_policy_client_get_surface(resource, surface_resource);
1717 if (policy_surface == NULL) {
1718 ds_err("tizen_policy_client_get_surface() failed.");
1719 wl_client_post_no_memory(wl_client);
1723 if (policy_surface->iconified)
1724 policy_surface->iconified = false;
1726 struct ds_tizen_policy_surface_event_uniconify event = {
1727 .policy_surface = policy_surface,
1729 wl_signal_emit_mutable(&policy_surface->events.uniconify, &event);
1733 policy_handle_add_aux_hint(struct wl_client *wl_client,
1734 struct wl_resource *resource, struct wl_resource *surface_resource,
1735 int32_t id, const char *name, const char *value)
1737 struct ds_tizen_policy_surface *policy_surface;
1739 policy_surface = tizen_policy_client_get_surface(resource, surface_resource);
1740 if (policy_surface == NULL) {
1741 ds_err("tizen_policy_client_get_surface() failed.");
1742 wl_client_post_no_memory(wl_client);
1746 struct ds_tizen_policy_surface_event_add_aux_hint event = {
1747 .policy_surface = policy_surface,
1752 wl_signal_emit_mutable(&policy_surface->events.add_aux_hint, &event);
1756 policy_handle_change_aux_hint(struct wl_client *wl_client,
1757 struct wl_resource *resource, struct wl_resource *surface_resource,
1758 int32_t id, const char *value)
1760 struct ds_tizen_policy_surface *policy_surface;
1762 policy_surface = tizen_policy_client_get_surface(resource, surface_resource);
1763 if (policy_surface == NULL) {
1764 ds_err("tizen_policy_client_get_surface() failed.");
1765 wl_client_post_no_memory(wl_client);
1769 struct ds_tizen_policy_surface_event_change_aux_hint event = {
1770 .policy_surface = policy_surface,
1774 wl_signal_emit_mutable(&policy_surface->events.change_aux_hint, &event);
1778 policy_handle_delete_aux_hint(struct wl_client *wl_client,
1779 struct wl_resource *resource, struct wl_resource *surface_resource,
1782 struct ds_tizen_policy_surface *policy_surface;
1784 policy_surface = tizen_policy_client_get_surface(resource, surface_resource);
1785 if (policy_surface == NULL) {
1786 ds_err("tizen_policy_client_get_surface() failed.");
1787 wl_client_post_no_memory(wl_client);
1791 struct ds_tizen_policy_surface_event_delete_aux_hint event = {
1792 .policy_surface = policy_surface,
1795 wl_signal_emit_mutable(&policy_surface->events.delete_aux_hint, &event);
1799 policy_handle_get_supported_aux_hints(struct wl_client *wl_client,
1800 struct wl_resource *resource, struct wl_resource *surface_resource)
1802 struct ds_tizen_policy_surface *policy_surface;
1804 policy_surface = tizen_policy_client_get_surface(resource, surface_resource);
1805 if (policy_surface == NULL) {
1806 ds_err("tizen_policy_client_get_surface() failed.");
1807 wl_client_post_no_memory(wl_client);
1811 struct ds_tizen_policy_surface_event_get_supported_aux_hints event = {
1812 .policy_surface = policy_surface,
1814 wl_signal_emit_mutable(&policy_surface->events.get_supported_aux_hints, &event);
1818 policy_handle_set_background_state(struct wl_client *wl_client,
1819 struct wl_resource *resource, uint32_t pid)
1821 struct ds_tizen_policy_client *client;
1822 struct ds_tizen_policy *policy;
1824 client = wl_resource_get_user_data(resource);
1825 policy = client->policy;
1827 wl_list_for_each(client, &policy->clients, link) {
1828 if (pid == (uint32_t)client->pid) {
1829 struct ds_tizen_policy_event_set_background_state event = {
1830 .policy = client->policy,
1833 wl_signal_emit_mutable(&client->policy->events.set_background_state, &event);
1839 policy_handle_unset_background_state(struct wl_client *wl_client,
1840 struct wl_resource *resource, uint32_t pid)
1842 struct ds_tizen_policy_client *client;
1843 struct ds_tizen_policy *policy;
1845 client = wl_resource_get_user_data(resource);
1846 policy = client->policy;
1848 wl_list_for_each(client, &policy->clients, link) {
1849 if (pid == (uint32_t)client->pid) {
1850 struct ds_tizen_policy_event_unset_background_state event = {
1851 .policy = client->policy,
1854 wl_signal_emit_mutable(&client->policy->events.unset_background_state, &event);
1860 policy_handle_set_floating_mode(struct wl_client *wl_client,
1861 struct wl_resource *resource, struct wl_resource *surface_resource)
1863 struct ds_tizen_policy_surface *policy_surface;
1865 policy_surface = tizen_policy_client_get_surface(resource, surface_resource);
1866 if (policy_surface == NULL) {
1867 ds_err("tizen_policy_client_get_surface() failed.");
1868 wl_client_post_no_memory(wl_client);
1872 if (policy_surface->floating_mode == false)
1875 policy_surface->floating_mode = false;
1877 struct ds_tizen_policy_surface_event_set_floating_mode event = {
1878 .policy_surface = policy_surface,
1880 wl_signal_emit_mutable(&policy_surface->events.set_floating_mode, &event);
1884 policy_handle_unset_floating_mode(struct wl_client *wl_client,
1885 struct wl_resource *resource, struct wl_resource *surface_resource)
1887 struct ds_tizen_policy_surface *policy_surface;
1889 policy_surface = tizen_policy_client_get_surface(resource, surface_resource);
1890 if (policy_surface == NULL) {
1891 ds_err("tizen_policy_client_get_surface() failed.");
1892 wl_client_post_no_memory(wl_client);
1896 if (policy_surface->floating_mode == false)
1899 policy_surface->floating_mode = false;
1901 struct ds_tizen_policy_surface_event_unset_floating_mode event = {
1902 .policy_surface = policy_surface,
1904 wl_signal_emit_mutable(&policy_surface->events.unset_floating_mode, &event);
1908 policy_handle_set_stack_mode(struct wl_client *wl_client,
1909 struct wl_resource *resource, struct wl_resource *surface_resource,
1912 struct ds_tizen_policy_surface *policy_surface;
1913 enum ds_tizen_policy_stack_mode stack_mode;
1915 policy_surface = tizen_policy_client_get_surface(resource, surface_resource);
1916 if (policy_surface == NULL) {
1917 ds_err("tizen_policy_client_get_surface() failed.");
1918 wl_client_post_no_memory(wl_client);
1923 case TIZEN_POLICY_STACK_MODE_ABOVE:
1924 stack_mode = DS_TIZEN_POLICY_STACK_MODE_ABOVE;
1926 case TIZEN_POLICY_STACK_MODE_BELOW:
1927 stack_mode = DS_TIZEN_POLICY_STACK_MODE_BELOW;
1930 stack_mode = DS_TIZEN_POLICY_STACK_MODE_NONE;
1934 if (policy_surface->stack_mode == stack_mode)
1937 policy_surface->stack_mode = stack_mode;
1939 struct ds_tizen_policy_surface_event_set_stack_mode event = {
1940 .policy_surface = policy_surface,
1943 wl_signal_emit_mutable(&policy_surface->events.set_stack_mode, &event);
1947 policy_handle_activate_above_by_res_id(struct wl_client *wl_client,
1948 struct wl_resource *resource, uint32_t universal_id,
1949 uint32_t above_universal_id)
1951 struct ds_tizen_policy_client *client;
1953 client = wl_resource_get_user_data(resource);
1955 struct ds_tizen_policy_event_activate_above_by_universal_id event = {
1956 .policy = client->policy,
1957 .universal_id = universal_id,
1958 .above_universal_id = above_universal_id,
1960 wl_signal_emit_mutable(&client->policy->events.activate_above_by_universal_id, &event);
1964 subsurface_watcher_handle_destroy(struct wl_client *wl_client,
1965 struct wl_resource *resource)
1967 wl_resource_destroy(resource);
1970 static const struct tizen_subsurface_watcher_interface subsurface_watcher_impl =
1972 subsurface_watcher_handle_destroy,
1976 _tizen_policy_subsurface_watcher_handle_destroy(struct wl_resource *resource)
1978 struct ds_tizen_policy_subsurface_watcher *subsurface_watcher;
1980 subsurface_watcher = wl_resource_get_user_data(resource);
1982 ds_inf("_tizen_policy_subsurface_watcher_handle_destroy (subsurface_watcher:%p)",
1983 subsurface_watcher);
1985 wl_signal_emit_mutable(&subsurface_watcher->events.destroy, subsurface_watcher);
1986 free(subsurface_watcher);
1990 policy_handle_get_subsurface_watcher(struct wl_client *wl_client,
1991 struct wl_resource *resource, uint32_t id,
1992 struct wl_resource *surface_resource)
1994 struct ds_tizen_policy_surface *policy_surface;
1995 struct ds_tizen_policy_subsurface_watcher *subsurface_watcher;
1997 policy_surface = tizen_policy_client_get_surface(resource, surface_resource);
1998 if (policy_surface == NULL) {
1999 ds_err("tizen_policy_client_get_surface() failed.");
2000 wl_client_post_no_memory(wl_client);
2004 subsurface_watcher = calloc(1, sizeof *subsurface_watcher);
2005 if (!subsurface_watcher) {
2006 ds_err("calloc() failed. tizen_policy");
2010 subsurface_watcher->policy_surface = policy_surface;
2011 wl_signal_init(&subsurface_watcher->events.destroy);
2013 wl_list_insert(&policy_surface->subsurface_watchers, &subsurface_watcher->link);
2015 subsurface_watcher->resource = wl_resource_create(wl_client,
2016 &tizen_subsurface_watcher_interface, wl_resource_get_version(resource),
2018 if (subsurface_watcher->resource == NULL) {
2019 ds_err("tizen_policy : wl_resource_create() failed.");
2020 free(subsurface_watcher);
2021 wl_client_post_no_memory(wl_client);
2025 wl_resource_set_implementation(subsurface_watcher->resource,
2026 &subsurface_watcher_impl, subsurface_watcher,
2027 _tizen_policy_subsurface_watcher_handle_destroy);
2029 struct ds_tizen_policy_surface_event_new_subsurface_watcher event = {
2030 .policy_surface = policy_surface,
2031 .subsurface_watcher = subsurface_watcher,
2033 wl_signal_emit_mutable(&policy_surface->events.new_subsurface_watcher, &event);
2037 policy_handle_set_parent(struct wl_client *wl_client,
2038 struct wl_resource *resource, struct wl_resource *surface_resource,
2039 struct wl_resource *parent_surface_resource)
2041 struct ds_tizen_policy_surface *policy_surface;
2042 struct ds_surface *parent_surface;
2044 policy_surface = tizen_policy_client_get_surface(resource, surface_resource);
2045 if (policy_surface == NULL) {
2046 ds_err("tizen_policy_client_get_surface() failed.");
2047 wl_client_post_no_memory(wl_client);
2051 parent_surface = ds_surface_from_resource(parent_surface_resource);
2053 struct ds_tizen_policy_surface_event_set_parent event = {
2054 .policy_surface = policy_surface,
2055 .parent_surface = parent_surface,
2057 wl_signal_emit_mutable(&policy_surface->events.set_parent, &event);
2061 policy_handle_ack_conformant_region(struct wl_client *wl_client,
2062 struct wl_resource *resource, struct wl_resource *surface_resource,
2065 struct ds_tizen_policy_surface *policy_surface;
2067 policy_surface = tizen_policy_client_get_surface(resource, surface_resource);
2068 if (policy_surface == NULL) {
2069 ds_err("tizen_policy_client_get_surface() failed.");
2070 wl_client_post_no_memory(wl_client);
2074 struct ds_tizen_policy_surface_event_ack_conformant_region event = {
2075 .policy_surface = policy_surface,
2078 wl_signal_emit_mutable(&policy_surface->events.ack_conformant_region, &event);
2082 policy_handle_destroy(struct wl_client *wl_client, struct wl_resource *resource)
2084 struct ds_tizen_policy_client *client;
2086 client = wl_resource_get_user_data(resource);
2088 if (!wl_list_empty(&client->policy_surfaces)) {
2089 ds_err("tizen_policy was destroyed before children");
2093 wl_resource_destroy(resource);
2097 policy_handle_has_video(struct wl_client *wl_client,
2098 struct wl_resource *resource, struct wl_resource *surface_resource,
2101 struct ds_tizen_policy_surface *policy_surface;
2103 policy_surface = tizen_policy_client_get_surface(resource, surface_resource);
2104 if (policy_surface == NULL) {
2105 ds_err("tizen_policy_client_get_surface() failed.");
2106 wl_client_post_no_memory(wl_client);
2110 if (policy_surface->video == has)
2113 policy_surface->video = has;
2115 struct ds_tizen_policy_surface_event_set_video event = {
2116 .policy_surface = policy_surface,
2119 wl_signal_emit_mutable(&policy_surface->events.set_video, &event);
2123 policy_handle_set_appid(struct wl_client *wl_client,
2124 struct wl_resource *resource, int32_t pid, const char *appid)
2126 struct ds_tizen_policy_client *client;
2128 client = wl_resource_get_user_data(resource);
2130 struct ds_tizen_policy_event_set_appid event = {
2131 .policy = client->policy,
2135 wl_signal_emit_mutable(&client->policy->events.set_appid, &event);
2139 policy_handle_show(struct wl_client *wl_client, struct wl_resource *resource,
2140 struct wl_resource *surface_resource)
2142 struct ds_tizen_policy_surface *policy_surface;
2144 policy_surface = tizen_policy_client_get_surface(resource, surface_resource);
2145 if (policy_surface == NULL) {
2146 ds_err("tizen_policy_client_get_surface() failed.");
2147 wl_client_post_no_memory(wl_client);
2151 struct ds_tizen_policy_surface_event_show event = {
2152 .policy_surface = policy_surface,
2154 wl_signal_emit_mutable(&policy_surface->events.show, &event);
2158 policy_handle_hide(struct wl_client *wl_client, struct wl_resource *resource,
2159 struct wl_resource *surface_resource)
2161 struct ds_tizen_policy_surface *policy_surface;
2163 policy_surface = tizen_policy_client_get_surface(resource, surface_resource);
2164 if (policy_surface == NULL) {
2165 ds_err("tizen_policy_client_get_surface() failed.");
2166 wl_client_post_no_memory(wl_client);
2170 struct ds_tizen_policy_surface_event_hide event = {
2171 .policy_surface = policy_surface,
2173 wl_signal_emit_mutable(&policy_surface->events.hide, &event);
2177 policy_handle_set_transient_for_below(struct wl_client *wl_client,
2178 struct wl_resource *resource, uint32_t universal_id,
2179 uint32_t parent_universal_id)
2181 struct ds_tizen_policy_client *client;
2183 client = wl_resource_get_user_data(resource);
2185 struct ds_tizen_policy_event_set_transient_for_below event = {
2186 .policy = client->policy,
2187 .universal_id = universal_id,
2188 .parent_universal_id = parent_universal_id,
2190 wl_signal_emit_mutable(&client->policy->events.set_transient_for_below, &event);
2194 policy_handle_set_parent_with_below(struct wl_client *wl_client,
2195 struct wl_resource *resource, struct wl_resource *surface_resource,
2196 struct wl_resource *parent_surface_resource)
2198 struct ds_tizen_policy_surface *policy_surface;
2199 struct ds_surface *parent_surface;
2201 policy_surface = tizen_policy_client_get_surface(resource, surface_resource);
2202 if (policy_surface == NULL) {
2203 ds_err("tizen_policy_client_get_surface() failed.");
2204 wl_client_post_no_memory(wl_client);
2208 parent_surface = ds_surface_from_resource(parent_surface_resource);
2210 struct ds_tizen_policy_surface_event_set_parent_with_below event = {
2211 .policy_surface = policy_surface,
2212 .parent_surface = parent_surface,
2214 wl_signal_emit_mutable(&policy_surface->events.set_parent_with_below, &event);
2217 static const struct tizen_policy_interface policy_impl =
2219 .get_visibility = policy_handle_get_visibility,
2220 .get_position = policy_handle_get_position,
2221 .activate = policy_handle_activate,
2222 .activate_below_by_res_id = policy_handle_activate_below_by_res_id,
2223 .raise = policy_handle_raise,
2224 .lower = policy_handle_lower,
2225 .lower_by_res_id = policy_handle_lower_by_res_id,
2226 .set_focus_skip = policy_handle_set_focus_skip,
2227 .unset_focus_skip = policy_handle_unset_focus_skip,
2228 .set_role = policy_handle_set_role,
2229 .set_type = policy_handle_set_type,
2230 .set_conformant = policy_handle_set_conformant,
2231 .unset_conformant = policy_handle_unset_conformant,
2232 .get_conformant = policy_handle_get_conformant,
2233 .set_notification_level = policy_handle_set_notification_level,
2234 .set_transient_for = policy_handle_set_transient_for,
2235 .unset_transient_for = policy_handle_unset_transient_for,
2236 .set_window_screen_mode = policy_handle_set_window_screen_mode,
2237 .place_subsurface_below_parent = policy_handle_place_subsurface_below_parent,
2238 .set_subsurface_stand_alone = policy_handle_set_subsurface_stand_alone,
2239 .get_subsurface = policy_handle_get_subsurface,
2240 .set_opaque_state = policy_handle_set_opaque_state,
2241 .iconify = policy_handle_iconify,
2242 .uniconify = policy_handle_uniconify,
2243 .add_aux_hint = policy_handle_add_aux_hint,
2244 .change_aux_hint = policy_handle_change_aux_hint,
2245 .del_aux_hint = policy_handle_delete_aux_hint,
2246 .get_supported_aux_hints = policy_handle_get_supported_aux_hints,
2247 .set_background_state = policy_handle_set_background_state,
2248 .unset_background_state = policy_handle_unset_background_state,
2249 .set_floating_mode = policy_handle_set_floating_mode,
2250 .unset_floating_mode = policy_handle_unset_floating_mode,
2251 .set_stack_mode = policy_handle_set_stack_mode,
2252 .activate_above_by_res_id = policy_handle_activate_above_by_res_id,
2253 .get_subsurface_watcher = policy_handle_get_subsurface_watcher,
2254 .set_parent = policy_handle_set_parent,
2255 .ack_conformant_region = policy_handle_ack_conformant_region,
2256 .destroy = policy_handle_destroy,
2257 .has_video = policy_handle_has_video,
2258 .set_appid = policy_handle_set_appid,
2259 .show = policy_handle_show,
2260 .hide = policy_handle_hide,
2261 .set_transient_for_below = policy_handle_set_transient_for_below,
2262 .set_parent_with_below = policy_handle_set_parent_with_below,
2266 _tizen_policy_client_handle_destroy(struct wl_resource *resource)
2268 struct ds_tizen_policy_client *client;
2269 struct ds_tizen_policy_surface *policy_surface, *tmp;
2271 client = wl_resource_get_user_data(resource);
2273 ds_inf("_tizen_policy_client_handle_destroy (client:%p)", client);
2275 wl_list_for_each_safe(policy_surface, tmp, &client->policy_surfaces, link) {
2276 wl_signal_emit_mutable(&policy_surface->events.destroy, policy_surface);
2277 wl_list_remove(&policy_surface->link);
2278 free(policy_surface);
2281 wl_list_remove(&client->link);
2286 policy_bind(struct wl_client *wl_client, void *data, uint32_t version,
2289 struct ds_tizen_policy *policy = data;
2290 struct ds_tizen_policy_client *client;
2292 client = calloc(1, sizeof *client);
2293 if (client == NULL) {
2294 ds_err("calloc() failed. tizen_policy");
2295 wl_client_post_no_memory(wl_client);
2299 ds_inf("tizen_policy_client binds. (client:%p)", client);
2301 client->policy = policy;
2302 client->wl_client = wl_client;
2303 wl_client_get_credentials(client->wl_client, &client->pid, &client->uid, NULL);
2305 wl_list_init(&client->policy_surfaces);
2307 client->resource = wl_resource_create(wl_client, &tizen_policy_interface,
2308 MIN(version, TIZEN_POLICY_VERSION), id);
2310 if (client->resource == NULL) {
2311 ds_err("tizen_policy : wl_resource_create() failed.");
2313 wl_client_post_no_memory(wl_client);
2317 wl_resource_set_implementation(client->resource, &policy_impl, client,
2318 _tizen_policy_client_handle_destroy);
2320 wl_list_insert(&policy->clients, &client->link);