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
{
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;
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);
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 *
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)
{
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;
}
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);
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;
// 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);
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;
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);
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
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)
{
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);
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);
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;
_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)
{
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;
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);
_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;
}
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;
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)
{
// 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;