struct _E_Client_Private
{
+ E_Client *ec;
+
struct
{
struct wl_signal eval_pre_new_client;
} virtual_touch;
uint32_t resize_edges;
+
+ struct wl_listener view_client_resize_listener;
+ struct wl_listener view_show_listener;
+ struct wl_listener view_hide_listener;
+ struct wl_listener view_move_listener;
+ struct wl_listener view_restack_listener;
};
static int _e_client_hooks_delete = 0;
if (!priv)
return EINA_FALSE;
+ priv->ec = ec;
+
wl_signal_init(&priv->events.eval_pre_new_client);
wl_signal_init(&priv->events.eval_post_new_client);
wl_signal_init(&priv->events.eval_end);
{
E_Comp *comp = e_comp_get();
E_View_Client *view_client;
+ E_View *view;
e_comp_ec_list_lock();
view_client = e_client_view_get(ec);
if (view_client)
{
+ view = e_view_client_view_get(view_client);
+ e_view_event_listener_del(view, E_VIEW_RESTACK, &PRI(ec)->view_restack_listener);
+ e_view_event_listener_del(view, E_VIEW_MOVE, &PRI(ec)->view_move_listener);
+ e_view_event_listener_del(view, E_VIEW_HIDE, &PRI(ec)->view_hide_listener);
+ e_view_event_listener_del(view, E_VIEW_SHOW, &PRI(ec)->view_show_listener);
+
+ wl_list_remove(&PRI(ec)->view_client_resize_listener.link);
+
e_view_client_redirected_set(view_client, EINA_FALSE);
e_view_client_render_update_del(view_client);
e_view_destroy(e_view_client_view_get(view_client));
}
static void
-_e_client_cb_evas_hide(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+_e_client_cb_view_hide(struct wl_listener *listener, void *data)
{
- E_Client *ec = data;
+ E_Client_Private *client_private;
+ E_Client *ec;
+
+ client_private = wl_container_of(listener, client_private, view_hide_listener);
+ ec = client_private->ec;
if (stopping) return; //ignore all of this if we're shutting down!
- if (e_object_is_del(data)) return; //client is about to die
+ if (e_object_is_del(E_OBJECT(ec))) return; //client is about to die
if (ec->cur_mouse_action)
{
if (ec->cur_mouse_action->func.end_mouse)
_e_client_transform_core_activate_set(ec, EINA_FALSE);
if (ec->new_client) return;
- e_client_event_hide(ec);
+ e_client_event_hide(ec);
e_client_focus_check_set(ec, EINA_TRUE);
+
EC_CHANGED(ec);
}
static void
-_e_client_cb_evas_move(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+_e_client_cb_view_move(struct wl_listener *listener, void *data)
{
- E_Client *ec = data;
+ E_Client_Private *client_private;
+ E_Client *ec;
Evas_Coord x, y, w, h;
Eina_Bool update = EINA_FALSE;
- if (e_object_is_del(data)) return;
+ client_private = wl_container_of(listener, client_private, view_move_listener);
+ ec = client_private->ec;
+
+ if (e_object_is_del(E_OBJECT(ec))) return;
ec->pre_res_change.valid = 0;
}
static void
-_e_client_cb_evas_resize(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+_e_client_cb_view_client_resize(struct wl_listener *listener, void *data)
{
- E_Client *ec = data;
+ E_Client_Private *client_private;
+ E_Client *ec;
+ E_View_Client *view_client;
Evas_Coord x, y, w, h;
- if (e_object_is_del(data)) return;
+ client_private = wl_container_of(listener, client_private, view_client_resize_listener);
+ ec = client_private->ec;
+ view_client = e_client_view_get(ec);
+
+ if (e_object_is_del(E_OBJECT(ec))) return;
ec->pre_res_change.valid = 0;
nh = (child->h * h) / ec->pre_cb.h;
nx += ((nw - child->w) / 2);
ny += ((nh - child->h) / 2);
- e_view_position_set(e_view_client_view_get(PRI(child)->view_client), nx, ny);
+ e_view_position_set(e_view_client_view_get(view_client), nx, ny);
}
}
}
}
static void
-_e_client_cb_evas_show(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+_e_client_cb_view_show(struct wl_listener *listener, void *data)
{
- E_Client *ec = data;
+ E_Client_Private *client_private;
+ E_Client *ec;
- if (e_object_is_del(data)) return;
+ client_private = wl_container_of(listener, client_private, view_show_listener);
+ ec = client_private->ec;
+
+ if (e_object_is_del(E_OBJECT(ec))) return;
_e_client_transform_core_activate_set(ec, EINA_TRUE);
e_client_event_show(ec);
e_client_focus_check_set(ec, EINA_TRUE);
+
EC_CHANGED(ec);
}
static void
-_e_client_cb_evas_restack(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+_e_client_cb_view_restack(struct wl_listener *listener, void *data)
{
- E_Client *ec = data;
+ E_Client_Private *client_private;
+ E_Client *ec;
E_Comp_Wl_Client_Data *child_cdata = NULL;
- if (e_object_is_del(data)) return;
+ client_private = wl_container_of(listener, client_private, view_restack_listener);
+ ec = client_private->ec;
+
+ if (e_object_is_del(E_OBJECT(ec))) return;
if (ec->layer_block) return;
if (ec->layer_pending) return;
if (e_config->transient.raise && ec->transients)
E_Client *ec;
E_Pixmap_Type type;
E_Comp *comp;
+ E_View_Client *view_client;
+ E_View *view;
type = e_pixmap_type_get(cp);
if (type >= E_PIXMAP_TYPE_MAX) return NULL;
return NULL;
}
- evas_object_event_callback_add(ec->frame, EVAS_CALLBACK_SHOW, _e_client_cb_evas_show, ec);
- evas_object_event_callback_add(ec->frame, EVAS_CALLBACK_HIDE, _e_client_cb_evas_hide, ec);
- evas_object_event_callback_add(ec->frame, EVAS_CALLBACK_MOVE, _e_client_cb_evas_move, ec);
- evas_object_event_callback_add(ec->frame, EVAS_CALLBACK_RESIZE, _e_client_cb_evas_resize, ec);
- evas_object_event_callback_add(ec->frame, EVAS_CALLBACK_RESTACK, _e_client_cb_evas_restack, ec);
+ // TODO: these listeners has to be moved to other files which may be e_policy_client?
+ view_client = e_client_view_get(ec);
+ PRI(ec)->view_client_resize_listener.notify = _e_client_cb_view_client_resize;
+ e_view_client_resize_listener_add(view_client, &PRI(ec)->view_client_resize_listener);
+
+ view = e_view_client_view_get(view_client);
+ PRI(ec)->view_show_listener.notify = _e_client_cb_view_show;
+ e_view_event_listener_add(view, E_VIEW_SHOW, &PRI(ec)->view_show_listener);
+ PRI(ec)->view_hide_listener.notify = _e_client_cb_view_hide;
+ e_view_event_listener_add(view, E_VIEW_HIDE, &PRI(ec)->view_hide_listener);
+ PRI(ec)->view_move_listener.notify = _e_client_cb_view_move;
+ e_view_event_listener_add(view, E_VIEW_MOVE, &PRI(ec)->view_move_listener);
+ PRI(ec)->view_restack_listener.notify = _e_client_cb_view_restack;
+ e_view_event_listener_add(view, E_VIEW_RESTACK, &PRI(ec)->view_restack_listener);
if (e_input_thread_check_client_cloning_needed())
{