struct wl_signal unfullscreen;
struct wl_signal set_layer;
+ struct wl_signal get_layer;
struct wl_signal raise;
struct wl_signal lower;
struct wl_signal stack_below;
wl_signal_init(&priv->events.fullscreen);
wl_signal_init(&priv->events.unfullscreen);
wl_signal_init(&priv->events.set_layer);
+ wl_signal_init(&priv->events.get_layer);
wl_signal_init(&priv->events.raise);
wl_signal_init(&priv->events.lower);
wl_signal_init(&priv->events.stack_below);
e_client_layer_set(E_Client *ec,
E_Layer layer)
{
- E_View *ec_view;
- E_View_Tree *layer_tree;
+ E_Client_Data_Layer data = {0,};
E_OBJECT_CHECK_RETURN(ec, EINA_FALSE);
E_OBJECT_TYPE_CHECK_RETURN(ec, E_CLIENT_TYPE, EINA_FALSE);
if (e_util_client_layer_map(layer) == 9999)
return EINA_FALSE; //invalid layer is not allowed
- ec_view = e_view_client_view_get(e_client_view_get(ec));
+ data.layer = layer;
+ data.result = EINA_FALSE;
+ wl_signal_emit(&PRI(ec)->events.set_layer, &data);
- if (ec->layer != layer)
- {
- e_view_position_set(ec_view, ec->x, ec->y);
- }
-
- layer_tree = e_canvas_layer_view_tree_get(e_canvas_get(ec_view), e_canvas_util_e_layer_map(layer));
- e_view_reparent(ec_view, layer_tree);
- evas_object_layer_set(ec_view->eo, layer);
- if (ec->layer != layer)
- {
- /* check exceptional case */
- if ((ec->fullscreen) &&
- (ec->saved.layer != layer))
- {
- ELOGF("LAYER", "(%d) fail to backup at saved.layer for fullscreen", ec, layer);
- return EINA_FALSE;
- }
- // if e_comp_object fail to change ec->layer due to ec->layer_pending or block
- // leave log and apply ec->layer according to set
- // as a result it restores back to given layer when pending or block is free
- ELOGF("LAYER", "change layer from %d to %d if in case layer pending(%d) or block(%d)",
- ec, ec->layer, layer, ec->layer_pending, ec->layer_block);
- if (ec->layer_pending || ec->layer_block)
- {
- ec->layer = layer;
- if (e_input_thread_check_client_cloning_needed())
- e_client_input_thread_layer_set(ec, layer);
- return EINA_TRUE;
- }
- }
-
- wl_signal_emit(&PRI(ec)->events.set_layer, NULL);
-
- return EINA_TRUE;
+ return data.result;
}
E_API E_Layer
e_client_layer_get(E_Client *ec)
{
- E_Layer layer;
- E_Canvas_Layer canvas_layer;
+ E_Client_Data_Layer data = {0,};
E_OBJECT_CHECK_RETURN(ec, E_LAYER_BOTTOM);
E_OBJECT_TYPE_CHECK_RETURN(ec, E_CLIENT_TYPE, E_LAYER_BOTTOM);
if (!ec->frame) return E_LAYER_BOTTOM;
- canvas_layer = e_view_layer_index_get(e_view_client_view_get(PRI(ec)->view_client));
- layer = e_canvas_util_layer_map(canvas_layer);
- if (ec->layer != layer)
- {
- /* client could be on temperory layer while pending or block,
- * in that case, client restores back to ec->layer after pending/block finish */
- if (ec->layer_block || ec->layer_pending)
- return ec->layer;
-
- /* otherwise, client is on unexpected layer */
- ELOGF("LAYER", "layer dismatch ec->layer %d | evas obj layer %d ",
- ec, ec->layer, layer);
-
- if (e_util_client_layer_map(layer) == 9999)
- return E_LAYER_BOTTOM; //not on E_LAYER_CLIENT
- }
+ wl_signal_emit(&PRI(ec)->events.get_layer, &data);
- return ec->layer;
+ return data.layer;
}
static void
wl_signal_add(&priv->events.set_layer, listener);
}
+EINTERN void
+e_client_get_layer_listener_add(E_Client *ec, struct wl_listener *listener)
+{
+ API_ENTRY;
+ wl_signal_add(&priv->events.get_layer, listener);
+}
+
EINTERN void
e_client_stack_transient_for_done_listener_add(E_Client *ec, struct wl_listener *listener)
{
E_Client *result_ec;
} E_Client_Data_Get_Client;
+typedef struct _E_Client_Data_Layer
+{
+ E_Layer layer;
+ Eina_Bool result;
+} E_Client_Data_Layer;
+
struct _E_Event_Mouse_Button
{
int button; /**< Mouse button number that was raised (1 - 32) */
EINTERN void e_client_fullscreen_listener_add(E_Client *ec, struct wl_listener *listener);
EINTERN void e_client_unfullscreen_listener_add(E_Client *ec, struct wl_listener *listener);
EINTERN void e_client_set_layer_listener_add(E_Client *ec, struct wl_listener *listener);
+EINTERN void e_client_get_layer_listener_add(E_Client *ec, struct wl_listener *listener);
EINTERN void e_client_raise_listener_add(E_Client *ec, struct wl_listener *listener);
EINTERN void e_client_lower_listener_add(E_Client *ec, struct wl_listener *listener);
EINTERN void e_client_stack_below_listener_add(E_Client *ec, struct wl_listener *listener);
#include "e_view_client_intern.h"
#include "e_policy_wl_intern.h"
#include "e_policy_desk_area_layer_intern.h"
+#include "e_canvas_intern.h"
typedef struct _E_Policy_Desk_Area_Private_Client E_Policy_Desk_Area_Private_Client;
struct wl_listener client_mouse_move;
struct wl_listener client_move_end;
struct wl_listener client_resize_end;
+ struct wl_listener client_layer_set;
+ struct wl_listener client_layer_get;
struct wl_listener delete_request;
struct wl_listener kill_request;
struct wl_listener redirect;
EC_CHANGED(ec);
}
+static void
+_desk_area_cb_client_layer_set(struct wl_listener *listener, void *data)
+{
+ E_Policy_Desk_Area_Private_Client *eda_client;
+ E_Client *ec;
+ E_View *ec_view;
+ E_View_Tree *layer_tree;
+ E_Client_Data_Layer *layer_data;
+ E_Layer layer;
+
+ eda_client = wl_container_of(listener, eda_client, client_layer_set);
+ ec = eda_client->ec;
+ layer_data = (E_Client_Data_Layer *) data;
+ layer = layer_data->layer;
+
+ ec_view = e_view_client_view_get(e_client_view_get(ec));
+
+ if (ec->layer != layer)
+ {
+ e_view_position_set(ec_view, ec->x, ec->y);
+ }
+
+ layer_tree = e_canvas_layer_view_tree_get(e_canvas_get(ec_view), e_canvas_util_e_layer_map(layer));
+ e_view_reparent(ec_view, layer_tree);
+ evas_object_layer_set(ec_view->eo, layer);
+ if (ec->layer != layer)
+ {
+ /* check exceptional case */
+ if ((ec->fullscreen) &&
+ (ec->saved.layer != layer))
+ {
+ ELOGF("LAYER", "(%d) fail to backup at saved.layer for fullscreen", ec, layer);
+ return;
+ }
+ // if e_comp_object fail to change ec->layer due to ec->layer_pending or block
+ // leave log and apply ec->layer according to set
+ // as a result it restores back to given layer when pending or block is free
+ ELOGF("LAYER", "change layer from %d to %d if in case layer pending(%d) or block(%d)",
+ ec, ec->layer, layer, ec->layer_pending, ec->layer_block);
+ if (ec->layer_pending || ec->layer_block)
+ {
+ ec->layer = layer;
+ if (e_input_thread_check_client_cloning_needed())
+ e_client_input_thread_layer_set(ec, layer);
+ return;
+ }
+ }
+
+ layer_data->result = EINA_TRUE;
+}
+
+static void
+_desk_area_cb_client_layer_get(struct wl_listener *listener, void *data)
+{
+ E_Policy_Desk_Area_Private_Client *eda_client;
+ E_Client *ec;
+ E_Client_Data_Layer *layer_data;
+ E_Canvas_Layer canvas_layer;
+ E_Layer layer;
+
+ eda_client = wl_container_of(listener, eda_client, client_layer_get);
+ ec = eda_client->ec;
+ layer_data = (E_Client_Data_Layer *) data;
+
+ canvas_layer = e_view_layer_index_get(e_view_client_view_get(e_client_view_get(ec)));
+ layer = e_canvas_util_layer_map(canvas_layer);
+ layer_data->layer = ec->layer;
+
+ if (ec->layer == layer) return;
+ /* client could be on temperory layer while pending or block,
+ * in that case, client restores back to ec->layer after pending/block finish */
+ if (ec->layer_block || ec->layer_pending) return;
+
+ /* otherwise, client is on unexpected layer */
+ ELOGF("LAYER", "layer dismatch ec->layer %d | evas obj layer %d ", ec, ec->layer, layer);
+
+ if (e_util_client_layer_map(layer) == 9999)
+ layer_data->layer = E_LAYER_BOTTOM; //not on E_LAYER_CLIENT
+}
+
static void
_e_policy_desk_area_configure_send(E_Client *ec, Eina_Bool edges, Eina_Bool send_size)
wl_list_remove(&eda_client->comp_object_lower.link);
wl_list_remove(&eda_client->comp_object_raise.link);
+ wl_list_remove(&eda_client->client_layer_get.link);
+ wl_list_remove(&eda_client->client_layer_set.link);
wl_list_remove(&eda_client->client_resize_end.link);
wl_list_remove(&eda_client->client_move_end.link);
wl_list_remove(&eda_client->client_mouse_move.link);
e_client_move_end_listener_add(ec, &eda_client->client_move_end);
eda_client->client_resize_end.notify = _desk_area_cb_client_resize_end;
e_client_resize_end_listener_add(ec, &eda_client->client_resize_end);
+ eda_client->client_layer_set.notify = _desk_area_cb_client_layer_set;
+ e_client_set_layer_listener_add(ec, &eda_client->client_layer_set);
+ eda_client->client_layer_get.notify = _desk_area_cb_client_layer_get;
+ e_client_get_layer_listener_add(ec, &eda_client->client_layer_get);
// e_comp_object listeners
eda_client->comp_object_lower.notify = _desk_area_cb_comp_object_lower;