e_client: use e_view event listeners 93/323293/1
authorSooChan Lim <sc1.lim@samsung.com>
Wed, 16 Apr 2025 05:48:54 +0000 (14:48 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Fri, 25 Apr 2025 07:25:30 +0000 (16:25 +0900)
use e_view event listeners instead of evas event listeners

Change-Id: I6f4e59defe003c682b3f538576a6edd1b6a76a3c

src/bin/core/e_client.c

index 0e0e1cd87def7cead1172aed99812c087e93eb00..db68ef66137c7ec38b5394193ef827d5ecd3b1b8 100644 (file)
@@ -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())
      {