typedef struct _E_Desk_Area_Private E_Desk_Area_Private;
typedef struct _E_Desk_Area_Private_Client E_Desk_Area_Private_Client;
+#define DESK_AREA_EC_DATA_KEY "E_Desk_Area_Client"
+
#define PRI(eda) ((E_Desk_Area_Private *)e_object_data_get(E_OBJECT(eda)))
#define API_ENTRY \
#ifdef REFACTOR_DESK_AREA
static void
+_e_desk_area_client_data_del(E_Desk_Area *eda, E_Client *ec)
+{
+ evas_object_data_del(ec->frame, DESK_AREA_EC_DATA_KEY);
+}
+
+static void
+_e_desk_area_client_data_set(E_Desk_Area *eda, E_Client *ec)
+{
+ E_Desk_Area *data;
+
+ data = evas_object_data_get(ec->frame, DESK_AREA_EC_DATA_KEY);
+ if (data)
+ {
+ if (data == eda)
+ {
+ ELOGF("EDA", "EC is already added to desk_area_id:%d", ec, eda->id);
+ return;
+ }
+
+ evas_object_data_del(ec->frame, DESK_AREA_EC_DATA_KEY);
+ }
+
+ evas_object_data_set(ec->frame, DESK_AREA_EC_DATA_KEY, eda);
+}
+
+static void
_e_comp_object_layers_add(E_Desk_Area *eda, E_Comp_Object *cw, E_Comp_Object *above, E_Comp_Object *below, Eina_Bool prepend)
{
g_rec_mutex_lock(&e_comp->ec_list_mutex);
ELOGF("EDA", "No Comp Object. Fix Me~!!", ec);
_e_desk_area_smart_client_del(eda->smart_obj, ec);
-
- eda->clients = eina_list_remove(eda->clients, eda_client);
+ _e_desk_area_client_data_del(eda, ec);
// wl_list remove
wl_list_remove(&eda_client->comp_object_stack_below.link);
#ifdef REFACTOR_DESK_AREA
static E_Desk_Area_Private_Client *
-_e_desk_area_ec_find_client(E_Desk_Area *eda, E_Client *ec)
+_e_desk_area_private_client_get(E_Client *ec)
{
- Eina_List *l;
E_Desk_Area_Private_Client *eda_client;
+ struct wl_listener *listener;
- EINA_LIST_FOREACH(eda->clients, l, eda_client)
- {
- if (eda_client->ec == ec)
- return eda_client;
- }
+ listener = e_client_destroy_listener_get(ec, _desk_area_cb_client_destroy);
+ if (!listener) return NULL;
- return NULL;
+ return wl_container_of(listener, eda_client, client_destroy);
}
#endif
E_OBJECT_CHECK_RETURN(ec, EINA_FALSE);
E_OBJECT_TYPE_CHECK_RETURN(ec, E_CLIENT_TYPE, EINA_FALSE);
- if (_e_desk_area_ec_find_client(eda, ec)) return EINA_FALSE;
+ if (e_desk_area_has_ec(eda, ec))
+ {
+ ELOGF("EAD", "CLIENT Already added.", ec);
+ return EINA_TRUE;
+ }
ELOGF("EAD", "CLIENT ADD", ec);
eda_client->comp_object_stack_below.notify = _desk_area_cb_comp_object_stack_below;
e_comp_object_stack_below_listener_add(ec->frame, &eda_client->comp_object_stack_below);
- eda->clients = eina_list_append(eda->clients, eda_client);
-
+ _e_desk_area_client_data_set(eda, ec);
_e_desk_area_smart_client_add(eda->smart_obj, ec);
#else
layer = e_client_desk_area_original_layer_get(ec);
E_OBJECT_CHECK(ec);
E_OBJECT_TYPE_CHECK(ec, E_CLIENT_TYPE);
- eda_client = _e_desk_area_ec_find_client(eda, ec);
- if (!eda_client) return;
+ if (!e_desk_area_has_ec(eda, ec)) return;
ELOGF("EDA", "CLIENT REMOVE. desk_area:%p", ec, eda);
+ eda_client = _e_desk_area_private_client_get(ec);
+ EINA_SAFETY_ON_NULL_RETURN(eda_client);
+
_e_desk_area_private_client_del(eda_client);
#else
E_Desk_Area_Client_Layer edgc_layer;
return NULL;
}
+
+EINTERN Eina_Bool
+e_desk_area_has_ec(E_Desk_Area *eda, E_Client *ec)
+{
+ E_Desk_Area *data;
+
+ EINA_SAFETY_ON_NULL_RETURN_VAL(eda, EINA_FALSE);
+
+ data = evas_object_data_get(ec->frame, DESK_AREA_EC_DATA_KEY);
+ if (data == eda) return EINA_TRUE;
+
+ return EINA_FALSE;
+}
#endif