e_comp_screen: use zone destroy listener
authorSooChan Lim <sc1.lim@samsung.com>
Thu, 12 Dec 2024 06:34:30 +0000 (15:34 +0900)
committerJunseok Kim <juns.kim@samsung.com>
Fri, 13 Dec 2024 05:15:52 +0000 (14:15 +0900)
instead of zone destroy event handler

Change-Id: Ie9998946e22247c4e93a519e5a9faaaca7fac1d9

src/bin/core/e_zone.c
src/bin/e_comp_screen.c

index 43d46f2154592f07e664a2358ba639c6d9b60e0c..eeadbfa436f132007de59ce7a830ba78ff920bb9 100644 (file)
@@ -700,8 +700,6 @@ e_zone_orientation_force_update_del(E_Zone *zone, E_Client *client)
 static void
 _e_zone_free(E_Zone *zone)
 {
-   E_Comp *comp;
-
    wl_signal_emit(&PRI(zone)->events.destroy, NULL);
 
    if(zone->focus) e_focus_del(zone->focus);
@@ -721,9 +719,6 @@ _e_zone_free(E_Zone *zone)
 
    if (zone->name) eina_stringshare_del(zone->name);
 
-   comp = e_comp_get();
-   comp->zones = eina_list_remove(comp->zones, zone);
-
    evas_object_del(zone->bg_event_object);
    evas_object_del(zone->bg_clip_object);
 
index 4d484d1f12f4c25596047574b6df19f6f1719c5e..84e566e52bcbf925b54a1efa99c17f995c53ebb7 100644 (file)
@@ -49,6 +49,7 @@ struct _E_Screen
    E_Tizen_Screen *tz_screen;
    E_Policy_Zone *policy_zone;
 
+   struct wl_listener zone_destroy;
    struct wl_listener tizen_screen_destroy;
 };
 
@@ -474,6 +475,9 @@ _e_comp_screen_del(E_Comp_Screen *e_comp_screen)
 static void
 _e_comp_screen_e_screen_free(E_Screen *scr)
 {
+   wl_list_remove(&scr->tizen_screen_destroy.link);
+   wl_list_remove(&scr->zone_destroy.link);
+
    free(scr->id);
    free(scr);
 }
@@ -504,6 +508,7 @@ _e_comp_screen_cb_dbus_init_done(void *data, int type, void *event)
    return ECORE_CALLBACK_PASS_ON;
 }
 
+#if 0
 static int
 _e_comp_canvas_cb_zone_sort(const void *data1, const void *data2)
 {
@@ -511,6 +516,7 @@ _e_comp_canvas_cb_zone_sort(const void *data1, const void *data2)
 
    return z1->num - z2->num;
 }
+#endif
 
 static const Eina_List *
 _e_comp_screen_e_screens_get(E_Comp_Screen *e_comp_screen)
@@ -528,6 +534,22 @@ _e_comp_screen_screen_del(E_Screen *screen)
    e_object_del(E_OBJECT(screen->zone));
 }
 
+static void
+_e_comp_screen_zone_cb_destroy(struct wl_listener *listener, void *data)
+{
+   E_Screen *screen;
+   E_Comp *comp;
+
+   screen = wl_container_of(listener, screen, zone_destroy);
+
+   comp = e_comp_get();
+   comp->zones = eina_list_remove(comp->zones, screen->zone);
+
+   e_policy_zone_del(screen->policy_zone);
+
+   _e_comp_screen_screen_policy_update();
+}
+
 static void
 _e_comp_screen_tizen_screen_cb_destroy(struct wl_listener *listener, void *data)
 {
@@ -536,17 +558,24 @@ _e_comp_screen_tizen_screen_cb_destroy(struct wl_listener *listener, void *data)
 
    screen = wl_container_of(listener, screen, tizen_screen_destroy);
 
-   comp_screen = e_comp_screen_get();
-   comp_screen->e_screens = eina_list_remove(comp_screen->e_screens, screen);
+   // destroy the zone
+   e_object_del(E_OBJECT(screen->zone));
 
-   _e_comp_screen_screen_del(screen);
+   comp_screen = e_comp_screen_get();
+   if (comp_screen)
+     comp_screen->e_screens = eina_list_remove(comp_screen->e_screens, screen);
 
-   _e_comp_screen_screen_policy_update();
+   // destroy the screen
+    _e_comp_screen_screen_del(screen);
 }
 
 static void
 _e_comp_screen_screen_policy_update(void)
 {
+// FIXME: this has to be implemented.
+#if 1
+   ELOGF("COMP_SCREEN","NOT IMPLEMENTED~!!!", NULL);
+#else
    Eina_List *l, *screens, *zones = NULL, *ll;
    E_Zone *zone;
    E_Screen *scr;
@@ -555,75 +584,63 @@ _e_comp_screen_screen_policy_update(void)
 
    comp = e_comp_get();
    screens = (Eina_List *)_e_comp_screen_e_screens_get(e_comp_screen_get());
+   if (!screens) return;
 
-   if (screens)
-     {
-        zones = comp->zones;
-        comp->zones = NULL;
-        printf("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n");
-        EINA_LIST_FOREACH(screens, l, scr)
-          {
-             zone = NULL;
-
-             printf("@ match screens %p[%i] = %i %i %ix%i -- %i\n",
-                    scr, scr->escreen, scr->x, scr->y, scr->w, scr->h, scr->escreen);
-             EINA_LIST_FOREACH(zones, ll, zone)
-               {
-                  if (zone->id == scr->escreen) break;
-                  zone = NULL;
-               }
-             printf("@ matches existing zone %p\n", zone);
-             if (zone)
-               {
-                  printf("   move resize %i %i %ix%i -> %i %i %ix%i\n",
-                         zone->x, zone->y, zone->w, zone->h,
-                         scr->x, scr->y, scr->w, scr->h);
-                  changed |= e_zone_move_resize(zone, scr->x, scr->y, scr->w, scr->h);
-                  if (changed)
-                    printf("@@@ FOUND ZONE %i %i [%p]\n", zone->num, zone->id, zone);
-                  zones = eina_list_remove(zones, zone);
-                  comp->zones = eina_list_append(comp->zones, zone);
-                  zone->num = scr->screen;
-                  free(zone->output_id);
-                  zone->output_id = NULL;
-                  if (scr->id) zone->output_id = strdup(scr->id);
-               }
-             else
-               {
-                  scr->zone = e_zone_screen_new(scr->screen, scr->w, scr->h);
-                  scr->policy_zone = e_policy_zone_new(zone);
-                  e_policy_zone_desk_count_set(scr->policy_zone,
-                       e_config->zone_desks_x_count,
-                       e_config->zone_desks_y_count);
-
-                  scr->tz_screen = e_tizen_screen_create(zone);
-                  scr->tizen_screen_destroy.notify = _e_comp_screen_tizen_screen_cb_destroy;
-                  e_tizen_screen_destroy_listener_add(scr->tz_screen,
-                           &scr->tizen_screen_destroy);
-
-                  if (scr->id) zone->output_id = strdup(scr->id);
-
-                  printf("@@@ NEW ZONE = %p, %p\n", zone, scr->tz_screen);
-                  changed = EINA_TRUE;
-               }
-
-             if (changed)
-               printf("@@@ SCREENS: %i %i | %i %i %ix%i\n",
-                      scr->screen, scr->escreen, scr->x, scr->y, scr->w, scr->h);
-          }
+   zones = comp->zones;
+   comp->zones = NULL;
+   printf("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n");
+   EINA_LIST_FOREACH(screens, l, scr)
+      {
+         zone = NULL;
+
+         printf("@ match screens %p[%i] = %i %i %ix%i -- %i\n",
+               scr, scr->escreen, scr->x, scr->y, scr->w, scr->h, scr->escreen);
+         EINA_LIST_FOREACH(zones, ll, zone)
+         {
+            if (zone->id == scr->escreen) break;
+            zone = NULL;
+         }
+         printf("@ matches existing zone %p\n", zone);
+         if (zone)
+         {
+            printf("   move resize %i %i %ix%i -> %i %i %ix%i\n",
+                     zone->x, zone->y, zone->w, zone->h,
+                     scr->x, scr->y, scr->w, scr->h);
+            changed |= e_zone_move_resize(zone, scr->x, scr->y, scr->w, scr->h);
+            if (changed)
+               printf("@@@ FOUND ZONE %i %i [%p]\n", zone->num, zone->id, zone);
+            zones = eina_list_remove(zones, zone);
+            comp->zones = eina_list_append(comp->zones, zone);
+            zone->num = scr->screen;
+            free(zone->output_id);
+            zone->output_id = NULL;
+            if (scr->id) zone->output_id = strdup(scr->id);
+         }
+         else
+         {
+            scr->zone = e_zone_screen_new(scr->screen, scr->w, scr->h);
+            scr->policy_zone = e_policy_zone_new(scr->zone);
+            e_policy_zone_desk_count_set(scr->policy_zone,
+                  e_config->zone_desks_x_count,
+                  e_config->zone_desks_y_count);
+
+            scr->tz_screen = e_tizen_screen_create(scr->zone);
+            scr->tizen_screen_destroy.notify = _e_comp_screen_tizen_screen_cb_destroy;
+            e_tizen_screen_destroy_listener_add(scr->tz_screen,
+                     &scr->tizen_screen_destroy);
+
+            if (scr->id) scr->zone->output_id = strdup(scr->id);
+
+            printf("@@@ NEW ZONE = %p, %p\n", scr->zone, scr->tz_screen);
+            changed = EINA_TRUE;
+         }
+
+         if (changed)
+         printf("@@@ SCREENS: %i %i | %i %i %ix%i\n",
+                  scr->screen, scr->escreen, scr->x, scr->y, scr->w, scr->h);
+      }
 
-        comp->zones = eina_list_sort(comp->zones, 0, _e_comp_canvas_cb_zone_sort);
-     }
-   else
-     {
-        E_Zone *z;
-
-        z = e_comp_zone_number_get(0);
-        if (z)
-          {
-             changed |= e_zone_move_resize(z, 0, 0, comp->w, comp->h);
-          }
-     }
+   comp->zones = eina_list_sort(comp->zones, 0, _e_comp_canvas_cb_zone_sort);
 
    if (!changed) return;
 
@@ -635,32 +652,7 @@ _e_comp_screen_screen_policy_update(void)
      }
 
    // TODO: update all zones -> desks -> desk_areas -> ecs
-}
-
-static Eina_Bool
-_e_comp_cb_zone_del(void *data EINA_UNUSED, int type EINA_UNUSED, void *event)
-{
-   E_Event_Zone_Del *ev;
-   E_Zone *zone;
-   E_Policy_Zone *policy_zone;
-   Eina_List *l, *ll;
-
-   ev = event;
-   zone = ev->zone;
-
-   EINA_LIST_FOREACH_SAFE(g_policy_zones, l, ll, policy_zone)
-     {
-        if (e_policy_zone_get_zone(policy_zone) == zone)
-          {
-             g_policy_zones = eina_list_remove(g_policy_zones, policy_zone);
-             e_policy_zone_del(policy_zone);
-             break;
-          }
-     }
-
-   _e_comp_screen_screen_policy_update();
-
-   return ECORE_CALLBACK_PASS_ON;
+#endif
 }
 
 static Eina_Bool
@@ -714,6 +706,9 @@ _e_comp_screen_screen_policy_setup(void)
    EINA_LIST_FOREACH(screens, l, scr)
       {
          scr->zone = e_zone_screen_new(scr->screen, scr->w, scr->h);
+         scr->zone_destroy.notify = _e_comp_screen_zone_cb_destroy;
+         e_zone_destroy_listener_add(scr->zone, &scr->zone_destroy);
+
          scr->policy_zone = e_policy_zone_new(scr->zone);
          e_policy_zone_desk_count_set(scr->policy_zone,
             e_config->zone_desks_x_count, e_config->zone_desks_y_count);
@@ -729,7 +724,6 @@ _e_comp_screen_screen_policy_setup(void)
 
    E_LIST_HANDLER_APPEND(event_handlers, E_EVENT_ZONE_MOVE_RESIZE, _e_comp_cb_zone_change, NULL);
    E_LIST_HANDLER_APPEND(event_handlers, E_EVENT_ZONE_ADD, _e_comp_cb_zone_change, NULL);
-   E_LIST_HANDLER_APPEND(event_handlers, E_EVENT_ZONE_DEL, _e_comp_cb_zone_del, NULL);
    E_LIST_HANDLER_APPEND(event_handlers, E_EVENT_COMPOSITOR_ENABLE, _e_comp_cb_compositor_enabled, NULL);
 
    return EINA_TRUE;