change wl_signal_emit_mutable into wl_signal_emit
[platform/core/uifw/libds-tizen.git] / examples / tinyds-policy.c
1 #include <libds-tizen/policy.h>
2
3 #include "tinyds-common.h"
4 #include "tinyds-policy.h"
5
6 struct tinyds_policy
7 {
8     policy_free_cb free_cb;
9     void *data;
10
11     struct ds_tizen_policy *policy;
12
13     struct wl_listener destroy;
14     struct wl_listener new_surface;
15     struct wl_listener activate_below_by_univeral_id;
16     struct wl_listener lower_by_universal_id;
17     struct wl_listener set_transient_for;
18     struct wl_listener unset_transient_for;
19     struct wl_listener place_subsurface_below_parent;
20     struct wl_listener set_subsurface_stand_alone;
21     struct wl_listener set_background_state;
22     struct wl_listener unset_background_state;
23     struct wl_listener add_activate_above_by_universal_id;
24     struct wl_listener set_appid;
25     struct wl_listener set_transient_for_below;
26
27     struct wl_list policy_surfaces;
28 };
29
30 struct tinyds_policy_surface
31 {
32     struct ds_tizen_policy_surface *policy_surface;
33
34     struct wl_listener destroy;
35     struct wl_listener new_visibility;
36     struct wl_listener new_position;
37     struct wl_listener activate;
38     struct wl_listener raise;
39     struct wl_listener lower;
40     struct wl_listener set_focus_skip;
41     struct wl_listener unset_focus_skip;
42     struct wl_listener set_role;
43     struct wl_listener set_window_type;
44     struct wl_listener set_conformant;
45     struct wl_listener unset_conformant;
46     struct wl_listener get_conformant;
47     struct wl_listener set_notification_level;
48     struct wl_listener set_window_screen_mode;
49     struct wl_listener get_subsurface;
50     struct wl_listener iconify;
51     struct wl_listener uniconify;
52     struct wl_listener add_aux_hint;
53     struct wl_listener change_aux_hint;
54     struct wl_listener delete_aux_hint;
55     struct wl_listener get_supported_aux_hints;
56     struct wl_listener set_floating_mode;
57     struct wl_listener unset_floating_mode;
58     struct wl_listener set_stack_mode;
59     struct wl_listener new_subsurface_watcher;
60     struct wl_listener set_parent;
61     struct wl_listener ack_conformant_region;
62     struct wl_listener set_video;
63     struct wl_listener show;
64     struct wl_listener hide;
65     struct wl_listener set_parent_with_below;
66
67     struct wl_list visibilities;
68     struct wl_list positions;
69     struct wl_list subsurface_watchers;
70
71     struct wl_list link; //tinyds_policy::policy_surfaces
72 };
73
74 struct tinyds_policy_visibility
75 {
76     struct ds_tizen_policy_visibility *visibility;
77
78     struct wl_listener destroy;
79
80     struct wl_list link; //tinyds_policy::visibilities
81 };
82
83 struct tinyds_policy_position
84 {
85     struct ds_tizen_policy_position *position;
86
87     struct wl_listener destroy;
88     struct wl_listener set;
89
90     struct wl_list link; //tinyds_policy::positions
91 };
92
93 struct tinyds_policy_subsurface_watcher
94 {
95     struct ds_tizen_policy_subsurface_watcher *subsurface_watcher;
96
97     struct wl_listener destroy;
98
99     struct wl_list link; //tinyds_policy::subsurface_watchers
100 };
101
102
103 static void
104 visibility_handle_destroy(struct wl_listener *listener, void *data)
105 {
106     struct tinyds_policy_visibility *visibility;
107
108     visibility = wl_container_of(listener, visibility, destroy);
109
110     ds_inf("Policy Visibility(%p) destroy", visibility);
111
112     wl_list_remove(&visibility->destroy.link);
113     wl_list_remove(&visibility->link);
114     free(visibility);
115 }
116
117 static void
118 position_handle_destroy(struct wl_listener *listener, void *data)
119 {
120     struct tinyds_policy_position *position;
121
122     position = wl_container_of(listener, position, destroy);
123
124     ds_inf("Policy Position(%p) destroy", position);
125
126     wl_list_remove(&position->destroy.link);
127     wl_list_remove(&position->set.link);
128     wl_list_remove(&position->link);
129     free(position);
130 }
131
132 static void
133 position_handle_set(struct wl_listener *listener, void *data)
134 {
135     struct tinyds_policy_position *position;
136
137     position = wl_container_of(listener, position, set);
138
139     ds_inf("Policy Position(%p) set", position);
140
141     // TODO:
142 }
143
144 static void
145 subsurface_watcher_handle_destroy(struct wl_listener *listener, void *data)
146 {
147     struct tinyds_policy_subsurface_watcher *subsurface_watcher;
148
149     subsurface_watcher = wl_container_of(listener, subsurface_watcher, destroy);
150
151     ds_inf("Policy Subsurface_Watcher(%p) destroy", subsurface_watcher);
152
153     wl_list_remove(&subsurface_watcher->destroy.link);
154     wl_list_remove(&subsurface_watcher->link);
155     free(subsurface_watcher);
156 }
157
158 static void
159 policy_surface_handle_destroy(struct wl_listener *listener, void *data)
160 {
161     struct tinyds_policy_surface *policy_surface;
162
163     policy_surface = wl_container_of(listener, policy_surface, destroy);
164
165     ds_inf("Policy Info(%p) destroy", policy_surface);
166
167     wl_list_remove(&policy_surface->destroy.link);
168     wl_list_remove(&policy_surface->new_visibility.link);
169     wl_list_remove(&policy_surface->new_position.link);
170     wl_list_remove(&policy_surface->activate.link);
171     wl_list_remove(&policy_surface->raise.link);
172     wl_list_remove(&policy_surface->lower.link);
173     wl_list_remove(&policy_surface->set_focus_skip.link);
174     wl_list_remove(&policy_surface->unset_focus_skip.link);
175     wl_list_remove(&policy_surface->set_role.link);
176     wl_list_remove(&policy_surface->set_window_type.link);
177     wl_list_remove(&policy_surface->set_conformant.link);
178     wl_list_remove(&policy_surface->unset_conformant.link);
179     wl_list_remove(&policy_surface->get_conformant.link);
180     wl_list_remove(&policy_surface->set_notification_level.link);
181     wl_list_remove(&policy_surface->set_window_screen_mode.link);
182     wl_list_remove(&policy_surface->get_subsurface.link);
183     wl_list_remove(&policy_surface->iconify.link);
184     wl_list_remove(&policy_surface->uniconify.link);
185     wl_list_remove(&policy_surface->add_aux_hint.link);
186     wl_list_remove(&policy_surface->change_aux_hint.link);
187     wl_list_remove(&policy_surface->delete_aux_hint.link);
188     wl_list_remove(&policy_surface->get_supported_aux_hints.link);
189     wl_list_remove(&policy_surface->set_floating_mode.link);
190     wl_list_remove(&policy_surface->unset_floating_mode.link);
191     wl_list_remove(&policy_surface->set_stack_mode.link);
192     wl_list_remove(&policy_surface->new_subsurface_watcher.link);
193     wl_list_remove(&policy_surface->set_parent.link);
194     wl_list_remove(&policy_surface->ack_conformant_region.link);
195     wl_list_remove(&policy_surface->set_video.link);
196     wl_list_remove(&policy_surface->show.link);
197     wl_list_remove(&policy_surface->hide.link);
198     wl_list_remove(&policy_surface->set_parent_with_below.link);
199     wl_list_remove(&policy_surface->link);
200     free(policy_surface);
201 }
202
203 static void
204 policy_surface_handle_new_visibility(struct wl_listener *listener, void *data)
205 {
206     struct tinyds_policy_surface *policy_surface;
207     struct tinyds_policy_visibility *visibility;
208     struct ds_tizen_policy_surface_event_new_visibility *event;
209
210     policy_surface = wl_container_of(listener, policy_surface, new_visibility);
211     event = (struct ds_tizen_policy_surface_event_new_visibility *)data;
212
213     ds_inf("Policy Info(%p) new_visibility", policy_surface);
214
215     visibility = calloc(1, sizeof *visibility);
216     if (!visibility)
217         return;
218
219     visibility->visibility = event->visibility;
220
221     visibility->destroy.notify = visibility_handle_destroy;
222     ds_tizen_policy_visibility_add_destroy_listener(visibility->visibility,
223         &visibility->destroy);
224
225     wl_list_insert(&policy_surface->visibilities, &visibility->link);
226 }
227
228 static void
229 policy_surface_handle_new_position(struct wl_listener *listener, void *data)
230 {
231     struct tinyds_policy_surface *policy_surface;
232     struct tinyds_policy_position *position;
233     struct ds_tizen_policy_surface_event_new_position *event;
234
235     policy_surface = wl_container_of(listener, policy_surface, new_position);
236     event = (struct ds_tizen_policy_surface_event_new_position *)data;
237
238     ds_inf("Policy Info(%p) new_position", policy_surface);
239
240     position = calloc(1, sizeof *position);
241     if (!position)
242         return;
243
244     position->position = event->position;
245
246     position->destroy.notify = position_handle_destroy;
247     ds_tizen_policy_position_add_destroy_listener(position->position,
248         &position->destroy);
249
250     position->set.notify = position_handle_set;
251     ds_tizen_policy_position_add_set_listener(position->position,
252         &position->set);
253
254     wl_list_insert(&policy_surface->positions, &position->link);
255 }
256
257 static void
258 policy_surface_handle_activate(struct wl_listener *listener, void *data)
259 {
260     struct tinyds_policy_surface *policy_surface;
261
262     policy_surface = wl_container_of(listener, policy_surface, activate);
263
264     ds_inf("Policy Info(%p) activate", policy_surface);
265
266     // TODO:
267 }
268
269 static void
270 policy_surface_handle_raise(struct wl_listener *listener, void *data)
271 {
272     struct tinyds_policy_surface *policy_surface;
273
274     policy_surface = wl_container_of(listener, policy_surface, raise);
275
276     ds_inf("Policy Info(%p) raise", policy_surface);
277
278     // TODO:
279 }
280
281 static void
282 policy_surface_handle_lower(struct wl_listener *listener, void *data)
283 {
284     struct tinyds_policy_surface *policy_surface;
285
286     policy_surface = wl_container_of(listener, policy_surface, raise);
287
288     ds_inf("Policy Info(%p) lower", policy_surface);
289
290     // TODO:
291 }
292
293 static void
294 policy_surface_handle_set_focus_skip(struct wl_listener *listener, void *data)
295 {
296     struct tinyds_policy_surface *policy_surface;
297
298     policy_surface = wl_container_of(listener, policy_surface, set_focus_skip);
299
300     ds_inf("Policy Info(%p) set_focus_skip", policy_surface);
301
302     // TODO:
303 }
304
305 static void
306 policy_surface_handle_unset_focus_skip(struct wl_listener *listener, void *data)
307 {
308     struct tinyds_policy_surface *policy_surface;
309
310     policy_surface = wl_container_of(listener, policy_surface, unset_focus_skip);
311
312     ds_inf("Policy Info(%p) unset_focus_skip", policy_surface);
313
314     // TODO:
315 }
316
317 static void
318 policy_surface_handle_set_role(struct wl_listener *listener, void *data)
319 {
320     struct tinyds_policy_surface *policy_surface;
321
322     policy_surface = wl_container_of(listener, policy_surface, set_role);
323
324     ds_inf("Policy Info(%p) set_role", policy_surface);
325
326     // TODO:
327 }
328
329 static void
330 policy_surface_handle_set_window_type(struct wl_listener *listener, void *data)
331 {
332     struct tinyds_policy_surface *policy_surface;
333
334     policy_surface = wl_container_of(listener, policy_surface, set_window_type);
335
336     ds_inf("Policy Info(%p) set_window_type", policy_surface);
337
338     // TODO:
339 }
340
341 static void
342 policy_surface_handle_set_conformant(struct wl_listener *listener, void *data)
343 {
344     struct tinyds_policy_surface *policy_surface;
345
346     policy_surface = wl_container_of(listener, policy_surface, set_conformant);
347
348     ds_inf("Policy Info(%p) set_conformant", policy_surface);
349
350     // TODO:
351 }
352
353 static void
354 policy_surface_handle_unset_conformant(struct wl_listener *listener, void *data)
355 {
356     struct tinyds_policy_surface *policy_surface;
357
358     policy_surface = wl_container_of(listener, policy_surface, unset_conformant);
359
360     ds_inf("Policy Info(%p) unset_conformant", policy_surface);
361
362     // TODO:
363 }
364
365 static void
366 policy_surface_handle_get_conformant(struct wl_listener *listener, void *data)
367 {
368     struct tinyds_policy_surface *policy_surface;
369
370     policy_surface = wl_container_of(listener, policy_surface, get_conformant);
371
372     ds_inf("Policy Info(%p) get_conformant", policy_surface);
373
374     // TODO:
375 }
376
377 static void
378 policy_surface_handle_set_notification_level(struct wl_listener *listener, void *data)
379 {
380     struct tinyds_policy_surface *policy_surface;
381
382     policy_surface = wl_container_of(listener, policy_surface, set_notification_level);
383
384     ds_inf("Policy Info(%p) set_notification_level", policy_surface);
385
386     // TODO:
387 }
388
389 static void
390 policy_surface_handle_set_window_screen_mode(struct wl_listener *listener, void *data)
391 {
392     struct tinyds_policy_surface *policy_surface;
393
394     policy_surface = wl_container_of(listener, policy_surface, set_window_screen_mode);
395
396     ds_inf("Policy Info(%p) set_window_screen_mode", policy_surface);
397
398     // TODO:
399 }
400
401 static void
402 policy_surface_handle_get_subsurface(struct wl_listener *listener, void *data)
403 {
404     struct tinyds_policy_surface *policy_surface;
405
406     policy_surface = wl_container_of(listener, policy_surface, get_subsurface);
407
408     ds_inf("Policy Info(%p) get_subsurface", policy_surface);
409
410     // TODO:
411 }
412
413 static void
414 policy_surface_handle_iconify(struct wl_listener *listener, void *data)
415 {
416     struct tinyds_policy_surface *policy_surface;
417
418     policy_surface = wl_container_of(listener, policy_surface, iconify);
419
420     ds_inf("Policy Info(%p) iconify", policy_surface);
421
422     // TODO:
423 }
424
425 static void
426 policy_surface_handle_uniconify(struct wl_listener *listener, void *data)
427 {
428     struct tinyds_policy_surface *policy_surface;
429
430     policy_surface = wl_container_of(listener, policy_surface, uniconify);
431
432     ds_inf("Policy Info(%p) uniconify", policy_surface);
433
434     // TODO:
435 }
436
437 static void
438 policy_surface_handle_add_aux_hint(struct wl_listener *listener, void *data)
439 {
440     struct tinyds_policy_surface *policy_surface;
441
442     policy_surface = wl_container_of(listener, policy_surface, add_aux_hint);
443
444     ds_inf("Policy Info(%p) add_aux_hint", policy_surface);
445
446     // TODO:
447 }
448
449 static void
450 policy_surface_handle_change_aux_hint(struct wl_listener *listener, void *data)
451 {
452     struct tinyds_policy_surface *policy_surface;
453
454     policy_surface = wl_container_of(listener, policy_surface, change_aux_hint);
455
456     ds_inf("Policy Info(%p) change_aux_hint", policy_surface);
457
458     // TODO:
459 }
460
461 static void
462 policy_surface_handle_delete_aux_hint(struct wl_listener *listener, void *data)
463 {
464     struct tinyds_policy_surface *policy_surface;
465
466     policy_surface = wl_container_of(listener, policy_surface, delete_aux_hint);
467
468     ds_inf("Policy Info(%p) delete_aux_hint", policy_surface);
469
470     // TODO:
471 }
472
473 static void
474 policy_surface_handle_get_supported_aux_hints(struct wl_listener *listener, void *data)
475 {
476     struct tinyds_policy_surface *policy_surface;
477
478     policy_surface = wl_container_of(listener, policy_surface, get_supported_aux_hints);
479
480     ds_inf("Policy Info(%p) get_supported_aux_hints", policy_surface);
481
482     // TODO:
483 }
484
485 static void
486 policy_surface_handle_set_floating_mode(struct wl_listener *listener, void *data)
487 {
488     struct tinyds_policy_surface *policy_surface;
489
490     policy_surface = wl_container_of(listener, policy_surface, set_floating_mode);
491
492     ds_inf("Policy Info(%p) set_floating_mode", policy_surface);
493
494     // TODO:
495 }
496
497 static void
498 policy_surface_handle_unset_floating_mode(struct wl_listener *listener, void *data)
499 {
500     struct tinyds_policy_surface *policy_surface;
501
502     policy_surface = wl_container_of(listener, policy_surface, unset_floating_mode);
503
504     ds_inf("Policy Info(%p) unset_floating_mode", policy_surface);
505
506     // TODO:
507 }
508
509 static void
510 policy_surface_handle_set_stack_mode(struct wl_listener *listener, void *data)
511 {
512     struct tinyds_policy_surface *policy_surface;
513
514     policy_surface = wl_container_of(listener, policy_surface, set_stack_mode);
515
516     ds_inf("Policy Info(%p) set_stack_mode", policy_surface);
517
518     // TODO:
519 }
520
521 static void
522 policy_surface_handle_new_subsurface_watcher(struct wl_listener *listener, void *data)
523 {
524     struct tinyds_policy_surface *policy_surface;
525     struct tinyds_policy_subsurface_watcher*subsurface_watcher;
526     struct ds_tizen_policy_surface_event_new_subsurface_watcher *event;
527
528     policy_surface = wl_container_of(listener, policy_surface, new_subsurface_watcher);
529     event = (struct ds_tizen_policy_surface_event_new_subsurface_watcher *)data;
530
531     ds_inf("Policy Info(%p) new_subsurface_watcher", policy_surface);
532
533     subsurface_watcher = calloc(1, sizeof *subsurface_watcher);
534     if (!subsurface_watcher)
535         return;
536
537     subsurface_watcher->subsurface_watcher = event->subsurface_watcher;
538
539     subsurface_watcher->destroy.notify = subsurface_watcher_handle_destroy;
540     ds_tizen_policy_subsurface_watcher_add_destroy_listener(subsurface_watcher->subsurface_watcher,
541         &subsurface_watcher->destroy);
542
543     wl_list_insert(&policy_surface->subsurface_watchers, &subsurface_watcher->link);
544 }
545
546 static void
547 policy_surface_handle_set_parent(struct wl_listener *listener, void *data)
548 {
549     struct tinyds_policy_surface *policy_surface;
550
551     policy_surface = wl_container_of(listener, policy_surface, set_parent);
552
553     ds_inf("Policy Info(%p) set_parent", policy_surface);
554
555     // TODO:
556 }
557
558 static void
559 policy_surface_handle_ack_conformant_region(struct wl_listener *listener, void *data)
560 {
561     struct tinyds_policy_surface *policy_surface;
562
563     policy_surface = wl_container_of(listener, policy_surface, ack_conformant_region);
564
565     ds_inf("Policy Info(%p) ack_conformant_region", policy_surface);
566
567     // TODO:
568 }
569
570 static void
571 policy_surface_handle_set_video(struct wl_listener *listener, void *data)
572 {
573     struct tinyds_policy_surface *policy_surface;
574
575     policy_surface = wl_container_of(listener, policy_surface, set_video);
576
577     ds_inf("Policy Info(%p) set_video", policy_surface);
578
579     // TODO:
580 }
581
582 static void
583 policy_surface_handle_show(struct wl_listener *listener, void *data)
584 {
585     struct tinyds_policy_surface *policy_surface;
586
587     policy_surface = wl_container_of(listener, policy_surface, show);
588
589     ds_inf("Policy Info(%p) show", policy_surface);
590
591     // TODO:
592 }
593
594 static void
595 policy_surface_handle_hide(struct wl_listener *listener, void *data)
596 {
597     struct tinyds_policy_surface *policy_surface;
598
599     policy_surface = wl_container_of(listener, policy_surface, hide);
600
601     ds_inf("Policy Info(%p) hide", policy_surface);
602
603     // TODO:
604 }
605
606 static void
607 policy_surface_handle_set_parent_with_below(struct wl_listener *listener, void *data)
608 {
609     struct tinyds_policy_surface *policy_surface;
610
611     policy_surface = wl_container_of(listener, policy_surface, set_parent_with_below);
612
613     ds_inf("Policy Info(%p) set_parent_with_below", policy_surface);
614
615     // TODO:
616 }
617
618 static void
619 policy_handle_destroy(struct wl_listener *listener, void *data)
620 {
621     struct tinyds_policy *policy;
622
623     policy = wl_container_of(listener, policy, destroy);
624
625     ds_inf("Policy(%p) destroy", policy);
626
627     policy->free_cb(data);
628
629     wl_list_remove(&policy->destroy.link);
630     wl_list_remove(&policy->new_surface.link);
631     wl_list_remove(&policy->activate_below_by_univeral_id.link);
632     wl_list_remove(&policy->lower_by_universal_id.link);
633     wl_list_remove(&policy->set_transient_for.link);
634     wl_list_remove(&policy->unset_transient_for.link);
635     wl_list_remove(&policy->place_subsurface_below_parent.link);
636     wl_list_remove(&policy->set_subsurface_stand_alone.link);
637     wl_list_remove(&policy->set_background_state.link);
638     wl_list_remove(&policy->unset_background_state.link);
639     wl_list_remove(&policy->add_activate_above_by_universal_id.link);
640     wl_list_remove(&policy->set_appid.link);
641     wl_list_remove(&policy->set_transient_for_below.link);
642
643     free(policy);
644 }
645
646 static void
647 policy_handle_new_surface(struct wl_listener *listener, void *data)
648 {
649     struct tinyds_policy *policy;
650     struct tinyds_policy_surface *policy_surface;
651     struct ds_tizen_policy_event_new_surface *event;
652
653     policy = wl_container_of(listener, policy, new_surface);
654     event = (struct ds_tizen_policy_event_new_surface *)data;
655
656     ds_inf("Policy(%p) new_surface", policy);
657
658     policy_surface = calloc(1, sizeof *policy_surface);
659     if (!policy_surface)
660         return;
661
662     policy_surface->policy_surface = event->policy_surface;
663
664     policy_surface->destroy.notify = policy_surface_handle_destroy;
665     ds_tizen_policy_surface_add_destroy_listener(policy_surface->policy_surface,
666         &policy_surface->destroy);
667
668     policy_surface->new_visibility.notify = policy_surface_handle_new_visibility;
669     ds_tizen_policy_surface_add_new_visibility_listener(policy_surface->policy_surface,
670         &policy_surface->new_visibility);
671
672     policy_surface->new_position.notify = policy_surface_handle_new_position;
673     ds_tizen_policy_surface_add_new_position_listener(policy_surface->policy_surface,
674         &policy_surface->new_position);
675
676     policy_surface->activate.notify = policy_surface_handle_activate;
677     ds_tizen_policy_surface_add_activate_listener(policy_surface->policy_surface,
678         &policy_surface->activate);
679
680     policy_surface->raise.notify = policy_surface_handle_raise;
681     ds_tizen_policy_surface_add_raise_listener(policy_surface->policy_surface,
682         &policy_surface->raise);
683
684     policy_surface->lower.notify = policy_surface_handle_lower;
685     ds_tizen_policy_surface_add_lower_listener(policy_surface->policy_surface,
686         &policy_surface->lower);
687
688     policy_surface->set_focus_skip.notify = policy_surface_handle_set_focus_skip;
689     ds_tizen_policy_surface_add_set_focus_skip_listener(policy_surface->policy_surface,
690         &policy_surface->set_focus_skip);
691
692     policy_surface->unset_focus_skip.notify = policy_surface_handle_unset_focus_skip;
693     ds_tizen_policy_surface_add_unset_focus_skip_listener(policy_surface->policy_surface,
694         &policy_surface->unset_focus_skip);
695
696     policy_surface->set_role.notify = policy_surface_handle_set_role;
697     ds_tizen_policy_surface_add_set_role_listener(policy_surface->policy_surface,
698         &policy_surface->set_role);
699
700     policy_surface->set_window_type.notify = policy_surface_handle_set_window_type;
701     ds_tizen_policy_surface_add_set_window_type_listener(policy_surface->policy_surface,
702         &policy_surface->set_window_type);
703
704     policy_surface->set_conformant.notify = policy_surface_handle_set_conformant;
705     ds_tizen_policy_surface_add_set_conformant_listener(policy_surface->policy_surface,
706         &policy_surface->set_conformant);
707
708     policy_surface->unset_conformant.notify = policy_surface_handle_unset_conformant;
709     ds_tizen_policy_surface_add_unset_conformant_listener(policy_surface->policy_surface,
710         &policy_surface->unset_conformant);
711
712     policy_surface->get_conformant.notify = policy_surface_handle_get_conformant;
713     ds_tizen_policy_surface_add_get_conformant_listener(policy_surface->policy_surface,
714         &policy_surface->get_conformant);
715
716     policy_surface->set_notification_level.notify =
717         policy_surface_handle_set_notification_level;
718     ds_tizen_policy_surface_add_set_notification_level_listener(
719             policy_surface->policy_surface, &policy_surface->set_notification_level);
720
721     policy_surface->set_window_screen_mode.notify =
722         policy_surface_handle_set_window_screen_mode;
723     ds_tizen_policy_surface_add_set_window_screen_mode_listener(
724         policy_surface->policy_surface, &policy_surface->set_window_screen_mode);
725
726     policy_surface->get_subsurface.notify = policy_surface_handle_get_subsurface;
727     ds_tizen_policy_surface_add_get_subsurface_listener(policy_surface->policy_surface,
728         &policy_surface->get_subsurface);
729
730     policy_surface->iconify.notify = policy_surface_handle_iconify;
731     ds_tizen_policy_surface_add_iconify_listener(policy_surface->policy_surface,
732         &policy_surface->iconify);
733
734     policy_surface->uniconify.notify = policy_surface_handle_uniconify;
735     ds_tizen_policy_surface_add_uniconify_listener(policy_surface->policy_surface,
736         &policy_surface->uniconify);
737
738     policy_surface->add_aux_hint.notify = policy_surface_handle_add_aux_hint;
739     ds_tizen_policy_surface_add_add_aux_hint_listener(policy_surface->policy_surface,
740         &policy_surface->add_aux_hint);
741
742     policy_surface->change_aux_hint.notify = policy_surface_handle_change_aux_hint;
743     ds_tizen_policy_surface_add_change_aux_hint_listener(policy_surface->policy_surface,
744         &policy_surface->change_aux_hint);
745
746     policy_surface->delete_aux_hint.notify = policy_surface_handle_delete_aux_hint;
747     ds_tizen_policy_surface_add_delete_aux_hint_listener(policy_surface->policy_surface,
748         &policy_surface->delete_aux_hint);
749
750     policy_surface->get_supported_aux_hints.notify =
751         policy_surface_handle_get_supported_aux_hints;
752     ds_tizen_policy_surface_add_get_supported_aux_hints_listener(
753         policy_surface->policy_surface, &policy_surface->get_supported_aux_hints);
754
755     policy_surface->set_floating_mode.notify =
756         policy_surface_handle_set_floating_mode;
757     ds_tizen_policy_surface_add_set_floating_mode_listener(
758         policy_surface->policy_surface, &policy_surface->set_floating_mode);
759
760     policy_surface->unset_floating_mode.notify =
761         policy_surface_handle_unset_floating_mode;
762     ds_tizen_policy_surface_add_unset_floating_mode_listener(
763         policy_surface->policy_surface, &policy_surface->unset_floating_mode);
764
765     policy_surface->set_stack_mode.notify = policy_surface_handle_set_stack_mode;
766     ds_tizen_policy_surface_add_set_stack_mode_listener(policy_surface->policy_surface,
767         &policy_surface->set_stack_mode);
768
769     policy_surface->new_subsurface_watcher.notify =
770         policy_surface_handle_new_subsurface_watcher;
771     ds_tizen_policy_surface_add_new_subsurface_watcher_listener(
772         policy_surface->policy_surface, &policy_surface->new_subsurface_watcher);
773
774     policy_surface->set_parent.notify = policy_surface_handle_set_parent;
775     ds_tizen_policy_surface_add_set_parent_listener(policy_surface->policy_surface,
776         &policy_surface->set_parent);
777
778     policy_surface->ack_conformant_region.notify =
779         policy_surface_handle_ack_conformant_region;
780     ds_tizen_policy_surface_add_ack_conformant_region_listener(
781         policy_surface->policy_surface, &policy_surface->ack_conformant_region);
782
783     policy_surface->set_video.notify = policy_surface_handle_set_video;
784     ds_tizen_policy_surface_add_set_video_listener(policy_surface->policy_surface,
785         &policy_surface->set_video);
786
787     policy_surface->show.notify = policy_surface_handle_show;
788     ds_tizen_policy_surface_add_show_listener(policy_surface->policy_surface,
789         &policy_surface->show);
790
791     policy_surface->hide.notify = policy_surface_handle_hide;
792     ds_tizen_policy_surface_add_hide_listener(policy_surface->policy_surface,
793         &policy_surface->hide);
794
795     policy_surface->set_parent_with_below.notify =
796         policy_surface_handle_set_parent_with_below;
797     ds_tizen_policy_surface_add_set_parent_with_below_listener(
798             policy_surface->policy_surface, &policy_surface->set_parent_with_below);
799
800
801     wl_list_init(&policy_surface->visibilities);
802     wl_list_init(&policy_surface->positions);
803     wl_list_init(&policy_surface->subsurface_watchers);
804
805     wl_list_insert(&policy->policy_surfaces, &policy_surface->link);
806 }
807
808 static void
809 policy_handle_activate_below_by_univeral_id(struct wl_listener *listener, void *data)
810 {
811     struct tinyds_policy *policy;
812
813     policy = wl_container_of(listener, policy, activate_below_by_univeral_id);
814
815     ds_inf("Policy(%p) activate_below_by_univeral_id", policy);
816
817     // TODO:
818 }
819
820 static void
821 policy_handle_lower_by_universal_id(struct wl_listener *listener, void *data)
822 {
823     struct tinyds_policy *policy;
824
825     policy = wl_container_of(listener, policy, lower_by_universal_id);
826
827     ds_inf("Policy(%p) lower_by_universal_id", policy);
828
829     // TODO:
830 }
831
832 static void
833 policy_handle_set_transient_for(struct wl_listener *listener, void *data)
834 {
835     struct tinyds_policy *policy;
836
837     policy = wl_container_of(listener, policy, set_transient_for);
838
839     ds_inf("Policy(%p) set_transient_for", policy);
840
841     // TODO:
842 }
843
844 static void
845 policy_handle_unset_transient_for(struct wl_listener *listener, void *data)
846 {
847     struct tinyds_policy *policy;
848
849     policy = wl_container_of(listener, policy, unset_transient_for);
850
851     ds_inf("Policy(%p) unset_transient_for", policy);
852
853     // TODO:
854 }
855
856 static void
857 policy_handle_place_subsurface_below_parent(struct wl_listener *listener, void *data)
858 {
859     struct tinyds_policy *policy;
860
861     policy = wl_container_of(listener, policy, place_subsurface_below_parent);
862
863     ds_inf("Policy(%p) place_subsurface_below_parent", policy);
864
865     // TODO:
866 }
867
868 static void
869 policy_handle_set_subsurface_stand_alone(struct wl_listener *listener, void *data)
870 {
871     struct tinyds_policy *policy;
872
873     policy = wl_container_of(listener, policy, set_subsurface_stand_alone);
874
875     ds_inf("Policy(%p) set_subsurface_stand_alone", policy);
876
877     // TODO:
878 }
879
880 static void
881 policy_handle_set_background_state(struct wl_listener *listener, void *data)
882 {
883     struct tinyds_policy *policy;
884
885     policy = wl_container_of(listener, policy, set_background_state);
886
887     ds_inf("Policy(%p) set_background_state", policy);
888
889     // TODO:
890 }
891
892 static void
893 policy_handle_unset_background_state(struct wl_listener *listener, void *data)
894 {
895     struct tinyds_policy *policy;
896
897     policy = wl_container_of(listener, policy, unset_background_state);
898
899     ds_inf("Policy(%p) unset_background_state", policy);
900
901     // TODO:
902 }
903
904 static void
905 policy_handle_add_activate_above_by_universal_id(struct wl_listener *listener, void *data)
906 {
907     struct tinyds_policy *policy;
908
909     policy = wl_container_of(listener, policy, add_activate_above_by_universal_id);
910
911     ds_inf("Policy(%p) add_activate_above_by_universal_id", policy);
912
913     // TODO:
914 }
915
916 static void
917 policy_handle_set_appid(struct wl_listener *listener, void *data)
918 {
919     struct tinyds_policy *policy;
920
921     policy = wl_container_of(listener, policy, set_appid);
922
923     ds_inf("Policy(%p) set_appid", policy);
924
925     // TODO:
926 }
927
928 static void
929 policy_handle_set_transient_for_below(struct wl_listener *listener, void *data)
930 {
931     struct tinyds_policy *policy;
932
933     policy = wl_container_of(listener, policy, set_transient_for_below);
934
935     ds_inf("Policy(%p) set_transient_for_below", policy);
936
937     // TODO:
938 }
939
940 struct tinyds_policy *
941 tinyds_policy_init(struct wl_display *display, policy_free_cb free_cb,
942     void *data)
943 {
944     struct tinyds_policy *policy;
945
946     policy = calloc(1, sizeof *policy);
947     if (!policy)
948         return NULL;
949
950     policy->free_cb = free_cb;
951     data = data;
952
953     policy->policy = ds_tizen_policy_create(display);
954     if (!policy->policy) {
955         free(policy);
956         ds_err("Could not create ds_tizen_policy");
957         return NULL;
958     }
959
960     policy->destroy.notify = policy_handle_destroy;
961     ds_tizen_policy_add_destroy_listener(policy->policy, &policy->destroy);
962
963     policy->new_surface.notify = policy_handle_new_surface;
964     ds_tizen_policy_add_new_surface_listener(policy->policy, &policy->new_surface);
965
966     policy->activate_below_by_univeral_id.notify =
967         policy_handle_activate_below_by_univeral_id;
968     ds_tizen_policy_add_activate_below_by_univeral_id_listener(policy->policy,
969         &policy->activate_below_by_univeral_id);
970
971     policy->lower_by_universal_id.notify = policy_handle_lower_by_universal_id;
972     ds_tizen_policy_add_lower_by_universal_id_listener(policy->policy,
973         &policy->lower_by_universal_id);
974
975     policy->set_transient_for.notify = policy_handle_set_transient_for;
976     ds_tizen_policy_add_set_transient_for_listener(policy->policy,
977         &policy->set_transient_for);
978
979     policy->unset_transient_for.notify = policy_handle_unset_transient_for;
980     ds_tizen_policy_add_unset_transient_for_listener(policy->policy,
981         &policy->unset_transient_for);
982
983     policy->place_subsurface_below_parent.notify =
984         policy_handle_place_subsurface_below_parent;
985     ds_tizen_policy_add_place_subsurface_below_parent_listener(policy->policy,
986         &policy->place_subsurface_below_parent);
987
988     policy->set_subsurface_stand_alone.notify =
989         policy_handle_set_subsurface_stand_alone;
990     ds_tizen_policy_add_set_subsurface_stand_alone_listener(policy->policy,
991         &policy->set_subsurface_stand_alone);
992
993     policy->set_background_state.notify = policy_handle_set_background_state;
994     ds_tizen_policy_add_set_background_state_listener(policy->policy,
995         &policy->set_background_state);
996
997     policy->unset_background_state.notify = policy_handle_unset_background_state;
998     ds_tizen_policy_add_unset_background_state_listener(policy->policy,
999         &policy->unset_background_state);
1000
1001     policy->add_activate_above_by_universal_id.notify =
1002         policy_handle_add_activate_above_by_universal_id;
1003     ds_tizen_policy_add_activate_above_by_universal_id_listener(policy->policy,
1004         &policy->add_activate_above_by_universal_id);
1005
1006     policy->set_appid.notify = policy_handle_set_appid;
1007     ds_tizen_policy_add_set_appid_listener(policy->policy, &policy->set_appid);
1008
1009     policy->set_transient_for_below.notify =
1010         policy_handle_set_transient_for_below;
1011     ds_tizen_policy_add_set_transient_for_below_listener(policy->policy,
1012         &policy->set_transient_for_below);
1013
1014     wl_list_init(&policy->policy_surfaces);
1015
1016     ds_inf("Policy (%p) created", policy);
1017
1018     return policy;
1019 }