e_comp_wl_rsm: To avoid double release of wl_buffer, we changed begining 55/167555/1
authorGwanglim Lee <gl77.lee@samsung.com>
Fri, 12 Jan 2018 11:24:46 +0000 (20:24 +0900)
committerGwanglim Lee <gl77.lee@samsung.com>
Thu, 18 Jan 2018 07:20:38 +0000 (16:20 +0900)
of window capture to the frame object hide hook callback.

Change-Id: I042ffc42c041693899c1859c83851a0b6785b041

src/bin/e_comp_wl_rsm.c

index 4a854ecfe632948884f606ce264def51f0908fa2..8846f03bea833a87c029185df0f81427604d87c6 100644 (file)
@@ -971,6 +971,20 @@ _remote_source_find(E_Client *ec)
    return source;
 }
 
+static E_Comp_Wl_Remote_Source *
+_remote_source_create(E_Client *ec)
+{
+   E_Comp_Wl_Remote_Source *source;
+
+   source = E_NEW(E_Comp_Wl_Remote_Source, 1);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(source, NULL);
+
+   source->common.ec = ec;
+   eina_hash_add(_rsm->source_hash, &ec, source);
+
+   return source;
+}
+
 static void
 _remote_source_destroy(E_Comp_Wl_Remote_Source *source)
 {
@@ -2592,13 +2606,9 @@ _remote_manager_cb_surface_create(struct wl_client *client,
              /* if passed */
              source = _remote_source_find(ec);
              if (!source)
-               {
-                  source = E_NEW(E_Comp_Wl_Remote_Source, 1);
-                  if (!source) goto fail;
+               source = _remote_source_create(ec);
 
-                  source->common.ec = ec;
-                  eina_hash_add(_rsm->source_hash, &ec, source);
-               }
+             EINA_SAFETY_ON_NULL_GOTO(source, fail);
           }
         else
           {
@@ -2719,50 +2729,75 @@ _image_save_type_check(E_Client *ec)
 }
 
 static void
-_e_comp_wl_remote_cb_client_iconify(void *data, E_Client *ec)
+_e_comp_wl_remote_cb_evas_show(void *data,
+                               Evas *e EINA_UNUSED,
+                               Evas_Object *o,
+                               void *event_info EINA_UNUSED)
 {
    E_Comp_Wl_Remote_Source *source;
+   E_Client *ec;
+
+   ec = evas_object_data_get(o, "E_Client");
+   EINA_SAFETY_ON_NULL_RETURN(ec);
 
-   if (!(source = _remote_source_find(ec)))
+   source = _remote_source_find(ec);
+   if (!source)
      {
         if (ec->ignored) return;
         if (!_image_save_type_check(ec)) return;
 
-        source = E_NEW(E_Comp_Wl_Remote_Source, 1);
+        source = _remote_source_create(ec);
         EINA_SAFETY_ON_NULL_RETURN(source);
-
-        source->common.ec = ec;
-        eina_hash_add(_rsm->source_hash, &ec, source);
      }
 
-   _remote_source_save_start(source);
+   if (!source->th) return;
+
+   RSMDBG("IMG save could be cancelled. th:%p(cancel:%d) defer_img_save:%d iconic:%d del:%d ec_del:%d",
+          ec->pixmap, ec, "SOURCE", source,
+          source->th, ecore_thread_check(source->th),
+          source->defer_img_save, ec->iconic,
+          source->deleted, e_object_is_del(E_OBJECT(ec)));
+
+   if (!ecore_thread_check(source->th) &&
+       !source->deleted &&
+       !e_object_is_del(E_OBJECT(ec)))
+     {
+        RSMDBG("IMG save CANCELLED.", ec->pixmap, ec, "SOURCE", source);
+        ecore_thread_cancel(source->th);
+     }
 }
 
 static void
-_e_comp_wl_remote_cb_client_uniconify(void *data, E_Client *ec)
+_e_comp_wl_remote_cb_evas_hide(void *data EINA_UNUSED,
+                               Evas *e EINA_UNUSED,
+                               Evas_Object *o,
+                               void *event_info EINA_UNUSED)
 {
    E_Comp_Wl_Remote_Source *source;
+   E_Client *ec;
+
+   ec = evas_object_data_get(o, "E_Client");
+   EINA_SAFETY_ON_NULL_RETURN(ec);
 
    source = _remote_source_find(ec);
-   if (!source) return;
-   EINA_SAFETY_ON_FALSE_RETURN(ec == source->common.ec);
+   EINA_SAFETY_ON_NULL_RETURN(source);
 
-   if (source->th)
-     {
-        RSMDBG("IMG save could be cancelled. UNICONIFY th:%p(cancel:%d) defer_img_save:%d iconic:%d del:%d ec_del:%d",
-               ec->pixmap, ec, "SOURCE", source,
-               source->th, ecore_thread_check(source->th),
-               source->defer_img_save, ec->iconic,
-               source->deleted, e_object_is_del(E_OBJECT(ec)));
+   if (!e_config->save_win_buffer) return;
+   if (!e_config->hold_prev_win_img) return;
+   if (ec->saved_img) return;
+   if (ec->ignored) return;
+   if (!_image_save_type_check(ec)) return;
 
-        if (!ecore_thread_check(source->th) &&
-            !source->deleted &&
-            !e_object_is_del(E_OBJECT(ec)))
-          {
-             RSMDBG("IMG save CANCELLED.", ec->pixmap, ec, "SOURCE", source);
-             ecore_thread_cancel(source->th);
-          }
-     }
+   _remote_source_save_start(source);
+}
+
+static void
+_e_comp_wl_remote_cb_new_client_post(void *data EINA_UNUSED, E_Client *ec)
+{
+   if (!e_config->save_win_buffer) return;
+
+   evas_object_event_callback_add(ec->frame, EVAS_CALLBACK_SHOW, _e_comp_wl_remote_cb_evas_show, NULL);
+   evas_object_event_callback_add(ec->frame, EVAS_CALLBACK_HIDE, _e_comp_wl_remote_cb_evas_hide, NULL);
 }
 
 static void
@@ -2772,7 +2807,8 @@ _e_comp_wl_remote_cb_client_del(void *data, E_Client *ec)
    E_Comp_Wl_Remote_Source *source;
    E_Comp_Wl_Remote_Surface *remote_surface;
 
-   if ((provider = eina_hash_find(_rsm->provider_hash, &ec)))
+   provider = eina_hash_find(_rsm->provider_hash, &ec);
+   if (provider)
      {
         eina_hash_del(_rsm->provider_hash, &ec, provider);
         EINA_LIST_FREE(provider->common.surfaces, remote_surface)
@@ -2793,12 +2829,20 @@ _e_comp_wl_remote_cb_client_del(void *data, E_Client *ec)
         E_FREE(provider);
      }
 
-   if ((source = _remote_source_find(ec)))
+   source = _remote_source_find(ec);
+   if (source)
      {
+        if (e_config->save_win_buffer)
+          {
+             evas_object_event_callback_del(ec->frame, EVAS_CALLBACK_SHOW, _e_comp_wl_remote_cb_evas_show);
+             evas_object_event_callback_del(ec->frame, EVAS_CALLBACK_HIDE, _e_comp_wl_remote_cb_evas_hide);
+          }
+
         _remote_source_destroy(source);
      }
 
-   if ((remote_surface = eina_hash_find(_rsm->surface_hash, &ec)))
+   remote_surface = eina_hash_find(_rsm->surface_hash, &ec);
+   if (remote_surface)
      {
         eina_hash_del(_rsm->surface_hash, &ec, remote_surface);
         if (remote_surface->owner == ec)
@@ -2807,11 +2851,12 @@ _e_comp_wl_remote_cb_client_del(void *data, E_Client *ec)
           _remote_provider_onscreen_parent_calculate(remote_surface->provider);
      }
 
-   if ((remote_surface = eina_hash_find(_rsm->bind_surface_hash, &ec)))
+   remote_surface = eina_hash_find(_rsm->bind_surface_hash, &ec);
+   if (remote_surface)
      {
         eina_hash_del(_rsm->surface_hash, &ec, remote_surface);
         if (remote_surface->bind_ec == ec)
-           _remote_surface_bind_client(remote_surface, NULL);
+          _remote_surface_bind_client(remote_surface, NULL);
      }
 }
 
@@ -3258,13 +3303,9 @@ e_comp_wl_remote_surface_image_save(E_Client *ec)
 
    src = _remote_source_find(ec);
    if (!src)
-     {
-        src = E_NEW(E_Comp_Wl_Remote_Source, 1);
-        EINA_SAFETY_ON_NULL_GOTO(src, end);
+     src = _remote_source_create(ec);
 
-        src->common.ec = ec;
-        eina_hash_add(_rsm->source_hash, &ec, src);
-     }
+   EINA_SAFETY_ON_NULL_GOTO(src, end);
 
    _remote_source_save_start(src);
 
@@ -3479,12 +3520,8 @@ e_comp_wl_remote_surface_init(void)
                                          _remote_manager_cb_bind);
 
    /* client hook */
-   E_CLIENT_HOOK_APPEND(rs_manager->client_hooks, E_CLIENT_HOOK_DEL, _e_comp_wl_remote_cb_client_del, NULL);
-   if (e_config->save_win_buffer)
-     {
-        E_CLIENT_HOOK_APPEND(rs_manager->client_hooks, E_CLIENT_HOOK_ICONIFY,   _e_comp_wl_remote_cb_client_iconify,   NULL);
-        E_CLIENT_HOOK_APPEND(rs_manager->client_hooks, E_CLIENT_HOOK_UNICONIFY, _e_comp_wl_remote_cb_client_uniconify, NULL);
-     }
+   E_CLIENT_HOOK_APPEND(rs_manager->client_hooks, E_CLIENT_HOOK_NEW_CLIENT_POST, _e_comp_wl_remote_cb_new_client_post, NULL);
+   E_CLIENT_HOOK_APPEND(rs_manager->client_hooks, E_CLIENT_HOOK_DEL,             _e_comp_wl_remote_cb_client_del,      NULL);
 
    /* client event */
    E_LIST_HANDLER_APPEND(rs_manager->event_hdlrs,