re-configure notification level whenever window is shown. 30/59830/1
authorSeunghun Lee <shiin.lee@samsung.com>
Wed, 17 Feb 2016 06:42:42 +0000 (15:42 +0900)
committerSeunghun Lee <shiin.lee@samsung.com>
Fri, 19 Feb 2016 02:25:59 +0000 (11:25 +0900)
wl_surface is destroyed when hide the window, and created when show the window.
since the configuration of notification level has dependency on the wl_surface,
so we need to re-configure it whenever window is shown.

Change-Id: If3f02e54e3dbe5c4df27c25b602c345c3981d2cd

src/efl_util.c

index 9860db6..ba1b831 100644 (file)
@@ -66,6 +66,7 @@ typedef struct _Efl_Util_Callback_Info
 #if WAYLAND
 typedef struct _Efl_Util_Wl_Surface_Lv_Info
 {
+   Evas_Object *window;
    void *surface; /* wl_surface */
    int level;
    Eina_Bool wait_for_done;
@@ -594,6 +595,36 @@ _cb_wl_tz_policy_scr_mode_done(void *data,
                EFL_UTIL_ERROR_PERMISSION_DENIED,
                cb_info->data);
 }
+
+static void
+_cb_window_show(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+   Efl_Util_Wl_Surface_Lv_Info *lv_info;
+   Ecore_Wl_Window *wlwin;
+   struct wl_surface *surface;
+
+   lv_info = data;
+   if (EINA_UNLIKELY(!lv_info))
+     return;
+
+   wlwin = elm_win_wl_window_get(lv_info->window);
+   if (EINA_UNLIKELY(!wlwin))
+     return;
+
+   surface = ecore_wl_window_surface_get(wlwin);
+   if (EINA_UNLIKELY(!surface))
+     return;
+
+   eina_hash_free_cb_set(_eflutil.wl.policy.hash_noti_lv, NULL);
+   eina_hash_del_by_key(_eflutil.wl.policy.hash_noti_lv, &lv_info->surface);
+
+   lv_info->surface = surface;
+   eina_hash_add(_eflutil.wl.policy.hash_noti_lv, &surface, lv_info);
+   eina_hash_free_cb_set(_eflutil.wl.policy.hash_noti_lv, free);
+
+   tizen_policy_set_notification_level(_eflutil.wl.policy.proto,
+                                       surface, (int)lv_info->level);
+}
 #endif /* end of WAYLAND */
 
 API int
@@ -672,6 +703,7 @@ efl_util_set_notification_window_level(Evas_Object *window,
         lv_info = calloc(1, sizeof(Efl_Util_Wl_Surface_Lv_Info));
         EINA_SAFETY_ON_NULL_RETURN_VAL(lv_info, EFL_UTIL_ERROR_OUT_OF_MEMORY);
 
+        lv_info->window = window;
         lv_info->surface = surface;
         lv_info->level = (int)level;
         lv_info->wait_for_done = EINA_TRUE;
@@ -679,6 +711,9 @@ efl_util_set_notification_window_level(Evas_Object *window,
         eina_hash_add(_eflutil.wl.policy.hash_noti_lv,
                       &surface,
                       lv_info);
+
+        evas_object_event_callback_add(window, EVAS_CALLBACK_SHOW,
+                                       _cb_window_show, lv_info);
      }
    else
      {
@@ -687,6 +722,7 @@ efl_util_set_notification_window_level(Evas_Object *window,
         lv_info->state = TIZEN_POLICY_ERROR_STATE_NONE;
      }
 
+
    tizen_policy_set_notification_level(_eflutil.wl.policy.proto,
                                        surface, (int)level);