e_comp_object: fix resource leak 79/274479/2
authorDoyoun Kang <doyoun.kang@samsung.com>
Fri, 29 Apr 2022 01:13:19 +0000 (10:13 +0900)
committerDoyoun Kang <doyoun.kang@samsung.com>
Fri, 29 Apr 2022 01:13:23 +0000 (10:13 +0900)
There was a bug that the evas_object_event_callback for mouse events didn't removed.
This patch fixes it.

Change-Id: I930f299370834d4a83b48fa2f19748fb9ffbb95a

src/bin/e_comp_object.c

index 72e9b78..c568486 100644 (file)
@@ -166,6 +166,7 @@ typedef struct _E_Comp_Object
 
    tbm_surface_h        tbm_surface;
    E_Comp_Image_Filter  image_filter;
+   Eina_Bool            set_mouse_callbacks;
 } E_Comp_Object;
 
 typedef struct _E_Input_Rect_Data
@@ -1327,6 +1328,38 @@ _e_comp_object_effect_visibility_start(E_Comp_Object *cw, Eina_Bool state)
 
 /* create necessary objects for clients that e manages */
 static void
+_e_comp_object_mouse_event_callback_set(E_Comp_Object *cw)
+{
+   if (cw->set_mouse_callbacks) return;
+   if (!cw->smart_obj) return;
+
+   evas_object_event_callback_add(cw->smart_obj, EVAS_CALLBACK_MOUSE_IN, _e_comp_object_cb_mouse_in, cw);
+   evas_object_event_callback_add(cw->smart_obj, EVAS_CALLBACK_MOUSE_OUT, _e_comp_object_cb_mouse_out, cw);
+   evas_object_event_callback_add(cw->smart_obj, EVAS_CALLBACK_MOUSE_DOWN, _e_comp_object_cb_mouse_down, cw);
+   evas_object_event_callback_add(cw->smart_obj, EVAS_CALLBACK_MOUSE_UP, _e_comp_object_cb_mouse_up, cw);
+   evas_object_event_callback_add(cw->smart_obj, EVAS_CALLBACK_MOUSE_MOVE, _e_comp_object_cb_mouse_move, cw);
+   evas_object_event_callback_add(cw->smart_obj, EVAS_CALLBACK_MOUSE_WHEEL, _e_comp_object_cb_mouse_wheel, cw);
+
+   cw->set_mouse_callbacks = EINA_TRUE;
+}
+
+static void
+_e_comp_object_mouse_event_callback_unset(E_Comp_Object *cw)
+{
+   if (!cw->set_mouse_callbacks) return;
+   if (!cw->smart_obj) return;
+
+   evas_object_event_callback_del(cw->smart_obj, EVAS_CALLBACK_MOUSE_IN, _e_comp_object_cb_mouse_in);
+   evas_object_event_callback_del(cw->smart_obj, EVAS_CALLBACK_MOUSE_OUT, _e_comp_object_cb_mouse_out);
+   evas_object_event_callback_del(cw->smart_obj, EVAS_CALLBACK_MOUSE_DOWN, _e_comp_object_cb_mouse_down);
+   evas_object_event_callback_del(cw->smart_obj, EVAS_CALLBACK_MOUSE_UP, _e_comp_object_cb_mouse_up);
+   evas_object_event_callback_del(cw->smart_obj, EVAS_CALLBACK_MOUSE_MOVE, _e_comp_object_cb_mouse_move);
+   evas_object_event_callback_del(cw->smart_obj, EVAS_CALLBACK_MOUSE_WHEEL, _e_comp_object_cb_mouse_wheel);
+
+   cw->set_mouse_callbacks = EINA_FALSE;
+}
+
+static void
 _e_comp_object_setup(E_Comp_Object *cw)
 {
    cw->clip = evas_object_rectangle_add(e_comp->evas);
@@ -1360,12 +1393,7 @@ _e_comp_object_setup(E_Comp_Object *cw)
    if (!cw->ec->input_only)
      {
         e_util_size_debug_set(cw->effect_obj, 1);
-        evas_object_event_callback_add(cw->smart_obj, EVAS_CALLBACK_MOUSE_IN, _e_comp_object_cb_mouse_in, cw);
-        evas_object_event_callback_add(cw->smart_obj, EVAS_CALLBACK_MOUSE_OUT, _e_comp_object_cb_mouse_out, cw);
-        evas_object_event_callback_add(cw->smart_obj, EVAS_CALLBACK_MOUSE_DOWN, _e_comp_object_cb_mouse_down, cw);
-        evas_object_event_callback_add(cw->smart_obj, EVAS_CALLBACK_MOUSE_UP, _e_comp_object_cb_mouse_up, cw);
-        evas_object_event_callback_add(cw->smart_obj, EVAS_CALLBACK_MOUSE_MOVE, _e_comp_object_cb_mouse_move, cw);
-        evas_object_event_callback_add(cw->smart_obj, EVAS_CALLBACK_MOUSE_WHEEL, _e_comp_object_cb_mouse_wheel, cw);
+        _e_comp_object_mouse_event_callback_set(cw);
      }
 
    cw->default_input_obj = evas_object_rectangle_add(e_comp->evas);
@@ -3340,6 +3368,7 @@ _e_comp_smart_del(Evas_Object *obj)
    _e_comp_object_layers_remove(cw);
    l = evas_object_data_get(obj, "comp_object-to_del");
    E_FREE_LIST(l, evas_object_del);
+   _e_comp_object_mouse_event_callback_unset(cw);
    evas_object_del(cw->clip);
    evas_object_del(cw->effect_obj);
    evas_object_del(cw->shobj);