From ee31683e5761f3f447ec9c3bec69567907e1b6eb Mon Sep 17 00:00:00 2001 From: Doyoun Kang Date: Fri, 17 Sep 2021 08:52:28 +0900 Subject: [PATCH] e_policy_visibility: fix bug for handling grab in wait_buf_list There was a bug that grabs in the wait_buf_attach_grab_list were not removed when the grab was canceling or the vc was removed. Change-Id: Ib9fc2c0ae3ae9b1c98f06e9a0e9c7dad90e86566 --- src/bin/e_policy_visibility.c | 38 +++++++++++++++++++++++++++++++++++--- 1 file changed, 35 insertions(+), 3 deletions(-) diff --git a/src/bin/e_policy_visibility.c b/src/bin/e_policy_visibility.c index 5d9055b..61ae365 100644 --- a/src/bin/e_policy_visibility.c +++ b/src/bin/e_policy_visibility.c @@ -992,6 +992,8 @@ _e_vis_client_grab_cb_timeout(void *data) VS_INF(grab->vc->ec, "TIMEOUT(%f) Grab %s", e_config->deiconify_pending_timeout, grab->name); grab->deleted = 1; _e_vis_client_grab_remove(grab->vc, grab); + + grab->timer = NULL; return ECORE_CALLBACK_DONE; } @@ -1020,6 +1022,14 @@ _e_vis_client_grab_cancel(E_Vis_Client *vc) { VS_INF(vc->ec, "Visibility changed while waiting Uniconify. Release grab."); E_FREE_FUNC(vc->grab, _e_vis_grab_release); + + E_Vis_Grab *grab; + EINA_LIST_FREE(vc->wait_buf_attach_grab_list, grab) + { + E_FREE_FUNC(grab, _e_vis_grab_release); + } + vc->wait_buf_attach_grab_list = NULL; + return EINA_TRUE; } @@ -1109,6 +1119,8 @@ _e_vis_client_grab_clear_cb(void *data) grab->deleted = 1; _e_vis_client_grab_remove(grab->vc, grab); + grab->timer = NULL; + return ECORE_CALLBACK_DONE; } @@ -1121,7 +1133,7 @@ _e_vis_client_delay_del(E_Object *obj) E_VIS_CLIENT_GET_OR_RETURN(vc, ec); if (vc->job.count) { - VS_DBG(ec, "REF Delay Del"); + VS_INF(ec, "REF Delay Del"); e_pixmap_ref(ec->pixmap); e_object_delay_del_ref(obj); if (vc->grab) @@ -1129,6 +1141,14 @@ _e_vis_client_delay_del(E_Object *obj) E_FREE_FUNC(vc->grab->timer, ecore_timer_del); vc->grab->timer = ecore_timer_add(E_CLEAR_GRAB_TIMEOUT, _e_vis_client_grab_clear_cb, vc->grab); } + + E_Vis_Grab *grab; + Eina_List *l; + EINA_LIST_FOREACH(vc->wait_buf_attach_grab_list, l, grab) + { + E_FREE_FUNC(grab->timer, ecore_timer_del); + grab->timer = ecore_timer_add(E_CLEAR_GRAB_TIMEOUT, _e_vis_client_grab_clear_cb, grab); + } } } @@ -1141,6 +1161,7 @@ _e_vis_client_job_timeout(void *data) /* FIXME delete all grab and evaluate it instead of exec */ _e_vis_job_exec(&job->entry); _e_vis_job_eval(); + job->timer = NULL; return ECORE_CALLBACK_DONE; } @@ -1161,9 +1182,13 @@ _e_vis_client_del(E_Vis_Client *vc) { E_Vis_Grab *grab; - VS_DBG(vc->ec, "CLIENT DEL"); + VS_INF(vc->ec, "CLIENT DEL"); - eina_list_free(vc->wait_buf_attach_grab_list); + EINA_LIST_FREE(vc->wait_buf_attach_grab_list, grab) + { + VS_INF(vc->ec, "Remove remain grab(%p) in wait_buf_attach list", grab); + E_FREE_FUNC(grab, _e_vis_grab_release); + } vc->wait_buf_attach_grab_list = NULL; E_FREE_FUNC(vc->grab, _e_vis_grab_release); @@ -2299,6 +2324,13 @@ e_policy_visibility_client_uniconify_by_visibility_job_cancel(E_Client *ec) vc->state = E_VIS_ICONIFY_STATE_ICONIC; VS_DBG(vc->ec, "\tUPDATE ICONIC STATE: %s", STATE_STR(vc)); E_FREE_FUNC(vc->grab, _e_vis_grab_release); + + E_Vis_Grab *grab; + EINA_LIST_FREE(vc->wait_buf_attach_grab_list, grab) + { + E_FREE_FUNC(grab, _e_vis_grab_release); + } + vc->wait_buf_attach_grab_list = NULL; } return ret; -- 2.7.4