e_containers: modify has_ec methods 17/320617/1
authorJunseok Kim <juns.kim@samsung.com>
Wed, 19 Feb 2025 02:25:50 +0000 (11:25 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Wed, 5 Mar 2025 05:00:11 +0000 (14:00 +0900)
Existing has_ec functions are using e_view_data_get to get their container.
But It uses evas_object internally and it can cause issue on thread.
For prevent it, compare containers using their private policy clients object.

Change-Id: Ia824d05c6bc4d4e95b22f6369633c937860dbd73

src/bin/core/e_desk.c
src/bin/core/e_desk_area.c
src/bin/core/e_desk_area_intern.h
src/bin/core/e_desk_intern.h
src/bin/core/e_zone.c
src/bin/core/e_zone_intern.h
src/bin/windowmgr/e_policy_desk.c
src/bin/windowmgr/e_policy_desk_area.c
src/bin/windowmgr/e_policy_zone.c

index f17839ecd09537139bd92eb64565aac740df8081..cb9ec7dfdb70c514f5b5b9282f171b6ceae432f9 100644 (file)
@@ -34,6 +34,7 @@ struct _E_Desk_Private
      {
         struct wl_signal client_add;
         struct wl_signal client_remove;
+        struct wl_signal has_ec;
         struct wl_signal desk_area_enable;
         struct wl_signal desk_area_disable;
         struct wl_signal desk_area_active_change;
@@ -94,6 +95,7 @@ _e_desk_private_init(E_Desk *desk)
 
    wl_signal_init(&priv->events.client_add);
    wl_signal_init(&priv->events.client_remove);
+   wl_signal_init(&priv->events.has_ec);
    wl_signal_init(&priv->events.desk_area_enable);
    wl_signal_init(&priv->events.desk_area_disable);
    wl_signal_init(&priv->events.desk_area_active_change);
@@ -749,14 +751,16 @@ e_desk_desk_area_below_get(E_Desk *desk, E_Desk_Area *eda)
 EINTERN Eina_Bool
 e_desk_has_ec(E_Desk *desk, E_Client *ec)
 {
-   E_Desk *data;
+   E_Desk_Data_Has_EC data;
 
    EINA_SAFETY_ON_NULL_RETURN_VAL(desk, EINA_FALSE);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(ec, EINA_FALSE);
 
-   data = e_view_data_get(e_view_client_view_get(e_client_view_get(ec)), DESK_EC_DATA_KEY);
-   if (data == desk) return EINA_TRUE;
+   data.ec = ec;
+   data.has_ec = EINA_FALSE;
+   wl_signal_emit(&PRI(desk)->events.has_ec, &data);
 
-   return EINA_FALSE;
+   return data.has_ec;
 }
 
 EINTERN E_Client *
@@ -882,6 +886,13 @@ e_desk_client_remove_listener_add(E_Desk *desk, struct wl_listener *listener)
    wl_signal_add(&priv->events.client_remove, listener);
 }
 
+EINTERN void
+e_desk_has_ec_listener_add(E_Desk *desk, struct wl_listener *listener)
+{
+   API_ENTRY;
+   wl_signal_add(&priv->events.has_ec, listener);
+}
+
 EINTERN void
 e_desk_desk_area_enable_listener_add(E_Desk *desk, struct wl_listener *listener)
 {
index 77ab2f2ef8376d0ae5a18bad016a18d78bcfc73b..ddfd2cf6083b9708679181099a116c9c7dac0ea6 100644 (file)
@@ -415,12 +415,12 @@ e_desk_area_has_ec(E_Desk_Area *eda, E_Client *ec)
    EINA_SAFETY_ON_NULL_RETURN_VAL(eda, EINA_FALSE);
    EINA_SAFETY_ON_NULL_RETURN_VAL(ec, EINA_FALSE);
 
-   data.eda = eda;
    data.ec = ec;
+   data.has_ec = EINA_FALSE;
 
    wl_signal_emit(&PRI(eda)->events.has_ec, &data);
 
-   return data.result;
+   return data.has_ec;
 }
 
 
index 0a61707853aed660d70f0efe8ccc7f2f718d6782..8d389291e5661bf29eb08ec6b9893c7397113d3a 100644 (file)
@@ -67,9 +67,8 @@ typedef struct _E_Desk_Area_Data_EC_Get
 
 typedef struct _E_Desk_Area_Data_Has_EC
 {
-   E_Desk_Area *eda;
    E_Client *ec;
-   Eina_Bool result;
+   Eina_Bool has_ec;
 } E_Desk_Area_Data_Has_EC;
 
 EINTERN int e_desk_area_init(void);
index 40f5883674f60078c9ab5d3305385acf9ada19f0..093b9515f35e53bb6f947c5333092f80a31de252 100644 (file)
@@ -49,6 +49,12 @@ typedef struct _E_Desk_Data_Client_Get
    E_Client *result_ec;
 } E_Desk_Data_Client_Get;
 
+typedef struct _E_Desk_Data_Has_EC
+{
+   E_Client *ec;
+   Eina_Bool has_ec;
+} E_Desk_Data_Has_EC;
+
 extern EINTERN int E_EVENT_DESK_SHOW;
 extern EINTERN int E_EVENT_DESK_BEFORE_SHOW;
 extern EINTERN int E_EVENT_DESK_AFTER_SHOW;
@@ -92,6 +98,7 @@ EINTERN void         e_desk_desk_area_info_print(E_Desk *desk);
 // listeners
 EINTERN void e_desk_client_add_listener_add(E_Desk *desk, struct wl_listener *listener);
 EINTERN void e_desk_client_remove_listener_add(E_Desk *desk, struct wl_listener *listener);
+EINTERN void e_desk_has_ec_listener_add(E_Desk *desk, struct wl_listener *listener);
 EINTERN void e_desk_desk_area_enable_listener_add(E_Desk *desk, struct wl_listener *listener);
 EINTERN void e_desk_desk_area_disable_listener_add(E_Desk *desk, struct wl_listener *listener);
 EINTERN void e_desk_desk_area_active_change_listener_add(E_Desk *desk, struct wl_listener *listener);
index dc8ae0128b64806c6d568cf93d8e18c002deda32..3a3fc136d4fbaaf9f972d44811cdbe373944d3b9 100644 (file)
@@ -53,6 +53,7 @@ struct _E_Zone_Private
         struct wl_signal desk_prev;
         struct wl_signal desk_count;
         struct wl_signal client_add;
+        struct wl_signal has_ec;
         struct wl_signal focused_client_get;
         struct wl_signal focused_client_set;
         struct wl_signal zone_client_top_get;
@@ -145,6 +146,7 @@ _e_zone_private_init(E_Zone *zone)
    wl_signal_init(&priv->events.desk_prev);
    wl_signal_init(&priv->events.desk_count);
    wl_signal_init(&priv->events.client_add);
+   wl_signal_init(&priv->events.has_ec);
    wl_signal_init(&priv->events.focused_client_get);
    wl_signal_init(&priv->events.focused_client_set);
    wl_signal_init(&priv->events.zone_client_top_get);
@@ -1090,14 +1092,16 @@ e_zone_client_add(E_Zone *zone, E_Client *ec)
 EINTERN Eina_Bool
 e_zone_has_ec(E_Zone *zone, E_Client *ec)
 {
-   E_Zone *data;
+   E_Zone_Data_Has_EC data;
 
    EINA_SAFETY_ON_NULL_RETURN_VAL(zone, EINA_FALSE);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(ec, EINA_FALSE);
 
-   data = e_view_data_get(e_view_client_view_get(e_client_view_get(ec)), ZONE_EC_DATA_KEY);
-   if (data == zone) return EINA_TRUE;
+   data.ec = ec;
+   data.has_ec = EINA_FALSE;
+   wl_signal_emit(&PRI(zone)->events.has_ec, &data);
 
-   return EINA_FALSE;
+   return data.has_ec;
 }
 
 EINTERN Eina_Bool
@@ -1349,6 +1353,13 @@ e_zone_client_add_listener_add(E_Zone *zone, struct wl_listener *listener)
    wl_signal_add(&priv->events.client_add, listener);
 }
 
+EINTERN void
+e_zone_has_ec_listener_add(E_Zone *zone, struct wl_listener *listener)
+{
+   API_ENTRY;
+   wl_signal_add(&priv->events.has_ec, listener);
+}
+
 EINTERN void
 e_zone_focused_client_get_listener_add(E_Zone *zone, struct wl_listener *listener)
 {
index 3e5e535c6ea4342db38aa94629ca22e81ea780a3..a6fceff2f8bcbb32b250190b948419524290a3a5 100644 (file)
@@ -99,6 +99,12 @@ typedef struct _E_Zone_Data_Client_Get
    E_Client *result_ec;
 } E_Zone_Data_Client_Get;
 
+typedef struct _E_Zone_Data_Has_EC
+{
+   E_Client *ec;
+   Eina_Bool has_ec;
+} E_Zone_Data_Has_EC;
+
 
 EINTERN int e_zone_init(void);
 EINTERN int e_zone_shutdown(void);
@@ -148,6 +154,7 @@ EINTERN void e_zone_useful_geometry_get_listener_add(E_Zone *zone, struct wl_lis
 EINTERN void e_zone_bg_mouse_down_listener_add(E_Zone *zone, struct wl_listener *listener);
 EINTERN void e_zone_bg_mouse_up_listener_add(E_Zone *zone, struct wl_listener *listener);
 EINTERN void e_zone_client_add_listener_add(E_Zone *zone, struct wl_listener *listener);
+EINTERN void e_zone_has_ec_listener_add(E_Zone *zone, struct wl_listener *listener);
 EINTERN void e_zone_focused_client_get_listener_add(E_Zone *zone, struct wl_listener *listener);
 EINTERN void e_zone_focused_client_set_listener_add(E_Zone *zone, struct wl_listener *listener);
 EINTERN void e_zone_client_top_get_listener_add(E_Zone *zone, struct wl_listener *listener);
index ef10ccea5e932f289bc12dcc8f07182ac3aea698..e2873f5ff21c86a37985c167c296be3bbd8f6447 100644 (file)
@@ -53,6 +53,7 @@ struct _E_Policy_Desk
    struct wl_listener desk_deskshow;
    struct wl_listener desk_client_add;
    struct wl_listener desk_client_del;
+   struct wl_listener desk_has_ec;
    struct wl_listener geometry_set;
    struct wl_listener zoom_set;
    struct wl_listener zoom_get;
@@ -1076,6 +1077,26 @@ _e_policy_desk_cb_desk_client_remove(struct wl_listener *listener, void *data)
    _e_policy_desk_private_client_del(desk_client);
 }
 
+static void
+_e_policy_desk_cb_desk_has_ec(struct wl_listener *listener, void *data)
+{
+   E_Desk_Data_Has_EC *has_ec_data = (E_Desk_Data_Has_EC *) data;
+   E_Policy_Desk *pd;
+   E_Desk *desk;
+   E_Policy_Desk_Private_Client *desk_client;
+   E_Client *ec;
+
+   pd = wl_container_of(listener, pd, desk_has_ec);
+   desk = pd->desk;
+   ec = has_ec_data->ec;
+
+   desk_client = _e_policy_desk_private_client_get(ec);
+   if (desk_client && desk_client->desk == desk)
+     has_ec_data->has_ec = EINA_TRUE;
+
+   return;
+}
+
 static void
 _e_policy_desk_cb_desk_geometry_set(struct wl_listener *listener, void *data)
 {
@@ -2163,6 +2184,8 @@ e_policy_desk_add(E_Desk *desk)
    e_desk_client_add_listener_add(pd->desk, &pd->desk_client_add);
    pd->desk_client_del.notify = _e_policy_desk_cb_desk_client_remove;
    e_desk_client_remove_listener_add(pd->desk, &pd->desk_client_del);
+   pd->desk_has_ec.notify = _e_policy_desk_cb_desk_has_ec;
+   e_desk_has_ec_listener_add(pd->desk, &pd->desk_has_ec);
    pd->geometry_set.notify = _e_policy_desk_cb_desk_geometry_set;
    e_desk_geometry_set_listener_add(pd->desk, &pd->geometry_set);
    pd->zoom_set.notify = _e_policy_desk_cb_desk_zoom_set;
index 13cd9f228a67af903fbc0e2412e5ead84d2e0b91..959f0233628d29eb82ce74b0ad8a6623addff7ce 100644 (file)
@@ -106,6 +106,7 @@ static Eina_Bool   _e_policy_desk_area_hook_call(E_Desk_Area_Hook_Point hookpoin
 static void        _e_policy_desk_area_private_client_del(E_Policy_Desk_Area_Private_Client *eda_client);
 static void        _e_policy_desk_area_configure_send(E_Client *ec, Eina_Bool edges, Eina_Bool send_size);
 static void        _e_comp_object_layer_update(E_Desk_Area *eda, Evas_Object *obj, Evas_Object *above, Evas_Object *below);
+static E_Policy_Desk_Area_Private_Client *_e_policy_desk_area_private_client_get(E_Client *ec);
 
 
 typedef void (*E_Policy_Desk_Area_Stack_Func)(Evas_Object *obj, Evas_Object *stack);
@@ -428,17 +429,20 @@ static void
 _e_policy_desk_area_cb_has_ec(struct wl_listener *listener, void *data)
 {
    E_Desk_Area_Data_Has_EC *has_ec_data = (E_Desk_Area_Data_Has_EC *) data;
-   E_Desk_Area *eda, *view_eda;
-   E_Client *ec;
    E_Policy_Desk_Area *pda;
+   E_Desk_Area *eda;
+   E_Policy_Desk_Area_Private_Client *eda_client;
+   E_Client *ec;
 
    pda = wl_container_of(listener, pda, has_ec);
-   eda = has_ec_data->eda;
+   eda = pda->desk_area;
    ec = has_ec_data->ec;
 
-   view_eda = e_view_data_get(e_view_client_view_get(e_client_view_get(ec)), POLICY_DESK_AREA_EC_DATA_KEY);
-   if (view_eda == eda) has_ec_data->result = EINA_TRUE;
-   else has_ec_data->result = EINA_FALSE;
+   eda_client = _e_policy_desk_area_private_client_get(ec);
+   if (eda_client && eda_client->eda == eda)
+     has_ec_data->has_ec = EINA_TRUE;
+
+   return;
 }
 
 
index 8784159b049ac34ade27ca6d25e6a350935e3877..05c727592fa7cbc7ae4deb2d8c0718033821739c 100644 (file)
@@ -29,6 +29,7 @@ struct _E_Policy_Zone
    E_Zone *zone;
 
    struct wl_listener client_add;
+   struct wl_listener has_ec;
    struct wl_listener zone_destroy;
    struct wl_listener move;
    struct wl_listener resize;
@@ -1301,6 +1302,26 @@ _e_policy_zone_cb_client_add(struct wl_listener *listener, void *data)
    return;
 }
 
+static void
+_e_policy_zone_cb_has_ec(struct wl_listener *listener, void *data)
+{
+   E_Zone_Data_Has_EC *has_ec_data = (E_Zone_Data_Has_EC *) data;
+   E_Policy_Zone *policy_zone;
+   E_Zone *zone;
+   E_Policy_Zone_Client *zone_client;
+   E_Client *ec;
+
+   policy_zone = wl_container_of(listener, policy_zone, has_ec);
+   zone = policy_zone->zone;
+   ec = has_ec_data->ec;
+
+   zone_client = _e_policy_zone_client_get(ec);
+   if (zone_client && zone_client->policy_zone->zone == zone)
+     has_ec_data->has_ec = EINA_TRUE;
+
+   return;
+}
+
 static E_Policy_Zone_Client *
 _e_policy_zone_client_get(E_Client *ec)
 {
@@ -2054,6 +2075,8 @@ e_policy_zone_new(E_Zone *zone)
    // zone listeners
    policy_zone->client_add.notify = _e_policy_zone_cb_client_add;
    e_zone_client_add_listener_add(zone, &policy_zone->client_add);
+   policy_zone->has_ec.notify = _e_policy_zone_cb_has_ec;
+   e_zone_has_ec_listener_add(zone, &policy_zone->has_ec);
    policy_zone->zone_destroy.notify = _e_policy_zone_cb_zone_destroy;
    e_zone_destroy_listener_add(zone, &policy_zone->zone_destroy);
    policy_zone->move.notify = _e_policy_zone_cb_move;