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;
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();
}
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
_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;
}
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: