e_zone: use wl_listeners of e_client 36/300536/1
authorSooChan Lim <sc1.lim@samsung.com>
Thu, 26 Oct 2023 04:27:11 +0000 (13:27 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Fri, 27 Oct 2023 00:10:13 +0000 (09:10 +0900)
Instead of E_Client_Hook, e_zone uses the wl_listeners of e_client.

Change-Id: Ic7a4b1c390ab19fbaeb6ebdfcc8275f4f4e32c5c

src/bin/e_zone.c

index 8c8baa2c151e20f3561b59fe8726aec144bba710..7a806760e53af72bd6281647161b900dde5822a9 100644 (file)
@@ -17,6 +17,7 @@
    E_Zone_Private *priv = PRI(zone)
 
 typedef struct _E_Zone_Private E_Zone_Private;
+typedef struct _E_Zone_Private_Client E_Zone_Private_Client;
 
 struct _E_Zone_Private
 {
@@ -32,6 +33,26 @@ struct _E_Zone_Private
      } events;
 };
 
+struct _E_Zone_Private_Client
+{
+   E_Zone *zone;
+   E_Client *ec;
+
+   struct wl_listener client_destroy;
+   struct wl_listener client_eval_post_new_client;
+   struct wl_listener client_focus_set;
+   struct wl_listener client_iconify;
+   struct wl_listener client_uniconify;
+   struct wl_listener client_stick;
+   struct wl_listener client_unstick;
+   struct wl_listener client_maximize;
+   struct wl_listener client_unmaximize;
+   struct wl_listener client_activate_done;
+   struct wl_listener client_fullscreen;
+   struct wl_listener client_unfullscreen;
+};
+
+
 /* E_Zone is a child object of E_Comp. There is one zone per screen
  * in a xinerama setup. Each zone has one or more desktops.
  */
@@ -350,20 +371,17 @@ _e_zone_client_apply_auto_placement(E_Zone *zone, E_Client *ec)
 #endif
 
 static void
-_e_zone_cb_hook_client_del(void *d, E_Client *ec)
+_zone_cb_client_destroy(struct wl_listener *listener, void *data)
 {
 #ifdef REFACTOR_ZONE_DESK
+   E_Zone_Private_Client *zone_client;
    E_Zone *zone;
+   E_Client *ec;
    E_Desk *desk;
 
-   EINA_SAFETY_ON_NULL_RETURN(ec);
-
-   zone = (E_Zone *)d;
-   EINA_SAFETY_ON_NULL_RETURN(zone);
-
-   // FIXME: A ec is set the current zone now.
-   //        We need to make a policy for the placement of the ec at the zone.
-   if (zone != e_zone_current_get()) return;
+   zone_client = wl_container_of(listener, zone_client, client_destroy);
+   zone = zone_client->zone;
+   ec = zone_client->ec;
 
    desk = e_zone_desk_find_by_ec(zone, ec);
    EINA_SAFETY_ON_NULL_RETURN(desk);
@@ -391,6 +409,22 @@ _e_zone_cb_hook_client_del(void *d, E_Client *ec)
    wl_signal_emit_mutable(&PRI(zone)->events.client_remove, ec);
 
    e_desk_client_del(desk, ec);
+
+   wl_list_remove(&zone_client->client_unfullscreen.link);
+   wl_list_remove(&zone_client->client_fullscreen.link);
+   wl_list_remove(&zone_client->client_activate_done.link);
+   wl_list_remove(&zone_client->client_unmaximize.link);
+   wl_list_remove(&zone_client->client_maximize.link);
+   wl_list_remove(&zone_client->client_unstick.link);
+   wl_list_remove(&zone_client->client_stick.link);
+   wl_list_remove(&zone_client->client_uniconify.link);
+   wl_list_remove(&zone_client->client_iconify.link);
+   wl_list_remove(&zone_client->client_focus_set.link);
+   wl_list_remove(&zone_client->client_eval_post_new_client.link);
+   wl_list_remove(&zone_client->client_destroy.link);
+
+   E_FREE(zone_client);
+
 #else
    evas_object_data_del(ec->frame, ZONE_EC_DATA_KEY);
 #endif
@@ -416,21 +450,18 @@ _e_zone_cb_hook_client_new_client_post(void *d, E_Client *ec)
 }
 
 static void
-_e_zone_cb_hook_client_eval_post_new_client(void *d, E_Client *ec)
+_zone_cb_client_eval_post_new_client(struct wl_listener *listener, void *data)
 {
+   E_Zone_Private_Client *zone_client;
    E_Zone *zone;
+   E_Client *ec;
    int tx, ty, tw, th;
    int nw, nh;
    int zx = 0, zy = 0, zw = 0, zh = 0;
 
-   EINA_SAFETY_ON_NULL_RETURN(ec);
-
-   zone = (E_Zone *)d;
-   EINA_SAFETY_ON_NULL_RETURN(zone);
-
-   // FIXME: A ec is set the current zone now.
-   //        We need to make a policy for the placement of the ec at the zone.
-   if (zone != e_zone_current_get()) return;
+   zone_client = wl_container_of(listener, zone_client, client_eval_post_new_client);
+   zone = zone_client->zone;
+   ec = zone_client->ec;
 
    e_zone_useful_geometry_get(zone, &zx, &zy, &zw, &zh);
    /* enforce wm size hints for initial sizing */
@@ -552,19 +583,16 @@ _e_zone_cb_hook_client_eval_post_new_client(void *d, E_Client *ec)
 }
 
 static void
-_e_zone_cb_hook_client_focus_set(void *d, E_Client *ec)
+_zone_cb_client_focus_set(struct wl_listener *listener, void *data)
 {
+   E_Zone_Private_Client *zone_client;
    E_Zone *zone;
+   E_Client *ec;
    E_Desk *desk;
 
-   EINA_SAFETY_ON_NULL_RETURN(ec);
-
-   zone = (E_Zone *)d;
-   EINA_SAFETY_ON_NULL_RETURN(zone);
-
-   // FIXME: A ec is set the current zone now.
-   //        We need to make a policy for the placement of the ec at the zone.
-   if (zone != e_zone_current_get()) return;
+   zone_client = wl_container_of(listener, zone_client, client_focus_set);
+   zone = zone_client->zone;
+   ec = zone_client->ec;
 
    desk = e_zone_desk_find_by_ec(zone, ec);
    EINA_SAFETY_ON_NULL_RETURN(desk);
@@ -574,19 +602,16 @@ _e_zone_cb_hook_client_focus_set(void *d, E_Client *ec)
 }
 
 static void
-_e_zone_cb_hook_client_iconify(void *d, E_Client *ec)
+_zone_cb_client_iconify(struct wl_listener *listener, void *data)
 {
+   E_Zone_Private_Client *zone_client;
    E_Zone *zone;
+   E_Client *ec;
    E_Desk *desk;
 
-   EINA_SAFETY_ON_NULL_RETURN(ec);
-
-   zone = (E_Zone *)d;
-   EINA_SAFETY_ON_NULL_RETURN(zone);
-
-   // FIXME: A ec is set the current zone now.
-   //        We need to make a policy for the placement of the ec at the zone.
-   if (zone != e_zone_current_get()) return;
+   zone_client = wl_container_of(listener, zone_client, client_iconify);
+   zone = zone_client->zone;
+   ec = zone_client->ec;
 
    desk = e_zone_desk_find_by_ec(zone, ec);
    EINA_SAFETY_ON_NULL_RETURN(desk);
@@ -624,20 +649,17 @@ _e_zone_cb_hook_client_iconify(void *d, E_Client *ec)
 }
 
 static void
-_e_zone_cb_hook_client_uniconify(void *d, E_Client *ec)
+_zone_cb_client_uniconify(struct wl_listener *listener, void *data)
 {
+   E_Zone_Private_Client *zone_client;
    E_Zone *zone;
+   E_Client *ec;
    E_Desk *desk;
    Eina_Bool not_raise;
 
-   EINA_SAFETY_ON_NULL_RETURN(ec);
-
-   zone = (E_Zone *)d;
-   EINA_SAFETY_ON_NULL_RETURN(zone);
-
-   // FIXME: A ec is set the current zone now.
-   //        We need to make a policy for the placement of the ec at the zone.
-   if (zone != e_zone_current_get()) return;
+   zone_client = wl_container_of(listener, zone_client, client_uniconify);
+   zone = zone_client->zone;
+   ec = zone_client->ec;
 
    desk = e_zone_desk_find_by_ec(zone, ec);
    EINA_SAFETY_ON_NULL_RETURN(desk);
@@ -739,19 +761,16 @@ _e_zone_cb_hook_client_uniconify(void *d, E_Client *ec)
 }
 
 static void
-_e_zone_cb_hook_client_stick(void *d, E_Client *ec)
+_zone_cb_client_stick(struct wl_listener *listener, void *data)
 {
+   E_Zone_Private_Client *zone_client;
    E_Zone *zone;
+   E_Client *ec;
    E_Desk *desk;
 
-   EINA_SAFETY_ON_NULL_RETURN(ec);
-
-   zone = (E_Zone *)d;
-   EINA_SAFETY_ON_NULL_RETURN(zone);
-
-   // FIXME: A ec is set the current zone now.
-   //        We need to make a policy for the placement of the ec at the zone.
-   if (zone != e_zone_current_get()) return;
+   zone_client = wl_container_of(listener, zone_client, client_stick);
+   zone = zone_client->zone;
+   ec = zone_client->ec;
 
    desk = e_zone_desk_find_by_ec(zone, ec);
    EINA_SAFETY_ON_NULL_RETURN(desk);
@@ -778,19 +797,16 @@ _e_zone_cb_hook_client_stick(void *d, E_Client *ec)
 }
 
 static void
-_e_zone_cb_hook_client_unstick(void *d, E_Client *ec)
+_zone_cb_client_unstick(struct wl_listener *listener, void *data)
 {
+   E_Zone_Private_Client *zone_client;
    E_Zone *zone;
+   E_Client *ec;
    E_Desk *desk, *curr_desk;
 
-   EINA_SAFETY_ON_NULL_RETURN(ec);
-
-   zone = (E_Zone *)d;
-   EINA_SAFETY_ON_NULL_RETURN(zone);
-
-   // FIXME: A ec is set the current zone now.
-   //        We need to make a policy for the placement of the ec at the zone.
-   if (zone != e_zone_current_get()) return;
+   zone_client = wl_container_of(listener, zone_client, client_unstick);
+   zone = zone_client->zone;
+   ec = zone_client->ec;
 
    desk = e_zone_desk_find_by_ec(zone, ec);
    EINA_SAFETY_ON_NULL_RETURN(desk);
@@ -816,20 +832,20 @@ _e_zone_cb_hook_client_unstick(void *d, E_Client *ec)
 }
 
 static void
-_e_zone_cb_hook_client_maximize(void *d, E_Client *ec)
+_zone_cb_client_maximize(struct wl_listener *listener, void *data)
 {
+   E_Zone_Private_Client *zone_client;
    E_Zone *zone;
+   E_Client *ec;
    E_Desk *desk;
    int desk_x, desk_y;
+   E_Maximize max;
 
-   EINA_SAFETY_ON_NULL_RETURN(ec);
+   zone_client = wl_container_of(listener, zone_client, client_maximize);
+   zone = zone_client->zone;
+   ec = zone_client->ec;
 
-   zone = (E_Zone *)d;
-   EINA_SAFETY_ON_NULL_RETURN(zone);
-
-   // FIXME: A ec is set the current zone now.
-   //        We need to make a policy for the placement of the ec at the zone.
-   if (zone != e_zone_current_get()) return;
+   max = *((E_Maximize *)data);
 
    desk = e_zone_desk_find_by_ec(zone, ec);
    EINA_SAFETY_ON_NULL_RETURN(desk);
@@ -867,28 +883,25 @@ _e_zone_cb_hook_client_maximize(void *d, E_Client *ec)
 
    ec->saved.zone = zone->num;
 
-   _e_zone_client_maximize(zone, desk, ec, ec->requested_max);
+   _e_zone_client_maximize(zone, desk, ec, max);
 }
 
 static void
-_e_zone_cb_hook_client_unmaximize(void *d, E_Client *ec)
+_zone_cb_client_unmaximize(struct wl_listener *listener, void *data)
 {
+   E_Zone_Private_Client *zone_client;
    E_Zone *zone;
+   E_Client *ec;
    E_Maximize max;
 
-   EINA_SAFETY_ON_NULL_RETURN(ec);
+   zone_client = wl_container_of(listener, zone_client, client_unmaximize);
+   zone = zone_client->zone;
+   ec = zone_client->ec;
 
-   zone = (E_Zone *)d;
-   EINA_SAFETY_ON_NULL_RETURN(zone);
-
-   // FIXME: A ec is set the current zone now.
-   //        We need to make a policy for the placement of the ec at the zone.
-   if (zone != e_zone_current_get()) return;
+   max = *((E_Maximize *)data);
 
    if (ec->maximized & E_MAXIMIZE_TYPE)
      {
-        max = ec->requested_max;
-
         ec->pre_res_change.valid = 0;
         ec->changes.need_maximize = 0;
 
@@ -984,19 +997,16 @@ _e_zone_cb_hook_client_unmaximize(void *d, E_Client *ec)
 }
 
 static void
-_e_zone_cb_hook_client_activate_done(void *d, E_Client *ec)
+_zone_cb_client_activate_done(struct wl_listener *listener, void *data)
 {
+   E_Zone_Private_Client *zone_client;
    E_Zone *zone;
+   E_Client *ec;
    E_Desk *desk;
 
-   EINA_SAFETY_ON_NULL_RETURN(ec);
-
-   zone = (E_Zone *)d;
-   EINA_SAFETY_ON_NULL_RETURN(zone);
-
-   // FIXME: A ec is set the current zone now.
-   //        We need to make a policy for the placement of the ec at the zone.
-   if (zone != e_zone_current_get()) return;
+   zone_client = wl_container_of(listener, zone_client, client_activate_done);
+   zone = zone_client->zone;
+   ec = zone_client->ec;
 
    desk = e_zone_desk_find_by_ec(zone, ec);
    EINA_SAFETY_ON_NULL_RETURN(desk);
@@ -1019,20 +1029,20 @@ _e_zone_cb_hook_client_activate_done(void *d, E_Client *ec)
 }
 
 static void
-_e_zone_cb_hook_client_fullscreen(void *d, E_Client *ec)
+_zone_cb_client_fullscreen(struct wl_listener *listener, void *data)
 {
+   E_Zone_Private_Client *zone_client;
    E_Zone *zone;
+   E_Client *ec;
    E_Desk *desk;
    int x, y, w, h;
+   E_Fullscreen fullscreen_policy;
 
-   EINA_SAFETY_ON_NULL_RETURN(ec);
+   zone_client = wl_container_of(listener, zone_client, client_fullscreen);
+   zone = zone_client->zone;
+   ec = zone_client->ec;
 
-   zone = (E_Zone *)d;
-   EINA_SAFETY_ON_NULL_RETURN(zone);
-
-   // FIXME: A ec is set the current zone now.
-   //        We need to make a policy for the placement of the ec at the zone.
-   if (zone != e_zone_current_get()) return;
+   fullscreen_policy = *((E_Fullscreen *)data);
 
    desk = e_zone_desk_find_by_ec(zone, ec);
    EINA_SAFETY_ON_NULL_RETURN(desk);
@@ -1083,11 +1093,11 @@ _e_zone_cb_hook_client_fullscreen(void *d, E_Client *ec)
 
    ec->fullscreen = 1;
    if ((eina_list_count(e_comp->zones) > 1) ||
-       (ec->fullscreen_policy == E_FULLSCREEN_RESIZE))
+       (fullscreen_policy == E_FULLSCREEN_RESIZE))
      {
         e_client_frame_geometry_set(ec, zone->x, zone->y, zone->w, zone->h);
      }
-   else if (ec->fullscreen_policy == E_FULLSCREEN_ZOOM)
+   else if (fullscreen_policy == E_FULLSCREEN_ZOOM)
      {
         /* compositor backends! */
         evas_object_smart_callback_call(ec->frame, "fullscreen_zoom", NULL);
@@ -1100,19 +1110,19 @@ _e_zone_cb_hook_client_fullscreen(void *d, E_Client *ec)
 }
 
 static void
-_e_zone_cb_hook_client_unfullscreen(void *d, E_Client *ec)
+_zone_cb_client_unfullscreen(struct wl_listener *listener, void *data)
 {
+   E_Zone_Private_Client *zone_client;
    E_Zone *zone;
+   E_Client *ec;
    E_Desk *desk;
+   E_Fullscreen fullscreen_policy;
 
-   EINA_SAFETY_ON_NULL_RETURN(ec);
+   zone_client = wl_container_of(listener, zone_client, client_unfullscreen);
+   zone = zone_client->zone;
+   ec = zone_client->ec;
 
-   zone = (E_Zone *)d;
-   EINA_SAFETY_ON_NULL_RETURN(zone);
-
-   // FIXME: A ec is set the current zone now.
-   //        We need to make a policy for the placement of the ec at the zone.
-   if (zone != e_zone_current_get()) return;
+   fullscreen_policy = *((E_Fullscreen *)data);
 
    desk = e_zone_desk_find_by_ec(zone, ec);
    EINA_SAFETY_ON_NULL_RETURN(desk);
@@ -1122,14 +1132,12 @@ _e_zone_cb_hook_client_unfullscreen(void *d, E_Client *ec)
    ec->need_fullscreen = 0;
    desk->fullscreen_clients = eina_list_remove(desk->fullscreen_clients, ec);
 
-   if (ec->fullscreen_policy == E_FULLSCREEN_ZOOM)
+   if (fullscreen_policy == E_FULLSCREEN_ZOOM)
      evas_object_smart_callback_call(ec->frame, "unfullscreen_zoom", NULL);
 
    if (!e_client_util_ignored_get(ec))
      e_client_frame_update(ec);
 
-   ec->fullscreen_policy = 0;
-
    evas_object_smart_callback_call(ec->frame, "unfullscreen", NULL);
 
    e_client_util_move_resize_without_frame(ec, zone->x + ec->saved.x,
@@ -1255,21 +1263,9 @@ e_zone_new(int num, int id, int x, int y, int w, int h)
 
    e_zone_all_edge_flip_eval();
 
-   E_LIST_HOOK_APPEND(zone->ec_hooks, E_CLIENT_HOOK_DEL, _e_zone_cb_hook_client_del, zone);
-#ifdef REFACTOR_ZONE_DESK
+   // CLIENT HOOK Handlers
    E_LIST_HOOK_APPEND(zone->ec_hooks, E_CLIENT_HOOK_NEW_CLIENT_POST, _e_zone_cb_hook_client_new_client_post, zone);
-   E_LIST_HOOK_APPEND(zone->ec_hooks, E_CLIENT_HOOK_EVAL_POST_NEW_CLIENT, _e_zone_cb_hook_client_eval_post_new_client, zone);
-   E_LIST_HOOK_APPEND(zone->ec_hooks, E_CLIENT_HOOK_FOCUS_SET, _e_zone_cb_hook_client_focus_set, zone);
-   E_LIST_HOOK_APPEND(zone->ec_hooks, E_CLIENT_HOOK_ICONIFY, _e_zone_cb_hook_client_iconify, zone);
-   E_LIST_HOOK_APPEND(zone->ec_hooks, E_CLIENT_HOOK_UNICONIFY, _e_zone_cb_hook_client_uniconify, zone);
-   E_LIST_HOOK_APPEND(zone->ec_hooks, E_CLIENT_HOOK_STICK, _e_zone_cb_hook_client_stick, zone);
-   E_LIST_HOOK_APPEND(zone->ec_hooks, E_CLIENT_HOOK_UNSTICK, _e_zone_cb_hook_client_unstick, zone);
-   E_LIST_HOOK_APPEND(zone->ec_hooks, E_CLIENT_HOOK_MAXIMIZE, _e_zone_cb_hook_client_maximize, zone);
-   E_LIST_HOOK_APPEND(zone->ec_hooks, E_CLIENT_HOOK_UNMAXIMIZE, _e_zone_cb_hook_client_unmaximize, zone);
-   E_LIST_HOOK_APPEND(zone->ec_hooks, E_CLIENT_HOOK_ACTIVATE_DONE, _e_zone_cb_hook_client_activate_done, zone);
-   E_LIST_HOOK_APPEND(zone->ec_hooks, E_CLIENT_HOOK_FULLSCREEN, _e_zone_cb_hook_client_fullscreen, zone);
-   E_LIST_HOOK_APPEND(zone->ec_hooks, E_CLIENT_HOOK_UNFULLSCREEN, _e_zone_cb_hook_client_unfullscreen, zone);
-#endif
+
    if (starting) return zone;
 
    ev = E_NEW(E_Event_Zone_Add, 1);
@@ -2465,11 +2461,55 @@ e_zone_client_add(E_Zone *zone, E_Client *ec)
 {
 #ifdef REFACTOR_ZONE_DESK
    E_Desk *desk;
+   E_Zone_Private_Client *zone_client;
 
    EINA_SAFETY_ON_NULL_RETURN(zone);
    EINA_SAFETY_ON_NULL_RETURN(ec);
    if (e_zone_has_ec(zone, ec)) return;
 
+   zone_client = E_NEW(E_Zone_Private_Client, 1);
+   EINA_SAFETY_ON_NULL_RETURN(zone_client);
+
+   zone_client->zone = zone;
+   zone_client->ec = ec;
+
+   // e_client listeners
+   zone_client->client_destroy.notify = _zone_cb_client_destroy;
+   e_client_destroy_listener_add(ec, &zone_client->client_destroy);
+
+   zone_client->client_eval_post_new_client.notify = _zone_cb_client_eval_post_new_client;
+   e_client_eval_post_new_client_listener_add(ec, &zone_client->client_eval_post_new_client);
+
+   zone_client->client_focus_set.notify = _zone_cb_client_focus_set;
+   e_client_focus_set_listener_add(ec, &zone_client->client_focus_set);
+
+   zone_client->client_iconify.notify = _zone_cb_client_iconify;
+   e_client_iconify_listener_add(ec, &zone_client->client_iconify);
+
+   zone_client->client_uniconify.notify = _zone_cb_client_uniconify;
+   e_client_uniconify_listener_add(ec, &zone_client->client_uniconify);
+
+   zone_client->client_stick.notify = _zone_cb_client_stick;
+   e_client_stick_listener_add(ec, &zone_client->client_stick);
+
+   zone_client->client_unstick.notify = _zone_cb_client_unstick;
+   e_client_unstick_listener_add(ec, &zone_client->client_unstick);
+
+   zone_client->client_maximize.notify = _zone_cb_client_maximize;
+   e_client_maximize_listener_add(ec, &zone_client->client_maximize);
+
+   zone_client->client_unmaximize.notify = _zone_cb_client_unmaximize;
+   e_client_unmaximize_listener_add(ec, &zone_client->client_unmaximize);
+
+   zone_client->client_activate_done.notify = _zone_cb_client_activate_done;
+   e_client_activate_done_listener_add(ec, &zone_client->client_activate_done);
+
+   zone_client->client_fullscreen.notify = _zone_cb_client_fullscreen;
+   e_client_fullscreen_listener_add(ec, &zone_client->client_fullscreen);
+
+   zone_client->client_unfullscreen.notify = _zone_cb_client_unfullscreen;
+   e_client_unfullscreen_listener_add(ec, &zone_client->client_unfullscreen);
+
    _e_zone_client_set(zone, ec);
    _e_zone_client_data_set(zone, ec);