E_Tizen_Screen *tz_screen;
E_Policy_Zone *policy_zone;
+ struct wl_listener zone_destroy;
struct wl_listener tizen_screen_destroy;
};
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);
}
return ECORE_CALLBACK_PASS_ON;
}
+#if 0
static int
_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)
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)
{
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;
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;
}
// 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
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);
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;