e_policy_visibility: fix bug for handling grab in wait_buf_list 88/264388/1 accepted/tizen/unified/20210917.060801 submit/tizen/20210917.004745
authorDoyoun Kang <doyoun.kang@samsung.com>
Thu, 16 Sep 2021 23:52:28 +0000 (08:52 +0900)
committerDoyoun Kang <doyoun.kang@samsung.com>
Thu, 16 Sep 2021 23:52:31 +0000 (08:52 +0900)
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

index 5d9055bf0e652f1619d7c810fddfb71537c75d6c..61ae365db0b3198b024a5483f2439a156d0a9e57 100644 (file)
@@ -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;