e_dpms: implementation of wayland-extension tizen-dpms-manager server interface 44/204544/9 accepted/tizen/unified/20190515.221739 submit/tizen/20190514.024650
authorJunkyeong Kim <jk0430.kim@samsung.com>
Wed, 24 Apr 2019 08:35:51 +0000 (17:35 +0900)
committerSooChan Lim <sc1.lim@samsung.com>
Wed, 15 May 2019 05:56:41 +0000 (05:56 +0000)
Change-Id: Iba62ebeec7a3173299b6a2e2b3e0decd3ef90e4a
Signed-off-by: Junkyeong Kim <jk0430.kim@samsung.com>
configure.ac
packaging/enlightenment.spec
src/bin/e_dpms.c

index d34387a..5c595e7 100755 (executable)
@@ -365,9 +365,9 @@ shm_unlink("/");
 LIBS=${LIBS_save}
 AC_MSG_RESULT([${have_shm_open}])
 AC_SUBST(SHM_OPEN_LIBS)
-                           
+
 if test "x${e_cv_want_wayland_only}" != "xno" || test "x${e_cv_want_wayland_clients}" != "xno";then
-  PKG_CHECK_MODULES([WAYLAND], [wayland-server >= 1.8.0 xkbcommon uuid xdg-shell-unstable-v5-server xdg-shell-unstable-v6-server tizen-remote-surface-server scaler-server screenshooter-server tizen-extension-server tizen-launch-server tizen-surface-server eom-server],
+  PKG_CHECK_MODULES([WAYLAND], [wayland-server >= 1.8.0 xkbcommon uuid xdg-shell-unstable-v5-server xdg-shell-unstable-v6-server tizen-remote-surface-server scaler-server screenshooter-server tizen-extension-server tizen-launch-server tizen-surface-server tizen-dpms-server eom-server],
     [
       have_wayland=yes
       AC_DEFINE_UNQUOTED([HAVE_WAYLAND],[1],[enable wayland support])
index 565ece7..ecb8b1d 100644 (file)
@@ -41,6 +41,7 @@ BuildRequires:  pkgconfig(tizen-launch-server)
 BuildRequires:  pkgconfig(wayland-tbm-server)
 BuildRequires:  pkgconfig(tizen-remote-surface-server)
 BuildRequires:  pkgconfig(tizen-surface-server)
+BuildRequires:  pkgconfig(tizen-dpms-server)
 BuildRequires:  pkgconfig(eom-server)
 BuildRequires:  pkgconfig(libtdm)
 BuildRequires:  pkgconfig(gbm)
index f6a9125..e59ada0 100644 (file)
@@ -3,15 +3,24 @@
 #endif
 
 #include "e.h"
+#include <tizen-dpms-server-protocol.h>
 
 typedef enum _E_Dpms_Mode
 {
-   E_DPMS_MODE_ON      = 0,
-   E_DPMS_MODE_STANDBY = 1,
-   E_DPMS_MODE_SUSPEND = 2,
-   E_DPMS_MODE_OFF     = 3
+   E_DPMS_MODE_ON        = 0,
+   E_DPMS_MODE_STANDBY   = 1,
+   E_DPMS_MODE_SUSPEND   = 2,
+   E_DPMS_MODE_OFF       = 3
 } E_Dpms_Mode;
 
+typedef enum _E_Dpms_Manager_Error {
+   E_DPMS_MANAGER_ERROR_NONE = 0,
+   E_DPMS_MANAGER_ERROR_INVALID_PERMISSION = 1,
+   E_DPMS_MANAGER_ERROR_INVALID_PARAMETER = 2,
+   E_DPMS_MANAGER_ERROR_NOT_SUPPORTED = 3,
+   E_DPMS_MANAGER_ERROR_ALREADY_DONE = 4,
+} E_Dpms_Manager_Error;
+
 #define BUS "org.enlightenment.wm"
 #define PATH "/org/enlightenment/wm"
 #define INTERFACE "org.enlightenment.wm.dpms"
@@ -21,6 +30,18 @@ static Eldbus_Connection_Type edbus_conn_type = ELDBUS_CONNECTION_TYPE_SYSTEM;
 Ecore_Event_Handler *dbus_init_done_handler = NULL;
 static Eldbus_Service_Interface *iface;
 
+static Eina_List *dpms_list;
+
+typedef struct _E_Dpms
+{
+   struct wl_resource *resource;
+   struct wl_resource *output;
+
+   E_Comp_Wl_Output *wl_output;
+   E_Output *e_output;
+   E_Dpms_Mode mode;
+} E_Dpms;
+
 static Eldbus_Message *
 _e_dpms_set_cb(const Eldbus_Service_Interface *iface, const Eldbus_Message *msg)
 {
@@ -149,6 +170,124 @@ _e_dpms_cb_dbus_init_done(void *data, int type, void *event)
    return ECORE_CALLBACK_PASS_ON;
 }
 
+static E_Dpms *
+_e_tizen_dpms_manager_create(struct wl_resource *output)
+{
+   E_Dpms *dpms = NULL;
+
+   dpms = E_NEW(E_Dpms, 1);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(dpms, NULL);
+
+   dpms->output = output;
+   dpms->wl_output = wl_resource_get_user_data(dpms->output);
+   EINA_SAFETY_ON_NULL_GOTO(dpms->wl_output, fail_create);
+
+   dpms->e_output = e_output_find(dpms->wl_output->id);
+   EINA_SAFETY_ON_NULL_GOTO(dpms->e_output, fail_create);
+
+   dpms_list = eina_list_append(dpms_list, dpms);
+
+   return dpms;
+
+fail_create:
+   E_FREE(dpms);
+
+   return NULL;
+}
+
+static E_Dpms *
+_e_tizen_dpms_manager_find(struct wl_resource *output)
+{
+   E_Dpms *dpms = NULL;
+   Eina_List *l;
+
+   if (eina_list_count(dpms_list) == 0)
+     return _e_tizen_dpms_manager_create(output);
+
+   EINA_LIST_FOREACH(dpms_list, l, dpms)
+     {
+        if (!dpms) continue;
+
+        if (dpms->output == output)
+          return dpms;
+     }
+
+     return _e_tizen_dpms_manager_create(output);
+}
+
+static void
+_e_tizen_dpms_manager_cb_set_dpms(struct wl_client *client, struct wl_resource *resource, struct wl_resource *output, uint32_t mode)
+{
+   E_Dpms *dpms = NULL;
+   Eina_Bool ret = EINA_FALSE;
+
+   EINA_SAFETY_ON_FALSE_RETURN(mode <= E_DPMS_MODE_OFF);
+
+   dpms = _e_tizen_dpms_manager_find(output);
+   if (!dpms)
+     {
+        ERR("cannot find dpms %p", output);
+        tizen_dpms_manager_send_state(resource, E_DPMS_MODE_OFF, E_DPMS_MANAGER_ERROR_INVALID_PARAMETER);
+        return;
+     }
+
+
+   ret = e_output_dpms_set(dpms->e_output, mode);
+   dpms->mode = mode;
+
+   if (ret)
+     INF("tizen_dpms_manager set dpms(res:%p, output:%p, dpms=%d", resource, dpms->e_output, mode);
+   else
+     ERR("tizen_dpms_manager set dpms fail(res:%p, output:%p, dpms=%d", resource, dpms->e_output, mode);
+}
+
+static void
+_e_tizen_dpms_manager_cb_get_dpms(struct wl_client *client, struct wl_resource *resource, struct wl_resource *output)
+{
+   E_Dpms *dpms = NULL;
+
+   dpms = _e_tizen_dpms_manager_find(output);
+   if (!dpms)
+     {
+        ERR("cannot find dpms %p", output);
+        tizen_dpms_manager_send_state(resource, E_DPMS_MODE_OFF, E_DPMS_MANAGER_ERROR_INVALID_PARAMETER);
+        return;
+     }
+
+   dpms->mode = e_output_dpms_get(dpms->e_output);
+
+   INF("tizen_dpms_manager get dpms(res:%p, output:%p, dpms=%d", resource, dpms->e_output, dpms->mode);
+   tizen_dpms_manager_send_state(resource, dpms->mode, E_DPMS_MANAGER_ERROR_NONE);
+}
+
+static void
+_e_tizen_dpms_manager_cb_destroy(struct wl_client *client, struct wl_resource *resource)
+{
+   wl_resource_destroy(resource);
+}
+
+static const struct tizen_dpms_manager_interface _e_tizen_dpms_interface =
+{
+   _e_tizen_dpms_manager_cb_destroy,
+   _e_tizen_dpms_manager_cb_set_dpms,
+   _e_tizen_dpms_manager_cb_get_dpms,
+};
+
+static void
+_e_dpms_cb_bind(struct wl_client *client, void *data, uint32_t version, uint32_t id)
+{
+   struct wl_resource *res;
+
+   if (!(res = wl_resource_create(client, &tizen_dpms_manager_interface, MIN(version, 1), id)))
+     {
+        ERR("Could not create tizen_dpms_manager resource");
+        wl_client_post_no_memory(client);
+        return;
+     }
+
+   wl_resource_set_implementation(res, &_e_tizen_dpms_interface, NULL, NULL);
+}
+
 EINTERN int
 e_dpms_init(void)
 {
@@ -160,12 +299,26 @@ e_dpms_init(void)
         e_dbus_conn_dbus_init(edbus_conn_type);
      }
 
+   if (!e_comp_wl || !e_comp_wl->wl.disp)
+     {
+        ERR("no e_comp_wl resource. cannot create dpms interface");
+        return 1;
+     }
+
+   /* try to add dpms_manager to wayland globals */
+   if (!wl_global_create(e_comp_wl->wl.disp, &tizen_dpms_manager_interface, 1,
+                         NULL, _e_dpms_cb_bind))
+     ERR("Could not add tizen_dpms_manager to wayland globals");
+
    return 1;
 }
 
 EINTERN int
 e_dpms_shutdown(void)
 {
+   E_Dpms *dpms = NULL;
+   Eina_List *l;
+
    if (dbus_init_done_handler)
      {
         ecore_event_handler_del(dbus_init_done_handler);
@@ -187,5 +340,11 @@ e_dpms_shutdown(void)
 
    e_dbus_conn_shutdown();
 
+   EINA_LIST_FOREACH(dpms_list, l, dpms)
+     free(dpms);
+
+   eina_list_free(dpms_list);
+   dpms_list = NULL;
+
    return 1;
 }