#ifdef REFACTOR_DESK_AREA
struct wl_signal get_above;
struct wl_signal get_below;
+ struct wl_signal get_visible_below;
struct wl_signal subsurface_stack_update;
#endif
} events;
#ifdef REFACTOR_DESK_AREA
wl_signal_init(&priv->events.get_above);
wl_signal_init(&priv->events.get_below);
+ wl_signal_init(&priv->events.get_visible_below);
wl_signal_init(&priv->events.subsurface_stack_update);
#endif
EINTERN E_Client *
e_client_visible_below_get(E_Client *ec)
{
+#ifdef REFACTOR_DESK_AREA
+ E_Client_Data_Get_Visible_Below data;
+
+ E_OBJECT_CHECK_RETURN(ec, NULL);
+ E_OBJECT_TYPE_CHECK_RETURN(ec, E_CLIENT_TYPE, NULL);
+
+ data.below_ec = NULL;
+
+ wl_signal_emit_mutable(&PRI(ec)->events.get_visible_below, &data);
+
+ return data.below_ec;
+#else
unsigned int x;
E_Client *ec2;
Eina_Inlist *l;
}
return NULL;
+#endif
}
E_API E_Client *
}
EINTERN void
+e_client_get_visible_below_listener_add(E_Client *ec, struct wl_listener *listener)
+{
+ API_ENTRY;
+ wl_signal_add(&priv->events.get_visible_below, listener);
+}
+
+EINTERN void
e_client_subsurface_stack_update_listener_add(E_Client *ec, struct wl_listener *listener)
{
API_ENTRY;
E_Client *below_ec; // returned below_ec
} E_Client_Data_Get_Below;
+typedef struct _E_Client_Data_Get_Visible_Below
+{
+ E_Client *below_ec; // returned below_ec
+} E_Client_Data_Get_Visible_Below;
+
EINTERN void e_client_eval_pre_fetch_listener_add(E_Client *ec, struct wl_listener *listener);
EINTERN void e_client_eval_fetch_listener_add(E_Client *ec, struct wl_listener *listener);
EINTERN void e_client_eval_pre_post_fetch_listener_add(E_Client *ec, struct wl_listener *listener);
//#ifdef REFACTOR_DESK_AREA
EINTERN void e_client_get_above_listener_add(E_Client *ec, struct wl_listener *listener);
EINTERN void e_client_get_below_listener_add(E_Client *ec, struct wl_listener *listener);
+EINTERN void e_client_get_visible_below_listener_add(E_Client *ec, struct wl_listener *listener);
EINTERN void e_client_subsurface_stack_update_listener_add(E_Client *ec, struct wl_listener *listener);
//#endif
// client listeners
struct wl_listener client_get_above;
struct wl_listener client_get_below;
+ struct wl_listener client_get_visible_below;
struct wl_listener client_subsurface_stack_update;
// comp_object listeners
}
static void
+_desk_area_cb_client_get_visible_below(struct wl_listener *listener, void *data)
+{
+ E_Desk_Area_Private_Client *eda_client;
+ E_Client_Data_Get_Visible_Below *get_visible_below_data = data;
+ E_Desk_Area *eda;
+ E_Client *ec, *ec2;
+ unsigned int x;
+ Eina_Inlist *l;
+ E_Layer ec_layer, ec_layer_cw;
+ int cw_layer;
+
+ eda_client = wl_container_of(listener, eda_client, client_get_visible_below);
+ ec = eda_client->ec;
+ eda = eda_client->eda;
+
+ if (EINA_INLIST_GET(ec)->prev) //check current layer
+ {
+ for (l = EINA_INLIST_GET(ec)->prev; l; l = l->prev)
+ {
+ ec2 = EINA_INLIST_CONTAINER_GET(l, E_Client);
+ if (ec == ec2) continue;
+ if ((!e_object_is_del(E_OBJECT(ec2))) &&
+ (!e_client_util_ignored_get(ec2)) &&
+ (ec2->visible) &&
+ (ec2->frame))
+ {
+ get_visible_below_data->below_ec = ec2;
+ return;
+ }
+ }
+ }
+
+ // check layer validation
+ ec_layer = ec->layer;
+ if (ec->layer_block || ec->layer_pending)
+ {
+ cw_layer = e_comp_object_layer_get(ec->frame);
+ if (cw_layer >= 0)
+ {
+ ec_layer_cw = e_comp_canvas_layer_map_to(cw_layer);
+ if (ec_layer != ec_layer_cw)
+ {
+ ELOGF("EDA", "[eda:%p] LAYER is not same. USE obj layer! (ec->layer:%d, obj:%d). block:%d, pending:%d)",
+ ec, eda, ec_layer, ec_layer_cw, ec->layer_block, ec->layer_pending);
+ ec_layer = ec_layer_cw;
+ }
+ }
+ }
+
+ /* go down the layers until we find one */
+ if (e_comp_canvas_layer_map(ec->layer) > e_comp_canvas_layer_map(E_LAYER_MAX)) return;
+ x = e_comp_canvas_layer_map(ec->layer);
+ if (x > 0) x--;
+
+ for (; x >= e_comp_canvas_layer_map(E_LAYER_CLIENT_DESKTOP); x--)
+ {
+ if (!e_comp->layers[x].clients) continue;
+ EINA_INLIST_REVERSE_FOREACH(e_comp->layers[x].clients, ec2)
+ {
+ if (ec == ec2) continue;
+ if ((!e_object_is_del(E_OBJECT(ec2))) &&
+ (!e_client_util_ignored_get(ec2)) &&
+ (ec2->visible) &&
+ (ec2->frame))
+ {
+ get_visible_below_data->below_ec = ec2;
+ return;
+ }
+ }
+ }
+}
+
+static void
_desk_area_cb_client_subsurface_stack_update(struct wl_listener *listener, void *data)
{
E_Desk_Area_Private_Client *eda_client;
e_client_get_above_listener_add(ec, &eda_client->client_get_above);
eda_client->client_get_below.notify = _desk_area_cb_client_get_below;
e_client_get_below_listener_add(ec, &eda_client->client_get_below);
+ eda_client->client_get_visible_below.notify = _desk_area_cb_client_get_visible_below;
+ e_client_get_visible_below_listener_add(ec, &eda_client->client_get_visible_below);
eda_client->client_subsurface_stack_update.notify = _desk_area_cb_client_subsurface_stack_update;
e_client_subsurface_stack_update_listener_add(ec, &eda_client->client_subsurface_stack_update);
wl_list_remove(&eda_client->comp_object_lower.link);
wl_list_remove(&eda_client->comp_object_raise.link);
wl_list_remove(&eda_client->client_subsurface_stack_update.link);
+ wl_list_remove(&eda_client->client_get_visible_below.link);
wl_list_remove(&eda_client->client_get_below.link);
wl_list_remove(&eda_client->client_get_above.link);