e_comp_screen: Use wl_listener instead of E_CLIENTT_HOOK_DEL 29/299229/4
authorSeunghun Lee <shiin.lee@samsung.com>
Thu, 21 Sep 2023 01:35:45 +0000 (10:35 +0900)
committerSooChan Lim <sc1.lim@samsung.com>
Mon, 25 Sep 2023 07:50:30 +0000 (07:50 +0000)
Change-Id: Ib58e1666c96eca969abe7d4bc9df9fb4e5e4cef5

src/bin/e_comp_screen.c

index 7affba2..3558c69 100644 (file)
@@ -5,6 +5,8 @@
 #include <tbm_drm_helper.h>
 #include <gbm.h>
 
+#include "e_client_intern.h"
+
 #define PATH "/org/enlightenment/wm"
 #define IFACE "org.enlightenment.wm.screen_rotation"
 
@@ -30,24 +32,25 @@ typedef struct _E_Comp_Screen_Tzsr
 {
    struct wl_resource *resource; /* tizen_screen_rotation */
    E_Client           *ec;
+   struct wl_listener ec_destroy;
 } E_Comp_Screen_Tzsr;
 
 static Eina_List *tzsr_list;
 static E_Client_Hook *tzsr_client_hook_del;
 
+static void _tz_screen_rotation_cb_ec_destroy(struct wl_listener *listener, void *data);
+
 static E_Comp_Screen_Tzsr*
 _tz_surface_rotation_find(E_Client *ec)
 {
-   E_Comp_Screen_Tzsr *tzsr;
-   Eina_List *l;
+   E_Comp_Screen_Tzsr *tzsr = NULL;
+   struct wl_listener *listener;
 
-   EINA_LIST_FOREACH(tzsr_list, l, tzsr)
-     {
-        if (tzsr->ec == ec)
-          return tzsr;
-     }
+   listener = e_client_destroy_listener_get(ec, _tz_screen_rotation_cb_ec_destroy);
+   if (listener)
+     return wl_container_of(listener, tzsr, ec_destroy);
 
-   return NULL;
+   return tzsr;
 }
 
 static void
@@ -55,14 +58,16 @@ _tz_surface_rotation_free(E_Comp_Screen_Tzsr *tzsr)
 {
    ELOGF("TRANSFORM", "|tzsr(%p) freed", tzsr->ec, tzsr);
    tzsr_list = eina_list_remove(tzsr_list, tzsr);
+   wl_list_remove(&tzsr->ec_destroy.link);
    free(tzsr);
 }
 
 static void
-_tz_screen_rotation_cb_client_del(void *data, E_Client *ec)
+_tz_screen_rotation_cb_ec_destroy(struct wl_listener *listener, void *data)
 {
-   E_Comp_Screen_Tzsr *tzsr = _tz_surface_rotation_find(ec);
-   if (!tzsr) return;
+   E_Comp_Screen_Tzsr *tzsr;
+
+   tzsr = wl_container_of(listener, tzsr, ec_destroy);
    _tz_surface_rotation_free(tzsr);
 }
 
@@ -92,6 +97,9 @@ _tz_screen_rotation_get_ignore_output_transform(struct wl_client *client, struct
    tzsr->resource = resource;
    tzsr->ec = ec;
 
+   tzsr->ec_destroy.notify = _tz_screen_rotation_cb_ec_destroy;
+   e_client_destroy_listener_add(ec, &tzsr->ec_destroy);
+
    tzsr_list = eina_list_append(tzsr_list, tzsr);
 
    zone = e_comp_zone_find_by_ec(ec);
@@ -1278,8 +1286,6 @@ e_comp_screen_init()
      }
    e_main_ts_end("\tDBUS Init Done");
 
-   tzsr_client_hook_del = e_client_hook_add(E_CLIENT_HOOK_DEL, _tz_screen_rotation_cb_client_del, NULL);
-
    E_LIST_HANDLER_APPEND(event_handlers, ECORE_EVENT_DEVICE_ADD, _e_comp_screen_cb_input_device_add, comp);
    E_LIST_HANDLER_PREPEND(event_handlers, ECORE_EVENT_DEVICE_DEL, _e_comp_screen_cb_input_device_del, comp);