e_comp_screen: E_Screen has zone and sreen information
authorSooChan Lim <sc1.lim@samsung.com>
Wed, 11 Dec 2024 08:21:27 +0000 (17:21 +0900)
committerJunseok Kim <juns.kim@samsung.com>
Fri, 13 Dec 2024 05:15:52 +0000 (14:15 +0900)
E_Screne has zone, tizen_screen, zone_policy information

Change-Id: Ice3e59f41ed00dfd59bf57877f0c8b3d5e15bf44

src/bin/e_comp_screen.c
src/bin/e_comp_screen_intern.h

index 9975431cacb50746a918cdb421084252557b357d..aea6bc34c35050e501657cc1150efa8cbd0a1676 100644 (file)
 
 typedef struct _E_Comp_Wl_Evas_Gl E_Comp_Wl_Evas_Gl;
 
+struct _E_Screen
+{
+   int screen, escreen;
+   int x, y, w, h;
+   char *id; // this is the same id we get from _E_Output so look it up there
+
+   E_Zone *zone;
+   E_Tizen_Screen *tz_screen;
+   E_Policy_Zone *policy_zone;
+
+   struct wl_listener tizen_screen_destroy;
+};
+
 struct _E_Comp_Wl_Evas_Gl
 {
    Evas_GL *gl;
@@ -507,15 +520,37 @@ _e_comp_screen_e_screens_get(E_Comp_Screen *e_comp_screen)
    return e_comp_screen->e_screens;
 }
 
+static void
+_e_comp_screen_screen_del(E_Screen *screen)
+{
+   e_tizen_screen_destroy(screen->tz_screen);
+   e_policy_zone_del(screen->policy_zone);
+   e_object_del(E_OBJECT(screen->zone));
+}
+
+static void
+_e_comp_screen_tizen_screen_cb_destroy(struct wl_listener *listener, void *data)
+{
+   E_Screen *screen;
+   E_Comp_Screen *comp_screen;
+
+   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);
+
+   _e_comp_screen_screen_del(screen);
+
+   _e_comp_screen_screen_policy_update();
+}
+
 static void
 _e_comp_screen_screen_policy_update(void)
 {
    Eina_List *l, *screens, *zones = NULL, *ll;
    E_Zone *zone;
-   E_Tizen_Screen *tizen_screen;
    E_Screen *scr;
    Eina_Bool changed = EINA_FALSE;
-   E_Policy_Zone *policy_zone;
    E_Comp *comp;
 
    comp = e_comp_get();
@@ -555,21 +590,28 @@ _e_comp_screen_screen_policy_update(void)
                }
              else
                {
-                  zone = e_zone_screen_new(scr->screen, scr->w, scr->h);
-                  policy_zone = e_policy_zone_new(zone);
-                  g_policy_zones = eina_list_append(g_policy_zones, policy_zone);
-                  e_policy_zone_desk_count_set(policy_zone, e_config->zone_desks_x_count, e_config->zone_desks_y_count);
+                  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);
 
-                  tizen_screen = e_tizen_screen_create(zone);
                   if (scr->id) zone->output_id = strdup(scr->id);
 
-                  printf("@@@ NEW ZONE = %p, %p\n", zone, tizen_screen);
+                  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);
           }
+
         comp->zones = eina_list_sort(comp->zones, 0, _e_comp_canvas_cb_zone_sort);
      }
    else
@@ -661,50 +703,32 @@ static Eina_Bool
 _e_comp_screen_screen_policy_setup(void)
 {
    Eina_List *screens;
-   E_Zone *zone;
-   E_Tizen_Screen *tizen_screen;
-   E_Comp *comp;
-   E_Policy_Zone *policy_zone;
-
-   comp = e_comp_get();
+   E_Screen *scr;
+   Eina_List *l;
 
    e_policy_desk_init();
 
    screens = (Eina_List *)_e_comp_screen_e_screens_get(e_comp_screen_get());
-   if (screens)
-     {
-        E_Screen *scr;
-        Eina_List *l;
-
-        EINA_LIST_FOREACH(screens, l, scr)
-          {
-             zone = e_zone_screen_new(scr->screen, scr->w, scr->h);
-             policy_zone = e_policy_zone_new(zone);
-             g_policy_zones = eina_list_append(g_policy_zones, policy_zone);
-             e_policy_zone_desk_count_set(policy_zone,
-                  e_config->zone_desks_x_count, e_config->zone_desks_y_count);
-
-             tizen_screen = e_tizen_screen_create(zone);
-             if (scr->id) zone->output_id = strdup(scr->id);
-             printf("@@@ NEW ZONE = %p, %p\n", zone, tizen_screen);
-          }
-     }
-   else
-     {
-        zone = e_zone_screen_new(0, comp->w, comp->h);
-        policy_zone = e_policy_zone_new(zone);
-        g_policy_zones = eina_list_append(g_policy_zones, policy_zone);
-        e_policy_zone_desk_count_set(policy_zone,
+   EINA_LIST_FOREACH(screens, l, scr)
+      {
+         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);
 
-        tizen_screen = e_tizen_screen_create(zone);
-        printf("@@@ NEW ZONE = %p, %p\n", zone, tizen_screen);
-     }
+         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);
+      }
 
    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);
+   E_LIST_HANDLER_APPEND(event_handlers, E_EVENT_COMPOSITOR_ENABLE, _e_comp_cb_compositor_enabled, NULL);
 
    return EINA_TRUE;
 }
@@ -764,11 +788,11 @@ _e_comp_screen_e_screens_setup(E_Comp_Screen *e_comp_screen, int rw, int rh)
         i++;
      }
 
-   ELOGF("COMP_SCREEN","_e_comp_screen_e_screens_setup............... %i %p\n", NULL, i, e_comp_screen->e_screens);
+   _e_comp_screen_e_screens_set(e_comp_screen, e_screens);
 
    ecore_event_add(E_EVENT_SCREEN_CHANGE, NULL, NULL, NULL);
 
-   _e_comp_screen_e_screens_set(e_comp_screen, e_screens);
+   ELOGF("COMP_SCREEN","_e_comp_screen_e_screens_setup............... %i %p\n", NULL, i, e_comp_screen->e_screens);
 
    return;
 out:
index 371176eb5b587b5c6213242fd70674f551801e57..cb2cbe01014087d666bd212bb4b234faf0180ea1 100644 (file)
@@ -47,13 +47,6 @@ struct _E_Comp_Screen
    Ecore_Fd_Handler *hdlr;
 };
 
-struct _E_Screen
-{
-   int screen, escreen;
-   int x, y, w, h;
-   char *id; // this is the same id we get from _E_Output so look it up there
-};
-
 extern EINTERN int E_EVENT_SCREEN_CHANGE;
 
 EINTERN Eina_Bool         e_comp_screen_init(void);