From: Seunghun Lee Date: Wed, 24 Apr 2019 10:09:20 +0000 (+0900) Subject: video: 'E_Client_Video' now handles handler of 'E_EVENT_CLIENT_REMOVE' event. X-Git-Tag: submit/tizen/20190425.013517~2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=fc5eff9016f6368b6694c7259334b2bc9d19a981;p=platform%2Fupstream%2Fenlightenment.git video: 'E_Client_Video' now handles handler of 'E_EVENT_CLIENT_REMOVE' event. '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 --- diff --git a/src/bin/video/e_client_video.c b/src/bin/video/e_client_video.c index cd5caf987f..d6465df5c3 100644 --- a/src/bin/video/e_client_video.c +++ b/src/bin/video/e_client_video.c @@ -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", " 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", " unset video", ec); - free(ecv); + _e_client_video_del(ecv); } E_API Eina_Bool