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 get_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 get_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_get_position_listener(
341 struct ds_tizen_policy_surface *policy_surface,
342 struct wl_listener *listener)
344 wl_signal_add(&policy_surface->events.get_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_get_subsurface_watcher_listener(
525 struct ds_tizen_policy_surface *policy_surface,
526 struct wl_listener *listener)
528 wl_signal_add(&policy_surface->events.get_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 tizen_policy_send_conformant_area(policy_surface->client->resource,
642 ds_surface_get_wl_resource(policy_surface->surface), conformant_part, visible,
647 ds_tizen_policy_surface_send_notification_done(struct ds_tizen_policy_surface *policy_surface,
648 enum ds_tizen_policy_notification_level level,
649 enum ds_tizen_policy_error_state state)
651 uint32_t notification_level;
652 uint32_t error_state;
655 case DS_TIZEN_POLICY_NOTIFICATION_LEVEL_1:
656 notification_level = TIZEN_POLICY_LEVEL_1;
658 case DS_TIZEN_POLICY_NOTIFICATION_LEVEL_2:
659 notification_level = TIZEN_POLICY_LEVEL_2;
661 case DS_TIZEN_POLICY_NOTIFICATION_LEVEL_3:
662 notification_level = TIZEN_POLICY_LEVEL_3;
664 case DS_TIZEN_POLICY_NOTIFICATION_LEVEL_NONE:
665 notification_level = TIZEN_POLICY_LEVEL_NONE;
667 case DS_TIZEN_POLICY_NOTIFICATION_LEVEL_DEFAULT:
668 notification_level = TIZEN_POLICY_LEVEL_DEFAULT;
670 case DS_TIZEN_POLICY_NOTIFICATION_LEVEL_MEDIUM:
671 notification_level = TIZEN_POLICY_LEVEL_MEDIUM;
673 case DS_TIZEN_POLICY_NOTIFICATION_LEVEL_HIGH:
674 notification_level = TIZEN_POLICY_LEVEL_HIGH;
676 case DS_TIZEN_POLICY_NOTIFICATION_LEVEL_TOP:
677 notification_level = TIZEN_POLICY_LEVEL_TOP;
680 ds_err("Not supported notification_level(%d)", level);
685 case DS_TIZEN_POLICY_ERROR_STATE_NONE:
686 error_state = TIZEN_POLICY_ERROR_STATE_NONE;
688 case DS_TIZEN_POLICY_ERROR_STATE_PERMISSION_DENIED:
689 error_state = TIZEN_POLICY_ERROR_STATE_PERMISSION_DENIED;
692 ds_err("Not supported error_state(%d)", state);
696 tizen_policy_send_notification_done(policy_surface->client->resource,
697 ds_surface_get_wl_resource(policy_surface->surface),
698 notification_level, error_state);
702 ds_tizen_policy_surface_send_window_screen_mode_done(struct ds_tizen_policy_surface *policy_surface,
703 enum ds_tizen_policy_window_screen_mode mode,
704 enum ds_tizen_policy_error_state state)
706 uint32_t window_screen_mode;
707 uint32_t error_state;
710 case DS_TIZEN_POLICY_WINDOW_SCREEN_MODE_DEFAULT:
711 window_screen_mode = TIZEN_POLICY_MODE_DEFAULT;
713 case DS_TIZEN_POLICY_WINDOW_SCREEN_MODE_ALWAYS_ON:
714 window_screen_mode = TIZEN_POLICY_MODE_ALWAYS_ON;
717 ds_err("Not supported window_screen_mode(%d)", mode);
722 case DS_TIZEN_POLICY_ERROR_STATE_NONE:
723 error_state = TIZEN_POLICY_ERROR_STATE_NONE;
725 case DS_TIZEN_POLICY_ERROR_STATE_PERMISSION_DENIED:
726 error_state = TIZEN_POLICY_ERROR_STATE_PERMISSION_DENIED;
729 ds_err("Not supported error_state(%d)", state);
733 tizen_policy_send_window_screen_mode_done(policy_surface->client->resource,
734 ds_surface_get_wl_resource(policy_surface->surface),
735 window_screen_mode, error_state);
739 ds_tizen_policy_surface_send_iconify_state_changed(struct ds_tizen_policy_surface *policy_surface,
740 bool iconified, bool force)
742 tizen_policy_send_iconify_state_changed(policy_surface->client->resource,
743 ds_surface_get_wl_resource(policy_surface->surface), iconified, force);
747 ds_tizen_policy_surface_send_supported_aux_hints(struct ds_tizen_policy_surface *policy_surface,
748 struct wl_array *hints, uint32_t force)
754 ds_tizen_policy_surface_send_allowed_aux_hint(struct ds_tizen_policy_surface *policy_surface,
761 ds_tizen_policy_surface_send_aux_message(struct ds_tizen_policy_surface *policy_surface,
762 const char *key, const char *value, struct wl_array *options)
768 ds_tizen_policy_surface_send_conformant_region(struct ds_tizen_policy_surface *policy_surface,
769 enum ds_tizen_policy_conformant_part part, bool visible,
770 int32_t x, int32_t y, int32_t w, int32_t h, uint32_t serial)
772 uint32_t conformant_part;
775 case DS_TIZEN_POLICY_CONFORMANT_PART_INDICATOR:
776 conformant_part = TIZEN_POLICY_CONFORMANT_PART_INDICATOR;
778 case DS_TIZEN_POLICY_CONFORMANT_PART_KEYBOARD:
779 conformant_part = TIZEN_POLICY_CONFORMANT_PART_KEYBOARD;
781 case DS_TIZEN_POLICY_CONFORMANT_PART_CLIPBOARD:
782 conformant_part = TIZEN_POLICY_CONFORMANT_PART_CLIPBOARD;
785 ds_err("Not supported conformant_part(%d)", part);
789 tizen_policy_send_conformant_region(policy_surface->client->resource,
790 ds_surface_get_wl_resource(policy_surface->surface), conformant_part, visible,
795 ds_tizen_policy_surface_send_interactive_move_done(struct ds_tizen_policy_surface *policy_surface,
796 int32_t x, int32_t y, uint32_t w, uint32_t h)
802 ds_tizen_policy_surface_send_interactive_resize_done(struct ds_tizen_policy_surface *policy_surface,
803 int32_t x, int32_t y, uint32_t w, uint32_t h)
809 tizen_policy_visibility_get_type(enum ds_tizen_policy_visibility_type type)
814 case DS_TIZEN_POLICY_VISIBILITY_TYPE_UNOBSCURED:
815 vis_type = TIZEN_VISIBILITY_VISIBILITY_UNOBSCURED;
817 case DS_TIZEN_POLICY_VISIBILITY_TYPE_PARTIALLY_OBSCURED:
818 vis_type = TIZEN_VISIBILITY_VISIBILITY_PARTIALLY_OBSCURED;
820 case DS_TIZEN_POLICY_VISIBILITY_TYPE_FULLY_OBSCURED:
821 vis_type = TIZEN_VISIBILITY_VISIBILITY_FULLY_OBSCURED;
823 case DS_TIZEN_POLICY_VISIBILITY_TYPE_PRE_UNOBSCURED:
824 vis_type = TIZEN_VISIBILITY_VISIBILITY_PRE_UNOBSCURED;
827 ds_err("Not supported visible type (%d)", type);
828 vis_type = DS_TIZEN_POLICY_VISIBILITY_TYPE_UNKNOWN;
836 ds_tizen_policy_visibility_send_notify(
837 struct ds_tizen_policy_visibility *visibility,
838 enum ds_tizen_policy_visibility_type type)
842 vis_type = tizen_policy_visibility_get_type(type);
843 if (vis_type == DS_TIZEN_POLICY_VISIBILITY_TYPE_UNKNOWN)
846 tizen_visibility_send_notify(visibility->resource, vis_type);
850 ds_tizen_policy_visibility_send_changed(
851 struct ds_tizen_policy_visibility *visibility,
852 enum ds_tizen_policy_visibility_type type, uint32_t option)
856 vis_type = tizen_policy_visibility_get_type(type);
857 if (vis_type == DS_TIZEN_POLICY_VISIBILITY_TYPE_UNKNOWN)
860 tizen_visibility_send_changed(visibility->resource, vis_type, option);
864 ds_tizen_policy_position_send_changed(
865 struct ds_tizen_policy_position *position, int32_t x, int32_t y)
867 tizen_position_send_changed(position->resource, x, y);
870 WL_EXPORT struct ds_surface *
871 ds_tizen_policy_surface_get_surface(struct ds_tizen_policy_surface *policy_surface)
873 return policy_surface->surface;
877 ds_tizen_policy_surface_get_conformant(struct ds_tizen_policy_surface *policy_surface)
879 return policy_surface->conformant;
883 ds_tizen_policy_surface_get_opaque_state(struct ds_tizen_policy_surface *policy_surface)
885 return policy_surface->opaque_state;
889 ds_tizen_policy_surface_get_iconified(struct ds_tizen_policy_surface *policy_surface)
891 return policy_surface->iconified;
895 ds_tizen_policy_surface_get_floating_mode(struct ds_tizen_policy_surface *policy_surface)
897 return policy_surface->floating_mode;
900 WL_EXPORT enum ds_tizen_policy_stack_mode
901 ds_tizen_policy_surface_get_stack_mode(struct ds_tizen_policy_surface *policy_surface)
903 return policy_surface->stack_mode;
906 static struct ds_tizen_policy_surface *
907 tizen_policy_client_find_policy_surface(struct ds_tizen_policy_client *client,
908 struct ds_surface *surface)
910 struct ds_tizen_policy_surface *policy_surface;
912 wl_list_for_each(policy_surface, &client->policy_surfaces, link) {
913 if (surface == policy_surface->surface)
914 return policy_surface;
920 static struct ds_tizen_policy_surface *
921 tizen_policy_client_get_surface(struct wl_resource *resource,
922 struct wl_resource *surface_resource)
924 struct ds_tizen_policy_client *client;
925 struct ds_tizen_policy_surface *policy_surface;
926 struct ds_surface *surface;
928 client = wl_resource_get_user_data(resource);
929 surface = ds_surface_from_resource(surface_resource);
931 policy_surface = tizen_policy_client_find_policy_surface(client, surface);
933 return policy_surface;
935 policy_surface = calloc(1, sizeof *policy_surface);
936 if (policy_surface == NULL) {
937 ds_err("calloc() failed. tizen_policy");
941 policy_surface->client = client;
942 policy_surface->surface = surface;
943 wl_client_get_credentials(client->wl_client, &policy_surface->pid, &policy_surface->uid, NULL);
945 wl_list_init(&policy_surface->visibilities);
946 wl_list_init(&policy_surface->positions);
947 wl_list_init(&policy_surface->subsurface_watchers);
949 wl_signal_init(&policy_surface->events.destroy);
950 wl_signal_init(&policy_surface->events.new_visibility);
951 wl_signal_init(&policy_surface->events.get_position);
952 wl_signal_init(&policy_surface->events.activate);
953 wl_signal_init(&policy_surface->events.raise);
954 wl_signal_init(&policy_surface->events.lower);
955 wl_signal_init(&policy_surface->events.set_focus_skip);
956 wl_signal_init(&policy_surface->events.unset_focus_skip);
957 wl_signal_init(&policy_surface->events.set_role);
958 wl_signal_init(&policy_surface->events.set_window_type);
959 wl_signal_init(&policy_surface->events.set_conformant);
960 wl_signal_init(&policy_surface->events.unset_conformant);
961 wl_signal_init(&policy_surface->events.get_conformant);
962 wl_signal_init(&policy_surface->events.set_notification_level);
963 wl_signal_init(&policy_surface->events.set_window_screen_mode);
964 wl_signal_init(&policy_surface->events.get_subsurface);
965 wl_signal_init(&policy_surface->events.iconify);
966 wl_signal_init(&policy_surface->events.uniconify);
967 wl_signal_init(&policy_surface->events.add_aux_hint);
968 wl_signal_init(&policy_surface->events.change_aux_hint);
969 wl_signal_init(&policy_surface->events.delete_aux_hint);
970 wl_signal_init(&policy_surface->events.get_supported_aux_hints);
971 wl_signal_init(&policy_surface->events.set_floating_mode);
972 wl_signal_init(&policy_surface->events.unset_floating_mode);
973 wl_signal_init(&policy_surface->events.set_stack_mode);
974 wl_signal_init(&policy_surface->events.get_subsurface_watcher);
975 wl_signal_init(&policy_surface->events.set_parent);
976 wl_signal_init(&policy_surface->events.ack_conformant_region);
977 wl_signal_init(&policy_surface->events.set_video);
978 wl_signal_init(&policy_surface->events.show);
979 wl_signal_init(&policy_surface->events.hide);
980 wl_signal_init(&policy_surface->events.set_parent_with_below);
982 wl_list_insert(&client->policy_surfaces, &policy_surface->link);
984 struct ds_tizen_event_policy_new_surface event = {
985 .policy = client->policy,
986 .policy_surface = policy_surface,
988 wl_signal_emit(&client->policy->events.new_surface, &event);
990 return policy_surface;
994 policy_handle_display_destroy(struct wl_listener *listener, void *data)
996 struct ds_tizen_policy *policy;
998 policy = wl_container_of(listener, policy, destroy);
1000 ds_inf("Global destroy: policy(%p)", policy);
1002 wl_signal_emit(&policy->events.destroy, policy);
1004 if (policy->use_security)
1005 tizen_security_finish();
1007 wl_list_remove(&policy->destroy.link);
1008 wl_global_destroy(policy->global);
1013 visibility_handle_destroy(struct wl_client *wl_client,
1014 struct wl_resource *resource)
1016 wl_resource_destroy(resource);
1019 static const struct tizen_visibility_interface visibility_impl =
1021 visibility_handle_destroy,
1025 _tizen_policy_visibility_handle_destroy(struct wl_resource *resource)
1027 struct ds_tizen_policy_visibility *visibility;
1029 visibility = wl_resource_get_user_data(resource);
1031 ds_inf("_tizen_policy_visibility_handle_destroy (visibility:%p)",
1034 wl_signal_emit(&visibility->events.destroy, visibility);
1035 wl_list_remove(&visibility->link);
1040 policy_handle_get_visibility(struct wl_client *wl_client, struct wl_resource *resource,
1041 uint32_t id, struct wl_resource *surface_resource)
1043 struct ds_tizen_policy_surface *policy_surface;
1044 struct ds_tizen_policy_visibility *visibility;
1046 policy_surface = tizen_policy_client_get_surface(resource, surface_resource);
1047 if (policy_surface == NULL) {
1048 ds_err("tizen_policy_client_get_surface() failed.");
1049 wl_client_post_no_memory(wl_client);
1053 visibility = calloc(1, sizeof *visibility);
1054 if (visibility == NULL) {
1055 ds_err("calloc() failed. tizen_policy");
1059 visibility->policy_surface = policy_surface;
1060 wl_signal_init(&visibility->events.destroy);
1062 wl_list_insert(&policy_surface->visibilities, &visibility->link);
1064 visibility->resource = wl_resource_create(wl_client,
1065 &tizen_visibility_interface, wl_resource_get_version(resource),
1067 if (visibility->resource == NULL) {
1068 ds_err("tizen_policy : wl_resource_create() failed.");
1069 wl_list_remove(&visibility->link);
1071 wl_client_post_no_memory(wl_client);
1075 wl_resource_set_implementation(visibility->resource,
1076 &visibility_impl, visibility,
1077 _tizen_policy_visibility_handle_destroy);
1079 struct ds_tizen_event_policy_surface_new_visibility event = {
1080 .policy_surface = policy_surface,
1081 .visibility = visibility,
1083 wl_signal_emit(&policy_surface->events.new_visibility, &event);
1087 position_handle_destroy(struct wl_client *wl_client, struct wl_resource *resource)
1089 wl_resource_destroy(resource);
1093 position_handle_set(struct wl_client *wl_client, struct wl_resource *resource,
1094 int32_t x, int32_t y)
1096 struct ds_tizen_policy_position *position;
1098 position = wl_resource_get_user_data(resource);
1100 struct ds_tizen_event_policy_position_set event = {
1101 .position = position,
1105 wl_signal_emit(&position->events.set, &event);
1108 static const struct tizen_position_interface position_impl =
1110 position_handle_destroy,
1111 position_handle_set,
1115 _tizen_policy_position_handle_destroy(struct wl_resource *resource)
1117 struct ds_tizen_policy_position *position;
1119 position = wl_resource_get_user_data(resource);
1121 ds_inf("_tizen_policy_position_handle_destroy (position:%p)",
1124 wl_signal_emit(&position->events.destroy, position);
1125 wl_list_remove(&position->link);
1130 policy_handle_get_position(struct wl_client *wl_client, struct wl_resource *resource,
1131 uint32_t id, struct wl_resource *surface_resource)
1133 struct ds_tizen_policy_surface *policy_surface;
1134 struct ds_tizen_policy_position *position;
1136 policy_surface = tizen_policy_client_get_surface(resource, surface_resource);
1137 if (policy_surface == NULL) {
1138 ds_err("tizen_policy_client_get_surface() failed.");
1139 wl_client_post_no_memory(wl_client);
1143 position = calloc(1, sizeof *position);
1144 if (position == NULL) {
1145 ds_err("calloc() failed. tizen_policy");
1149 position->policy_surface = policy_surface;
1150 wl_signal_init(&position->events.destroy);
1151 wl_signal_init(&position->events.set);
1153 wl_list_insert(&policy_surface->positions, &position->link);
1155 position->resource = wl_resource_create(wl_client,
1156 &tizen_position_interface, wl_resource_get_version(resource),
1158 if (position->resource == NULL) {
1159 ds_err("tizen_policy : wl_resource_create() failed.");
1160 wl_list_remove(&position->link);
1162 wl_client_post_no_memory(wl_client);
1166 wl_resource_set_implementation(position->resource,
1167 &position_impl, position,
1168 _tizen_policy_position_handle_destroy);
1170 struct ds_tizen_event_policy_surface_get_position event = {
1171 .policy_surface = policy_surface,
1172 .position = position,
1174 wl_signal_emit(&policy_surface->events.get_position, &event);
1178 policy_handle_activate(struct wl_client *wl_client,
1179 struct wl_resource *resource, struct wl_resource *surface_resource)
1181 struct ds_tizen_policy_surface *policy_surface;
1183 policy_surface = tizen_policy_client_get_surface(resource, surface_resource);
1184 if (policy_surface == NULL) {
1185 ds_err("tizen_policy_client_get_surface() failed.");
1186 wl_client_post_no_memory(wl_client);
1190 struct ds_tizen_event_policy_surface_activate event = {
1191 .policy_surface = policy_surface,
1193 wl_signal_emit(&policy_surface->events.activate, &event);
1197 policy_handle_activate_below_by_res_id(struct wl_client *wl_client,
1198 struct wl_resource *resource, uint32_t universal_id,
1199 uint32_t below_universal_id)
1201 struct ds_tizen_policy_client *client;
1203 client = wl_resource_get_user_data(resource);
1205 struct ds_tizen_event_policy_activate_below_by_univeral_id event = {
1206 .policy = client->policy,
1207 .universal_id = universal_id,
1208 .below_universal_id = below_universal_id,
1210 wl_signal_emit(&client->policy->events.activate_below_by_univeral_id, &event);
1214 policy_handle_raise(struct wl_client *wl_client, struct wl_resource *resource,
1215 struct wl_resource *surface_resource)
1217 struct ds_tizen_policy_surface *policy_surface;
1219 policy_surface = tizen_policy_client_get_surface(resource, surface_resource);
1220 if (policy_surface == NULL) {
1221 ds_err("tizen_policy_client_get_surface() failed.");
1222 wl_client_post_no_memory(wl_client);
1226 struct ds_tizen_event_policy_surface_raise event = {
1227 .policy_surface = policy_surface,
1229 wl_signal_emit(&policy_surface->events.raise, &event);
1233 policy_handle_lower(struct wl_client *wl_client, struct wl_resource *resource,
1234 struct wl_resource *surface_resource)
1236 struct ds_tizen_policy_surface *policy_surface;
1238 policy_surface = tizen_policy_client_get_surface(resource, surface_resource);
1239 if (policy_surface == NULL) {
1240 ds_err("tizen_policy_client_get_surface() failed.");
1241 wl_client_post_no_memory(wl_client);
1245 struct ds_tizen_event_policy_surface_lower event = {
1246 .policy_surface = policy_surface,
1248 wl_signal_emit(&policy_surface->events.lower, &event);
1252 policy_handle_lower_by_res_id(struct wl_client *wl_client,
1253 struct wl_resource *resource, uint32_t universal_id)
1255 struct ds_tizen_policy_client *client;
1257 client = wl_resource_get_user_data(resource);
1259 struct ds_tizen_event_policy_lower_by_universal_id event = {
1260 .policy = client->policy,
1261 .universal_id = universal_id,
1263 wl_signal_emit(&client->policy->events.lower_by_universal_id, &event);
1267 policy_handle_set_focus_skip(struct wl_client *wl_client,
1268 struct wl_resource *resource, struct wl_resource *surface_resource)
1270 struct ds_tizen_policy_surface *policy_surface;
1272 policy_surface = tizen_policy_client_get_surface(resource, surface_resource);
1273 if (policy_surface == NULL) {
1274 ds_err("tizen_policy_client_get_surface() failed.");
1275 wl_client_post_no_memory(wl_client);
1279 struct ds_tizen_event_policy_surface_set_focus_skip event = {
1280 .policy_surface = policy_surface,
1282 wl_signal_emit(&policy_surface->events.set_focus_skip, &event);
1286 policy_handle_unset_focus_skip(struct wl_client *wl_client,
1287 struct wl_resource *resource, struct wl_resource *surface_resource)
1289 struct ds_tizen_policy_surface *policy_surface;
1291 policy_surface = tizen_policy_client_get_surface(resource, surface_resource);
1292 if (policy_surface == NULL) {
1293 ds_err("tizen_policy_client_get_surface() failed.");
1294 wl_client_post_no_memory(wl_client);
1298 struct ds_tizen_event_policy_surface_unset_focus_skip event = {
1299 .policy_surface = policy_surface,
1301 wl_signal_emit(&policy_surface->events.unset_focus_skip, &event);
1305 policy_handle_set_role(struct wl_client *wl_client, struct wl_resource *resource,
1306 struct wl_resource *surface_resource, const char *role)
1308 struct ds_tizen_policy_surface *policy_surface;
1310 policy_surface = tizen_policy_client_get_surface(resource, surface_resource);
1311 if (policy_surface == NULL) {
1312 ds_err("tizen_policy_client_get_surface() failed.");
1313 wl_client_post_no_memory(wl_client);
1317 struct ds_tizen_event_policy_surface_set_role event = {
1318 .policy_surface = policy_surface,
1321 wl_signal_emit(&policy_surface->events.set_role, &event);
1325 policy_handle_set_type(struct wl_client *wl_client, struct wl_resource *resource,
1326 struct wl_resource *surface_resource, uint32_t type)
1328 struct ds_tizen_policy_surface *policy_surface;
1329 enum ds_tizen_policy_window_type win_type;
1331 policy_surface = tizen_policy_client_get_surface(resource, surface_resource);
1332 if (policy_surface == NULL) {
1333 ds_err("tizen_policy_client_get_surface() failed.");
1334 wl_client_post_no_memory(wl_client);
1339 case TIZEN_POLICY_WIN_TYPE_NONE:
1340 win_type = DS_TIZEN_POLICY_WINDOW_TYPE_NONE;
1342 case TIZEN_POLICY_WIN_TYPE_TOPLEVEL:
1343 win_type = DS_TIZEN_POLICY_WINDOW_TYPE_TOPLEVEL;
1345 case TIZEN_POLICY_WIN_TYPE_FULLSCREEN:
1346 win_type = DS_TIZEN_POLICY_WINDOW_TYPE_FULLLSCREEN;
1348 case TIZEN_POLICY_WIN_TYPE_MAXIMIZED:
1349 win_type = DS_TIZEN_POLICY_WINDOW_TYPE_MAXIMIZED;
1351 case TIZEN_POLICY_WIN_TYPE_TRANSIENT:
1352 win_type = DS_TIZEN_POLICY_WINDOW_TYPE_TRANSIENT;
1354 case TIZEN_POLICY_WIN_TYPE_MENU:
1355 win_type = DS_TIZEN_POLICY_WINDOW_TYPE_MENU;
1357 case TIZEN_POLICY_WIN_TYPE_DND:
1358 win_type = DS_TIZEN_POLICY_WINDOW_TYPE_DND;
1360 case TIZEN_POLICY_WIN_TYPE_CUSTOM:
1361 win_type = DS_TIZEN_POLICY_WINDOW_TYPE_CUSTOM;
1363 case TIZEN_POLICY_WIN_TYPE_NOTIFICATION:
1364 win_type = DS_TIZEN_POLICY_WINDOW_TYPE_NOTIFICATION;
1366 case TIZEN_POLICY_WIN_TYPE_UTILITY:
1367 win_type = DS_TIZEN_POLICY_WINDOW_TYPE_UTILITY;
1369 case TIZEN_POLICY_WIN_TYPE_DIALOG:
1370 win_type = DS_TIZEN_POLICY_WINDOW_TYPE_DIALOG;
1372 case TIZEN_POLICY_WIN_TYPE_DOCK:
1373 win_type = DS_TIZEN_POLICY_WINDOW_TYPE_DOCK;
1375 case TIZEN_POLICY_WIN_TYPE_SPLASH:
1376 win_type = DS_TIZEN_POLICY_WINDOW_TYPE_SPLASH;
1378 case TIZEN_POLICY_WIN_TYPE_DESKTOP:
1379 win_type = DS_TIZEN_POLICY_WINDOW_TYPE_DESKTOP;
1382 win_type = DS_TIZEN_POLICY_WINDOW_TYPE_NONE;
1386 struct ds_tizen_event_policy_surface_set_window_type event = {
1387 .policy_surface = policy_surface,
1388 .win_type = win_type,
1390 wl_signal_emit(&policy_surface->events.set_window_type, &event);
1394 policy_handle_set_conformant(struct wl_client *wl_client,
1395 struct wl_resource *resource, struct wl_resource *surface_resource)
1397 struct ds_tizen_policy_surface *policy_surface;
1399 policy_surface = tizen_policy_client_get_surface(resource, surface_resource);
1400 if (policy_surface == NULL) {
1401 ds_err("tizen_policy_client_get_surface() failed.");
1402 wl_client_post_no_memory(wl_client);
1406 if (!policy_surface->conformant)
1407 policy_surface->conformant = true;
1409 struct ds_tizen_event_policy_surface_set_conformant event = {
1410 .policy_surface = policy_surface,
1412 wl_signal_emit(&policy_surface->events.set_conformant, &event);
1416 policy_handle_unset_conformant(struct wl_client *wl_client,
1417 struct wl_resource *resource, struct wl_resource *surface_resource)
1419 struct ds_tizen_policy_surface *policy_surface;
1421 policy_surface = tizen_policy_client_get_surface(resource, surface_resource);
1422 if (policy_surface == NULL) {
1423 ds_err("tizen_policy_client_get_surface() failed.");
1424 wl_client_post_no_memory(wl_client);
1428 if (policy_surface->conformant)
1429 policy_surface->conformant = false;
1431 struct ds_tizen_event_policy_surface_unset_conformant event = {
1432 .policy_surface = policy_surface,
1434 wl_signal_emit(&policy_surface->events.unset_conformant, &event);
1438 policy_handle_get_conformant(struct wl_client *wl_client,
1439 struct wl_resource *resource, struct wl_resource *surface_resource)
1441 struct ds_tizen_policy_surface *policy_surface;
1443 policy_surface = tizen_policy_client_get_surface(resource, surface_resource);
1444 if (policy_surface == NULL) {
1445 ds_err("tizen_policy_client_get_surface() failed.");
1446 wl_client_post_no_memory(wl_client);
1450 struct ds_tizen_event_policy_surface_get_conformant event = {
1451 .policy_surface = policy_surface,
1453 wl_signal_emit(&policy_surface->events.get_conformant, &event);
1457 policy_handle_set_notification_level(struct wl_client *wl_client,
1458 struct wl_resource *resource, struct wl_resource *surface_resource,
1461 struct ds_tizen_policy_surface *policy_surface;
1462 enum ds_tizen_policy_notification_level noti_level;
1465 policy_surface = tizen_policy_client_get_surface(resource, surface_resource);
1466 if (policy_surface == NULL) {
1467 ds_err("tizen_policy_client_get_surface() failed.");
1468 wl_client_post_no_memory(wl_client);
1472 ret = tizen_security_check_privilege(policy_surface->pid, policy_surface->uid,
1473 TIZEN_POLICY_PRIVILEGE_SET_NOTIFICATION_LEVEL);
1475 ds_err("tizen_security_check_privilege() failed. "
1476 "Privilege Denied on set_notification_level.");
1478 tizen_policy_send_notification_done(resource, surface_resource,
1479 -1, TIZEN_POLICY_ERROR_STATE_PERMISSION_DENIED);
1485 case TIZEN_POLICY_LEVEL_1:
1486 noti_level = DS_TIZEN_POLICY_NOTIFICATION_LEVEL_1;
1488 case TIZEN_POLICY_LEVEL_2:
1489 noti_level = DS_TIZEN_POLICY_NOTIFICATION_LEVEL_2;
1491 case TIZEN_POLICY_LEVEL_3:
1492 noti_level = DS_TIZEN_POLICY_NOTIFICATION_LEVEL_3;
1494 case TIZEN_POLICY_LEVEL_NONE:
1495 noti_level = DS_TIZEN_POLICY_NOTIFICATION_LEVEL_NONE;
1497 case TIZEN_POLICY_LEVEL_DEFAULT:
1498 noti_level = DS_TIZEN_POLICY_NOTIFICATION_LEVEL_DEFAULT;
1500 case TIZEN_POLICY_LEVEL_MEDIUM:
1501 noti_level = DS_TIZEN_POLICY_NOTIFICATION_LEVEL_MEDIUM;
1503 case TIZEN_POLICY_LEVEL_HIGH:
1504 noti_level = DS_TIZEN_POLICY_NOTIFICATION_LEVEL_HIGH;
1506 case TIZEN_POLICY_LEVEL_TOP:
1507 noti_level = DS_TIZEN_POLICY_NOTIFICATION_LEVEL_TOP;
1510 noti_level = DS_TIZEN_POLICY_NOTIFICATION_LEVEL_NONE;
1514 struct ds_tizen_event_policy_surface_set_notification_level event = {
1515 .policy_surface = policy_surface,
1516 .level = noti_level,
1518 wl_signal_emit(&policy_surface->events.set_notification_level, &event);
1522 policy_handle_set_transient_for(struct wl_client *wl_client,
1523 struct wl_resource *resource, uint32_t child_id, uint32_t parent_id)
1525 struct ds_tizen_policy_client *client;
1527 client = wl_resource_get_user_data(resource);
1529 struct ds_tizen_event_policy_set_transient_for event = {
1530 .policy = client->policy,
1531 .child_universal_id = child_id,
1532 .parent_universal_id = parent_id,
1534 wl_signal_emit(&client->policy->events.set_transient_for, &event);
1536 tizen_policy_send_transient_for_done(resource, child_id);
1540 policy_handle_unset_transient_for(struct wl_client *wl_client,
1541 struct wl_resource *resource, uint32_t child_id)
1543 struct ds_tizen_policy_client *client;
1545 client = wl_resource_get_user_data(resource);
1547 struct ds_tizen_event_policy_unset_transient_for event = {
1548 .policy = client->policy,
1549 .child_universal_id = child_id,
1551 wl_signal_emit(&client->policy->events.unset_transient_for, &event);
1555 policy_handle_set_window_screen_mode(struct wl_client *wl_client,
1556 struct wl_resource *resource, struct wl_resource *surface_resource,
1559 struct ds_tizen_policy_surface *policy_surface;
1560 enum ds_tizen_policy_window_screen_mode screen_mode;
1563 policy_surface = tizen_policy_client_get_surface(resource, surface_resource);
1564 if (policy_surface == NULL) {
1565 ds_err("tizen_policy_client_get_surface() failed.");
1566 wl_client_post_no_memory(wl_client);
1570 ret = tizen_security_check_privilege(policy_surface->pid, policy_surface->uid,
1571 TIZEN_POLICY_PRIVILEGE_SET_SCREEN_MODE);
1573 ds_err("tizen_security_check_privilege() failed. "
1574 "Privilege Denied on set_window_screen_mode.");
1576 tizen_policy_send_notification_done(resource, surface_resource,
1577 -1, TIZEN_POLICY_ERROR_STATE_PERMISSION_DENIED);
1583 case TIZEN_POLICY_MODE_DEFAULT:
1584 screen_mode = DS_TIZEN_POLICY_WINDOW_SCREEN_MODE_DEFAULT;
1586 case TIZEN_POLICY_MODE_ALWAYS_ON:
1587 screen_mode = DS_TIZEN_POLICY_WINDOW_SCREEN_MODE_ALWAYS_ON;
1590 screen_mode = DS_TIZEN_POLICY_WINDOW_SCREEN_MODE_DEFAULT;
1594 struct ds_tizen_event_policy_surface_set_window_screen_mode event = {
1595 .policy_surface = policy_surface,
1596 .mode = screen_mode,
1598 wl_signal_emit(&policy_surface->events.set_window_screen_mode, &event);
1602 policy_handle_place_subsurface_below_parent(struct wl_client *wl_client,
1603 struct wl_resource *resource, struct wl_resource *subsurface_resource)
1605 struct ds_tizen_policy_client *client;
1606 struct ds_subsurface *subsurface;
1608 client = wl_resource_get_user_data(resource);
1609 subsurface = ds_subsurface_from_resource(subsurface_resource);
1611 struct ds_tizen_event_policy_place_subsurface_below_parent event = {
1612 .policy = client->policy,
1613 .subsurface = subsurface,
1616 &client->policy->events.place_subsurface_below_parent,
1621 policy_handle_set_subsurface_stand_alone(struct wl_client *wl_client,
1622 struct wl_resource *resource, struct wl_resource *subsurface_resource)
1624 struct ds_tizen_policy_client *client;
1625 struct ds_subsurface *subsurface;
1627 client = wl_resource_get_user_data(resource);
1628 subsurface = ds_subsurface_from_resource(subsurface_resource);
1630 struct ds_tizen_event_policy_set_subsurface_stand_alone event = {
1631 .policy = client->policy,
1632 .subsurface = subsurface,
1635 &client->policy->events.set_subsurface_stand_alone,
1640 policy_handle_get_subsurface(struct wl_client *wl_client,
1641 struct wl_resource *resource, uint32_t id,
1642 struct wl_resource *surface_resource, uint32_t parent_id)
1644 struct ds_tizen_policy_surface *policy_surface;
1646 policy_surface = tizen_policy_client_get_surface(resource, surface_resource);
1647 if (policy_surface == NULL) {
1648 ds_err("tizen_policy_client_get_surface() failed.");
1649 wl_client_post_no_memory(wl_client);
1653 // TODO: How to create the ds_subsurface with a parent_universal_id.
1655 struct ds_tizen_event_policy_surface_get_subsurface event = {
1656 .policy_surface = policy_surface,
1657 .parent_universal_id = parent_id,
1659 wl_signal_emit(&policy_surface->events.get_subsurface, &event);
1663 policy_handle_set_opaque_state(struct wl_client *wl_client,
1664 struct wl_resource *resource, struct wl_resource *surface_resource,
1667 struct ds_tizen_policy_surface *policy_surface;
1669 policy_surface = tizen_policy_client_get_surface(resource, surface_resource);
1670 if (policy_surface == NULL) {
1671 ds_err("tizen_policy_client_get_surface() failed.");
1672 wl_client_post_no_memory(wl_client);
1676 if (policy_surface->opaque_state != state)
1677 policy_surface->opaque_state = state;
1681 policy_handle_iconify(struct wl_client *wl_client, struct wl_resource *resource,
1682 struct wl_resource *surface_resource)
1684 struct ds_tizen_policy_surface *policy_surface;
1686 policy_surface = tizen_policy_client_get_surface(resource, surface_resource);
1687 if (policy_surface == NULL) {
1688 ds_err("tizen_policy_client_get_surface() failed.");
1689 wl_client_post_no_memory(wl_client);
1693 if (!policy_surface->iconified)
1694 policy_surface->iconified = true;
1696 struct ds_tizen_event_policy_surface_iconify event = {
1697 .policy_surface = policy_surface,
1699 wl_signal_emit(&policy_surface->events.iconify, &event);
1703 policy_handle_uniconify(struct wl_client *wl_client, struct wl_resource *resource,
1704 struct wl_resource *surface_resource)
1706 struct ds_tizen_policy_surface *policy_surface;
1708 policy_surface = tizen_policy_client_get_surface(resource, surface_resource);
1709 if (policy_surface == NULL) {
1710 ds_err("tizen_policy_client_get_surface() failed.");
1711 wl_client_post_no_memory(wl_client);
1715 if (policy_surface->iconified)
1716 policy_surface->iconified = false;
1718 struct ds_tizen_event_policy_surface_uniconify event = {
1719 .policy_surface = policy_surface,
1721 wl_signal_emit(&policy_surface->events.uniconify, &event);
1725 policy_handle_add_aux_hint(struct wl_client *wl_client,
1726 struct wl_resource *resource, struct wl_resource *surface_resource,
1727 int32_t id, const char *name, const char *value)
1729 struct ds_tizen_policy_surface *policy_surface;
1731 policy_surface = tizen_policy_client_get_surface(resource, surface_resource);
1732 if (policy_surface == NULL) {
1733 ds_err("tizen_policy_client_get_surface() failed.");
1734 wl_client_post_no_memory(wl_client);
1738 struct ds_tizen_event_policy_surface_add_aux_hint event = {
1739 .policy_surface = policy_surface,
1744 wl_signal_emit(&policy_surface->events.add_aux_hint, &event);
1748 policy_handle_change_aux_hint(struct wl_client *wl_client,
1749 struct wl_resource *resource, struct wl_resource *surface_resource,
1750 int32_t id, const char *value)
1752 struct ds_tizen_policy_surface *policy_surface;
1754 policy_surface = tizen_policy_client_get_surface(resource, surface_resource);
1755 if (policy_surface == NULL) {
1756 ds_err("tizen_policy_client_get_surface() failed.");
1757 wl_client_post_no_memory(wl_client);
1761 struct ds_tizen_event_policy_surface_change_aux_hint event = {
1762 .policy_surface = policy_surface,
1766 wl_signal_emit(&policy_surface->events.change_aux_hint, &event);
1770 policy_handle_delete_aux_hint(struct wl_client *wl_client,
1771 struct wl_resource *resource, struct wl_resource *surface_resource,
1774 struct ds_tizen_policy_surface *policy_surface;
1776 policy_surface = tizen_policy_client_get_surface(resource, surface_resource);
1777 if (policy_surface == NULL) {
1778 ds_err("tizen_policy_client_get_surface() failed.");
1779 wl_client_post_no_memory(wl_client);
1783 struct ds_tizen_event_policy_surface_delete_aux_hint event = {
1784 .policy_surface = policy_surface,
1787 wl_signal_emit(&policy_surface->events.delete_aux_hint, &event);
1791 policy_handle_get_supported_aux_hints(struct wl_client *wl_client,
1792 struct wl_resource *resource, struct wl_resource *surface_resource)
1794 struct ds_tizen_policy_surface *policy_surface;
1796 policy_surface = tizen_policy_client_get_surface(resource, surface_resource);
1797 if (policy_surface == NULL) {
1798 ds_err("tizen_policy_client_get_surface() failed.");
1799 wl_client_post_no_memory(wl_client);
1803 struct ds_tizen_event_policy_surface_get_supported_aux_hints event = {
1804 .policy_surface = policy_surface,
1806 wl_signal_emit(&policy_surface->events.get_supported_aux_hints, &event);
1810 policy_handle_set_background_state(struct wl_client *wl_client,
1811 struct wl_resource *resource, uint32_t pid)
1813 struct ds_tizen_policy_client *client;
1814 struct ds_tizen_policy *policy;
1816 client = wl_resource_get_user_data(resource);
1817 policy = client->policy;
1819 wl_list_for_each(client, &policy->clients, link) {
1820 if (pid == client->pid) {
1821 struct ds_tizen_event_policy_set_background_state event = {
1822 .policy = client->policy,
1825 wl_signal_emit(&client->policy->events.set_background_state, &event);
1831 policy_handle_unset_background_state(struct wl_client *wl_client,
1832 struct wl_resource *resource, uint32_t pid)
1834 struct ds_tizen_policy_client *client;
1835 struct ds_tizen_policy *policy;
1837 client = wl_resource_get_user_data(resource);
1838 policy = client->policy;
1840 wl_list_for_each(client, &policy->clients, link) {
1841 if (pid == client->pid) {
1842 struct ds_tizen_event_policy_unset_background_state event = {
1843 .policy = client->policy,
1846 wl_signal_emit(&client->policy->events.unset_background_state, &event);
1852 policy_handle_set_floating_mode(struct wl_client *wl_client,
1853 struct wl_resource *resource, struct wl_resource *surface_resource)
1855 struct ds_tizen_policy_surface *policy_surface;
1857 policy_surface = tizen_policy_client_get_surface(resource, surface_resource);
1858 if (policy_surface == NULL) {
1859 ds_err("tizen_policy_client_get_surface() failed.");
1860 wl_client_post_no_memory(wl_client);
1864 if (policy_surface->floating_mode == false)
1867 policy_surface->floating_mode = false;
1869 struct ds_tizen_event_policy_surface_set_floating_mode event = {
1870 .policy_surface = policy_surface,
1872 wl_signal_emit(&policy_surface->events.set_floating_mode, &event);
1876 policy_handle_unset_floating_mode(struct wl_client *wl_client,
1877 struct wl_resource *resource, struct wl_resource *surface_resource)
1879 struct ds_tizen_policy_surface *policy_surface;
1881 policy_surface = tizen_policy_client_get_surface(resource, surface_resource);
1882 if (policy_surface == NULL) {
1883 ds_err("tizen_policy_client_get_surface() failed.");
1884 wl_client_post_no_memory(wl_client);
1888 if (policy_surface->floating_mode == false)
1891 policy_surface->floating_mode = false;
1893 struct ds_tizen_event_policy_surface_unset_floating_mode event = {
1894 .policy_surface = policy_surface,
1896 wl_signal_emit(&policy_surface->events.unset_floating_mode, &event);
1900 policy_handle_set_stack_mode(struct wl_client *wl_client,
1901 struct wl_resource *resource, struct wl_resource *surface_resource,
1904 struct ds_tizen_policy_surface *policy_surface;
1905 enum ds_tizen_policy_stack_mode stack_mode;
1907 policy_surface = tizen_policy_client_get_surface(resource, surface_resource);
1908 if (policy_surface == NULL) {
1909 ds_err("tizen_policy_client_get_surface() failed.");
1910 wl_client_post_no_memory(wl_client);
1915 case TIZEN_POLICY_STACK_MODE_ABOVE:
1916 stack_mode = DS_TIZEN_POLICY_STACK_MODE_ABOVE;
1918 case TIZEN_POLICY_STACK_MODE_BELOW:
1919 stack_mode = DS_TIZEN_POLICY_STACK_MODE_BELOW;
1922 stack_mode = DS_TIZEN_POLICY_STACK_MODE_NONE;
1926 if (policy_surface->stack_mode == stack_mode)
1929 policy_surface->stack_mode = stack_mode;
1931 struct ds_tizen_event_policy_surface_set_stack_mode event = {
1932 .policy_surface = policy_surface,
1935 wl_signal_emit(&policy_surface->events.set_stack_mode, &event);
1939 policy_handle_activate_above_by_res_id(struct wl_client *wl_client,
1940 struct wl_resource *resource, uint32_t universal_id,
1941 uint32_t above_universal_id)
1943 struct ds_tizen_policy_client *client;
1945 client = wl_resource_get_user_data(resource);
1947 struct ds_tizen_event_policy_activate_above_by_universal_id event = {
1948 .policy = client->policy,
1949 .universal_id = universal_id,
1950 .above_universal_id = above_universal_id,
1952 wl_signal_emit(&client->policy->events.activate_above_by_universal_id, &event);
1956 subsurface_watcher_handle_destroy(struct wl_client *wl_client,
1957 struct wl_resource *resource)
1959 wl_resource_destroy(resource);
1962 static const struct tizen_subsurface_watcher_interface subsurface_watcher_impl =
1964 subsurface_watcher_handle_destroy,
1968 _tizen_policy_subsurface_watcher_handle_destroy(struct wl_resource *resource)
1970 struct ds_tizen_policy_subsurface_watcher *subsurface_watcher;
1972 subsurface_watcher = wl_resource_get_user_data(resource);
1974 ds_inf("_tizen_policy_subsurface_watcher_handle_destroy (subsurface_watcher:%p)",
1975 subsurface_watcher);
1977 wl_signal_emit(&subsurface_watcher->events.destroy, subsurface_watcher);
1978 free(subsurface_watcher);
1982 policy_handle_get_subsurface_watcher(struct wl_client *wl_client,
1983 struct wl_resource *resource, uint32_t id,
1984 struct wl_resource *surface_resource)
1986 struct ds_tizen_policy_surface *policy_surface;
1987 struct ds_tizen_policy_subsurface_watcher *subsurface_watcher;
1989 policy_surface = tizen_policy_client_get_surface(resource, surface_resource);
1990 if (policy_surface == NULL) {
1991 ds_err("tizen_policy_client_get_surface() failed.");
1992 wl_client_post_no_memory(wl_client);
1996 subsurface_watcher = calloc(1, sizeof *subsurface_watcher);
1997 if (!subsurface_watcher) {
1998 ds_err("calloc() failed. tizen_policy");
2002 subsurface_watcher->policy_surface = policy_surface;
2003 wl_signal_init(&subsurface_watcher->events.destroy);
2005 wl_list_insert(&policy_surface->subsurface_watchers, &subsurface_watcher->link);
2007 subsurface_watcher->resource = wl_resource_create(wl_client,
2008 &tizen_subsurface_watcher_interface, wl_resource_get_version(resource),
2010 if (subsurface_watcher->resource == NULL) {
2011 ds_err("tizen_policy : wl_resource_create() failed.");
2012 free(subsurface_watcher);
2013 wl_client_post_no_memory(wl_client);
2017 wl_resource_set_implementation(subsurface_watcher->resource,
2018 &subsurface_watcher_impl, subsurface_watcher,
2019 _tizen_policy_subsurface_watcher_handle_destroy);
2021 struct ds_tizen_event_policy_surface_get_subsurface_watcher event = {
2022 .policy_surface = policy_surface,
2023 .subsurface_watcher = subsurface_watcher,
2025 wl_signal_emit(&policy_surface->events.get_subsurface_watcher, &event);
2029 policy_handle_set_parent(struct wl_client *wl_client,
2030 struct wl_resource *resource, struct wl_resource *surface_resource,
2031 struct wl_resource *parent_surface_resource)
2033 struct ds_tizen_policy_surface *policy_surface;
2034 struct ds_surface *parent_surface;
2036 policy_surface = tizen_policy_client_get_surface(resource, surface_resource);
2037 if (policy_surface == NULL) {
2038 ds_err("tizen_policy_client_get_surface() failed.");
2039 wl_client_post_no_memory(wl_client);
2043 parent_surface = ds_surface_from_resource(parent_surface_resource);
2045 struct ds_tizen_event_policy_surface_set_parent event = {
2046 .policy_surface = policy_surface,
2047 .parent_surface = parent_surface,
2049 wl_signal_emit(&policy_surface->events.set_parent, &event);
2053 policy_handle_ack_conformant_region(struct wl_client *wl_client,
2054 struct wl_resource *resource, struct wl_resource *surface_resource,
2057 struct ds_tizen_policy_surface *policy_surface;
2059 policy_surface = tizen_policy_client_get_surface(resource, surface_resource);
2060 if (policy_surface == NULL) {
2061 ds_err("tizen_policy_client_get_surface() failed.");
2062 wl_client_post_no_memory(wl_client);
2066 struct ds_tizen_event_policy_surface_ack_conformant_region event = {
2067 .policy_surface = policy_surface,
2070 wl_signal_emit(&policy_surface->events.ack_conformant_region, &event);
2074 policy_handle_destroy(struct wl_client *wl_client, struct wl_resource *resource)
2076 struct ds_tizen_policy_client *client;
2078 client = wl_resource_get_user_data(resource);
2080 if (!wl_list_empty(&client->policy_surfaces)) {
2081 ds_err("tizen_policy was destroyed before children");
2085 wl_resource_destroy(resource);
2089 policy_handle_has_video(struct wl_client *wl_client,
2090 struct wl_resource *resource, struct wl_resource *surface_resource,
2093 struct ds_tizen_policy_surface *policy_surface;
2095 policy_surface = tizen_policy_client_get_surface(resource, surface_resource);
2096 if (policy_surface == NULL) {
2097 ds_err("tizen_policy_client_get_surface() failed.");
2098 wl_client_post_no_memory(wl_client);
2102 if (policy_surface->video == has)
2105 policy_surface->video = has;
2107 struct ds_tizen_event_policy_surface_set_video event = {
2108 .policy_surface = policy_surface,
2111 wl_signal_emit(&policy_surface->events.set_video, &event);
2115 policy_handle_set_appid(struct wl_client *wl_client,
2116 struct wl_resource *resource, int32_t pid, const char *appid)
2118 struct ds_tizen_policy_client *client;
2120 client = wl_resource_get_user_data(resource);
2122 struct ds_tizen_event_policy_set_appid event = {
2123 .policy = client->policy,
2127 wl_signal_emit(&client->policy->events.set_appid, &event);
2131 policy_handle_show(struct wl_client *wl_client, struct wl_resource *resource,
2132 struct wl_resource *surface_resource)
2134 struct ds_tizen_policy_surface *policy_surface;
2136 policy_surface = tizen_policy_client_get_surface(resource, surface_resource);
2137 if (policy_surface == NULL) {
2138 ds_err("tizen_policy_client_get_surface() failed.");
2139 wl_client_post_no_memory(wl_client);
2143 struct ds_tizen_event_policy_surface_show event = {
2144 .policy_surface = policy_surface,
2146 wl_signal_emit(&policy_surface->events.show, &event);
2150 policy_handle_hide(struct wl_client *wl_client, struct wl_resource *resource,
2151 struct wl_resource *surface_resource)
2153 struct ds_tizen_policy_surface *policy_surface;
2155 policy_surface = tizen_policy_client_get_surface(resource, surface_resource);
2156 if (policy_surface == NULL) {
2157 ds_err("tizen_policy_client_get_surface() failed.");
2158 wl_client_post_no_memory(wl_client);
2162 struct ds_tizen_event_policy_surface_hide event = {
2163 .policy_surface = policy_surface,
2165 wl_signal_emit(&policy_surface->events.hide, &event);
2169 policy_handle_set_transient_for_below(struct wl_client *wl_client,
2170 struct wl_resource *resource, uint32_t universal_id,
2171 uint32_t parent_universal_id)
2173 struct ds_tizen_policy_client *client;
2175 client = wl_resource_get_user_data(resource);
2177 struct ds_tizen_event_policy_set_transient_for_below event = {
2178 .policy = client->policy,
2179 .universal_id = universal_id,
2180 .parent_universal_id = parent_universal_id,
2182 wl_signal_emit(&client->policy->events.set_transient_for_below, &event);
2186 policy_handle_set_parent_with_below(struct wl_client *wl_client,
2187 struct wl_resource *resource, struct wl_resource *surface_resource,
2188 struct wl_resource *parent_surface_resource)
2190 struct ds_tizen_policy_surface *policy_surface;
2191 struct ds_surface *parent_surface;
2193 policy_surface = tizen_policy_client_get_surface(resource, surface_resource);
2194 if (policy_surface == NULL) {
2195 ds_err("tizen_policy_client_get_surface() failed.");
2196 wl_client_post_no_memory(wl_client);
2200 parent_surface = ds_surface_from_resource(parent_surface_resource);
2202 struct ds_tizen_event_policy_surface_set_parent_with_below event = {
2203 .policy_surface = policy_surface,
2204 .parent_surface = parent_surface,
2206 wl_signal_emit(&policy_surface->events.set_parent_with_below, &event);
2209 static const struct tizen_policy_interface policy_impl =
2211 policy_handle_get_visibility,
2212 policy_handle_get_position,
2213 policy_handle_activate,
2214 policy_handle_activate_below_by_res_id,
2215 policy_handle_raise,
2216 policy_handle_lower,
2217 policy_handle_lower_by_res_id,
2218 policy_handle_set_focus_skip,
2219 policy_handle_unset_focus_skip,
2220 policy_handle_set_role,
2221 policy_handle_set_type,
2222 policy_handle_set_conformant,
2223 policy_handle_unset_conformant,
2224 policy_handle_get_conformant,
2225 policy_handle_set_notification_level,
2226 policy_handle_set_transient_for,
2227 policy_handle_unset_transient_for,
2228 policy_handle_set_window_screen_mode,
2229 policy_handle_place_subsurface_below_parent,
2230 policy_handle_set_subsurface_stand_alone,
2231 policy_handle_get_subsurface,
2232 policy_handle_set_opaque_state,
2233 policy_handle_iconify,
2234 policy_handle_uniconify,
2235 policy_handle_add_aux_hint,
2236 policy_handle_change_aux_hint,
2237 policy_handle_delete_aux_hint,
2238 policy_handle_get_supported_aux_hints,
2239 policy_handle_set_background_state,
2240 policy_handle_unset_background_state,
2241 policy_handle_set_floating_mode,
2242 policy_handle_unset_floating_mode,
2243 policy_handle_set_stack_mode,
2244 policy_handle_activate_above_by_res_id,
2245 policy_handle_get_subsurface_watcher,
2246 policy_handle_set_parent,
2247 policy_handle_ack_conformant_region,
2248 policy_handle_destroy,
2249 policy_handle_has_video,
2250 policy_handle_set_appid,
2253 policy_handle_set_transient_for_below,
2254 policy_handle_set_parent_with_below,
2258 _tizen_policy_client_handle_destroy(struct wl_resource *resource)
2260 struct ds_tizen_policy_client *client;
2261 struct ds_tizen_policy_surface *policy_surface, *tmp;
2263 client = wl_resource_get_user_data(resource);
2265 ds_inf("_tizen_policy_client_handle_destroy (client:%p)", client);
2267 wl_list_for_each_safe(policy_surface, tmp, &client->policy_surfaces, link) {
2268 wl_signal_emit(&policy_surface->events.destroy, policy_surface);
2269 wl_list_remove(&policy_surface->link);
2270 free(policy_surface);
2273 wl_list_remove(&client->link);
2278 policy_bind(struct wl_client *wl_client, void *data, uint32_t version,
2281 struct ds_tizen_policy *policy = data;
2282 struct ds_tizen_policy_client *client;
2284 client = calloc(1, sizeof *client);
2285 if (client == NULL) {
2286 ds_err("calloc() failed. tizen_policy");
2287 wl_client_post_no_memory(wl_client);
2291 ds_inf("tizen_policy_client binds. (client:%p)", client);
2293 client->policy = policy;
2294 client->wl_client = wl_client;
2295 wl_client_get_credentials(client->wl_client, &client->pid, &client->uid, NULL);
2297 wl_list_init(&client->policy_surfaces);
2299 client->resource = wl_resource_create(wl_client, &tizen_policy_interface,
2300 MIN(version, TIZEN_POLICY_VERSION), id);
2302 if (client->resource == NULL) {
2303 ds_err("tizen_policy : wl_resource_create() failed.");
2305 wl_client_post_no_memory(wl_client);
2309 wl_resource_set_implementation(client->resource, &policy_impl, client,
2310 _tizen_policy_client_handle_destroy);
2312 wl_list_insert(&policy->clients, &client->link);