rotation: fix waiting for removed client 06/98606/1
authorMinJeong Kim <minjjj.kim@samsung.com>
Thu, 17 Nov 2016 12:19:41 +0000 (21:19 +0900)
committerMinJeong Kim <minjjj.kim@samsung.com>
Fri, 18 Nov 2016 02:03:37 +0000 (11:03 +0900)
Change-Id: I4298c86813342026898acff9686341a0b52db1f4
Signed-off-by: MinJeong Kim <minjjj.kim@samsung.com>
src/e_mod_effect_rotation.c

index 341be53..9a28e7a 100644 (file)
@@ -780,7 +780,13 @@ _rotation_effect_cb_zone_rotation_end(void *data, int type, void *event)
         return ECORE_CALLBACK_PASS_ON;
      }
 
-   if (!effect->ctx_end) _rotation_effect_animator_end_prepare(effect);
+   if (!effect->ctx_end)
+     {
+        _rotation_effect_animator_end_prepare(effect);
+
+        if (!effect->ctx_end)
+          _rotation_effect_clear(effect);
+     }
    if (effect->ctx_end) _rotation_effect_start(effect);
 
    return ECORE_CALLBACK_PASS_ON;
@@ -834,6 +840,39 @@ _rotation_effect_cb_buffer_change(void *data, int ev_type, void *event)
    return ECORE_CALLBACK_PASS_ON;
 }
 
+static Eina_Bool
+_rotation_effect_cb_client_remove(void *data, int ev_type, void *event)
+{
+   E_Event_Client *ev = event;
+   E_Client *ec;
+   Rotation_Effect *effect;
+   Rotation_Effect_Object *eobj;
+   Eina_List *l;
+   Eina_Bool clear = EINA_FALSE;
+
+   ec = ev->ec;
+   if (!ec) return ECORE_CALLBACK_PASS_ON;
+
+   effect = (Rotation_Effect *)data;
+   if (!effect) return ECORE_CALLBACK_PASS_ON;
+   if (effect->ctx_begin)
+     {
+        EINA_LIST_FOREACH(effect->ctx_begin->objects, l, eobj)
+          {
+             if (ec == eobj->ec)
+               {
+                  clear = EINA_TRUE;
+                  break;
+               }
+          }
+
+        if (clear)
+          _rotation_effect_clear(effect);
+     }
+
+   return ECORE_CALLBACK_PASS_ON;
+}
+
 static void
 _rotation_effect_free(Rotation_Effect *effect)
 {
@@ -916,6 +955,9 @@ _rotation_zone_create(E_Zone *zone)
                          E_EVENT_CLIENT_BUFFER_CHANGE,
                          _rotation_effect_cb_buffer_change, rotation_zone->effect);
 
+   E_LIST_HANDLER_APPEND(rotation_zone->event_hdlrs,
+                         E_EVENT_CLIENT_REMOVE,
+                         _rotation_effect_cb_client_remove, rotation_zone->effect);
 
    return rotation_zone;
 }