example: check if a input_method_context is null.
[platform/core/uifw/libds-tizen.git] / examples / tinyds-tdm.c
index eb542d0..a797ca2 100644 (file)
@@ -28,6 +28,9 @@
 #include <libds/interfaces/keyboard.h>
 #include <libds-tizen/launch.h>
 #include <libds-tizen/backend/tdm_output_hwc.h>
+#include <libds-tizen/input_method.h>
+#include <libds-tizen/text_input.h>
+#include <libds-tizen/policy.h>
 
 #define USE_TDM_BUFFER_QUEUE
 
@@ -82,6 +85,99 @@ struct tinyds_dpms
     struct wl_listener get_dpms;
 };
 
+struct tinyds_policy
+{
+    struct ds_tizen_policy *policy;
+
+    struct wl_listener destroy;
+    struct wl_listener new_surface;
+    struct wl_listener activate_below_by_univeral_id;
+    struct wl_listener lower_by_universal_id;
+    struct wl_listener set_transient_for;
+    struct wl_listener unset_transient_for;
+    struct wl_listener place_subsurface_below_parent;
+    struct wl_listener set_subsurface_stand_alone;
+    struct wl_listener set_background_state;
+    struct wl_listener unset_background_state;
+    struct wl_listener add_activate_above_by_universal_id;
+    struct wl_listener set_appid;
+    struct wl_listener set_transient_for_below;
+
+    struct wl_list policy_surfaces;
+};
+
+struct tinyds_policy_surface
+{
+    struct ds_tizen_policy_surface *policy_surface;
+
+    struct wl_listener destroy;
+    struct wl_listener new_visibility;
+    struct wl_listener new_position;
+    struct wl_listener activate;
+    struct wl_listener raise;
+    struct wl_listener lower;
+    struct wl_listener set_focus_skip;
+    struct wl_listener unset_focus_skip;
+    struct wl_listener set_role;
+    struct wl_listener set_window_type;
+    struct wl_listener set_conformant;
+    struct wl_listener unset_conformant;
+    struct wl_listener get_conformant;
+    struct wl_listener set_notification_level;
+    struct wl_listener set_window_screen_mode;
+    struct wl_listener get_subsurface;
+    struct wl_listener iconify;
+    struct wl_listener uniconify;
+    struct wl_listener add_aux_hint;
+    struct wl_listener change_aux_hint;
+    struct wl_listener delete_aux_hint;
+    struct wl_listener get_supported_aux_hints;
+    struct wl_listener set_floating_mode;
+    struct wl_listener unset_floating_mode;
+    struct wl_listener set_stack_mode;
+    struct wl_listener new_subsurface_watcher;
+    struct wl_listener set_parent;
+    struct wl_listener ack_conformant_region;
+    struct wl_listener set_video;
+    struct wl_listener show;
+    struct wl_listener hide;
+    struct wl_listener set_parent_with_below;
+
+    struct wl_list visibilities;
+    struct wl_list positions;
+    struct wl_list subsurface_watchers;
+
+    struct wl_list link; //tinyds_policy::policy_surfaces
+};
+
+struct tinyds_policy_visibility
+{
+    struct ds_tizen_policy_visibility *visibility;
+
+    struct wl_listener destroy;
+
+    struct wl_list link; //tinyds_policy::visibilities
+};
+
+struct tinyds_policy_position
+{
+    struct ds_tizen_policy_position *position;
+
+    struct wl_listener destroy;
+    struct wl_listener set;
+
+    struct wl_list link; //tinyds_policy::positions
+};
+
+struct tinyds_policy_subsurface_watcher
+{
+    struct ds_tizen_policy_subsurface_watcher *subsurface_watcher;
+
+    struct wl_listener destroy;
+
+    struct wl_list link; //tinyds_policy::subsurface_watchers
+};
+
 struct tinyds_server
 {
     struct ds_tbm_server *tbm_server;
@@ -101,6 +197,8 @@ struct tinyds_server
 
     struct tinyds_output *output;
     struct tinyds_dpms *dpms;
+    struct tinyds_policy *policy;
+
     struct wl_event_source *stdin_source;
 
     struct wl_list views;
@@ -118,6 +216,9 @@ struct tinyds_server
 
     struct wl_list keyboards;
     struct wl_list pointers;
+
+    struct tinyds_text_input *text_input;
+    struct tinyds_input_method *input_method;
 };
 
 struct tinyds_view
@@ -177,6 +278,67 @@ struct tinyds_touch
     struct wl_listener motion;
 };
 
+struct tinyds_text_input {
+    struct ds_tizen_text_input *input;
+    struct ds_tizen_text_input_manager *text_input_mgr;
+
+    struct tinyds_server *server;
+    struct ds_surface *surface;
+
+    struct wl_list input_methods;
+
+    struct wl_listener destroy;
+    struct wl_listener mgr_destroy;
+
+    struct wl_listener new_text_input;
+
+    struct wl_listener text_input_activate;
+    struct wl_listener text_input_deactivate;
+    struct wl_listener text_input_reset;
+    struct wl_listener text_input_set_content_type;
+    struct wl_listener text_input_invoke_action;
+    struct wl_listener text_input_commit_state;
+    struct wl_listener text_input_set_preferred_language;
+};
+
+struct tinyds_input_method {
+    struct ds_tizen_input_method *input_method;
+    struct ds_tizen_input_method_manager *input_method_mgr;
+
+    struct tinyds_server *server;
+    struct tinyds_text_input *input;
+    struct tinyds_input_method_context *context;
+
+    struct wl_list link;
+
+    struct wl_listener destroy;
+    struct wl_listener mgr_destroy;
+};
+
+struct tinyds_input_method_context {
+    struct ds_tizen_input_method_context *context;
+
+    struct tinyds_server *server;
+    struct tinyds_text_input *input;
+    struct tinyds_input_method *input_method;
+
+    struct wl_listener destroy;
+
+    struct wl_listener im_context_commit_string;
+    struct wl_listener im_context_preedit_string;
+    struct wl_listener im_context_preedit_styling;
+    struct wl_listener im_context_preedit_cursor;
+    struct wl_listener im_context_delete_surrounding_text;
+    struct wl_listener im_context_cursor_position;
+    struct wl_listener im_context_modifiers_map;
+    struct wl_listener im_context_keysym;
+    struct wl_listener im_context_grab_keyboard;
+    struct wl_listener im_context_key;
+    struct wl_listener im_context_modifiers;
+    struct wl_listener im_context_language;
+    struct wl_listener im_context_text_direction;
+};
+
 struct tinyds_server tinyds;
 
 static bool init_server(struct tinyds_server *server, struct wl_display *display);
@@ -210,11 +372,28 @@ static void server_add_pointer(struct tinyds_server *server,
         struct ds_input_device *dev);
 static void server_add_touch(struct tinyds_server *server,
         struct ds_input_device *dev);
-
+static bool new_policy(struct tinyds_server *server);
 static struct tinyds_view *
 server_view_at(struct tinyds_server *server, double lx, double ly,
         double *sx, double *sy);
 
+static bool add_new_text_input(struct tinyds_server *server);
+static bool add_new_input_method(struct tinyds_server *server);
+static bool add_new_input_method_context(
+        struct tinyds_input_method *input_method,
+        struct tinyds_text_input *text_input);
+
+static void text_input_mgr_handle_destroy(struct wl_listener *listener,
+        void *data TINYDS_UNUSED);
+static void text_input_mgr_handle_new_text_input(struct wl_listener *listener,
+        void *data TINYDS_UNUSED);
+
+static void input_method_mgr_handle_destroy(struct wl_listener *listener,
+        void *data TINYDS_UNUSED);
+
+static void input_method_handle_destroy(struct wl_listener *listener,
+        void *data TINYDS_UNUSED);
+
 int
 main(void)
 {
@@ -259,10 +438,16 @@ view_populate_pid(struct tinyds_view *view)
 {
     pid_t pid;
     struct wl_client *client = NULL;
-    struct ds_surface *surface = ds_xdg_surface_get_surface(view->xdg_surface);
+    struct ds_surface *surface;
+
+    surface = ds_xdg_surface_get_surface(view->xdg_surface);
+    if (!surface)
+        return;
+
+    client = wl_resource_get_client(ds_surface_get_wl_resource(surface));
+    if (!client)
+        return;
 
-    if (surface)
-        client = wl_resource_get_client(ds_surface_get_wl_resource(surface));
     wl_client_get_credentials(client, &pid, NULL, NULL);
 
     ds_inf("view pid(%u)", pid);
@@ -341,6 +526,8 @@ view_handle_surface_commit(struct wl_listener *listener,
 static void
 server_new_xdg_surface(struct wl_listener *listener, void *data)
 {
+    static unsigned int seedx = 1;
+    static unsigned int seedy = 43210;
     struct tinyds_server *server;
     struct tinyds_view *view;
     struct ds_xdg_surface *xdg_surface;
@@ -373,8 +560,8 @@ server_new_xdg_surface(struct wl_listener *listener, void *data)
             ds_xdg_surface_get_surface(xdg_surface),
             &view->surface_commit);
 
-    view->x = rand() % 1000;
-    view->y = rand() % 500;
+    view->x = rand_r(&seedx) % 1000;
+    view->y = rand_r(&seedy) % 500;
 
     view->hwc_window = ds_tdm_output_hwc_window_create(server->output->hwc);
     assert(view->hwc_window);
@@ -525,7 +712,7 @@ devicemgr_add_keymap_data(struct wl_list *list, const char *name, int keycode)
 
     data = calloc(1, sizeof *data);
     if (!data) {
-        ds_err("Failed to alloc memory\n");
+        ds_err("Failed to alloc memory");
         return;
     }
 
@@ -536,15 +723,14 @@ devicemgr_add_keymap_data(struct wl_list *list, const char *name, int keycode)
 }
 
 static void
-devicemgr_remove_keymap_data(struct wl_list *list, int keycode)
+devicemgr_cleanup_keymap_list(struct wl_list *list)
 {
     struct ds_tizen_input_devicemgr_keymap_data *data, *tmp;
 
     wl_list_for_each_safe(data, tmp, list, link) {
-        if (data->keycode == keycode) {
-            wl_list_remove(&data->link);
-            free(data);
-        }
+        wl_list_remove(&data->link);
+        free(data->name);
+        free(data);
     }
 }
 
@@ -565,10 +751,7 @@ devicemgr_set_keymap(struct ds_tizen_input_devicemgr *devicemgr)
     if (!res)
         ds_inf("Failed to set keymap");
 
-    devicemgr_remove_keymap_data(&keymap_list, 455);
-    devicemgr_remove_keymap_data(&keymap_list, 456);
-    devicemgr_remove_keymap_data(&keymap_list, 457);
-    devicemgr_remove_keymap_data(&keymap_list, 458);
+    devicemgr_cleanup_keymap_list(&keymap_list);
 }
 
 static void
@@ -775,6 +958,9 @@ init_server(struct tinyds_server *server, struct wl_display *display)
     if (!add_new_dpms(server))
         goto err;
 
+    if (!new_policy(server))
+        goto err;
+
     server->seat = ds_seat_create(display, "seat0" /* arbitrary name */);
     if (!server->seat)
         goto err;
@@ -783,6 +969,7 @@ init_server(struct tinyds_server *server, struct wl_display *display)
     server->devicemgr = ds_tizen_input_devicemgr_create(
             server->input_backend, server->seat);
     if (!server->devicemgr) {
+        ds_err("Could not create ds_tizen_input_devicemgr");
         goto err;
     }
 
@@ -817,6 +1004,12 @@ init_server(struct tinyds_server *server, struct wl_display *display)
     ds_tizen_launch_effect_add_new_splash_listener(server->effect,
             &server->new_splash);
 
+    if (!add_new_text_input(server))
+        goto err;
+
+    if (!add_new_input_method(server))
+        goto err;
+
     return true;
 
 err:
@@ -1407,12 +1600,16 @@ server_add_keyboard(struct tinyds_server *server, struct ds_input_device *dev)
     kbd->server = server;
 
     context = xkb_context_new(XKB_CONTEXT_NO_FLAGS);
+    if (!context)
+        goto err;
+
     keymap = xkb_keymap_new_from_names(context, NULL,
             XKB_KEYMAP_COMPILE_NO_FLAGS);
 
     if (!keymap) {
         ds_err("Failed to compile keymap");
         xkb_context_unref(context);
+        goto err;
     }
 
     ds_keyboard_set_keymap(ds_input_device_get_keyboard(dev), keymap);
@@ -1429,6 +1626,11 @@ server_add_keyboard(struct tinyds_server *server, struct ds_input_device *dev)
     wl_list_insert(&server->keyboards, &kbd->link);
 
     ds_inf("Keyboard(%p) added", kbd);
+
+    return;
+
+err:
+    free(kbd);
 }
 
 static struct tinyds_view *
@@ -1705,7 +1907,6 @@ server_add_pointer(struct tinyds_server *server, struct ds_input_device *dev)
     ds_inf("Pointer(%p) added", pointer);
 }
 
-
 static void
 output_schedule_commit_handle_idle_timer(void *data)
 {
@@ -1725,3 +1926,1517 @@ output_schedule_commit(struct tinyds_output *output)
     output->idle_commit =
         wl_event_loop_add_idle(ev, output_schedule_commit_handle_idle_timer, output);
 }
+
+static void
+text_input_mgr_handle_destroy(struct wl_listener *listener, void *data)
+{
+    struct tinyds_text_input *text_input;
+    struct tinyds_server *server;
+
+    ds_inf("text_input_mgr_handle_destroy");
+    text_input = wl_container_of(listener, text_input, mgr_destroy);
+
+    wl_list_remove(&text_input->mgr_destroy.link);
+    wl_list_remove(&text_input->destroy.link);
+
+    wl_list_remove(&text_input->new_text_input.link);
+
+    wl_list_remove(&text_input->text_input_activate.link);
+    wl_list_remove(&text_input->text_input_deactivate.link);
+    wl_list_remove(&text_input->text_input_reset.link);
+    wl_list_remove(&text_input->text_input_set_content_type.link);
+    wl_list_remove(&text_input->text_input_invoke_action.link);
+    wl_list_remove(&text_input->text_input_commit_state.link);
+    wl_list_remove(&text_input->text_input_set_preferred_language.link);
+
+    server = text_input->server;
+    server->text_input = NULL;
+
+    free(text_input);
+}
+
+static void
+text_input_handle_destroy(struct wl_listener *listener, void *data)
+{
+    struct tinyds_text_input *text_input;
+
+    ds_inf("text_input_handle_destroy");
+
+    text_input = wl_container_of(listener, text_input, destroy);
+
+    wl_list_remove(&text_input->destroy.link);
+}
+
+static void
+text_input_handle_activate(struct wl_listener *listener, void *data)
+{
+    struct tinyds_text_input *text_input;
+    struct tinyds_input_method *input_method;
+    struct ds_tizen_text_input_event_activate *event = data;
+
+    text_input = wl_container_of(listener, text_input, text_input_activate);
+
+    input_method = text_input->server->input_method;
+
+    ds_inf("text_input_handle_activate. text_input(%p) seat(%p) surface(%p) text_input(%p)",
+        text_input, event->seat, event->surface, event->text_input);
+
+    if (input_method->input == text_input)
+        return;
+    if (input_method->input)
+        ;//deactivate_input_method(server->input_method);
+    input_method->input = text_input;
+    wl_list_insert(&text_input->input_methods, &input_method->link);
+
+    text_input->surface = event->surface;
+
+    if (!add_new_input_method_context(input_method, text_input))
+        return;
+
+    // ds_tizen_input_method_send_set_text_input_id();
+}
+
+static void
+text_input_handle_deactivate(struct wl_listener *listener, void *data)
+{
+    struct tinyds_text_input *text_input;
+    struct tinyds_input_method *input_method, *tmp;
+    struct ds_tizen_text_input_event_deactivate *event = data;
+
+    text_input = wl_container_of(listener, text_input, text_input_deactivate);
+    ds_inf("text_input_handle_deactivate. text_input(%p) seat(%p) text_input(%p)",
+        text_input, event->seat, event->text_input);
+
+    wl_list_for_each_safe(input_method, tmp, &text_input->input_methods, link) {
+        if (!input_method->input_method || !input_method->context->context) continue;
+        ds_tizen_input_method_send_deactivate(input_method->input_method, input_method->context->context);
+        input_method->input = NULL;
+        input_method->context = NULL;
+        wl_list_remove(&input_method->link);
+    }
+
+    text_input->surface = NULL;
+    // ds_tizen_input_method_send_close_connection();
+}
+
+static void
+text_input_handle_reset(struct wl_listener *listener, void *data)
+{
+    struct tinyds_text_input *text_input;
+    struct tinyds_input_method *input_method;
+
+    text_input = wl_container_of(listener, text_input, text_input_reset);
+
+    ds_inf("text_input_handle_reset. text_input(%p)", text_input);
+
+    wl_list_for_each(input_method, &text_input->input_methods, link) {
+        if (!input_method->context || !input_method->context->context) continue;
+        ds_tizen_input_method_context_send_reset(input_method->context->context);
+    }
+}
+
+static void
+text_input_handle_set_content_type(struct wl_listener *listener, void *data)
+{
+    struct tinyds_text_input *text_input;
+    struct ds_tizen_text_input_event_set_content_type *event = data;
+    struct tinyds_input_method *input_method;
+
+    text_input = wl_container_of(listener, text_input, text_input_set_content_type);
+
+    ds_inf("text_input_handle_content_type. text_input(%p) hint(%u) purpose(%u)",
+        text_input, event->hint, event->purpose);
+
+    wl_list_for_each(input_method, &text_input->input_methods, link) {
+        if (!input_method->context || !input_method->context->context) continue;
+        ds_tizen_input_method_context_send_content_type(input_method->context->context,
+            event->hint, event->purpose);
+    }
+}
+
+static void
+text_input_handle_invoke_action(struct wl_listener *listener, void *data)
+{
+    struct tinyds_text_input *text_input;
+    struct ds_tizen_text_input_event_invoke_action *event = data;
+    struct tinyds_input_method *input_method;
+
+    text_input = wl_container_of(listener, text_input, text_input_invoke_action);
+
+    ds_inf("text_input_handle_invoke_action. text_input(%p) button(%u) index(%u)",
+        text_input, event->button, event->index);
+
+    wl_list_for_each(input_method, &text_input->input_methods, link) {
+        if (!input_method->context || !input_method->context->context) continue;
+        ds_tizen_input_method_context_send_invoke_action(input_method->context->context,
+            event->button, event->index);
+    }
+}
+
+static void
+text_input_handle_commit_state(struct wl_listener *listener, void *data)
+{
+    struct tinyds_text_input *text_input;
+    struct ds_tizen_text_input_event_commit_state *event = data;
+    struct tinyds_input_method *input_method;
+
+    text_input = wl_container_of(listener, text_input, text_input_commit_state);
+
+    ds_inf("text_input_handle_commit_state. text_input(%p) serial(%u)",
+        text_input, event->serial);
+
+    wl_list_for_each(input_method, &text_input->input_methods, link) {
+        if (!input_method->context || !input_method->context->context) continue;
+        ds_tizen_input_method_context_send_commit_state(input_method->context->context,
+            event->serial);
+    }
+}
+
+static void
+text_input_handle_set_preferred_language(struct wl_listener *listener, void *data)
+{
+    struct tinyds_text_input *text_input;
+    struct ds_tizen_text_input_event_set_preferred_language *event = data;
+    struct tinyds_input_method *input_method;
+
+    text_input = wl_container_of(listener, text_input, text_input_set_preferred_language);
+
+    ds_inf("text_input_handle_set_preferred_language. text_input(%p) language(%s)",
+        text_input, event->language);
+
+    wl_list_for_each(input_method, &text_input->input_methods, link) {
+        if (!input_method->context || !input_method->context->context) continue;
+        ds_tizen_input_method_context_send_preferred_language(input_method->context->context,
+            event->language);
+    }
+}
+
+static void
+text_input_mgr_handle_new_text_input(struct wl_listener *listener, void *data)
+{
+    struct tinyds_text_input *text_input;
+    struct ds_tizen_text_input *input = data;
+
+    text_input = wl_container_of(listener, text_input, new_text_input);
+
+    ds_inf("text_input_mgr_handle_new_text_input");
+
+    text_input->input = input;
+
+    text_input->destroy.notify = text_input_handle_destroy;
+    ds_tizen_text_input_add_destroy_listener(text_input->input,
+        &text_input->destroy);
+
+    text_input->text_input_activate.notify = text_input_handle_activate;
+    ds_tizen_text_input_add_activate_listener(text_input->input,
+        &text_input->text_input_activate);
+
+    text_input->text_input_deactivate.notify = text_input_handle_deactivate;
+    ds_tizen_text_input_add_deactivate_listener(text_input->input,
+        &text_input->text_input_deactivate);
+
+    text_input->text_input_reset.notify = text_input_handle_reset;
+    ds_tizen_text_input_add_reset_listener(text_input->input,
+        &text_input->text_input_reset);
+
+    text_input->text_input_set_content_type.notify = text_input_handle_set_content_type;
+    ds_tizen_text_input_add_set_content_type_listener(text_input->input,
+        &text_input->text_input_set_content_type);
+
+    text_input->text_input_invoke_action.notify = text_input_handle_invoke_action;
+    ds_tizen_text_input_add_invoke_action_listener(text_input->input,
+        &text_input->text_input_invoke_action);
+
+    text_input->text_input_commit_state.notify = text_input_handle_commit_state;
+    ds_tizen_text_input_add_commit_state_listener(text_input->input,
+        &text_input->text_input_commit_state);
+
+    text_input->text_input_set_preferred_language.notify = text_input_handle_set_preferred_language;
+    ds_tizen_text_input_add_set_preferred_language_listener(text_input->input,
+        &text_input->text_input_set_preferred_language);
+}
+
+static void
+input_method_mgr_handle_destroy(struct wl_listener *listener, void *data)
+{
+    struct tinyds_input_method *input_method;
+
+    ds_inf("input_method_mgr_handle_destroy");
+
+    input_method = wl_container_of(listener, input_method, mgr_destroy);
+
+    wl_list_remove(&input_method->mgr_destroy.link);
+}
+
+static void
+input_method_handle_destroy(struct wl_listener *listener, void *data)
+{
+    struct tinyds_input_method *input_method;
+    struct tinyds_server *server;
+
+    ds_inf("input_method_handle_destroy");
+
+    input_method = wl_container_of(listener, input_method, destroy);
+
+    wl_list_remove(&input_method->destroy.link);
+
+    server = input_method->server;
+    server->input_method = NULL;
+
+    free(input_method);
+}
+
+static void
+context_handle_destroy(struct wl_listener *listener, void *data)
+{
+    struct tinyds_input_method_context *context;
+    struct tinyds_server *server;
+
+    ds_inf("context_handle_destroy");
+
+    context = wl_container_of(listener, context, destroy);
+
+    wl_list_remove(&context->destroy.link);
+
+    wl_list_remove(&context->im_context_commit_string.link);
+    wl_list_remove(&context->im_context_preedit_string.link);
+    wl_list_remove(&context->im_context_preedit_styling.link);
+    wl_list_remove(&context->im_context_preedit_cursor.link);
+    wl_list_remove(&context->im_context_delete_surrounding_text.link);
+    wl_list_remove(&context->im_context_cursor_position.link);
+    wl_list_remove(&context->im_context_modifiers_map.link);
+    wl_list_remove(&context->im_context_keysym.link);
+    wl_list_remove(&context->im_context_grab_keyboard.link);
+    wl_list_remove(&context->im_context_key.link);
+    wl_list_remove(&context->im_context_modifiers.link);
+    wl_list_remove(&context->im_context_language.link);
+    wl_list_remove(&context->im_context_text_direction.link);
+
+    server = context->server;
+    server->input_method->context = NULL;
+
+    free(context);
+}
+
+static void
+context_handle_commit_string(struct wl_listener *listener, void *data)
+{
+    struct tinyds_text_input *text_input;
+    struct tinyds_input_method_context *context;
+    struct ds_tizen_input_method_context_event_commit_string *event = data;
+
+    context = wl_container_of(listener, context, im_context_commit_string);
+    text_input = context->server->text_input;
+
+    ds_inf("context_handle_commit_string. text_input(%p) serial(%u) text(%s)",
+        text_input, event->serial, event->text);
+
+    ds_tizen_text_input_send_commit_string(text_input->input, event->serial, event->text);
+}
+
+static void
+context_handle_preedit_string(struct wl_listener *listener, void *data)
+{
+    struct tinyds_input_method_context *context;
+    struct tinyds_text_input *text_input;
+    struct ds_tizen_input_method_context_event_preedit_string *event = data;
+
+    context = wl_container_of(listener, context, im_context_preedit_string);
+    text_input = context->server->text_input;
+
+    ds_inf("context_handle_preedit_string. text_input(%p) serial(%u) text(%s) commit(%s)",
+        text_input, event->serial, event->text, event->commit);
+
+    ds_tizen_text_input_send_preedit_string(text_input->input, event->serial, event->text, event->commit);
+}
+
+static void
+context_handle_preedit_styling(struct wl_listener *listener, void *data)
+{
+    struct tinyds_input_method_context *context;
+    struct tinyds_text_input *text_input;
+    struct ds_tizen_input_method_context_event_preedit_styling *event = data;
+
+    context = wl_container_of(listener, context, im_context_preedit_styling);
+    text_input = context->server->text_input;
+
+    ds_inf("context_handle_preedit_styling. text_input(%p) index(%u) length(%u) style(%u)",
+        text_input, event->index, event->length, event->style);
+
+    ds_tizen_text_input_send_preedit_styling(text_input->input, event->index, event->length, event->style);
+}
+
+static void
+context_handle_preedit_cursor(struct wl_listener *listener, void *data)
+{
+    struct tinyds_input_method_context *context;
+    struct tinyds_text_input *text_input;
+    struct ds_tizen_input_method_context_event_preedit_cursor *event = data;
+
+    context = wl_container_of(listener, context, im_context_preedit_cursor);
+    text_input = context->server->text_input;
+
+    ds_inf("context_handle_preedit_cursor. text_input(%p) index(%u)",
+        text_input, event->index);
+
+    ds_tizen_text_input_send_preedit_cursor(text_input->input, event->index);
+}
+
+static void
+context_handle_delete_surrounding_text(struct wl_listener *listener, void *data)
+{
+    struct tinyds_input_method_context *context;
+    struct tinyds_text_input *text_input;
+    struct ds_tizen_input_method_context_event_delete_surrounding_text *event = data;
+
+    context = wl_container_of(listener, context, im_context_delete_surrounding_text);
+    text_input = context->server->text_input;
+
+    ds_inf("context_handle_delete_surrounding_text. text_input(%p) index(%d) length(%u)",
+        text_input, event->index, event->length);
+
+    ds_tizen_text_input_send_delete_surrounding_text(text_input->input, event->index, event->length);
+}
+
+static void
+context_handle_cursor_position(struct wl_listener *listener, void *data)
+{
+    struct tinyds_input_method_context *context;
+    struct tinyds_text_input *text_input;
+    struct ds_tizen_input_method_context_event_cursor_position *event = data;
+
+    context = wl_container_of(listener, context, im_context_cursor_position);
+    text_input = context->server->text_input;
+
+    ds_inf("context_handle_cursor_position. text_input(%p) index(%d) length(%d)",
+        text_input, event->index, event->anchor);
+
+    ds_tizen_text_input_send_cursor_position(text_input->input, event->index, event->anchor);
+}
+
+static void
+context_handle_modifiers_map(struct wl_listener *listener, void *data)
+{
+    struct tinyds_input_method_context *context;
+    struct tinyds_text_input *text_input;
+    struct ds_tizen_input_method_context_event_modifiers_map *event = data;
+
+    context = wl_container_of(listener, context, im_context_modifiers_map);
+    text_input = context->server->text_input;
+
+    ds_inf("context_handle_modifiers_map. text_input(%p) map(%p)",
+        text_input, event->map);
+
+    ds_tizen_text_input_send_modifiers_map(text_input->input, event->map);
+}
+
+static void
+context_handle_keysym(struct wl_listener *listener, void *data)
+{
+    struct tinyds_input_method_context *context;
+    struct tinyds_text_input *text_input;
+    struct ds_tizen_input_method_context_event_keysym *event = data;
+
+    context = wl_container_of(listener, context, im_context_keysym);
+    text_input = context->server->text_input;
+
+    ds_inf("context_handle_keysym. text_input(%p) serial(%u) time(%u) sysm(%u) state(%u) modifiers(%u)",
+        text_input, event->serial, event->time, event->sym, event->state, event->modifiers);
+
+    ds_tizen_text_input_send_keysym(text_input->input, event->serial, event->time, event->sym, event->state, event->modifiers);
+}
+
+static void
+context_handle_grab_keyboard(struct wl_listener *listener, void *data)
+{
+    struct tinyds_input_method_context *context;
+    struct tinyds_text_input *text_input;
+
+    context = wl_container_of(listener, context, im_context_grab_keyboard);
+    text_input = context->server->text_input;
+
+    ds_inf("context_handle_grab_keyboard. text_input(%p)",
+        text_input);
+
+    //TODO
+}
+
+static void
+context_handle_key(struct wl_listener *listener, void *data)
+{
+    struct tinyds_input_method_context *context;
+    struct tinyds_text_input *text_input;
+
+    context = wl_container_of(listener, context, im_context_key);
+    text_input = context->server->text_input;
+
+    ds_inf("context_handle_key. text_input(%p)",
+        text_input);
+
+   //TODO
+}
+
+static void
+context_handle_modifiers(struct wl_listener *listener, void *data)
+{
+    struct tinyds_input_method_context *context;
+    struct tinyds_text_input *text_input;
+
+    context = wl_container_of(listener, context, im_context_modifiers);
+    text_input = context->server->text_input;
+
+    ds_inf("context_handle_modifiers. text_input(%p)",
+        text_input);
+
+   //TODO
+}
+
+static void
+context_handle_language(struct wl_listener *listener, void *data)
+{
+    struct tinyds_input_method_context *context;
+    struct tinyds_text_input *text_input;
+    struct ds_tizen_input_method_context_event_language *event = data;
+
+    context = wl_container_of(listener, context, im_context_language);
+    text_input = context->server->text_input;
+
+    ds_inf("context_handle_language. text_input(%p) serial(%u), language(%s)",
+        text_input, event->serial, event->language);
+
+    ds_tizen_text_input_send_language(text_input->input, event->serial, event->language);
+}
+
+static void
+context_handle_text_direction(struct wl_listener *listener, void *data)
+{
+    struct tinyds_input_method_context *context;
+    struct tinyds_text_input *text_input;
+    struct ds_tizen_input_method_context_event_text_direction *event = data;
+
+    context = wl_container_of(listener, context, im_context_text_direction);
+    text_input = context->server->text_input;
+
+    ds_inf("context_handle_text_direction. text_input(%p) serial(%u), direction(%u)",
+        text_input, event->serial, event->direction);
+
+    ds_tizen_text_input_send_text_direction(text_input->input, event->serial, event->direction);
+}
+
+static bool
+add_new_text_input(struct tinyds_server *server)
+{
+    struct tinyds_text_input *text_input;
+
+    text_input = calloc(1, sizeof *text_input);
+    if (!text_input)
+        return false;
+
+    text_input->text_input_mgr = ds_tizen_text_input_manager_create(server->display);
+    if (!text_input->text_input_mgr) {
+        free(text_input);
+        ds_err("Could not create ds_tizen_text_input_manager");
+        return false;
+    }
+
+    wl_list_init(&text_input->input_methods);
+
+    text_input->destroy.notify = text_input_mgr_handle_destroy;
+    ds_tizen_text_input_manager_add_destroy_listener(text_input->text_input_mgr,
+            &text_input->destroy);
+
+    text_input->new_text_input.notify = text_input_mgr_handle_new_text_input;
+    ds_tizen_text_input_manager_add_new_text_input_listener(text_input->text_input_mgr,
+            &text_input->new_text_input);
+
+    text_input->server = server;
+    server->text_input = text_input;
+
+    ds_inf("Text_Input (%p) added", text_input);
+
+    return true;
+}
+
+static bool
+add_new_input_method(struct tinyds_server *server)
+{
+    struct tinyds_input_method *input_method;
+
+    input_method = calloc(1, sizeof *input_method);
+    if (!input_method)
+        return false;
+
+    input_method->input_method = ds_tizen_input_method_create(server->display);
+    if (!input_method->input_method) {
+        free(input_method);
+        ds_err("Could not create ds_tizen_input_method");
+        return false;
+    }
+    input_method->destroy.notify = input_method_handle_destroy;
+    ds_tizen_input_method_add_destroy_listener(input_method->input_method,
+            &input_method->destroy);
+
+    input_method->input_method_mgr = ds_tizen_input_method_manager_create(server->display);
+    if (!input_method->input_method_mgr) {
+        free(input_method);
+        ds_err("Could not create ds_tizen_input_method_manager");
+        return false;
+    }
+
+    input_method->mgr_destroy.notify = input_method_mgr_handle_destroy;
+    ds_tizen_input_method_manager_add_destroy_listener(input_method->input_method_mgr,
+            &input_method->mgr_destroy);
+
+    input_method->server = server;
+    server->input_method = input_method;
+
+    ds_inf("Input_Method (%p) added", input_method);
+
+    return true;
+}
+
+static bool
+add_new_input_method_context(struct tinyds_input_method *input_method,
+        struct tinyds_text_input *text_input)
+{
+    struct tinyds_input_method_context *context;
+
+    context = calloc(1, sizeof *context);
+    if (context == NULL)
+    {
+        ds_err("calloc is failed. tinyds_input_method_context");
+        return false;
+    }
+    input_method->context = context;
+    context->input_method = input_method;
+    context->server = input_method->server;
+    context->input = text_input;
+
+    context->context = ds_tizen_input_method_create_context(input_method->input_method);
+    if (context->context == NULL) {
+        ds_err("ds_tizen_input_method_create_context() failed.");
+        return false;
+    }
+
+    context->destroy.notify = context_handle_destroy;
+    ds_tizen_input_method_context_add_destroy_listener(context->context,
+        &context->destroy);
+
+    context->im_context_commit_string.notify = context_handle_commit_string;
+    ds_tizen_input_method_context_add_commit_string_listener(context->context,
+        &context->im_context_commit_string);
+
+    context->im_context_preedit_string.notify = context_handle_preedit_string;
+    ds_tizen_input_method_context_add_preedit_string_listener(context->context,
+        &context->im_context_preedit_string);
+
+    context->im_context_preedit_styling.notify = context_handle_preedit_styling;
+    ds_tizen_input_method_context_add_preedit_styling_listener(context->context,
+        &context->im_context_preedit_styling);
+
+    context->im_context_preedit_cursor.notify = context_handle_preedit_cursor;
+    ds_tizen_input_method_context_add_preedit_cursor_listener(context->context,
+        &context->im_context_preedit_cursor);
+
+    context->im_context_delete_surrounding_text.notify = context_handle_delete_surrounding_text;
+    ds_tizen_input_method_context_add_delete_surrounding_text_listener(context->context,
+        &context->im_context_delete_surrounding_text);
+
+    context->im_context_cursor_position.notify = context_handle_cursor_position;
+    ds_tizen_input_method_context_add_cursor_position_listener(context->context,
+        &context->im_context_cursor_position);
+
+    context->im_context_modifiers_map.notify = context_handle_modifiers_map;
+    ds_tizen_input_method_context_add_modifiers_map_listener(context->context,
+        &context->im_context_modifiers_map);
+
+    context->im_context_keysym.notify = context_handle_keysym;
+    ds_tizen_input_method_context_add_keysym_listener(context->context,
+        &context->im_context_keysym);
+
+    context->im_context_grab_keyboard.notify = context_handle_grab_keyboard;
+    ds_tizen_input_method_context_add_grab_keyboard_listener(context->context,
+        &context->im_context_grab_keyboard);
+
+    context->im_context_key.notify = context_handle_key;
+    ds_tizen_input_method_context_add_key_listener(context->context,
+        &context->im_context_key);
+
+    context->im_context_modifiers.notify = context_handle_modifiers;
+    ds_tizen_input_method_context_add_modifiers_listener(context->context,
+        &context->im_context_modifiers);
+
+    context->im_context_language.notify = context_handle_language;
+    ds_tizen_input_method_context_add_language_listener(context->context,
+        &context->im_context_language);
+
+    context->im_context_text_direction.notify = context_handle_text_direction;
+    ds_tizen_input_method_context_add_text_direction_listener(context->context,
+        &context->im_context_text_direction);
+
+    return true;
+}
+
+static void
+visibility_handle_destroy(struct wl_listener *listener, void *data)
+{
+    struct tinyds_policy_visibility *visibility;
+
+    visibility = wl_container_of(listener, visibility, destroy);
+
+    ds_inf("Policy Visibility(%p) destroy", visibility);
+
+    wl_list_remove(&visibility->link);
+    free(visibility);
+}
+
+static void
+position_handle_destroy(struct wl_listener *listener, void *data)
+{
+    struct tinyds_policy_position *position;
+
+    position = wl_container_of(listener, position, destroy);
+
+    ds_inf("Policy Position(%p) destroy", position);
+
+    wl_list_remove(&position->link);
+    free(position);
+}
+
+static void
+position_handle_set(struct wl_listener *listener, void *data)
+{
+    struct tinyds_policy_position *position;
+
+    position = wl_container_of(listener, position, set);
+
+    ds_inf("Policy Position(%p) set", position);
+
+    // TODO:
+}
+
+static void
+subsurface_watcher_handle_destroy(struct wl_listener *listener, void *data)
+{
+    struct tinyds_policy_subsurface_watcher *subsurface_watcher;
+
+    subsurface_watcher = wl_container_of(listener, subsurface_watcher, destroy);
+
+    ds_inf("Policy Subsurface_Watcher(%p) destroy", subsurface_watcher);
+
+    wl_list_remove(&subsurface_watcher->link);
+    free(subsurface_watcher);
+}
+
+static void
+policy_surface_handle_destroy(struct wl_listener *listener, void *data)
+{
+    struct tinyds_policy_surface *policy_surface;
+
+    policy_surface = wl_container_of(listener, policy_surface, destroy);
+
+    ds_inf("Policy Info(%p) destroy", policy_surface);
+
+    wl_list_remove(&policy_surface->link);
+    free(policy_surface);
+}
+
+static void
+policy_surface_handle_new_visibility(struct wl_listener *listener, void *data)
+{
+    struct tinyds_policy_surface *policy_surface;
+    struct tinyds_policy_visibility *visibility;
+    struct ds_tizen_event_policy_surface_new_visibility *event;
+
+    policy_surface = wl_container_of(listener, policy_surface, new_visibility);
+    event = (struct ds_tizen_event_policy_surface_new_visibility *)data;
+
+    ds_inf("Policy Info(%p) new_visibility", policy_surface);
+
+    visibility = calloc(1, sizeof *visibility);
+    if (!visibility)
+        return;
+
+    visibility->visibility = event->visibility;
+
+    visibility->destroy.notify = visibility_handle_destroy;
+    ds_tizen_policy_visibility_add_destroy_listener(visibility->visibility,
+        &visibility->destroy);
+
+    wl_list_insert(&policy_surface->visibilities, &visibility->link);
+}
+
+static void
+policy_surface_handle_new_position(struct wl_listener *listener, void *data)
+{
+    struct tinyds_policy_surface *policy_surface;
+    struct tinyds_policy_position *position;
+    struct ds_tizen_event_policy_surface_new_position *event;
+
+    policy_surface = wl_container_of(listener, policy_surface, new_position);
+    event = (struct ds_tizen_event_policy_surface_new_position *)data;
+
+    ds_inf("Policy Info(%p) new_position", policy_surface);
+
+    position = calloc(1, sizeof *position);
+    if (!position)
+        return;
+
+    position->position = event->position;
+
+    position->destroy.notify = position_handle_destroy;
+    ds_tizen_policy_position_add_destroy_listener(position->position,
+        &position->destroy);
+
+    position->set.notify = position_handle_set;
+    ds_tizen_policy_position_add_set_listener(position->position,
+        &position->set);
+
+    wl_list_insert(&policy_surface->positions, &position->link);
+}
+
+static void
+policy_surface_handle_activate(struct wl_listener *listener, void *data)
+{
+    struct tinyds_policy_surface *policy_surface;
+
+    policy_surface = wl_container_of(listener, policy_surface, activate);
+
+    ds_inf("Policy Info(%p) activate", policy_surface);
+
+    // TODO:
+}
+
+static void
+policy_surface_handle_raise(struct wl_listener *listener, void *data)
+{
+    struct tinyds_policy_surface *policy_surface;
+
+    policy_surface = wl_container_of(listener, policy_surface, raise);
+
+    ds_inf("Policy Info(%p) raise", policy_surface);
+
+    // TODO:
+}
+
+static void
+policy_surface_handle_lower(struct wl_listener *listener, void *data)
+{
+    struct tinyds_policy_surface *policy_surface;
+
+    policy_surface = wl_container_of(listener, policy_surface, raise);
+
+    ds_inf("Policy Info(%p) lower", policy_surface);
+
+    // TODO:
+}
+
+static void
+policy_surface_handle_set_focus_skip(struct wl_listener *listener, void *data)
+{
+    struct tinyds_policy_surface *policy_surface;
+
+    policy_surface = wl_container_of(listener, policy_surface, set_focus_skip);
+
+    ds_inf("Policy Info(%p) set_focus_skip", policy_surface);
+
+    // TODO:
+}
+
+static void
+policy_surface_handle_unset_focus_skip(struct wl_listener *listener, void *data)
+{
+    struct tinyds_policy_surface *policy_surface;
+
+    policy_surface = wl_container_of(listener, policy_surface, unset_focus_skip);
+
+    ds_inf("Policy Info(%p) unset_focus_skip", policy_surface);
+
+    // TODO:
+}
+
+static void
+policy_surface_handle_set_role(struct wl_listener *listener, void *data)
+{
+    struct tinyds_policy_surface *policy_surface;
+
+    policy_surface = wl_container_of(listener, policy_surface, set_role);
+
+    ds_inf("Policy Info(%p) set_role", policy_surface);
+
+    // TODO:
+}
+
+static void
+policy_surface_handle_set_window_type(struct wl_listener *listener, void *data)
+{
+    struct tinyds_policy_surface *policy_surface;
+
+    policy_surface = wl_container_of(listener, policy_surface, set_window_type);
+
+    ds_inf("Policy Info(%p) set_window_type", policy_surface);
+
+    // TODO:
+}
+
+static void
+policy_surface_handle_set_conformant(struct wl_listener *listener, void *data)
+{
+    struct tinyds_policy_surface *policy_surface;
+
+    policy_surface = wl_container_of(listener, policy_surface, set_conformant);
+
+    ds_inf("Policy Info(%p) set_conformant", policy_surface);
+
+    // TODO:
+}
+
+static void
+policy_surface_handle_unset_conformant(struct wl_listener *listener, void *data)
+{
+    struct tinyds_policy_surface *policy_surface;
+
+    policy_surface = wl_container_of(listener, policy_surface, unset_conformant);
+
+    ds_inf("Policy Info(%p) unset_conformant", policy_surface);
+
+    // TODO:
+}
+
+static void
+policy_surface_handle_get_conformant(struct wl_listener *listener, void *data)
+{
+    struct tinyds_policy_surface *policy_surface;
+
+    policy_surface = wl_container_of(listener, policy_surface, get_conformant);
+
+    ds_inf("Policy Info(%p) get_conformant", policy_surface);
+
+    // TODO:
+}
+
+static void
+policy_surface_handle_set_notification_level(struct wl_listener *listener, void *data)
+{
+    struct tinyds_policy_surface *policy_surface;
+
+    policy_surface = wl_container_of(listener, policy_surface, set_notification_level);
+
+    ds_inf("Policy Info(%p) set_notification_level", policy_surface);
+
+    // TODO:
+}
+
+static void
+policy_surface_handle_set_window_screen_mode(struct wl_listener *listener, void *data)
+{
+    struct tinyds_policy_surface *policy_surface;
+
+    policy_surface = wl_container_of(listener, policy_surface, set_window_screen_mode);
+
+    ds_inf("Policy Info(%p) set_window_screen_mode", policy_surface);
+
+    // TODO:
+}
+
+static void
+policy_surface_handle_get_subsurface(struct wl_listener *listener, void *data)
+{
+    struct tinyds_policy_surface *policy_surface;
+
+    policy_surface = wl_container_of(listener, policy_surface, get_subsurface);
+
+    ds_inf("Policy Info(%p) get_subsurface", policy_surface);
+
+    // TODO:
+}
+
+static void
+policy_surface_handle_iconify(struct wl_listener *listener, void *data)
+{
+    struct tinyds_policy_surface *policy_surface;
+
+    policy_surface = wl_container_of(listener, policy_surface, iconify);
+
+    ds_inf("Policy Info(%p) iconify", policy_surface);
+
+    // TODO:
+}
+
+static void
+policy_surface_handle_uniconify(struct wl_listener *listener, void *data)
+{
+    struct tinyds_policy_surface *policy_surface;
+
+    policy_surface = wl_container_of(listener, policy_surface, uniconify);
+
+    ds_inf("Policy Info(%p) uniconify", policy_surface);
+
+    // TODO:
+}
+
+static void
+policy_surface_handle_add_aux_hint(struct wl_listener *listener, void *data)
+{
+    struct tinyds_policy_surface *policy_surface;
+
+    policy_surface = wl_container_of(listener, policy_surface, add_aux_hint);
+
+    ds_inf("Policy Info(%p) add_aux_hint", policy_surface);
+
+    // TODO:
+}
+
+static void
+policy_surface_handle_change_aux_hint(struct wl_listener *listener, void *data)
+{
+    struct tinyds_policy_surface *policy_surface;
+
+    policy_surface = wl_container_of(listener, policy_surface, change_aux_hint);
+
+    ds_inf("Policy Info(%p) change_aux_hint", policy_surface);
+
+    // TODO:
+}
+
+static void
+policy_surface_handle_delete_aux_hint(struct wl_listener *listener, void *data)
+{
+    struct tinyds_policy_surface *policy_surface;
+
+    policy_surface = wl_container_of(listener, policy_surface, delete_aux_hint);
+
+    ds_inf("Policy Info(%p) delete_aux_hint", policy_surface);
+
+    // TODO:
+}
+
+static void
+policy_surface_handle_get_supported_aux_hints(struct wl_listener *listener, void *data)
+{
+    struct tinyds_policy_surface *policy_surface;
+
+    policy_surface = wl_container_of(listener, policy_surface, get_supported_aux_hints);
+
+    ds_inf("Policy Info(%p) get_supported_aux_hints", policy_surface);
+
+    // TODO:
+}
+
+static void
+policy_surface_handle_set_floating_mode(struct wl_listener *listener, void *data)
+{
+    struct tinyds_policy_surface *policy_surface;
+
+    policy_surface = wl_container_of(listener, policy_surface, set_floating_mode);
+
+    ds_inf("Policy Info(%p) set_floating_mode", policy_surface);
+
+    // TODO:
+}
+
+static void
+policy_surface_handle_unset_floating_mode(struct wl_listener *listener, void *data)
+{
+    struct tinyds_policy_surface *policy_surface;
+
+    policy_surface = wl_container_of(listener, policy_surface, unset_floating_mode);
+
+    ds_inf("Policy Info(%p) unset_floating_mode", policy_surface);
+
+    // TODO:
+}
+
+static void
+policy_surface_handle_set_stack_mode(struct wl_listener *listener, void *data)
+{
+    struct tinyds_policy_surface *policy_surface;
+
+    policy_surface = wl_container_of(listener, policy_surface, set_stack_mode);
+
+    ds_inf("Policy Info(%p) set_stack_mode", policy_surface);
+
+    // TODO:
+}
+
+static void
+policy_surface_handle_new_subsurface_watcher(struct wl_listener *listener, void *data)
+{
+    struct tinyds_policy_surface *policy_surface;
+    struct tinyds_policy_subsurface_watcher*subsurface_watcher;
+    struct ds_tizen_event_policy_surface_new_subsurface_watcher *event;
+
+    policy_surface = wl_container_of(listener, policy_surface, new_subsurface_watcher);
+    event = (struct ds_tizen_event_policy_surface_new_subsurface_watcher *)data;
+
+    ds_inf("Policy Info(%p) new_subsurface_watcher", policy_surface);
+
+    subsurface_watcher = calloc(1, sizeof *subsurface_watcher);
+    if (!subsurface_watcher)
+        return;
+
+    subsurface_watcher->subsurface_watcher = event->subsurface_watcher;
+
+    subsurface_watcher->destroy.notify = subsurface_watcher_handle_destroy;
+    ds_tizen_policy_subsurface_watcher_add_destroy_listener(subsurface_watcher->subsurface_watcher,
+        &subsurface_watcher->destroy);
+
+    wl_list_insert(&policy_surface->subsurface_watchers, &subsurface_watcher->link);
+}
+
+static void
+policy_surface_handle_set_parent(struct wl_listener *listener, void *data)
+{
+    struct tinyds_policy_surface *policy_surface;
+
+    policy_surface = wl_container_of(listener, policy_surface, set_parent);
+
+    ds_inf("Policy Info(%p) set_parent", policy_surface);
+
+    // TODO:
+}
+
+static void
+policy_surface_handle_ack_conformant_region(struct wl_listener *listener, void *data)
+{
+    struct tinyds_policy_surface *policy_surface;
+
+    policy_surface = wl_container_of(listener, policy_surface, ack_conformant_region);
+
+    ds_inf("Policy Info(%p) ack_conformant_region", policy_surface);
+
+    // TODO:
+}
+
+static void
+policy_surface_handle_set_video(struct wl_listener *listener, void *data)
+{
+    struct tinyds_policy_surface *policy_surface;
+
+    policy_surface = wl_container_of(listener, policy_surface, set_video);
+
+    ds_inf("Policy Info(%p) set_video", policy_surface);
+
+    // TODO:
+}
+
+static void
+policy_surface_handle_show(struct wl_listener *listener, void *data)
+{
+    struct tinyds_policy_surface *policy_surface;
+
+    policy_surface = wl_container_of(listener, policy_surface, show);
+
+    ds_inf("Policy Info(%p) show", policy_surface);
+
+    // TODO:
+}
+
+static void
+policy_surface_handle_hide(struct wl_listener *listener, void *data)
+{
+    struct tinyds_policy_surface *policy_surface;
+
+    policy_surface = wl_container_of(listener, policy_surface, hide);
+
+    ds_inf("Policy Info(%p) hide", policy_surface);
+
+    // TODO:
+}
+
+static void
+policy_surface_handle_set_parent_with_below(struct wl_listener *listener, void *data)
+{
+    struct tinyds_policy_surface *policy_surface;
+
+    policy_surface = wl_container_of(listener, policy_surface, set_parent_with_below);
+
+    ds_inf("Policy Info(%p) set_parent_with_below", policy_surface);
+
+    // TODO:
+}
+
+static void
+policy_handle_destroy(struct wl_listener *listener, void *data)
+{
+    struct tinyds_policy *policy;
+
+    policy = wl_container_of(listener, policy, destroy);
+
+    ds_inf("Policy(%p) destroy", policy);
+
+    free(policy);
+}
+
+static void
+policy_handle_new_surface(struct wl_listener *listener, void *data)
+{
+    struct tinyds_policy *policy;
+    struct tinyds_policy_surface *policy_surface;
+    struct ds_tizen_event_policy_new_surface *event;
+
+    policy = wl_container_of(listener, policy, new_surface);
+    event = (struct ds_tizen_event_policy_new_surface *)data;
+
+    ds_inf("Policy(%p) new_surface", policy);
+
+    policy_surface = calloc(1, sizeof *policy_surface);
+    if (!policy_surface)
+        return;
+
+    policy_surface->policy_surface = event->policy_surface;
+
+    policy_surface->destroy.notify = policy_surface_handle_destroy;
+    ds_tizen_policy_surface_add_destroy_listener(policy_surface->policy_surface,
+        &policy_surface->destroy);
+
+    policy_surface->new_visibility.notify = policy_surface_handle_new_visibility;
+    ds_tizen_policy_surface_add_new_visibility_listener(policy_surface->policy_surface,
+        &policy_surface->new_visibility);
+
+    policy_surface->new_position.notify = policy_surface_handle_new_position;
+    ds_tizen_policy_surface_add_new_position_listener(policy_surface->policy_surface,
+        &policy_surface->new_position);
+
+    policy_surface->activate.notify = policy_surface_handle_activate;
+    ds_tizen_policy_surface_add_activate_listener(policy_surface->policy_surface,
+        &policy_surface->activate);
+
+    policy_surface->raise.notify = policy_surface_handle_raise;
+    ds_tizen_policy_surface_add_raise_listener(policy_surface->policy_surface,
+        &policy_surface->raise);
+
+    policy_surface->lower.notify = policy_surface_handle_lower;
+    ds_tizen_policy_surface_add_lower_listener(policy_surface->policy_surface,
+        &policy_surface->lower);
+
+    policy_surface->set_focus_skip.notify = policy_surface_handle_set_focus_skip;
+    ds_tizen_policy_surface_add_set_focus_skip_listener(policy_surface->policy_surface,
+        &policy_surface->set_focus_skip);
+
+    policy_surface->unset_focus_skip.notify = policy_surface_handle_unset_focus_skip;
+    ds_tizen_policy_surface_add_unset_focus_skip_listener(policy_surface->policy_surface,
+        &policy_surface->unset_focus_skip);
+
+    policy_surface->set_role.notify = policy_surface_handle_set_role;
+    ds_tizen_policy_surface_add_set_role_listener(policy_surface->policy_surface,
+        &policy_surface->set_role);
+
+    policy_surface->set_window_type.notify = policy_surface_handle_set_window_type;
+    ds_tizen_policy_surface_add_set_window_type_listener(policy_surface->policy_surface,
+        &policy_surface->set_window_type);
+
+    policy_surface->set_conformant.notify = policy_surface_handle_set_conformant;
+    ds_tizen_policy_surface_add_set_conformant_listener(policy_surface->policy_surface,
+        &policy_surface->set_conformant);
+
+    policy_surface->unset_conformant.notify = policy_surface_handle_unset_conformant;
+    ds_tizen_policy_surface_add_unset_conformant_listener(policy_surface->policy_surface,
+        &policy_surface->unset_conformant);
+
+    policy_surface->get_conformant.notify = policy_surface_handle_get_conformant;
+    ds_tizen_policy_surface_add_get_conformant_listener(policy_surface->policy_surface,
+        &policy_surface->get_conformant);
+
+    policy_surface->set_notification_level.notify =
+        policy_surface_handle_set_notification_level;
+    ds_tizen_policy_surface_add_set_notification_level_listener(
+            policy_surface->policy_surface, &policy_surface->set_notification_level);
+
+    policy_surface->set_window_screen_mode.notify =
+        policy_surface_handle_set_window_screen_mode;
+    ds_tizen_policy_surface_add_set_window_screen_mode_listener(
+        policy_surface->policy_surface, &policy_surface->set_window_screen_mode);
+
+    policy_surface->get_subsurface.notify = policy_surface_handle_get_subsurface;
+    ds_tizen_policy_surface_add_get_subsurface_listener(policy_surface->policy_surface,
+        &policy_surface->get_subsurface);
+
+    policy_surface->iconify.notify = policy_surface_handle_iconify;
+    ds_tizen_policy_surface_add_iconify_listener(policy_surface->policy_surface,
+        &policy_surface->iconify);
+
+    policy_surface->uniconify.notify = policy_surface_handle_uniconify;
+    ds_tizen_policy_surface_add_uniconify_listener(policy_surface->policy_surface,
+        &policy_surface->uniconify);
+
+    policy_surface->add_aux_hint.notify = policy_surface_handle_add_aux_hint;
+    ds_tizen_policy_surface_add_add_aux_hint_listener(policy_surface->policy_surface,
+        &policy_surface->add_aux_hint);
+
+    policy_surface->change_aux_hint.notify = policy_surface_handle_change_aux_hint;
+    ds_tizen_policy_surface_add_change_aux_hint_listener(policy_surface->policy_surface,
+        &policy_surface->change_aux_hint);
+
+    policy_surface->delete_aux_hint.notify = policy_surface_handle_delete_aux_hint;
+    ds_tizen_policy_surface_add_delete_aux_hint_listener(policy_surface->policy_surface,
+        &policy_surface->delete_aux_hint);
+
+    policy_surface->get_supported_aux_hints.notify =
+        policy_surface_handle_get_supported_aux_hints;
+    ds_tizen_policy_surface_add_get_supported_aux_hints_listener(
+        policy_surface->policy_surface, &policy_surface->get_supported_aux_hints);
+
+    policy_surface->set_floating_mode.notify =
+        policy_surface_handle_set_floating_mode;
+    ds_tizen_policy_surface_add_set_floating_mode_listener(
+        policy_surface->policy_surface, &policy_surface->set_floating_mode);
+
+    policy_surface->unset_floating_mode.notify =
+        policy_surface_handle_unset_floating_mode;
+    ds_tizen_policy_surface_add_unset_floating_mode_listener(
+        policy_surface->policy_surface, &policy_surface->unset_floating_mode);
+
+    policy_surface->set_stack_mode.notify = policy_surface_handle_set_stack_mode;
+    ds_tizen_policy_surface_add_set_stack_mode_listener(policy_surface->policy_surface,
+        &policy_surface->set_stack_mode);
+
+    policy_surface->new_subsurface_watcher.notify =
+        policy_surface_handle_new_subsurface_watcher;
+    ds_tizen_policy_surface_add_new_subsurface_watcher_listener(
+        policy_surface->policy_surface, &policy_surface->new_subsurface_watcher);
+
+    policy_surface->set_parent.notify = policy_surface_handle_set_parent;
+    ds_tizen_policy_surface_add_set_parent_listener(policy_surface->policy_surface,
+        &policy_surface->set_parent);
+
+    policy_surface->ack_conformant_region.notify =
+        policy_surface_handle_ack_conformant_region;
+    ds_tizen_policy_surface_add_ack_conformant_region_listener(
+        policy_surface->policy_surface, &policy_surface->ack_conformant_region);
+
+    policy_surface->set_video.notify = policy_surface_handle_set_video;
+    ds_tizen_policy_surface_add_set_video_listener(policy_surface->policy_surface,
+        &policy_surface->set_video);
+
+    policy_surface->show.notify = policy_surface_handle_show;
+    ds_tizen_policy_surface_add_show_listener(policy_surface->policy_surface,
+        &policy_surface->show);
+
+    policy_surface->hide.notify = policy_surface_handle_hide;
+    ds_tizen_policy_surface_add_hide_listener(policy_surface->policy_surface,
+        &policy_surface->hide);
+
+    policy_surface->set_parent_with_below.notify =
+        policy_surface_handle_set_parent_with_below;
+    ds_tizen_policy_surface_add_set_parent_with_below_listener(
+            policy_surface->policy_surface, &policy_surface->set_parent_with_below);
+
+
+    wl_list_init(&policy_surface->visibilities);
+    wl_list_init(&policy_surface->positions);
+    wl_list_init(&policy_surface->subsurface_watchers);
+
+    wl_list_insert(&policy->policy_surfaces, &policy_surface->link);
+}
+
+static void
+policy_handle_activate_below_by_univeral_id(struct wl_listener *listener, void *data)
+{
+    struct tinyds_policy *policy;
+
+    policy = wl_container_of(listener, policy, activate_below_by_univeral_id);
+
+    ds_inf("Policy(%p) activate_below_by_univeral_id", policy);
+
+    // TODO:
+}
+
+static void
+policy_handle_lower_by_universal_id(struct wl_listener *listener, void *data)
+{
+    struct tinyds_policy *policy;
+
+    policy = wl_container_of(listener, policy, lower_by_universal_id);
+
+    ds_inf("Policy(%p) lower_by_universal_id", policy);
+
+    // TODO:
+}
+
+static void
+policy_handle_set_transient_for(struct wl_listener *listener, void *data)
+{
+    struct tinyds_policy *policy;
+
+    policy = wl_container_of(listener, policy, set_transient_for);
+
+    ds_inf("Policy(%p) set_transient_for", policy);
+
+    // TODO:
+}
+
+static void
+policy_handle_unset_transient_for(struct wl_listener *listener, void *data)
+{
+    struct tinyds_policy *policy;
+
+    policy = wl_container_of(listener, policy, unset_transient_for);
+
+    ds_inf("Policy(%p) unset_transient_for", policy);
+
+    // TODO:
+}
+
+static void
+policy_handle_place_subsurface_below_parent(struct wl_listener *listener, void *data)
+{
+    struct tinyds_policy *policy;
+
+    policy = wl_container_of(listener, policy, place_subsurface_below_parent);
+
+    ds_inf("Policy(%p) place_subsurface_below_parent", policy);
+
+    // TODO:
+}
+
+static void
+policy_handle_set_subsurface_stand_alone(struct wl_listener *listener, void *data)
+{
+    struct tinyds_policy *policy;
+
+    policy = wl_container_of(listener, policy, set_subsurface_stand_alone);
+
+    ds_inf("Policy(%p) set_subsurface_stand_alone", policy);
+
+    // TODO:
+}
+
+static void
+policy_handle_set_background_state(struct wl_listener *listener, void *data)
+{
+    struct tinyds_policy *policy;
+
+    policy = wl_container_of(listener, policy, set_background_state);
+
+    ds_inf("Policy(%p) set_background_state", policy);
+
+    // TODO:
+}
+
+static void
+policy_handle_unset_background_state(struct wl_listener *listener, void *data)
+{
+    struct tinyds_policy *policy;
+
+    policy = wl_container_of(listener, policy, unset_background_state);
+
+    ds_inf("Policy(%p) unset_background_state", policy);
+
+    // TODO:
+}
+
+static void
+policy_handle_add_activate_above_by_universal_id(struct wl_listener *listener, void *data)
+{
+    struct tinyds_policy *policy;
+
+    policy = wl_container_of(listener, policy, add_activate_above_by_universal_id);
+
+    ds_inf("Policy(%p) add_activate_above_by_universal_id", policy);
+
+    // TODO:
+}
+
+static void
+policy_handle_set_appid(struct wl_listener *listener, void *data)
+{
+    struct tinyds_policy *policy;
+
+    policy = wl_container_of(listener, policy, set_appid);
+
+    ds_inf("Policy(%p) set_appid", policy);
+
+    // TODO:
+}
+
+static void
+policy_handle_set_transient_for_below(struct wl_listener *listener, void *data)
+{
+    struct tinyds_policy *policy;
+
+    policy = wl_container_of(listener, policy, set_transient_for_below);
+
+    ds_inf("Policy(%p) set_transient_for_below", policy);
+
+    // TODO:
+}
+
+static bool
+new_policy(struct tinyds_server *server)
+{
+    struct tinyds_policy *policy;
+
+    policy = calloc(1, sizeof *policy);
+    if (!policy)
+        return false;
+
+    policy->policy = ds_tizen_policy_create(server->display);
+    if (!policy->policy) {
+        free(policy);
+        ds_err("Could not create ds_tizen_policy");
+        return false;
+    }
+
+    policy->destroy.notify = policy_handle_destroy;
+    ds_tizen_policy_add_destroy_listener(policy->policy, &policy->destroy);
+
+    policy->new_surface.notify = policy_handle_new_surface;
+    ds_tizen_policy_add_new_surface_listener(policy->policy, &policy->new_surface);
+
+    policy->activate_below_by_univeral_id.notify =
+        policy_handle_activate_below_by_univeral_id;
+    ds_tizen_policy_add_activate_below_by_univeral_id_listener(policy->policy,
+        &policy->activate_below_by_univeral_id);
+
+    policy->lower_by_universal_id.notify = policy_handle_lower_by_universal_id;
+    ds_tizen_policy_add_lower_by_universal_id_listener(policy->policy,
+        &policy->lower_by_universal_id);
+
+    policy->set_transient_for.notify = policy_handle_set_transient_for;
+    ds_tizen_policy_add_set_transient_for_listener(policy->policy,
+        &policy->set_transient_for);
+
+    policy->unset_transient_for.notify = policy_handle_unset_transient_for;
+    ds_tizen_policy_add_unset_transient_for_listener(policy->policy,
+        &policy->unset_transient_for);
+
+    policy->place_subsurface_below_parent.notify =
+        policy_handle_place_subsurface_below_parent;
+    ds_tizen_policy_add_place_subsurface_below_parent_listener(policy->policy,
+        &policy->place_subsurface_below_parent);
+
+    policy->set_subsurface_stand_alone.notify =
+        policy_handle_set_subsurface_stand_alone;
+    ds_tizen_policy_add_set_subsurface_stand_alone_listener(policy->policy,
+        &policy->set_subsurface_stand_alone);
+
+    policy->set_background_state.notify = policy_handle_set_background_state;
+    ds_tizen_policy_add_set_background_state_listener(policy->policy,
+        &policy->destroy);
+
+    policy->unset_background_state.notify = policy_handle_unset_background_state;
+    ds_tizen_policy_add_unset_background_state_listener(policy->policy,
+        &policy->unset_background_state);
+
+    policy->add_activate_above_by_universal_id.notify =
+        policy_handle_add_activate_above_by_universal_id;
+    ds_tizen_policy_add_activate_above_by_universal_id_listener(policy->policy,
+        &policy->add_activate_above_by_universal_id);
+
+    policy->set_appid.notify = policy_handle_set_appid;
+    ds_tizen_policy_add_set_appid_listener(policy->policy, &policy->set_appid);
+
+    policy->set_transient_for_below.notify =
+        policy_handle_set_transient_for_below;
+    ds_tizen_policy_add_set_transient_for_below_listener(policy->policy,
+        &policy->set_transient_for_below);
+
+    wl_list_init(&policy->policy_surfaces);
+
+    server->policy = policy;
+
+    ds_inf("Policy (%p) created", policy);
+
+    return true;
+}