Revert "screen: add wtz_screen_set_opaque_region request callback"
[platform/core/uifw/libds-tizen.git] / examples / tinyds-tdm.c
index 2a54e3d..9c50c84 100644 (file)
@@ -1,54 +1,4 @@
-#include <assert.h>
-#include <stdbool.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <signal.h>
-#include <time.h>
-
-#include <drm_fourcc.h>
-#include <pixman.h>
-#include <wayland-server.h>
-#include <libds/log.h>
-#include <libds/backend.h>
-#include <libds/output.h>
-#include <libds/compositor.h>
-#include <libds/xdg_shell.h>
-#include <libds-tizen/allocator/tbm.h>
-#include <libds-tizen/backend/tdm.h>
-#include <libds/backend/libinput.h>
-#include <libds-tizen/tbm_server.h>
-#include <libds-tizen/dpms.h>
-#include <libds/input_device.h>
-#include <libds/keyboard.h>
-#include <libds/touch.h>
-#include <libds/pointer.h>
-#include <libds/seat.h>
-#include <libds-tizen/input_devicemgr.h>
-#include <xkbcommon/xkbcommon.h>
-#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
-#define CURSOR_W 10
-#define CURSOR_H 16
-
-#ifdef USE_TDM_BUFFER_QUEUE
-#include "pixman-tbm-helper.h"
-#include "tinyds-tdm-renderer.h"
-#else
-#include <libds/swapchain.h>
-#endif
-
-#include "pixman-helper.h"
-#include "protocol-trace.h"
-
-#define TINYDS_UNUSED   __attribute__((unused))
-struct tinyds_keyboard;
-struct tinyds_pointer;
+#include "tinyds-tdm.h"
 
 struct tinyds_output
 {
@@ -83,174 +33,6 @@ struct tinyds_output
 #endif
 };
 
-struct tinyds_dpms
-{
-    struct ds_tizen_dpms *ds_dpms;
-    struct tinyds_server *server;
-
-    struct wl_listener destroy;
-    struct wl_listener set_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;
-
-    struct wl_display *display;
-
-    struct ds_backend *backend;
-    struct ds_backend *input_backend;
-    struct ds_compositor *compositor;
-    struct ds_xdg_shell *xdg_shell;
-    struct ds_seat *seat;
-    uint32_t seat_caps;
-    double output_x, output_y;
-    struct ds_tizen_input_devicemgr *devicemgr;
-    struct ds_tizen_launch_effect *effect;
-    struct ds_tizen_launch_splash *splash;
-
-    struct tinyds_output *output;
-    struct tinyds_dpms *dpms;
-    struct tinyds_policy *policy;
-
-    struct wl_event_source *stdin_source;
-
-    struct wl_list views;
-
-    struct wl_listener new_output;
-    struct wl_listener new_input;
-    struct wl_listener new_xdg_surface;
-    struct wl_listener devicemgr_destroy;
-    struct wl_listener pointer_warp;
-    struct wl_listener effect_destroy;
-    struct wl_listener effect_type_set;
-    struct wl_listener effect_type_unset;
-    struct wl_listener new_splash;
-    struct wl_listener splash_owner;
-
-    struct wl_list keyboards;
-    struct wl_list pointers;
-
-    struct tinyds_text_input *text_input;
-    struct tinyds_input_method *input_method;
-};
-
-struct tinyds_view
-{
-    struct tinyds_server *server;
-
-    struct tinyds_texture *texture;
-    struct ds_xdg_surface *xdg_surface;
-
-    struct wl_listener xdg_surface_map;
-    struct wl_listener xdg_surface_unmap;
-    struct wl_listener xdg_surface_destroy;
-    struct wl_listener surface_commit;
-    struct wl_list link; // tinyds_server::views
-
-    struct ds_tdm_output_hwc_window *hwc_window;
-
-    int x, y;
-    bool mapped;
-
-    pid_t pid;
-    int effect_type;
-};
-
 struct tinyds_pointer
 {
     struct ds_input_device *dev;
@@ -370,20 +152,12 @@ static void output_swapchain_init(struct tinyds_output *output,
 static void output_draw_with_swapchain(struct tinyds_output *output);
 static void draw_view(struct tinyds_view *view, pixman_image_t *dst_image);
 #endif
-static void dpms_handle_destroy(struct wl_listener *listener, void *data);
-static void dpms_handle_set_dpms(struct wl_listener *listener, void *data);
-static void dpms_handle_get_dpms(struct wl_listener *listener, void *data);
 static void server_add_keyboard(struct tinyds_server *server,
         struct ds_input_device *dev);
 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(
@@ -446,9 +220,9 @@ main(void)
 static void
 view_populate_pid(struct tinyds_view *view)
 {
-    pid_t pid;
-    struct wl_client *client = NULL;
     struct ds_surface *surface;
+    struct wl_client *client = NULL;
+    pid_t pid;
 
     surface = ds_xdg_surface_get_surface(view->xdg_surface);
     if (!surface)
@@ -459,12 +233,14 @@ view_populate_pid(struct tinyds_view *view)
         return;
 
     wl_client_get_credentials(client, &pid, NULL, NULL);
+    view->pid = pid;
 
     ds_inf("view pid(%u)", pid);
-    view->pid = pid;
 
-    view->effect_type = ds_tizen_launch_effect_get_effect_type(view->server->effect, pid);
-    ds_tizen_launch_effect_unset_effect_type(view->server->effect, pid);
+    view->effect_type = tinyds_launch_get_effect_type(
+            view->server->launch, pid);
+    tinyds_launch_unset_effect_type(view->server->launch, pid);
+
     ds_inf("view effect_type(%d)", view->effect_type);
 }
 
@@ -648,7 +424,7 @@ backend_handle_new_output(struct wl_listener *listener, void *data)
     output->output_frame.notify = output_handle_frame;
     ds_output_add_frame_listener(ds_output, &output->output_frame);
 
-    ds_tizen_input_devicemgr_set_output_width_height(server->devicemgr, (uint32_t)output->width, (uint32_t)output->height);
+    tinyds_input_devicemgr_set_output_size(server->input_devicemgr, (uint32_t)output->width, (uint32_t)output->height);
 
     server->output = output;
     server->output_x = (double)(output->width) / 2;
@@ -657,38 +433,6 @@ backend_handle_new_output(struct wl_listener *listener, void *data)
     output_schedule_commit(output);
 }
 
-static bool
-add_new_dpms(struct tinyds_server *server)
-{
-    struct tinyds_dpms *dpms;
-
-    dpms = calloc(1, sizeof *dpms);
-    if (!dpms)
-        return false;
-
-    dpms->ds_dpms = ds_tizen_dpms_create(server->display);
-    if (!dpms->ds_dpms) {
-        free(dpms);
-        ds_err("Could not create ds_tizen_dpms");
-        return false;
-    }
-
-    dpms->destroy.notify = dpms_handle_destroy;
-    ds_tizen_dpms_add_destroy_listener(dpms->ds_dpms, &dpms->destroy);
-
-    dpms->set_dpms.notify = dpms_handle_set_dpms;
-    ds_tizen_dpms_add_set_dpms_listener(dpms->ds_dpms, &dpms->set_dpms);
-
-    dpms->get_dpms.notify = dpms_handle_get_dpms;
-    ds_tizen_dpms_add_get_dpms_listener(dpms->ds_dpms, &dpms->get_dpms);
-
-    server->dpms = dpms;
-
-    ds_inf("Dpms (%p) added", dpms);
-
-    return true;
-}
-
 static void
 backend_handle_new_input(struct wl_listener *listener, void *data)
 {
@@ -722,208 +466,35 @@ backend_handle_new_input(struct wl_listener *listener, void *data)
 }
 
 static void
-devicemgr_add_keymap_data(struct wl_list *list, const char *name, int keycode)
-{
-    struct ds_tizen_input_devicemgr_keymap_data *data;
-
-    data = calloc(1, sizeof *data);
-    if (!data) {
-        ds_err("Failed to alloc memory");
-        return;
-    }
-
-    data->name = strdup(name);
-    data->keycode = keycode;
-
-    wl_list_insert(list, &data->link);
-}
-
-static void
-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) {
-        wl_list_remove(&data->link);
-        free(data->name);
-        free(data);
-    }
-}
-
-static void
-devicemgr_set_keymap(struct ds_tizen_input_devicemgr *devicemgr)
-{
-    struct wl_list keymap_list;
-    bool res;
-
-    wl_list_init(&keymap_list);
-
-    devicemgr_add_keymap_data(&keymap_list, "XF86VolumeRaise", 455);
-    devicemgr_add_keymap_data(&keymap_list, "XF86VolumeLower", 456);
-    devicemgr_add_keymap_data(&keymap_list, "XF86LightOn", 457);
-    devicemgr_add_keymap_data(&keymap_list, "XF86LightOff", 458);
-
-    res = ds_tizen_input_devicemgr_set_keymap_list(devicemgr, &keymap_list);
-    if (!res)
-        ds_inf("Failed to set keymap");
-
-    devicemgr_cleanup_keymap_list(&keymap_list);
-}
-
-static void
-devicemgr_handle_pointer_warp(struct wl_listener *listener, void *data)
-{
-    struct tinyds_server *server;
-    struct tinyds_pointer *pointer;
-    struct ds_tizen_input_devicemgr_event_pointer_warp *event = data;
-    double sx = 0.f, sy = 0.f;
-    struct tinyds_view *view = NULL;
-
-    server = wl_container_of(listener, server, pointer_warp);
-
-    ds_inf("Pointer warp: surface(%p) x(%.2f) y(%.2f)", event->surface,
-            event->x, event->y);
-
-    wl_list_for_each(pointer, &server->pointers, link){
-        if (!pointer->focused_view) continue;
-        view = pointer->focused_view;
-    }
-    if (!view) return;
-
-    if (event->surface != ds_xdg_surface_get_surface(view->xdg_surface)) {
-        ds_inf("Pointer is not on the requested surface");
-        return;
-    }
-
-    server->output_x = view->x + (event->x * server->output->width);
-    server->output_y = view->y + (event->y * server->output->height);
-
-    server_view_at(server, server->output_x, server->output_y, &sx, &sy);
-
-    ds_inf("notify motion: sx:%.2f sy:%.2f, output_x:%.1f, output_y:%.1f",
-            sx, sy, server->output_x, server->output_y);
-
-    ds_seat_pointer_notify_motion(server->seat,
-            event->time_msec, sx, sy);
-}
-
-static void
-devicemgr_handle_destroy(struct wl_listener *listener, void *data TINYDS_UNUSED)
-{
-    struct tinyds_server *server =
-        wl_container_of(listener, server, devicemgr_destroy);
-
-    wl_list_remove(&server->devicemgr_destroy.link);
-    wl_list_remove(&server->pointer_warp.link);
-
-    server->devicemgr = NULL;
-}
-
-static void
-launch_effect_handle_destroy(struct wl_listener *listener, void *data TINYDS_UNUSED)
-{
-    struct tinyds_server *server =
-        wl_container_of(listener, server, effect_destroy);
-
-    wl_list_remove(&server->effect_destroy.link);
-    wl_list_remove(&server->effect_type_set.link);
-    wl_list_remove(&server->effect_type_unset.link);
-    wl_list_remove(&server->new_splash.link);
-
-    server->effect = NULL;
-}
-
-static void
-launch_effect_handle_type_set(struct wl_listener *listener, void *data)
+dpms_free_func(void *data)
 {
-    struct tinyds_server *server;
-    struct ds_tizen_launch_effect_event_type_set *event = data;
-    struct tinyds_view *view = NULL;
-    bool existing = false;
-
-    server = wl_container_of(listener, server, effect_type_set);
-
-    ds_inf("Launch effect. type_set: pid(%u) type:%s", event->pid, (event->effect_type == 1) ? "depth-in" : "launch");
+    struct tinyds_server *server = (struct tinyds_server *)data;
 
-    wl_list_for_each(view, &server->views, link) {
-        if (view->pid == event->pid) {
-            view->effect_type = event->effect_type;
-            ds_inf("Launch effect. existing pid");
-            existing = true;
-        }
-    }
-    if (existing) {
-        ds_tizen_launch_effect_unset_effect_type(server->effect, event->pid);
-    } else {
-        ds_tizen_launch_effect_set_effect_type(server->effect, event->pid, event->effect_type);
-    }
+    server->dpms = NULL;
 }
 
 static void
-launch_effect_handle_type_unset(struct wl_listener *listener, void *data)
+policy_free_func(void *data)
 {
-    struct tinyds_server *server;
-    struct ds_tizen_launch_effect_event_type_unset *event = data;
-    struct tinyds_view *view = NULL;
-
-    server = wl_container_of(listener, server, effect_type_unset);
+    struct tinyds_server *server = (struct tinyds_server *)data;
 
-    ds_inf("Launch effect. type_unset: pid(%u)", event->pid);
-
-    wl_list_for_each(view, &server->views, link) {
-        if (view->pid == event->pid) {
-            view->effect_type = -1;
-            ds_inf("Launch effect. pid found");
-        }
-    }
-    ds_tizen_launch_effect_unset_effect_type(server->effect, event->pid);
+    server->policy = NULL;
 }
 
 static void
-launch_splash_handle_owner(struct wl_listener *listener, void *data)
+launch_free_func(void *data)
 {
-    struct tinyds_server *server;
-    struct ds_tizen_launch_splash_event_owner *event = data;
-    struct tinyds_view *view = NULL;
-
-    server = wl_container_of(listener, server, splash_owner);
-
-    ds_inf("Splash owner. pid(%u)", event->pid);
+    struct tinyds_server *server = (struct tinyds_server *)data;
 
-    wl_list_for_each(view, &server->views, link) {
-        if (view->pid == event->pid) {
-            if (event->pid == ds_tizen_launch_splash_get_pid(server->splash))
-                ;//
-            else {
-                ds_tizen_launch_splash_set_pid(server->splash, event->pid);
-            }
-        }
-    }
+    server->launch = NULL;
 }
 
 static void
-launch_effect_handle_new_splash(struct wl_listener *listener, void *data)
+input_devicemgr_free_func(void *data)
 {
-    struct tinyds_server *server;
-    struct ds_tizen_launch_splash *splash = data;
-    struct tinyds_view *view = NULL;
-
-    server = wl_container_of(listener, server, new_splash);
-
-    ds_inf("Launch new splash. splash(%p)", splash);
-    if (!splash) return;
+    struct tinyds_server *server = (struct tinyds_server *)data;
 
-    server->splash = splash;
-
-    // new view for "Launchscreen"
-    view = calloc(1, sizeof *view);
-    assert(view);
-    wl_list_insert(server->views.prev, &view->link);
-    view->pid = ds_tizen_launch_splash_get_pid(splash);
-
-    server->splash_owner.notify = launch_splash_handle_owner;
-    ds_tizen_launch_splash_add_owner_listener(server->splash,
-            &server->splash_owner);
+    server->input_devicemgr = NULL;
 }
 
 static bool
@@ -971,10 +542,16 @@ init_server(struct tinyds_server *server, struct wl_display *display)
     ds_xdg_shell_add_new_surface_listener(server->xdg_shell,
             &server->new_xdg_surface);
 
-    if (!add_new_dpms(server))
+    server->dpms = tinyds_dpms_init(server->display, dpms_free_func, (void *)server);
+    if (!server->dpms)
+        goto err;
+
+    server->policy = tinyds_policy_init(server->display, policy_free_func, (void *)server);
+    if (!server->policy)
         goto err;
 
-    if (!new_policy(server))
+    server->launch = tinyds_launch_init(server->display, launch_free_func, (void *)server);
+    if (!server->launch)
         goto err;
 
     server->seat = ds_seat_create(display, "seat0" /* arbitrary name */);
@@ -982,43 +559,10 @@ init_server(struct tinyds_server *server, struct wl_display *display)
         goto err;
     server->seat_caps = 0;
 
-    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;
-    }
-
-    devicemgr_set_keymap(server->devicemgr);
-
-    server->devicemgr_destroy.notify = devicemgr_handle_destroy;
-    ds_tizen_input_devicemgr_add_destroy_listener(server->devicemgr,
-            &server->devicemgr_destroy);
-
-    server->pointer_warp.notify = devicemgr_handle_pointer_warp;
-    ds_tizen_input_devicemgr_add_pointer_warp_listener(server->devicemgr,
-            &server->pointer_warp);
-
-    server->effect = ds_tizen_launch_effect_create(display);
-    if (!server->effect) {
+    server->input_devicemgr = tinyds_input_devicemgr_init(server->input_backend,
+             server->seat, input_devicemgr_free_func, (void *)server);
+    if (!server->input_devicemgr)
         goto err;
-    }
-
-    server->effect_destroy.notify = launch_effect_handle_destroy;
-    ds_tizen_launch_effect_add_destroy_listener(server->effect,
-            &server->effect_destroy);
-
-    server->effect_type_set.notify = launch_effect_handle_type_set;
-    ds_tizen_launch_effect_add_type_set_listener(server->effect,
-            &server->effect_type_set);
-
-    server->effect_type_unset.notify = launch_effect_handle_type_unset;
-    ds_tizen_launch_effect_add_type_unset_listener(server->effect,
-            &server->effect_type_unset);
-
-    server->new_splash.notify = launch_effect_handle_new_splash;
-    ds_tizen_launch_effect_add_new_splash_listener(server->effect,
-            &server->new_splash);
 
     if (!add_new_text_input(server))
         goto err;
@@ -1079,7 +623,7 @@ output_commit(struct tinyds_output *output)
     struct ds_tdm_output_hwc_window **changed_hwc_windows = NULL;
     enum ds_tdm_output_hwc_window_composition composition;
     struct tinyds_view *view;
-    int i;
+    size_t i;
     bool need_target = false;
     bool fully_obscured = false;
     struct ds_buffer *ds_buffer;
@@ -1220,7 +764,7 @@ output_commit(struct tinyds_output *output)
             return;
         }
 
-        for (i = 0; i < num_changed; i++) {
+        for (i = 0; i < (size_t)num_changed; i++) {
             composition = ds_tdm_output_hwc_window_get_composition(changed_hwc_windows[i]);
             if (composition == DS_TDM_OUTPUT_HWC_WINDOW_COMPOSITION_CLIENT) {
                 need_target = true;
@@ -1261,8 +805,6 @@ output_commit(struct tinyds_output *output)
     output->target_updated = false;
 
     wl_list_for_each(view, &output->server->views, link) {
-        enum ds_tdm_output_hwc_window_composition composition;
-
         if (!view->mapped)
             continue;
 
@@ -1522,53 +1064,6 @@ server_dispatch_stdin(int fd, uint32_t mask, void *data)
 }
 
 static void
-dpms_handle_destroy(struct wl_listener *listener, void *data)
-{
-    struct tinyds_dpms *dpms;
-
-    dpms = wl_container_of(listener, dpms, destroy);
-
-    ds_inf("Dpms(%p) destroyed", dpms);
-
-    wl_list_remove(&dpms->destroy.link);
-    wl_list_remove(&dpms->set_dpms.link);
-    wl_list_remove(&dpms->get_dpms.link);
-
-    free(dpms);
-}
-
-static void
-dpms_handle_set_dpms(struct wl_listener *listener, void *data)
-{
-    struct tinyds_dpms *dpms;
-    struct ds_tizen_dpms_event *event = data;
-
-    dpms = wl_container_of(listener, dpms, set_dpms);
-
-    ds_inf("Dpms(%p) set dpms : %d", dpms, event->mode);
-
-    //To do
-    //set dpms mode to output
-    ds_tizen_dpms_send_set_result(dpms->ds_dpms, event->mode,
-        DS_TIZEN_DPMS_ERROR_NONE);
-}
-
-static void
-dpms_handle_get_dpms(struct wl_listener *listener, void *data)
-{
-    struct tinyds_dpms *dpms;
-
-    dpms = wl_container_of(listener, dpms, get_dpms);
-
-    ds_inf("Dpms(%p) get dpms", dpms);
-
-    //To do
-    //get dpms mode from output
-    ds_tizen_dpms_send_get_result(dpms->ds_dpms, DS_TIZEN_DPMS_MODE_ON,
-        DS_TIZEN_DPMS_ERROR_NONE);
-}
-
-static void
 keyboard_handle_device_destroy(struct wl_listener *listener, void *data)
 {
     struct tinyds_keyboard *kbd;
@@ -1602,7 +1097,7 @@ static void
 keyboard_handle_key(struct wl_listener *listener, void *data)
 {
     struct tinyds_keyboard *kbd;
-    struct ds_event_keyboard_key *event = data;
+    struct ds_keyboard_event_key *event = data;
     struct ds_keyboard *ds_keyboard;
     struct xkb_state *xkb_state;
     const xkb_keysym_t *syms;
@@ -1682,8 +1177,8 @@ err:
     free(kbd);
 }
 
-static struct tinyds_view *
-server_view_at(struct tinyds_server *server, double lx, double ly,
+struct tinyds_view *
+tinyds_server_view_at(struct tinyds_server *server, double lx, double ly,
         double *sx, double *sy)
 {
     struct tinyds_view *view;
@@ -1730,7 +1225,7 @@ touch_handle_device_destroy(struct wl_listener *listener, void *data)
 static void
 touch_handle_down(struct wl_listener *listener, void *data)
 {
-    struct ds_event_touch_down *event = data;
+    struct ds_touch_event_down *event = data;
     struct tinyds_touch *touch;
     struct tinyds_view *view;
     struct tinyds_server *server;
@@ -1739,13 +1234,15 @@ touch_handle_down(struct wl_listener *listener, void *data)
     touch = wl_container_of(listener, touch, down);
 
     server = touch->server;
-    server->output_x = event->x * server->output->width;
-    server->output_y = event->y * server->output->height;
+    if (server->output) {
+        server->output_x = event->x * server->output->width;
+        server->output_y = event->y * server->output->height;
+    }
 
     ds_inf("Touch(%p) event down: id(%d) x %.3f y %.3f output_x %.1f output_y %.1f",
             touch->dev, event->id, event->x, event->y, server->output_x, server->output_y);
 
-    view = server_view_at(server, server->output_x, server->output_y, &sx, &sy);
+    view = tinyds_server_view_at(server, server->output_x, server->output_y, &sx, &sy);
 
     if (view) {
         ds_seat_touch_notify_down(touch->server->seat, ds_xdg_surface_get_surface(view->xdg_surface),
@@ -1763,7 +1260,7 @@ touch_handle_down(struct wl_listener *listener, void *data)
 static void
 touch_handle_up(struct wl_listener *listener, void *data)
 {
-    struct ds_event_touch_up *event = data;
+    struct ds_touch_event_up *event = data;
     struct tinyds_touch *touch;
 
     touch = wl_container_of(listener, touch, up);
@@ -1777,7 +1274,7 @@ touch_handle_up(struct wl_listener *listener, void *data)
 static void
 touch_handle_motion(struct wl_listener *listener, void *data)
 {
-    struct ds_event_touch_motion *event = data;
+    struct ds_touch_event_motion *event = data;
     struct tinyds_touch *touch;
     struct tinyds_view *view;
     struct tinyds_server *server;
@@ -1786,13 +1283,15 @@ touch_handle_motion(struct wl_listener *listener, void *data)
     touch = wl_container_of(listener, touch, motion);
 
     server = touch->server;
-    server->output_x = event->x * server->output->width;
-    server->output_y = event->y * server->output->height;
+    if (server->output) {
+        server->output_x = event->x * server->output->width;
+        server->output_y = event->y * server->output->height;
+    }
 
     ds_inf("Touch(%p) event motion: id(%d) x %.3f y %.3f output_x %.1f output_y %.1f",
             touch->dev, event->id, event->x, event->y, server->output_x, server->output_y);
 
-    view = server_view_at(server, server->output_x, server->output_y, &sx, &sy);
+    view = tinyds_server_view_at(server, server->output_x, server->output_y, &sx, &sy);
 
     if (view) {
         ds_seat_touch_notify_motion(server->seat, event->time_msec,
@@ -1872,7 +1371,7 @@ static void
 pointer_handle_motion(struct wl_listener *listener, void *data)
 {
     struct tinyds_pointer *pointer;
-    struct ds_event_pointer_motion *event = data;
+    struct ds_pointer_event_motion *event = data;
     struct tinyds_view *view;
     struct tinyds_server *server;
     int ow = 0, oh = 0;
@@ -1902,7 +1401,7 @@ pointer_handle_motion(struct wl_listener *listener, void *data)
     ds_inf("Pointer(%p) motion: (delta_x %.1f delta_y %.1f) output_x %.1f output_y %.1f",
             pointer, event->delta_x, event->delta_y, server->output_x, server->output_y);
 
-    view = server_view_at(pointer->server, server->output_x, server->output_y, &sx, &sy);
+    view = tinyds_server_view_at(pointer->server, server->output_x, server->output_y, &sx, &sy);
 
     if (pointer->focused_view != view) {
         if (pointer->focused_view) {
@@ -1936,7 +1435,7 @@ static void
 pointer_handle_button(struct wl_listener *listener, void *data)
 {
     struct tinyds_pointer *pointer;
-    struct ds_event_pointer_button *event = data;
+    struct ds_pointer_event_button *event = data;
 
     pointer = wl_container_of(listener, pointer, button);
 
@@ -2674,916 +2173,25 @@ add_new_input_method_context(struct tinyds_input_method *input_method,
     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->destroy.link);
-    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->destroy.link);
-    wl_list_remove(&position->set.link);
-    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_view *
+tinyds_server_get_focused_view(struct tinyds_server *server)
 {
-    struct tinyds_policy_subsurface_watcher *subsurface_watcher;
+    struct tinyds_view *view = NULL;
+    struct tinyds_pointer *pointer;
 
-    subsurface_watcher = wl_container_of(listener, subsurface_watcher, destroy);
+    wl_list_for_each(pointer, &server->pointers, link){
+        if (!pointer->focused_view) continue;
 
-    ds_inf("Policy Subsurface_Watcher(%p) destroy", subsurface_watcher);
+        view = pointer->focused_view;
+    }
 
-    wl_list_remove(&subsurface_watcher->destroy.link);
-    wl_list_remove(&subsurface_watcher->link);
-    free(subsurface_watcher);
+    return view;
 }
 
-static void
-policy_surface_handle_destroy(struct wl_listener *listener, void *data)
+void
+tinyds_server_get_output_size(struct tinyds_server *server,
+    int *output_w, int *output_h)
 {
-    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->destroy.link);
-    wl_list_remove(&policy_surface->new_visibility.link);
-    wl_list_remove(&policy_surface->new_position.link);
-    wl_list_remove(&policy_surface->activate.link);
-    wl_list_remove(&policy_surface->raise.link);
-    wl_list_remove(&policy_surface->lower.link);
-    wl_list_remove(&policy_surface->set_focus_skip.link);
-    wl_list_remove(&policy_surface->unset_focus_skip.link);
-    wl_list_remove(&policy_surface->set_role.link);
-    wl_list_remove(&policy_surface->set_window_type.link);
-    wl_list_remove(&policy_surface->set_conformant.link);
-    wl_list_remove(&policy_surface->unset_conformant.link);
-    wl_list_remove(&policy_surface->get_conformant.link);
-    wl_list_remove(&policy_surface->set_notification_level.link);
-    wl_list_remove(&policy_surface->set_window_screen_mode.link);
-    wl_list_remove(&policy_surface->get_subsurface.link);
-    wl_list_remove(&policy_surface->iconify.link);
-    wl_list_remove(&policy_surface->uniconify.link);
-    wl_list_remove(&policy_surface->add_aux_hint.link);
-    wl_list_remove(&policy_surface->change_aux_hint.link);
-    wl_list_remove(&policy_surface->delete_aux_hint.link);
-    wl_list_remove(&policy_surface->get_supported_aux_hints.link);
-    wl_list_remove(&policy_surface->set_floating_mode.link);
-    wl_list_remove(&policy_surface->unset_floating_mode.link);
-    wl_list_remove(&policy_surface->set_stack_mode.link);
-    wl_list_remove(&policy_surface->new_subsurface_watcher.link);
-    wl_list_remove(&policy_surface->set_parent.link);
-    wl_list_remove(&policy_surface->ack_conformant_region.link);
-    wl_list_remove(&policy_surface->set_video.link);
-    wl_list_remove(&policy_surface->show.link);
-    wl_list_remove(&policy_surface->hide.link);
-    wl_list_remove(&policy_surface->set_parent_with_below.link);
-    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);
-
-    wl_list_remove(&policy->destroy.link);
-    wl_list_remove(&policy->new_surface.link);
-    wl_list_remove(&policy->activate_below_by_univeral_id.link);
-    wl_list_remove(&policy->lower_by_universal_id.link);
-    wl_list_remove(&policy->set_transient_for.link);
-    wl_list_remove(&policy->unset_transient_for.link);
-    wl_list_remove(&policy->place_subsurface_below_parent.link);
-    wl_list_remove(&policy->set_subsurface_stand_alone.link);
-    wl_list_remove(&policy->set_background_state.link);
-    wl_list_remove(&policy->unset_background_state.link);
-    wl_list_remove(&policy->add_activate_above_by_universal_id.link);
-    wl_list_remove(&policy->set_appid.link);
-    wl_list_remove(&policy->set_transient_for_below.link);
-
-    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->set_background_state);
-
-    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;
+    *output_w = server->output->width;
+    *output_h = server->output->height;
 }