#ifdef REFACTOR_DESK_AREA
struct wl_signal get_above;
struct wl_signal get_below;
+ struct wl_signal get_visible_above;
struct wl_signal get_visible_below;
struct wl_signal subsurface_stack_update;
#endif
#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_above);
wl_signal_init(&priv->events.get_visible_below);
wl_signal_init(&priv->events.subsurface_stack_update);
#endif
EINTERN E_Client *
e_client_visible_above_get(E_Client *ec)
{
+#ifdef REFACTOR_DESK_AREA
+ E_Client_Data_Get_Visible_Above data;
+
+ E_OBJECT_CHECK_RETURN(ec, NULL);
+ E_OBJECT_TYPE_CHECK_RETURN(ec, E_CLIENT_TYPE, NULL);
+
+ data.above_ec = NULL;
+
+ wl_signal_emit_mutable(&PRI(ec)->events.get_visible_above, &data);
+
+ return data.above_ec;
+#else
unsigned int x;
E_Client *ec2;
}
return NULL;
+#endif
}
EINTERN E_Client *
}
EINTERN void
+e_client_get_visible_above_listener_add(E_Client *ec, struct wl_listener *listener)
+{
+ API_ENTRY;
+ wl_signal_add(&priv->events.get_visible_above, listener);
+}
+
+EINTERN void
e_client_get_visible_below_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_Above
+{
+ E_Client *above_ec; // returned above_ec
+} E_Client_Data_Get_Visible_Above;
+
typedef struct _E_Client_Data_Get_Visible_Below
{
E_Client *below_ec; // returned below_ec
//#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_above_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_above;
struct wl_listener client_get_visible_below;
struct wl_listener client_subsurface_stack_update;
}
static void
+_desk_area_cb_client_get_visible_above(struct wl_listener *listener, void *data)
+{
+ E_Desk_Area_Private_Client *eda_client;
+ E_Client_Data_Get_Visible_Above *get_visible_above_data = data;
+ E_Client *ec, *ec2;
+ unsigned int x;
+
+ eda_client = wl_container_of(listener, eda_client, client_get_visible_above);
+ ec = eda_client->ec;
+
+ if (EINA_INLIST_GET(ec)->next) //check current layer
+ {
+ EINA_INLIST_FOREACH(EINA_INLIST_GET(ec)->next, 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_above_data->above_ec = ec2;
+ return;
+ }
+ }
+ }
+
+ if (ec->layer == E_LAYER_CLIENT_CURSOR) return;
+ if (e_comp_canvas_client_layer_map(ec->layer) == 9999) return;
+
+ /* go up the layers until we find one */
+ for (x = e_comp_canvas_layer_map(ec->layer) + 1; x <= e_comp_canvas_layer_map(E_LAYER_CLIENT_CURSOR); x++)
+ {
+ if (!e_comp->layers[x].clients) continue;
+ EINA_INLIST_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_above_data->above_ec = ec2;
+ return;
+ }
+ }
+ }
+}
+
+static void
_desk_area_cb_client_get_visible_below(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_above.notify = _desk_area_cb_client_get_visible_above;
+ e_client_get_visible_above_listener_add(ec, &eda_client->client_get_visible_above);
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;
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_visible_above.link);
wl_list_remove(&eda_client->client_get_below.link);
wl_list_remove(&eda_client->client_get_above.link);