video: 'E_Client_Video' now handles handler of 'E_EVENT_CLIENT_REMOVE' event. 68/204568/2
authorSeunghun Lee <shiin.lee@samsung.com>
Wed, 24 Apr 2019 10:09:20 +0000 (19:09 +0900)
committerSooChan Lim <sc1.lim@samsung.com>
Wed, 24 Apr 2019 10:49:56 +0000 (10:49 +0000)
'E_Client_Video' instance is created through 'e_client_video_set()' API,
and 'e_client_video_unset()' should be called to free this instance.
Yet it can be considered by user not to create any instance at all because of
its API name. So, for that reason, it's better to listen event and remove
'E_Client_Video' instance by itself for safety.

Change-Id: I9a303525d1d40678d60eb3deba2b15e6a4e16559

src/bin/video/e_client_video.c

index cd5caf987f22a48229a953ce7a8d99f0c93974ad..d6465df5c361f4dc994fa4ee38f87ef748d30c08 100644 (file)
@@ -26,7 +26,7 @@ struct _E_Client_Video
 
    E_Client *ec;
 
-   Ecore_Event_Handler *eeh_zone_set;
+   Eina_List *event_handlers;
 
    struct
    {
@@ -85,6 +85,25 @@ end:
    return EINA_TRUE;
 }
 
+static void
+_e_client_video_deinit(E_Client_Video *ecv)
+{
+   _e_client_video_comp_iface_deinit(ecv);
+
+   E_FREE_LIST(ecv->event_handlers, ecore_event_handler_del);
+}
+
+static void
+_e_client_video_del(E_Client_Video *ecv)
+{
+   _e_client_video_deinit(ecv);
+
+   evas_object_data_del(ecv->ec->frame, EO_DATA_KEY);
+   e_object_unref(E_OBJECT(ecv->ec));
+
+   free(ecv);
+}
+
 static Eina_Bool
 _e_client_video_cb_ec_zone_set(void *data, int type EINA_UNUSED, void *event)
 {
@@ -105,6 +124,23 @@ end:
    return ECORE_CALLBACK_PASS_ON;
 }
 
+static Eina_Bool
+_e_client_video_cb_ec_remove(void *data, int type EINA_UNUSED, void *event)
+{
+   E_Client_Video *ecv;
+   E_Event_Client *ev;
+
+   ev = event;
+   ecv = data;
+   if (ev->ec != ecv->ec)
+     goto end;
+
+   _e_client_video_del(ecv);
+
+end:
+   return ECORE_CALLBACK_PASS_ON;
+}
+
 static Eina_Bool
 _e_client_video_init(E_Client_Video *ecv, E_Client *ec)
 {
@@ -118,19 +154,13 @@ _e_client_video_init(E_Client_Video *ecv, E_Client *ec)
      }
 
    ecv->ec = ec;
-   ecv->eeh_zone_set = ecore_event_handler_add(E_EVENT_CLIENT_ZONE_SET,
-                                               _e_client_video_cb_ec_zone_set,
-                                               ecv);
-
-   return EINA_TRUE;
-}
 
-static void
-_e_client_video_deinit(E_Client_Video *ecv)
-{
-   _e_client_video_comp_iface_deinit(ecv);
+   E_LIST_HANDLER_APPEND(ecv->event_handlers, E_EVENT_CLIENT_ZONE_SET,
+                         _e_client_video_cb_ec_zone_set, ecv);
+   E_LIST_HANDLER_APPEND(ecv->event_handlers, E_EVENT_CLIENT_REMOVE,
+                         _e_client_video_cb_ec_remove, ecv);
 
-   E_FREE_FUNC(ecv->eeh_zone_set, ecore_event_handler_del);
+   return EINA_TRUE;
 }
 
 E_API Eina_Bool
@@ -181,16 +211,18 @@ e_client_video_set(E_Client *ec)
 E_API void
 e_client_video_unset(E_Client *ec)
 {
-   API_ENTRY;
-
-   ELOGF("VIDEO", "<INF> unset video", ec);
+   INTERNAL_DATA_GET;
 
-   _e_client_video_deinit(ecv);
+   if (!ecv)
+     {
+        VWR("It's not video client or already deleted(%d)",
+            ec, e_object_is_del(E_OBJECT(ec)));
+        return;
+     }
 
-   evas_object_data_del(ec->frame, EO_DATA_KEY);
-   e_object_unref(E_OBJECT(ec));
+   ELOGF("VIDEO", "<INF> unset video", ec);
 
-   free(ecv);
+   _e_client_video_del(ecv);
 }
 
 E_API Eina_Bool