Remove Profile Build Dependency: do it at runtime / CAPI defragmentation
[platform/core/api/efl-util.git] / src / efl_util.c
index 7464164..170f0dc 100644 (file)
 #undef LOG_TAG
 #endif
 
+/* Determine Tizen profile at runtime */
+#include <system_info.h>
+typedef enum {
+   TIZEN_PROFILE_UNKNOWN = 0,
+   TIZEN_PROFILE_MOBILE = 0x1,
+   TIZEN_PROFILE_WEARABLE = 0x2,
+   TIZEN_PROFILE_TV = 0x4,
+   TIZEN_PROFILE_IVI = 0x8,
+   TIZEN_PROFILE_COMMON = 0x10,
+} tizen_profile_t;
+static tizen_profile_t profile = TIZEN_PROFILE_UNKNOWN;
+static tizen_profile_t _get_tizen_profile()
+{
+   char *profileName;
+   system_info_get_platform_string("http://tizen.org/feature/profile", &profileName);
+   switch (*profileName) {
+   case 'm':
+   case 'M':
+     profile = TIZEN_PROFILE_MOBILE;
+     break;
+   case 'w':
+   case 'W':
+     profile = TIZEN_PROFILE_WEARABLE;
+     break;
+   case 't':
+   case 'T':
+     profile = TIZEN_PROFILE_TV;
+     break;
+   case 'i':
+   case 'I':
+     profile = TIZEN_PROFILE_IVI;
+     break;
+   default: // common or unknown ==> ALL ARE COMMON.
+     profile = TIZEN_PROFILE_COMMON;
+   }
+   free(profileName);
+
+   return profile;
+}
+static inline tizen_profile_t get_tizen_profile()
+{
+   if (__builtin_expect(profile != TIZEN_PROFILE_UNKNOWN, 1))
+     return profile;
+   return _get_tizen_profile();
+}
+
+
 #define LOG_TAG "TIZEN_N_EFL_UTIL"
 
 
@@ -98,11 +145,7 @@ typedef struct _Efl_Util_Data
    struct
    {
       Eina_Bool init;
-      int ref_count;
-
       struct wl_display *dpy;
-      struct wl_registry *reg;
-
       struct wl_event_queue *queue;
 
       struct
@@ -124,7 +167,6 @@ typedef struct _Efl_Util_Data
       {
          struct tizen_input_device_manager *devicemgr;
          int request_notified;
-         Eina_List *device_list;
       } devmgr;
       struct
       {
@@ -144,8 +186,7 @@ static Efl_Util_Data _eflutil =
 {
    {
       EINA_FALSE,
-      0,
-      NULL, NULL, NULL,
+      NULL, NULL,
       { NULL, NULL, NULL }, /* tizen_policy protocol */
       { NULL, NULL, NULL, NULL, NULL, 0 }, /* screenshooter protocol */
       { NULL, -1 } /* tizen_input_device_manager protocol */
@@ -161,8 +202,6 @@ static Eina_Bool               _cb_info_del_by_win(Evas_Object *win, int idx);
 static Eina_List              *_cb_info_list_get(int idx);
 static Efl_Util_Callback_Info *_cb_info_find_by_win(Evas_Object *win, int idx);
 static Eina_Bool               _wl_init(void);
-static void                    _wl_shutdown(void);
-
 static void                    _cb_wl_reg_global(void *data, struct wl_registry *reg, unsigned int name, const char *interface, unsigned int version);
 static void                    _cb_wl_reg_global_remove(void *data, struct wl_registry *reg, unsigned int name);
 static void                    _cb_wl_reg_screenshooter_global(void *data, struct wl_registry *reg, unsigned int name, const char *interface, unsigned int version);
@@ -296,7 +335,8 @@ _cb_info_find_by_win(Evas_Object *win,
 static Eina_Bool
 _wl_init(void)
 {
-   _eflutil.wl.ref_count++;
+   struct wl_display *display_wrapper = NULL;
+   struct wl_registry *reg = NULL;
 
    if (_eflutil.wl.init) return EINA_TRUE;
 
@@ -305,100 +345,27 @@ _wl_init(void)
    _eflutil.wl.dpy = ecore_wl_display_get();
    EINA_SAFETY_ON_NULL_GOTO(_eflutil.wl.dpy, fail);
 
+   display_wrapper = wl_proxy_create_wrapper(_eflutil.wl.dpy);
+   EINA_SAFETY_ON_NULL_GOTO(display_wrapper, fail);
+
    _eflutil.wl.queue = wl_display_create_queue(_eflutil.wl.dpy);
    EINA_SAFETY_ON_NULL_GOTO(_eflutil.wl.queue, fail);
 
-   _eflutil.wl.reg = wl_display_get_registry(_eflutil.wl.dpy);
-   EINA_SAFETY_ON_NULL_GOTO(_eflutil.wl.reg, fail);
+   wl_proxy_set_queue((struct wl_proxy *)display_wrapper, _eflutil.wl.queue);
+
+   reg = wl_display_get_registry(display_wrapper);
+   wl_proxy_wrapper_destroy(display_wrapper);
+   display_wrapper = NULL;
+   EINA_SAFETY_ON_NULL_GOTO(reg, fail);
 
-   wl_proxy_set_queue((struct wl_proxy*)_eflutil.wl.reg, _eflutil.wl.queue);
-   wl_registry_add_listener(_eflutil.wl.reg, &_wl_reg_listener, NULL);
+   wl_registry_add_listener(reg, &_wl_reg_listener, NULL);
 
    _eflutil.wl.init = EINA_TRUE;
 
    return EINA_TRUE;
 fail:
-   if (_eflutil.wl.queue)
-     {
-        wl_event_queue_destroy(_eflutil.wl.queue);
-        _eflutil.wl.queue = NULL;
-     }
-
-   if (_eflutil.wl.reg)
-     {
-        wl_registry_destroy(_eflutil.wl.reg);
-        _eflutil.wl.reg = NULL;
-     }
-
-   _eflutil.wl.dpy = NULL;
-
-   ecore_wl_shutdown();
-   return EINA_FALSE;
-}
-
-static void
-_wl_shutdown(void)
-{
-   Eina_List *l, *ll;
-   struct tizen_input_device *data;
-   Efl_Util_Wl_Output_Info *output;
-
-   if (!_eflutil.wl.init) return;
-
-   _eflutil.wl.ref_count--;
-   if (_eflutil.wl.ref_count > 0)
-     return;
-
-   // tizen_policy
-   if (_eflutil.wl.policy.proto)
-     tizen_policy_destroy(_eflutil.wl.policy.proto);
-   _eflutil.wl.policy.proto = NULL;
-
-   eina_hash_free(_eflutil.wl.policy.hash_noti_lv);
-   _eflutil.wl.policy.hash_noti_lv = NULL;
-   eina_hash_free(_eflutil.wl.policy.hash_scr_mode);
-   _eflutil.wl.policy.hash_scr_mode = NULL;
-
-   // wl_output
-   if (_eflutil.wl.shot.output_list)
-     {
-        EINA_LIST_FREE(_eflutil.wl.shot.output_list, output)
-          {
-             wl_output_destroy(output->output);
-             free(output);
-          }
-     }
-   _eflutil.wl.shot.output_list = NULL;
-
-   // screenshooter
-   if (_eflutil.wl.shot.screenshooter)
-     screenshooter_destroy(_eflutil.wl.shot.screenshooter);
-   _eflutil.wl.shot.screenshooter = NULL;
-
-   // tizen_input_device_manager
-   EINA_LIST_FOREACH_SAFE(_eflutil.wl.devmgr.device_list, l, ll, data)
-     {
-        tizen_input_device_release(data);
-        _eflutil.wl.devmgr.device_list = eina_list_remove_list(_eflutil.wl.devmgr.device_list, l);
-     }
-   if (_eflutil.wl.devmgr.devicemgr)
-     tizen_input_device_manager_destroy(_eflutil.wl.devmgr.devicemgr);
-   _eflutil.wl.devmgr.devicemgr = NULL;
-
-   // tizen_display_policy
-   if (_eflutil.wl.display_policy.proto)
-     tizen_display_policy_destroy(_eflutil.wl.display_policy.proto);
-   _eflutil.wl.display_policy.proto = NULL;
-
-   eina_hash_free(_eflutil.wl.display_policy.hash_brightness);
-   _eflutil.wl.display_policy.hash_brightness = NULL;
-
-   if (_eflutil.wl.reg)
-     {
-        wl_proxy_set_queue((struct wl_proxy*)_eflutil.wl.reg, NULL);
-        wl_registry_destroy(_eflutil.wl.reg);
-        _eflutil.wl.reg = NULL;
-     }
+   if (display_wrapper)
+     wl_proxy_wrapper_destroy(display_wrapper);
 
    if (_eflutil.wl.queue)
      {
@@ -406,10 +373,8 @@ _wl_shutdown(void)
         _eflutil.wl.queue = NULL;
      }
 
-   _eflutil.wl.dpy = NULL;
-   _eflutil.wl.init = EINA_FALSE;
-
    ecore_wl_shutdown();
+   return EINA_FALSE;
 }
 
 static void
@@ -543,53 +508,12 @@ _cb_wl_reg_global_remove(void *data,
                          struct wl_registry *reg,
                          unsigned int name)
 {
-   Eina_List *l, *ll;
-   struct tizen_input_device *ddata;
-   Efl_Util_Wl_Output_Info *output;
-
-   // tizen_policy
-   if (_eflutil.wl.policy.proto)
-     tizen_policy_destroy(_eflutil.wl.policy.proto);
    _eflutil.wl.policy.proto = NULL;
-
    eina_hash_free(_eflutil.wl.policy.hash_noti_lv);
-   _eflutil.wl.policy.hash_noti_lv = NULL;
    eina_hash_free(_eflutil.wl.policy.hash_scr_mode);
-   _eflutil.wl.policy.hash_scr_mode = NULL;
-
-   // wl_output
-   if (_eflutil.wl.shot.output_list)
-     {
-        EINA_LIST_FREE(_eflutil.wl.shot.output_list, output)
-          {
-             wl_output_destroy(output->output);
-             free(output);
-          }
-     }
-   _eflutil.wl.shot.output_list = NULL;
-
-   // screenshooter
-   if (_eflutil.wl.shot.screenshooter)
-     screenshooter_destroy(_eflutil.wl.shot.screenshooter);
-   _eflutil.wl.shot.screenshooter = NULL;
 
-   // tizen_input_device_manager
-   EINA_LIST_FOREACH_SAFE(_eflutil.wl.devmgr.device_list, l, ll, ddata)
-     {
-        tizen_input_device_release(ddata);
-        _eflutil.wl.devmgr.device_list = eina_list_remove_list(_eflutil.wl.devmgr.device_list, l);
-     }
-   if (_eflutil.wl.devmgr.devicemgr)
-     tizen_input_device_manager_destroy(_eflutil.wl.devmgr.devicemgr);
-   _eflutil.wl.devmgr.devicemgr = NULL;
-
-   // tizen_display_policy
-   if (_eflutil.wl.display_policy.proto)
-     tizen_display_policy_destroy(_eflutil.wl.display_policy.proto);
    _eflutil.wl.display_policy.proto = NULL;
-
    eina_hash_free(_eflutil.wl.display_policy.hash_brightness);
-   _eflutil.wl.display_policy.hash_brightness = NULL;
 }
 /* LCOV_EXCL_STOP */
 
@@ -768,45 +692,13 @@ _cb_window_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, vo
      return;
 
    eina_hash_del(_eflutil.wl.policy.hash_noti_lv, &lv_info->surface, lv_info);
-
-   eina_hash_population(_eflutil.wl.policy.hash_noti_lv);
-
-   if (eina_hash_population(_eflutil.wl.policy.hash_noti_lv) == 0)
-     {
-        _wl_shutdown();
-     }
-}
-
-static Eina_Bool
-_init_tizen_policy_proto(void)
-{
-   int ret = 0;
-
-   if (!_eflutil.wl.policy.proto)
-     {
-        ret = _wl_init();
-        EINA_SAFETY_ON_FALSE_RETURN_VAL(ret, EINA_FALSE);
-
-        ret = 0;
-        while (!_eflutil.wl.policy.proto && ret != -1)
-          ret = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
-
-        EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil.wl.policy.proto, EINA_FALSE);
-     }
-
-   return EINA_TRUE;
 }
 
 API int
 efl_util_set_notification_window_level(Evas_Object *window,
                                        efl_util_notification_level_e level)
 {
-   Eina_Bool ret;
-   Elm_Win_Type type;
-   Ecore_Wl_Window *wlwin;
-   struct wl_surface *surface;
-   Efl_Util_Wl_Surface_Lv_Info *lv_info;
-   Ecore_Wl_Window_Type wl_type;
+   Eina_Bool res;
 
    EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER);
    EINA_SAFETY_ON_FALSE_RETURN_VAL((level >= EFL_UTIL_NOTIFICATION_LEVEL_NONE) &&
@@ -829,6 +721,15 @@ efl_util_set_notification_window_level(Evas_Object *window,
           "DEPRECATION WARNING: EFL_UTIL_NOTIFICATION_LEVEL_3 is deprecated and will be removed from next release. Use EFL_UTIL_NOTIFICATION_LEVEL_TOP instead.");
      }
 
+   Elm_Win_Type type;
+   Ecore_Wl_Window *wlwin;
+   struct wl_surface *surface;
+   Efl_Util_Wl_Surface_Lv_Info *lv_info;
+   Ecore_Wl_Window_Type wl_type;
+
+   res = _wl_init();
+   EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EFL_UTIL_ERROR_INVALID_PARAMETER);
+
    wlwin = elm_win_wl_window_get(window);
    EINA_SAFETY_ON_NULL_RETURN_VAL(wlwin, EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE);
 
@@ -840,8 +741,8 @@ efl_util_set_notification_window_level(Evas_Object *window,
                                         EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE);
      }
 
-   ret = _init_tizen_policy_proto();
-   EINA_SAFETY_ON_FALSE_RETURN_VAL(ret, EFL_UTIL_ERROR_NOT_SUPPORTED);
+   while (!_eflutil.wl.policy.proto)
+     wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
 
    surface = ecore_wl_window_surface_get(wlwin);
    EINA_SAFETY_ON_NULL_RETURN_VAL(surface,
@@ -905,15 +806,19 @@ API int
 efl_util_get_notification_window_level(Evas_Object *window,
                                        efl_util_notification_level_e *level)
 {
-   Eina_Bool ret;
+   Eina_Bool res;
+
+   EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(level, EFL_UTIL_ERROR_INVALID_PARAMETER);
+
    Elm_Win_Type type;
    Ecore_Wl_Window *wlwin;
    struct wl_surface *surface;
    Efl_Util_Wl_Surface_Lv_Info *lv_info;
    Ecore_Wl_Window_Type wl_type;
 
-   EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER);
-   EINA_SAFETY_ON_NULL_RETURN_VAL(level, EFL_UTIL_ERROR_INVALID_PARAMETER);
+   res = _wl_init();
+   EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EFL_UTIL_ERROR_INVALID_PARAMETER);
 
    wlwin = elm_win_wl_window_get(window);
    EINA_SAFETY_ON_NULL_RETURN_VAL(wlwin, EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE);
@@ -926,13 +831,13 @@ efl_util_get_notification_window_level(Evas_Object *window,
                                         EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE);
      }
 
+   while (!_eflutil.wl.policy.proto)
+     wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
+
    surface = ecore_wl_window_surface_get(wlwin);
    EINA_SAFETY_ON_NULL_RETURN_VAL(surface,
                                   EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE);
 
-   ret = _init_tizen_policy_proto();
-   EINA_SAFETY_ON_FALSE_RETURN_VAL(ret, EFL_UTIL_ERROR_NOT_SUPPORTED);
-
    lv_info = eina_hash_find(_eflutil.wl.policy.hash_noti_lv, &surface);
    if (lv_info)
      {
@@ -1016,14 +921,28 @@ API int
 efl_util_set_window_opaque_state(Evas_Object *window,
                                  int opaque)
 {
-   Eina_Bool ret;
-   Ecore_Wl_Window *wlwin;
-   struct wl_surface *surface;
+   Eina_Bool res;
 
    EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER);
    EINA_SAFETY_ON_FALSE_RETURN_VAL(((opaque >= 0) && (opaque <= 1)),
                                    EFL_UTIL_ERROR_INVALID_PARAMETER);
 
+   Ecore_Wl_Window *wlwin;
+   struct wl_surface *surface;
+
+   if (!_eflutil.wl.policy.proto)
+     {
+        int ret = 0;
+
+        res = _wl_init();
+        EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EFL_UTIL_ERROR_INVALID_PARAMETER);
+
+        while (!_eflutil.wl.policy.proto && ret != -1)
+          ret = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
+
+        EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil.wl.policy.proto, EFL_UTIL_ERROR_INVALID_PARAMETER);
+     }
+
    wlwin = elm_win_wl_window_get(window);
    if (!wlwin)
       return EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE;
@@ -1032,9 +951,6 @@ efl_util_set_window_opaque_state(Evas_Object *window,
    if (!surface)
       return EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE;
 
-   ret = _init_tizen_policy_proto();
-   EINA_SAFETY_ON_FALSE_RETURN_VAL(ret, EFL_UTIL_ERROR_NOT_SUPPORTED);
-
    tizen_policy_set_opaque_state(_eflutil.wl.policy.proto, surface, opaque);
 
    return EFL_UTIL_ERROR_NONE;
@@ -1052,65 +968,72 @@ efl_util_set_window_screen_mode(Evas_Object *window,
    Ecore_Wl_Window *wlwin;
    struct wl_surface *surface;
    Efl_Util_Wl_Surface_Scr_Mode_Info *scr_mode_info;
-   Eina_Bool ret;
+   Eina_Bool res;
 
-   wlwin = elm_win_wl_window_get(window);
-   EINA_SAFETY_ON_NULL_RETURN_VAL(wlwin, EFL_UTIL_ERROR_INVALID_PARAMETER);
-
-   surface = ecore_wl_window_surface_get(wlwin);
-   EINA_SAFETY_ON_NULL_RETURN_VAL(surface, EFL_UTIL_ERROR_INVALID_PARAMETER);
-
-   ret = _init_tizen_policy_proto();
-   EINA_SAFETY_ON_FALSE_RETURN_VAL(ret, EFL_UTIL_ERROR_NOT_SUPPORTED);
+   res = _wl_init();
+   EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EFL_UTIL_ERROR_INVALID_PARAMETER);
 
-   scr_mode_info = eina_hash_find(_eflutil.wl.policy.hash_scr_mode, &surface);
-   if (!scr_mode_info)
+   wlwin = elm_win_wl_window_get(window);
+   if (wlwin)
      {
-        scr_mode_info = calloc(1, sizeof(Efl_Util_Wl_Surface_Scr_Mode_Info));
-        EINA_SAFETY_ON_NULL_RETURN_VAL(scr_mode_info, EFL_UTIL_ERROR_OUT_OF_MEMORY);
+        while (!_eflutil.wl.policy.proto)
+          wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
 
-        scr_mode_info->surface = surface;
-        scr_mode_info->mode = (unsigned int)mode;
-        scr_mode_info->wait_for_done = EINA_TRUE;
-        scr_mode_info->state = TIZEN_POLICY_ERROR_STATE_NONE;
+        surface = ecore_wl_window_surface_get(wlwin);
+        EINA_SAFETY_ON_NULL_RETURN_VAL(surface,
+                                       EFL_UTIL_ERROR_INVALID_PARAMETER);
 
-        eina_hash_add(_eflutil.wl.policy.hash_scr_mode,
-                      &surface,
-                      scr_mode_info);
-     }
-   else
-     {
-        scr_mode_info->mode = (unsigned int)mode;
-        scr_mode_info->wait_for_done = EINA_TRUE;
-        scr_mode_info->state = TIZEN_POLICY_ERROR_STATE_NONE;
-     }
+        scr_mode_info = eina_hash_find(_eflutil.wl.policy.hash_scr_mode, &surface);
+        if (!scr_mode_info)
+          {
+             scr_mode_info = calloc(1, sizeof(Efl_Util_Wl_Surface_Scr_Mode_Info));
+             EINA_SAFETY_ON_NULL_RETURN_VAL(scr_mode_info, EFL_UTIL_ERROR_OUT_OF_MEMORY);
 
-   tizen_policy_set_window_screen_mode(_eflutil.wl.policy.proto,
-                                       surface, (unsigned int)mode);
-   if (scr_mode_info->wait_for_done)
-     {
-        int count = 0;
-        while (scr_mode_info->wait_for_done && (count < 3))
+             scr_mode_info->surface = surface;
+             scr_mode_info->mode = (unsigned int)mode;
+             scr_mode_info->wait_for_done = EINA_TRUE;
+             scr_mode_info->state = TIZEN_POLICY_ERROR_STATE_NONE;
+
+             eina_hash_add(_eflutil.wl.policy.hash_scr_mode,
+                           &surface,
+                           scr_mode_info);
+          }
+        else
           {
-             ecore_wl_flush();
-             wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
-             count++;
+             scr_mode_info->mode = (unsigned int)mode;
+             scr_mode_info->wait_for_done = EINA_TRUE;
+             scr_mode_info->state = TIZEN_POLICY_ERROR_STATE_NONE;
           }
 
+        tizen_policy_set_window_screen_mode(_eflutil.wl.policy.proto,
+                                            surface, (unsigned int)mode);
         if (scr_mode_info->wait_for_done)
           {
-             return EFL_UTIL_ERROR_INVALID_PARAMETER;
-          }
-        else
-          {
-             if (scr_mode_info->state == TIZEN_POLICY_ERROR_STATE_PERMISSION_DENIED)
+             int count = 0;
+             while (scr_mode_info->wait_for_done && (count < 3))
                {
-                  return EFL_UTIL_ERROR_PERMISSION_DENIED;
+                  ecore_wl_flush();
+                  wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
+                  count++;
+               }
+
+             if (scr_mode_info->wait_for_done)
+               {
+                  return EFL_UTIL_ERROR_INVALID_PARAMETER;
+               }
+             else
+               {
+                  if (scr_mode_info->state == TIZEN_POLICY_ERROR_STATE_PERMISSION_DENIED)
+                    {
+                       return EFL_UTIL_ERROR_PERMISSION_DENIED;
+                    }
                }
           }
-     }
 
-   return EFL_UTIL_ERROR_NONE;
+        return EFL_UTIL_ERROR_NONE;
+     }
+   else
+     return EFL_UTIL_ERROR_INVALID_PARAMETER;
 }
 
 API int
@@ -1123,59 +1046,61 @@ efl_util_get_window_screen_mode(Evas_Object *window,
    Ecore_Wl_Window *wlwin;
    struct wl_surface *surface;
    Efl_Util_Wl_Surface_Scr_Mode_Info *scr_mode_info;
-   Eina_Bool ret;
+   Eina_Bool res;
 
-   wlwin = elm_win_wl_window_get(window);
-   EINA_SAFETY_ON_NULL_RETURN_VAL(wlwin, EFL_UTIL_ERROR_INVALID_PARAMETER);
+   res = _wl_init();
+   EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EFL_UTIL_ERROR_INVALID_PARAMETER);
 
-   surface = ecore_wl_window_surface_get(wlwin);
-   EINA_SAFETY_ON_NULL_RETURN_VAL(surface, EFL_UTIL_ERROR_INVALID_PARAMETER);
+   wlwin = elm_win_wl_window_get(window);
+   if (wlwin)
+     {
+        while (!_eflutil.wl.policy.proto)
+          wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
 
-   ret = _init_tizen_policy_proto();
-   EINA_SAFETY_ON_FALSE_RETURN_VAL(ret, EFL_UTIL_ERROR_NOT_SUPPORTED);
+        surface = ecore_wl_window_surface_get(wlwin);
+        EINA_SAFETY_ON_NULL_RETURN_VAL(surface,
+                                       EFL_UTIL_ERROR_INVALID_PARAMETER);
 
-   scr_mode_info = eina_hash_find(_eflutil.wl.policy.hash_scr_mode, &surface);
-   if (scr_mode_info)
-     {
-        if (scr_mode_info->wait_for_done)
+        scr_mode_info = eina_hash_find(_eflutil.wl.policy.hash_scr_mode, &surface);
+        if (scr_mode_info)
           {
-             while (scr_mode_info->wait_for_done)
+             if (scr_mode_info->wait_for_done)
                {
-                  ecore_wl_flush();
-                  wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
+                  while (scr_mode_info->wait_for_done)
+                    {
+                       ecore_wl_flush();
+                       wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
+                    }
                }
-          }
 
-        switch (scr_mode_info->mode)
+             switch (scr_mode_info->mode)
+               {
+                case TIZEN_POLICY_MODE_DEFAULT:   *mode = EFL_UTIL_SCREEN_MODE_DEFAULT;   break;
+                case TIZEN_POLICY_MODE_ALWAYS_ON: *mode = EFL_UTIL_SCREEN_MODE_ALWAYS_ON; break;
+                default:                          *mode = EFL_UTIL_SCREEN_MODE_DEFAULT;
+                  return EFL_UTIL_ERROR_INVALID_PARAMETER;
+               }
+             return EFL_UTIL_ERROR_NONE;
+          }
+        else
           {
-           case TIZEN_POLICY_MODE_DEFAULT:
-              *mode = EFL_UTIL_SCREEN_MODE_DEFAULT;
-              break;
-
-           case TIZEN_POLICY_MODE_ALWAYS_ON:
-              *mode = EFL_UTIL_SCREEN_MODE_ALWAYS_ON;
-              break;
-
-           default:
-              *mode = EFL_UTIL_SCREEN_MODE_DEFAULT;
-              return EFL_UTIL_ERROR_INVALID_PARAMETER;
+             *mode = EFL_UTIL_SCREEN_MODE_DEFAULT;
+             return EFL_UTIL_ERROR_INVALID_PARAMETER;
           }
-
-        return EFL_UTIL_ERROR_NONE;
      }
    else
-     {
-        *mode = EFL_UTIL_SCREEN_MODE_DEFAULT;
-        return EFL_UTIL_ERROR_INVALID_PARAMETER;
-     }
+     return EFL_UTIL_ERROR_INVALID_PARAMETER;
 }
 
-#ifndef TIZEN_WEARABLE
 API int
 efl_util_set_window_screen_mode_error_cb(Evas_Object *window,
                                          efl_util_window_screen_mode_error_cb callback,
                                          void *user_data)
 {
+   /* Wearable device cannot use this. */
+   if (get_tizen_profile() == TIZEN_PROFILE_WEARABLE)
+     return EFL_UTIL_ERROR_NO_SUCH_DEVICE;
+
    dlog_print(DLOG_WARN, LOG_TAG,
      "DEPRECATION WARNING: efl_util_set_window_screen_mode_error_cb() is deprecated and will be removed from next release. Use the return value of efl_util_set_window_screen_mode() instead.");
 
@@ -1196,6 +1121,10 @@ efl_util_set_window_screen_mode_error_cb(Evas_Object *window,
 API int
 efl_util_unset_window_screen_mode_error_cb(Evas_Object *window)
 {
+   /* Wearable device cannot use this. */
+   if (get_tizen_profile() == TIZEN_PROFILE_WEARABLE)
+     return EFL_UTIL_ERROR_NO_SUCH_DEVICE;
+
    dlog_print(DLOG_WARN, LOG_TAG,
      "DEPRECATION WARNING: efl_util_unset_window_screen_mode_error_cb() is deprecated and will be removed from next release. Use the return value of efl_util_set_window_screen_mode() instead.");
 
@@ -1208,27 +1137,6 @@ efl_util_unset_window_screen_mode_error_cb(Evas_Object *window)
 
    return EFL_UTIL_ERROR_NONE;
 }
-#endif
-
-static Eina_Bool
-_init_tizen_display_policy_proto(void)
-{
-   int ret = 0;
-
-   if (!_eflutil.wl.display_policy.proto)
-     {
-        ret = _wl_init();
-        EINA_SAFETY_ON_FALSE_RETURN_VAL(ret, EINA_FALSE);
-
-        ret = 0;
-        while (!_eflutil.wl.display_policy.proto && ret != -1)
-          ret = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
-
-        EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil.wl.display_policy.proto, EINA_FALSE);
-     }
-
-   return EINA_TRUE;
-}
 
 API int
 efl_util_set_window_brightness(Evas_Object *window, int brightness)
@@ -1236,68 +1144,74 @@ efl_util_set_window_brightness(Evas_Object *window, int brightness)
    Ecore_Wl_Window *wlwin;
    struct wl_surface *surface;
    Efl_Util_Wl_Surface_Brightness_Info *brightness_info;
-   Eina_Bool ret;
+   Eina_Bool res;
 
    EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER);
    EINA_SAFETY_ON_FALSE_RETURN_VAL(brightness <= 100, EFL_UTIL_ERROR_INVALID_PARAMETER);
 
-   wlwin = elm_win_wl_window_get(window);
-   EINA_SAFETY_ON_NULL_RETURN_VAL(wlwin, EFL_UTIL_ERROR_INVALID_PARAMETER);
-
-   surface = ecore_wl_window_surface_get(wlwin);
-   EINA_SAFETY_ON_NULL_RETURN_VAL(surface, EFL_UTIL_ERROR_INVALID_PARAMETER);
-
-   ret = _init_tizen_display_policy_proto();
-   EINA_SAFETY_ON_FALSE_RETURN_VAL(ret, EFL_UTIL_ERROR_NOT_SUPPORTED);
+   res = _wl_init();
+   EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EFL_UTIL_ERROR_INVALID_PARAMETER);
 
-   brightness_info = eina_hash_find(_eflutil.wl.display_policy.hash_brightness, &surface);
-   if (!brightness_info)
-     {
-        brightness_info = calloc(1, sizeof(Efl_Util_Wl_Surface_Brightness_Info));
-        EINA_SAFETY_ON_NULL_RETURN_VAL(brightness_info, EFL_UTIL_ERROR_OUT_OF_MEMORY);
-
-        brightness_info->surface = surface;
-        brightness_info->brightness = brightness;
-        brightness_info->wait_for_done = EINA_TRUE;
-        brightness_info->state = TIZEN_DISPLAY_POLICY_ERROR_STATE_NONE;
-
-        eina_hash_add(_eflutil.wl.display_policy.hash_brightness,
-                      &surface,
-                      brightness_info);
-     }
-   else
+   wlwin = elm_win_wl_window_get(window);
+   if (wlwin)
      {
-        brightness_info->brightness = brightness;
-        brightness_info->wait_for_done = EINA_TRUE;
-        brightness_info->state = TIZEN_DISPLAY_POLICY_ERROR_STATE_NONE;
-     }
+        while (!_eflutil.wl.display_policy.proto)
+          wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
 
-   tizen_display_policy_set_window_brightness(_eflutil.wl.display_policy.proto,
-                                              surface, brightness);
-   if (brightness_info->wait_for_done)
-     {
-        int count = 0;
-        while (brightness_info->wait_for_done && (count < 3))
-          {
-             ecore_wl_flush();
-             wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
-             count++;
-          }
+        surface = ecore_wl_window_surface_get(wlwin);
+        EINA_SAFETY_ON_NULL_RETURN_VAL(surface,
+                                       EFL_UTIL_ERROR_INVALID_PARAMETER);
 
-        if (brightness_info->wait_for_done)
-          {
-             return EFL_UTIL_ERROR_INVALID_PARAMETER;
-          }
-        else
+        brightness_info = eina_hash_find(_eflutil.wl.display_policy.hash_brightness, &surface);
+        if (!brightness_info)
           {
-             if (brightness_info->state == TIZEN_DISPLAY_POLICY_ERROR_STATE_PERMISSION_DENIED)
-               {
-                  return EFL_UTIL_ERROR_PERMISSION_DENIED;
-               }
-          }
+             brightness_info = calloc(1, sizeof(Efl_Util_Wl_Surface_Brightness_Info));
+             EINA_SAFETY_ON_NULL_RETURN_VAL(brightness_info, EFL_UTIL_ERROR_OUT_OF_MEMORY);
+
+             brightness_info->surface = surface;
+             brightness_info->brightness = brightness;
+             brightness_info->wait_for_done = EINA_TRUE;
+             brightness_info->state = TIZEN_DISPLAY_POLICY_ERROR_STATE_NONE;
+
+             eina_hash_add(_eflutil.wl.display_policy.hash_brightness,
+                           &surface,
+                           brightness_info);
+           }
+         else
+           {
+              brightness_info->brightness = brightness;
+              brightness_info->wait_for_done = EINA_TRUE;
+              brightness_info->state = TIZEN_DISPLAY_POLICY_ERROR_STATE_NONE;
+           }
+
+         tizen_display_policy_set_window_brightness(_eflutil.wl.display_policy.proto,
+                                                    surface, brightness);
+         if (brightness_info->wait_for_done)
+           {
+              int count = 0;
+              while (brightness_info->wait_for_done && (count < 3))
+                {
+                   ecore_wl_flush();
+                   wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
+                   count++;
+                }
+
+              if (brightness_info->wait_for_done)
+                {
+                   return EFL_UTIL_ERROR_INVALID_PARAMETER;
+                }
+              else
+                {
+                   if (brightness_info->state == TIZEN_DISPLAY_POLICY_ERROR_STATE_PERMISSION_DENIED)
+                     {
+                        return EFL_UTIL_ERROR_PERMISSION_DENIED;
+                     }
+                }
+           }
+        return EFL_UTIL_ERROR_NONE;
      }
-
-   return EFL_UTIL_ERROR_NONE;
+   else
+     return EFL_UTIL_ERROR_INVALID_PARAMETER;
 }
 
 API int
@@ -1306,19 +1220,23 @@ efl_util_get_window_brightness(Evas_Object *window, int *brightness)
    Ecore_Wl_Window *wlwin;
    struct wl_surface *surface;
    Efl_Util_Wl_Surface_Brightness_Info *brightness_info;
-   Eina_Bool ret;
+   Eina_Bool res;
 
    EINA_SAFETY_ON_NULL_RETURN_VAL(window, EFL_UTIL_ERROR_INVALID_PARAMETER);
    EINA_SAFETY_ON_NULL_RETURN_VAL(brightness, EFL_UTIL_ERROR_INVALID_PARAMETER);
 
+   res = _wl_init();
+   EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EFL_UTIL_ERROR_INVALID_PARAMETER);
+
    wlwin = elm_win_wl_window_get(window);
-   EINA_SAFETY_ON_NULL_RETURN_VAL(wlwin, EFL_UTIL_ERROR_INVALID_PARAMETER);
+   if (!wlwin) return EFL_UTIL_ERROR_INVALID_PARAMETER;
 
-   surface = ecore_wl_window_surface_get(wlwin);
-   EINA_SAFETY_ON_NULL_RETURN_VAL(surface, EFL_UTIL_ERROR_INVALID_PARAMETER);
+   while (!_eflutil.wl.display_policy.proto)
+     wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
 
-   ret = _init_tizen_display_policy_proto();
-   EINA_SAFETY_ON_FALSE_RETURN_VAL(ret, EFL_UTIL_ERROR_NOT_SUPPORTED);
+   surface = ecore_wl_window_surface_get(wlwin);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(surface,
+                                  EFL_UTIL_ERROR_INVALID_PARAMETER);
 
    brightness_info = eina_hash_find(_eflutil.wl.display_policy.hash_brightness, &surface);
    if (brightness_info)
@@ -1350,18 +1268,10 @@ _cb_device_add(void *data EINA_UNUSED,
                struct tizen_input_device_manager *tizen_input_device_manager EINA_UNUSED,
                uint32_t serial EINA_UNUSED,
                const char *identifier EINA_UNUSED,
-               struct tizen_input_device *device,
+               struct tizen_input_device *device EINA_UNUSED,
                struct wl_seat *seat EINA_UNUSED)
 {
-   Eina_List *l;
-   struct tizen_input_device *ddata;
-
-   EINA_LIST_FOREACH(_eflutil.wl.devmgr.device_list, l, ddata)
-     {
-        if (device == ddata) return;
-     }
-
-   _eflutil.wl.devmgr.device_list = eina_list_append(_eflutil.wl.devmgr.device_list, device);
+   ;
 }
 
 /* LCOV_EXCL_START */
@@ -1370,19 +1280,10 @@ _cb_device_remove(void *data EINA_UNUSED,
                struct tizen_input_device_manager *tizen_input_device_manager EINA_UNUSED,
                uint32_t serial  EINA_UNUSED,
                const char *identifier  EINA_UNUSED,
-               struct tizen_input_device *device,
+               struct tizen_input_device *device  EINA_UNUSED,
                struct wl_seat *seat  EINA_UNUSED)
 {
-   Eina_List *l, *ll;
-   struct tizen_input_device *ddata;
-
-   EINA_LIST_FOREACH_SAFE(_eflutil.wl.devmgr.device_list, l, ll, ddata)
-     {
-        if (device == ddata)
-          {
-             _eflutil.wl.devmgr.device_list = eina_list_remove_list(_eflutil.wl.devmgr.device_list, l);
-          }
-     }
+   ;
 }
 /* LCOV_EXCL_STOP */
 
@@ -1426,6 +1327,7 @@ efl_util_input_initialize_generator(unsigned int dev_type)
 {
    int ret = EFL_UTIL_ERROR_NONE;
    efl_util_inputgen_h inputgen_h = NULL;
+   unsigned int clas = 0x0;
 
    if (!dev_type ||
         dev_type & ~(EFL_UTIL_INPUT_DEVTYPE_TOUCHSCREEN
@@ -1452,10 +1354,17 @@ efl_util_input_initialize_generator(unsigned int dev_type)
         goto out;
      }
 
+   if (dev_type & EFL_UTIL_INPUT_DEVTYPE_TOUCHSCREEN)
+     clas |= TIZEN_INPUT_DEVICE_MANAGER_CLAS_TOUCHSCREEN;
+   if (dev_type & EFL_UTIL_INPUT_DEVTYPE_KEYBOARD)
+     clas |= TIZEN_INPUT_DEVICE_MANAGER_CLAS_KEYBOARD;
+   if (dev_type & EFL_UTIL_INPUT_DEVTYPE_POINTER)
+     clas |= TIZEN_INPUT_DEVICE_MANAGER_CLAS_MOUSE;
+
    while (!_eflutil.wl.devmgr.devicemgr)
      wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
 
-   tizen_input_device_manager_init_generator(_eflutil.wl.devmgr.devicemgr);
+   tizen_input_device_manager_init_generator(_eflutil.wl.devmgr.devicemgr, clas);
 
    while (_eflutil.wl.devmgr.request_notified == -1)
      wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
@@ -1482,14 +1391,22 @@ API int
 efl_util_input_deinitialize_generator(efl_util_inputgen_h inputgen_h)
 {
    int ret = EFL_UTIL_ERROR_NONE;
+   unsigned int clas = 0x0;
    EINA_SAFETY_ON_NULL_RETURN_VAL(inputgen_h, EFL_UTIL_ERROR_INVALID_PARAMETER);
 
+   if (inputgen_h->init_type & EFL_UTIL_INPUT_DEVTYPE_TOUCHSCREEN)
+     clas |= TIZEN_INPUT_DEVICE_MANAGER_CLAS_TOUCHSCREEN;
+   if (inputgen_h->init_type & EFL_UTIL_INPUT_DEVTYPE_KEYBOARD)
+     clas |= TIZEN_INPUT_DEVICE_MANAGER_CLAS_KEYBOARD;
+   if (inputgen_h->init_type & EFL_UTIL_INPUT_DEVTYPE_POINTER)
+     clas |= TIZEN_INPUT_DEVICE_MANAGER_CLAS_MOUSE;
+
    free(inputgen_h);
    inputgen_h = NULL;
 
    EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil.wl.devmgr.devicemgr, EFL_UTIL_ERROR_INVALID_PARAMETER);
 
-   tizen_input_device_manager_deinit_generator(_eflutil.wl.devmgr.devicemgr);
+   tizen_input_device_manager_deinit_generator(_eflutil.wl.devmgr.devicemgr, clas);
 
    while (_eflutil.wl.devmgr.request_notified == -1)
      wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
@@ -1497,8 +1414,6 @@ efl_util_input_deinitialize_generator(efl_util_inputgen_h inputgen_h)
    ret = _efl_util_input_convert_input_generator_error(_eflutil.wl.devmgr.request_notified);
    _eflutil.wl.devmgr.request_notified = -1;
 
-   _wl_shutdown();
-
    return ret;
 }
 
@@ -1697,16 +1612,18 @@ efl_util_screenshot_initialize(int width, int height)
         wl_display_roundtrip_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
 
         display_wrapper = wl_proxy_create_wrapper(_eflutil.wl.dpy);
-        EINA_SAFETY_ON_NULL_GOTO(display_wrapper, fail_init);
+        EINA_SAFETY_ON_NULL_GOTO(display_wrapper, fail_memory);
 
         _eflutil.wl.shot.queue = wl_display_create_queue(_eflutil.wl.dpy);
-        EINA_SAFETY_ON_NULL_GOTO(_eflutil.wl.shot.queue, fail_init);
+        EINA_SAFETY_ON_NULL_GOTO(_eflutil.wl.shot.queue, fail_memory);
+
+        wl_proxy_set_queue((struct wl_proxy *)display_wrapper, _eflutil.wl.shot.queue);
 
         reg = wl_display_get_registry(display_wrapper);
+        wl_proxy_wrapper_destroy(display_wrapper);
+        display_wrapper = NULL;
         EINA_SAFETY_ON_NULL_GOTO(reg, fail_init);
 
-        wl_proxy_set_queue((struct wl_proxy*)reg, _eflutil.wl.shot.queue);
-
         wl_registry_add_listener(reg, &_wl_reg_screenshooter_listener, NULL);
 
         ret = wl_display_roundtrip_queue(_eflutil.wl.dpy, _eflutil.wl.shot.queue);
@@ -1765,15 +1682,13 @@ fail_memory:
      wl_proxy_wrapper_destroy(display_wrapper);
    set_last_result(EFL_UTIL_ERROR_OUT_OF_MEMORY);
    return NULL;
-/* LCOV_EXCL_STOP */
 fail_init:
    if (screenshot)
      efl_util_screenshot_deinitialize(screenshot);
    _screenshot_mutex_unlock();
-   if (display_wrapper)
-     wl_proxy_wrapper_destroy(display_wrapper);
    set_last_result(EFL_UTIL_ERROR_SCREENSHOT_INIT_FAIL);
    return NULL;
+/* LCOV_EXCL_STOP */
 }
 
 API int
@@ -1811,8 +1726,6 @@ efl_util_screenshot_deinitialize(efl_util_screenshot_h screenshot)
    _screenshot_mutex_unlock();
    _screenshot_mutex_destory();
 
-   _wl_shutdown();
-
    return EFL_UTIL_ERROR_NONE;
 }