added code to support setting screen mode 69/72069/3
authorDoyoun Kang <doyoun.kang@samsung.com>
Mon, 30 May 2016 11:16:34 +0000 (20:16 +0900)
committerGwanglim Lee <gl77.lee@samsung.com>
Thu, 2 Jun 2016 04:36:54 +0000 (21:36 -0700)
Change-Id: I37eb60e07797497da5e91346375d4ff1ef95a5c1

src/Makefile.am
src/e_mod_utils.h
src/e_mod_wl.c
src/e_mod_wl_display.c [new file with mode: 0644]
src/e_mod_wl_display.h [new file with mode: 0644]

index 27011eec627f6bb7f453786f83623a2c41b4ce79..f0de5cac756954bcbc839a91bf2ed57d7c988167 100644 (file)
@@ -34,9 +34,10 @@ ROT_SRC  += rotation/e_mod_sensord.c \
             rotation/e_mod_sensord.h
 endif
 
-if HAVE_WAYLAND_ONLY
 WL_SRC   += e_mod_wl.c \
             e_mod_wl.h \
+            e_mod_wl_display.c \
+            e_mod_wl_display.h \
             tizen_policy_ext-protocol.c \
             tizen_policy_ext-server-protocol.h
 
@@ -45,7 +46,6 @@ ROT_SRC  += rotation/e_mod_rotation_wl.c \
 
 SRVS_SRC += services/e_mod_volume.c \
             services/e_mod_volume.h
-endif
 
 module_la_SOURCES      = e_mod_config.c \
                          e_mod_main.c \
index 256c5f5d12d242d2b98a502641ed41d77cb11967..f004e172f740f40c4a5fa03fd827e132e09d791a 100644 (file)
@@ -1,4 +1,14 @@
 #ifndef E_MOD_UTILS_H
 #define E_MOD_UTILS_H
 
+#define E_CLIENT_HOOK_APPEND(l, t, cb, d) \
+  do                                      \
+    {                                     \
+       E_Client_Hook *_h;                 \
+       _h = e_client_hook_add(t, cb, d);  \
+       assert(_h);                        \
+       l = eina_list_append(l, _h);       \
+    }                                     \
+  while (0)
+
 #endif
index eaf0be3050250e4a8bfdca54e26c516622545b7a..0a8120a682f5f4cc85df92d7e2f26654ac4831f0 100644 (file)
@@ -3,6 +3,7 @@
 #include "e_mod_quickpanel.h"
 #include "e_mod_volume.h"
 #include "e_mod_lockscreen.h"
+#include "e_mod_wl_display.h"
 
 #include <device/display.h>
 #include <wayland-server.h>
@@ -1834,6 +1835,7 @@ _tzpol_iface_cb_win_scrmode_set(struct wl_client *client EINA_UNUSED, struct wl_
         return;
      }
 
+   e_mod_pol_display_screen_mode_set(ec, mode);
    e_mod_pol_wl_win_scrmode_apply();
 
    tizen_policy_send_window_screen_mode_done
@@ -1843,8 +1845,7 @@ _tzpol_iface_cb_win_scrmode_set(struct wl_client *client EINA_UNUSED, struct wl_
 void
 e_mod_pol_wl_win_scrmode_apply(void)
 {
-   // TODO: update screen mode for ec which was changed to be visible
-   ;
+   e_mod_pol_display_screen_mode_apply();
 }
 
 // --------------------------------------------------------
@@ -4250,6 +4251,8 @@ e_mod_pol_wl_init(void)
 
    E_COMP_WL_HOOK_APPEND(hooks_cw, E_COMP_WL_HOOK_SHELL_SURFACE_READY, _pol_wl_cb_hook_shell_surface_ready, NULL);
 
+   e_mod_pol_display_init();
+
    return EINA_TRUE;
 
 err:
@@ -4273,6 +4276,8 @@ e_mod_pol_wl_shutdown(void)
    struct wl_global *global;
    int i;
 
+   e_mod_pol_display_shutdown();
+
    EINA_SAFETY_ON_NULL_RETURN(polwl);
 
    E_FREE_LIST(hooks_cw, e_comp_wl_hook_del);
diff --git a/src/e_mod_wl_display.c b/src/e_mod_wl_display.c
new file mode 100644 (file)
index 0000000..f716928
--- /dev/null
@@ -0,0 +1,278 @@
+#include "e_mod_wl_display.h"
+#include "e_mod_utils.h"
+
+typedef struct _E_Display_Dbus_Info
+{
+   Eldbus_Connection *conn;
+} E_Display_Dbus_Info;
+
+#define BUS_NAME "org.enlightenment.wm"
+
+#define DEVICED_DEST "org.tizen.system.deviced"
+#define DEVICED_PATH "/Org/Tizen/System/DeviceD/Display"
+#define DEVICED_IFACE "org.tizen.system.deviced.display"
+#define DEVICED_LOCK_STATE "lockstate"
+#define DEVICED_UNLOCK_STATE "unlockstate"
+
+#define DEVICED_LCDON "lcdon"
+#define DEVICED_STAY_CUR_STATE "staycurstate"
+#define DEVICED_SLEEP_MARGIN "sleepmargin"
+
+/* static global variables */
+static E_Display_Dbus_Info _e_display_dbus_info;
+static Eina_List *_display_control_hooks = NULL;
+
+/* for screen mode */
+static Eina_List *_screen_mode_client_list = NULL;
+static E_Display_Screen_Mode _e_display_screen_mode;
+
+/* static functions */
+static Eina_Bool _e_mod_pol_display_dbus_init(void);
+static void      _e_mod_pol_display_dbus_shutdown(void);
+static void      _e_mod_pol_display_dbus_request_name_cb(void *data EINA_UNUSED, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED);
+
+static Eina_Bool _e_mod_wl_display_client_add_to_list(Eina_List** list, E_Client *ec);
+static Eina_Bool _e_mod_wl_display_client_remove_from_list(Eina_List** list, E_Client *ec);
+
+static void _e_mod_wl_display_hook_client_del(void *d EINA_UNUSED, E_Client *ec);
+static void _e_mod_wl_display_hook_client_visibility(void *d EINA_UNUSED, E_Client *ec);
+
+/* for screen mode */
+static Eina_Bool _e_mod_wl_display_screen_mode_find_visible_window(void);
+static void      _e_mod_wl_display_screen_mode_send(E_Display_Screen_Mode mode);
+
+
+static Eina_Bool
+_e_mod_pol_display_dbus_init(void)
+{
+   if (eldbus_init() == 0) return EINA_FALSE;
+
+   _e_display_dbus_info.conn = eldbus_connection_get(ELDBUS_CONNECTION_TYPE_SYSTEM);
+   EINA_SAFETY_ON_NULL_GOTO(_e_display_dbus_info.conn, failed);
+
+   eldbus_name_request(_e_display_dbus_info.conn,
+                       BUS_NAME,
+                       ELDBUS_NAME_REQUEST_FLAG_DO_NOT_QUEUE,
+                       _e_mod_pol_display_dbus_request_name_cb,
+                       NULL);
+
+   return EINA_TRUE;
+
+failed:
+   _e_mod_pol_display_dbus_shutdown();
+   return EINA_FALSE;
+}
+
+static void
+_e_mod_pol_display_dbus_shutdown(void)
+{
+   if (_e_display_dbus_info.conn)
+     {
+        eldbus_name_release(_e_display_dbus_info.conn, BUS_NAME, NULL, NULL);
+        eldbus_connection_unref(_e_display_dbus_info.conn);
+        _e_display_dbus_info.conn = NULL;
+     }
+
+   eldbus_shutdown();
+}
+
+static void
+_e_mod_pol_display_dbus_request_name_cb(void *data EINA_UNUSED, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED)
+{
+   unsigned int flag;
+
+   if (eldbus_message_error_get(msg, NULL, NULL))
+     {
+        ERR("Could not request bus name");
+        return;
+     }
+
+   if (!eldbus_message_arguments_get(msg, "u", &flag))
+     {
+        ERR("Could not get arguments on on_name_request");
+        return;
+     }
+
+   if (!(flag & ELDBUS_NAME_REQUEST_REPLY_PRIMARY_OWNER))
+     {
+        WRN("Name already in use\n");
+     }
+}
+
+static Eina_Bool
+_e_mod_wl_display_client_add_to_list(Eina_List** list, E_Client *ec)
+{
+   if (!ec) return EINA_FALSE;
+
+   if (eina_list_data_find(*list, ec) == ec)
+     return EINA_TRUE;
+
+   *list = eina_list_append(*list, ec);
+
+   return EINA_TRUE;
+}
+
+static Eina_Bool
+_e_mod_wl_display_client_remove_from_list(Eina_List** list, E_Client *ec)
+{
+   if (!ec) return EINA_FALSE;
+
+   if (!eina_list_data_find(*list, ec))
+     return EINA_FALSE;
+
+   *list = eina_list_remove(*list, ec);
+
+   return EINA_TRUE;
+}
+
+static void
+_e_mod_wl_display_hook_client_del(void *d EINA_UNUSED, E_Client *ec)
+{
+   _e_mod_wl_display_client_remove_from_list(&_screen_mode_client_list, ec);
+}
+
+static void
+_e_mod_wl_display_hook_client_visibility(void *d EINA_UNUSED, E_Client *ec)
+{
+   if (ec->visibility.changed)
+     {
+        e_mod_pol_display_screen_mode_apply();
+     }
+}
+
+static Eina_Bool
+_e_mod_wl_display_screen_mode_find_visible_window(void)
+{
+   Eina_List *l = NULL;
+   E_Client *ec = NULL;
+   Eina_Bool find = EINA_FALSE;
+   int ec_visibility;
+
+   if (_screen_mode_client_list == NULL) return EINA_FALSE;
+
+   EINA_LIST_FOREACH(_screen_mode_client_list, l, ec)
+     {
+        if (e_object_is_del(E_OBJECT(ec)))
+          ec_visibility = E_VISIBILITY_FULLY_OBSCURED;
+        else
+          ec_visibility = ec->visibility.obscured;
+
+        if ((ec_visibility == E_VISIBILITY_UNOBSCURED) ||
+            (ec_visibility == E_VISIBILITY_PARTIALLY_OBSCURED))
+          {
+             find = EINA_TRUE;
+             break;
+          }
+     }
+
+   return find;
+}
+
+static void
+_e_mod_wl_display_screen_mode_send(E_Display_Screen_Mode mode)
+{
+   Eldbus_Message *msg;
+   Eina_Bool ret;
+   unsigned int timeout = 0;
+
+   if (!_e_display_dbus_info.conn) return;
+
+   if (mode == E_DISPLAY_SCREEN_MODE_ALWAYS_ON)
+     {
+        msg = eldbus_message_method_call_new(DEVICED_DEST,
+                                             DEVICED_PATH,
+                                             DEVICED_IFACE,
+                                             DEVICED_LOCK_STATE);
+        if (!msg) return;
+
+        ret = eldbus_message_arguments_append(msg, "sssi",
+                                              DEVICED_LCDON,
+                                              DEVICED_STAY_CUR_STATE,
+                                              "",
+                                              timeout);
+     }
+   else
+     {
+        msg = eldbus_message_method_call_new(DEVICED_DEST,
+                                             DEVICED_PATH,
+                                             DEVICED_IFACE,
+                                             DEVICED_UNLOCK_STATE);
+        if (!msg) return;
+
+        ret = eldbus_message_arguments_append(msg, "ss",
+                                              DEVICED_LCDON,
+                                              DEVICED_SLEEP_MARGIN);
+     }
+
+   if (!ret)
+     {
+        if (msg)
+          eldbus_message_unref(msg);
+
+        return;
+     }
+
+   _e_display_screen_mode = mode;
+   DBG("[SCREEN_MODE] Request screen mode:%d\n", mode);
+
+   eldbus_connection_send(_e_display_dbus_info.conn, msg, NULL, NULL, -1);
+}
+
+Eina_Bool
+e_mod_pol_display_init(void)
+{
+   if (!_e_mod_pol_display_dbus_init()) return EINA_FALSE;
+
+   _e_display_screen_mode = E_DISPLAY_SCREEN_MODE_DEFAULT;
+
+   /* hook functions */
+   E_CLIENT_HOOK_APPEND(_display_control_hooks, E_CLIENT_HOOK_DEL, _e_mod_wl_display_hook_client_del, NULL);
+   E_CLIENT_HOOK_APPEND(_display_control_hooks, E_CLIENT_HOOK_EVAL_VISIBILITY, _e_mod_wl_display_hook_client_visibility, NULL);
+
+   return EINA_TRUE;
+}
+
+void
+e_mod_pol_display_shutdown(void)
+{
+   E_FREE_LIST(_display_control_hooks, e_client_hook_del);
+
+   if (_screen_mode_client_list) eina_list_free(_screen_mode_client_list);
+
+   _e_mod_pol_display_dbus_shutdown();
+}
+
+void
+e_mod_pol_display_screen_mode_set(E_Client *ec, int mode)
+{
+   if (!ec) return;
+   if (e_object_is_del(E_OBJECT(ec))) return;
+
+   if (mode == 0)
+     {
+        _e_mod_wl_display_client_remove_from_list(&_screen_mode_client_list, ec);
+        e_mod_pol_display_screen_mode_apply();
+     }
+   else
+     {
+        _e_mod_wl_display_client_add_to_list(&_screen_mode_client_list, ec);
+        e_mod_pol_display_screen_mode_apply();
+     }
+}
+
+void
+e_mod_pol_display_screen_mode_apply(void)
+{
+   /* check the _screen_mode_client_list and update the lcd locked status */
+   if (_e_mod_wl_display_screen_mode_find_visible_window())
+     {
+        if (_e_display_screen_mode == E_DISPLAY_SCREEN_MODE_DEFAULT)
+          _e_mod_wl_display_screen_mode_send(E_DISPLAY_SCREEN_MODE_ALWAYS_ON);
+     }
+   else
+     {
+        if (_e_display_screen_mode == E_DISPLAY_SCREEN_MODE_ALWAYS_ON)
+          _e_mod_wl_display_screen_mode_send(E_DISPLAY_SCREEN_MODE_DEFAULT);
+     }
+}
+
diff --git a/src/e_mod_wl_display.h b/src/e_mod_wl_display.h
new file mode 100644 (file)
index 0000000..9d61574
--- /dev/null
@@ -0,0 +1,19 @@
+#ifndef E_MOD_WL_DISPLAY_CONTROL_H
+#define E_MOD_WL_H
+
+#define E_COMP_WL
+#include <e.h>
+
+typedef enum _E_Display_Screen_Mode
+{
+   E_DISPLAY_SCREEN_MODE_DEFAULT = 0,
+   E_DISPLAY_SCREEN_MODE_ALWAYS_ON = 1,
+} E_Display_Screen_Mode;
+
+Eina_Bool e_mod_pol_display_init(void);
+void      e_mod_pol_display_shutdown(void);
+
+void      e_mod_pol_display_screen_mode_set(E_Client *ec, int mode);
+void      e_mod_pol_display_screen_mode_apply(void);
+
+#endif