From: SooChan Lim Date: Wed, 16 Apr 2025 05:48:54 +0000 (+0900) Subject: e_client: use e_view event listeners X-Git-Tag: accepted/tizen/unified/20250429.071401~41 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fchanges%2F93%2F323293%2F1;p=platform%2Fupstream%2Fenlightenment.git e_client: use e_view event listeners use e_view event listeners instead of evas event listeners Change-Id: I6f4e59defe003c682b3f538576a6edd1b6a76a3c --- diff --git a/src/bin/core/e_client.c b/src/bin/core/e_client.c index 0e0e1cd87d..db68ef6613 100644 --- a/src/bin/core/e_client.c +++ b/src/bin/core/e_client.c @@ -45,6 +45,8 @@ typedef struct _E_Client_Private E_Client_Private; struct _E_Client_Private { + E_Client *ec; + struct { struct wl_signal eval_pre_new_client; @@ -141,6 +143,12 @@ struct _E_Client_Private } 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; @@ -630,6 +638,8 @@ _e_client_private_init(E_Client *ec) 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); @@ -722,6 +732,7 @@ _e_client_free(E_Client *ec) { E_Comp *comp = e_comp_get(); E_View_Client *view_client; + E_View *view; e_comp_ec_list_lock(); @@ -731,6 +742,14 @@ _e_client_free(E_Client *ec) 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)); @@ -1539,12 +1558,16 @@ _e_client_transform_core_activate_set(E_Client *ec, Eina_Bool set) } 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) @@ -1560,20 +1583,25 @@ _e_client_cb_evas_hide(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UN _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; @@ -1646,12 +1674,18 @@ _e_client_input_thread_eo_geometry_set(void *data) } 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; @@ -1675,7 +1709,7 @@ _e_client_cb_evas_resize(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_ 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); } } } @@ -1707,27 +1741,36 @@ _e_client_cb_evas_resize(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_ } 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) @@ -2832,6 +2875,8 @@ e_client_new(E_Pixmap *cp, int first_map, int internal) 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; @@ -2957,11 +3002,20 @@ e_client_new(E_Pixmap *cp, int first_map, int internal) 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()) {