merge tizends-tdm-dpms code to tinyds-tdm
[platform/core/uifw/libds-tizen.git] / examples / tinyds-tdm.c
index 4bc08f1..98b9a0a 100644 (file)
@@ -16,6 +16,7 @@
 #include <libds-tizen/allocator/tbm.h>
 #include <libds-tizen/backend/tdm.h>
 #include <libds-tizen/tbm_server.h>
+#include <libds-tizen/dpms.h>
 
 #define USE_TDM_BUFFER_QUEUE
 
@@ -53,6 +54,16 @@ struct tinyds_output
     bool damaged;
 };
 
+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_server
 {
     struct ds_tbm_server *tbm_server;
@@ -64,6 +75,7 @@ struct tinyds_server
     struct ds_xdg_shell *xdg_shell;
 
     struct tinyds_output *output;
+    struct tinyds_dpms *dpms;
     struct wl_event_source *stdin_source;
 
     struct wl_list views;
@@ -110,6 +122,10 @@ 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);
+
 
 int
 main(void)
@@ -290,6 +306,35 @@ backend_handle_new_output(struct wl_listener *listener, void *data)
 }
 
 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)
+        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 bool
 init_server(struct tinyds_server *server, struct wl_display *display)
 {
     server->display = display;
@@ -329,6 +374,11 @@ 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)) {
+        ds_backend_destroy(server->backend);
+        return false;
+    }
+
     return true;
 }
 
@@ -573,3 +623,50 @@ server_dispatch_stdin(int fd, uint32_t mask, void *data)
 
     return 1;
 }
+
+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);
+}