Enlightenment CVS committal Author : handyande Project : e17 Module : apps/e
Dir : e17/apps/e/src/modules/pager Modified Files: e_mod_main.c e_mod_main.h Log Message: Modified patch from [EMAIL PROTECTED] adds 1 pager per zone, saves the gadman clients independantly Looks only at the zone size, rather than the whole viewport issues with : a) saving x position on zone > 1 b) adding windows to zone > 1 =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e/src/modules/pager/e_mod_main.c,v retrieving revision 1.34 retrieving revision 1.35 diff -u -3 -r1.34 -r1.35 --- e_mod_main.c 27 Jan 2005 15:17:09 -0000 1.34 +++ e_mod_main.c 1 Feb 2005 18:21:45 -0000 1.35 @@ -7,35 +7,31 @@ /* TODO List: * - * should support proper resize and move handles in the edje. - * */ /* module private routines */ -static Pager *_pager_init(E_Module *m); -static void _pager_shutdown(Pager *e); -static E_Menu *_pager_config_menu_new(Pager *e); -static void _pager_config_menu_del(Pager *e, E_Menu *m); +static Evas_List *_pager_init(E_Module *m); +static void _pager_shutdown(Evas_List *pagers); +static E_Menu *_pager_config_menu_new(); +static void _pager_config_menu_del(E_Menu *menu); + +static Pager *_pager_new(E_Zone *zone); +static void _pager_destroy(Pager *pager); +static void _pager_zone_set(Pager *pager, E_Zone *zone); +static void _pager_zone_leave(Pager *pager); -static Pager_Desk *_pager_desk_create(Pager *e, E_Desk *desk); +static Pager_Desk *_pager_desk_new(Pager *pager, E_Desk *desk); static void _pager_desk_destroy(Pager_Desk *d); -static Pager_Win *_pager_window_create(Pager *e, E_Border *border, Pager_Desk *owner); -static void _pager_window_destroy(Pager_Win *w); -static void _pager_window_move(Pager *e, Pager_Win *w); +static Pager_Win *_pager_window_new(Pager_Desk *owner, E_Border *border); +static void _pager_window_destroy(Pager_Win *win); -static void _pager_zone_set(Pager *e, E_Zone *zone); -static void _pager_zone_leave(Pager *e); -static void _pager_desk_set(Pager *e, E_Desk *desk); +static void _pager_draw(Pager *pager); +static void _pager_window_move(Pager *pager, Pager_Win *win); -static void _pager_container_set(Pager *e); -static void _pager_container_leave(Pager *e); +static Pager_Desk *_pager_desk_find(Pager *pager, E_Desk *desk); +static Pager_Win *_pager_window_find(Pager *pager, E_Border *border); -static Pager_Desk *_pager_desk_find(Pager *e, E_Desk *desk); -static Pager_Win *_pager_window_find(Pager *e, E_Border *border); - -static E_Manager *_pager_manager_current_get(Pager *e); - -static void _pager_cb_down(void *data, Evas *e, Evas_Object *obj, void *event_info); +static void _pager_cb_mouse_down(void *data, Evas *e, Evas_Object *obj, void *event_info); static void _pager_cb_gmc_change(void *data, E_Gadman_Client *gmc, E_Gadman_Change change); static int _pager_cb_event_border_resize(void *data, int type, void *event); static int _pager_cb_event_border_move(void *data, int type, void *event); @@ -46,14 +42,16 @@ static int _pager_cb_event_border_desk_set(void *data, int type, void *event); static int _pager_cb_event_zone_desk_count_set(void *data, int type, void *event); +static int _pager_count; /* public module routines. all modules must have these */ void * -init(E_Module *m) +init(E_Module *module) { - Pager *e; - + Evas_List *pagers = NULL, *l; + Pager *pager; + /* check module api version */ - if (m->api->version < E_MODULE_API_VERSION) + if (module->api->version < E_MODULE_API_VERSION) { e_error_dialog_show("Module API Error", "Error initializing Module: Pager\n" @@ -61,51 +59,57 @@ "The module API advertized by Enlightenment is: %i.\n" "Aborting module.", E_MODULE_API_VERSION, - m->api->version); + module->api->version); return NULL; } /* actually init pager */ - e = _pager_init(m); - m->config_menu = _pager_config_menu_new(e); - return e; + pagers = _pager_init(module); + module->config_menu = _pager_config_menu_new(); + + for (l = pagers; l; l = l->next) { + pager = l->data; + pager->config_menu = module->config_menu; + } + return pagers; } int -shutdown(E_Module *m) +shutdown(E_Module *module) { - Pager *e; - - e = m->data; - if (e) + Evas_List *pagers; + + if (module->config_menu) { - if (m->config_menu) - { - _pager_config_menu_del(e, m->config_menu); - m->config_menu = NULL; - } - _pager_shutdown(e); + _pager_config_menu_del(module->config_menu); + module->config_menu = NULL; + } + + pagers = module->data; + if (pagers) + { + _pager_shutdown(pagers); } return 1; } int -save(E_Module *m) +save(E_Module *module) { - Pager *e; + Evas_List *pagers; - e = m->data; + pagers = module->data; /* e_config_domain_save("module.pager", e->conf_edd, e->conf); */ return 1; } int -info(E_Module *m) +info(E_Module *module) { char buf[4096]; - - m->label = strdup("Pager"); - snprintf(buf, sizeof(buf), "%s/module_icon.png", e_module_dir_get(m)); - m->icon_file = strdup(buf); + + module->label = strdup("Pager"); + snprintf(buf, sizeof(buf), "%s/module_icon.png", e_module_dir_get(module)); + module->icon_file = strdup(buf); return 1; } @@ -118,16 +122,17 @@ } /* module private routines */ -static Pager * +static Evas_List * _pager_init(E_Module *m) { - Pager *e; - Evas_List *managers, *l, *l2; - Evas_Object *o; - - e = calloc(1, sizeof(Pager)); - if (!e) return NULL; - + Evas_List *pagers = NULL; + Evas_List *managers, *l, *l2, *l3; + E_Manager *man; + E_Container *con; + E_Zone *zone; + Pager *pager; + + _pager_count = 0; /* e->conf_edd = E_CONFIG_DD_NEW("Pager_Config", Config); #undef T #undef D @@ -141,221 +146,294 @@ } */ managers = e_manager_list(); - e->managers = managers; for (l = managers; l; l = l->next) { - E_Manager *man; - man = l->data; + for (l2 = man->containers; l2; l2 = l2->next) { - E_Container *con; - con = l2->data; - e->evas = con->bg_evas; - e->con = con; - } - } - o = evas_object_rectangle_add(e->evas); - e->base = o; - evas_object_color_set(o, 128, 128, 128, 0); - evas_object_pass_events_set(o, 0); - evas_object_repeat_events_set(o, 0); - evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_DOWN, _pager_cb_down, e); - evas_object_show(o); + for (l3 = con->zones; l3; l3 = l3->next) + { + zone = l3->data; - o = edje_object_add(e->evas); - e->screen = o; - edje_object_file_set(o, - /* FIXME: "default.eet" needs to come from conf */ - e_path_find(path_themes, "default.eet"), - "modules/pager/screen"); - evas_object_show(o); - - e->ev_handler_border_resize = - ecore_event_handler_add(E_EVENT_BORDER_RESIZE, - _pager_cb_event_border_resize, e); - e->ev_handler_border_move = - ecore_event_handler_add(E_EVENT_BORDER_MOVE, - _pager_cb_event_border_move, e); - e->ev_handler_border_add = - ecore_event_handler_add(E_EVENT_BORDER_ADD, - _pager_cb_event_border_add, e); - e->ev_handler_border_remove = - ecore_event_handler_add(E_EVENT_BORDER_REMOVE, - _pager_cb_event_border_remove, e); - e->ev_handler_border_hide = - ecore_event_handler_add(E_EVENT_BORDER_HIDE, - _pager_cb_event_border_hide, e); - e->ev_handler_border_show = - ecore_event_handler_add(E_EVENT_BORDER_SHOW, - _pager_cb_event_border_show, e); - e->ev_handler_border_desk_set = - ecore_event_handler_add(E_EVENT_BORDER_DESK_SET, - _pager_cb_event_border_desk_set, e); - e->ev_handler_zone_desk_count_set = - ecore_event_handler_add(E_EVENT_ZONE_DESK_COUNT_SET, - _pager_cb_event_zone_desk_count_set, e); - - _pager_container_set(e); - - e->gmc = e_gadman_client_new(e->con->gadman); - e_gadman_client_domain_set(e->gmc, "module.pager", 0); - e_gadman_client_policy_set(e->gmc, - E_GADMAN_POLICY_ANYWHERE | - E_GADMAN_POLICY_HMOVE | - E_GADMAN_POLICY_VMOVE | - E_GADMAN_POLICY_HSIZE | - E_GADMAN_POLICY_VSIZE); - e_gadman_client_min_size_set(e->gmc, 8, 8); - e_gadman_client_max_size_set(e->gmc, 256, 256); - e_gadman_client_auto_size_set(e->gmc, 64, 64); - e_gadman_client_align_set(e->gmc, 0.0, 1.0); - e_gadman_client_resize(e->gmc, 80, 60); - e_gadman_client_change_func_set(e->gmc, _pager_cb_gmc_change, e); - e_gadman_client_load(e->gmc); - return e; + pager = _pager_new(zone); + if (pager) + pagers = evas_list_append(pagers, pager); + } + } + } + return pagers; } static void -_pager_shutdown(Pager *e) +_pager_shutdown(Evas_List *pagers) { - free(e->conf); + Evas_List *list; +/* free(e->conf); */ /* E_CONFIG_DD_FREE(e->conf_edd);*/ - if (e->base) evas_object_del(e->base); - if (e->screen) evas_object_del(e->screen); - e_object_del(E_OBJECT(e->gmc)); - - _pager_zone_leave(e); - ecore_event_handler_del(e->ev_handler_border_resize); - ecore_event_handler_del(e->ev_handler_border_move); - ecore_event_handler_del(e->ev_handler_border_add); - ecore_event_handler_del(e->ev_handler_border_remove); - ecore_event_handler_del(e->ev_handler_border_hide); - ecore_event_handler_del(e->ev_handler_border_show); - ecore_event_handler_del(e->ev_handler_border_desk_set); - ecore_event_handler_del(e->ev_handler_zone_desk_count_set); - - free(e); + for (list = pagers; list; list = list->next) + { + _pager_destroy(list->data); + } + evas_list_free(pagers); } static E_Menu * -_pager_config_menu_new(Pager *e) +_pager_config_menu_new() { E_Menu *mn; E_Menu_Item *mi; mn = e_menu_new(); - + mi = e_menu_item_new(mn); e_menu_item_label_set(mi, "(Unused)"); - e->config_menu = mn; - + return mn; } static void -_pager_config_menu_del(Pager *e, E_Menu *m) +_pager_config_menu_del(E_Menu *menu) +{ + e_object_del(E_OBJECT(menu)); +} + +static Pager * +_pager_new(E_Zone *zone) +{ + Pager *pager; + Evas_Object *o; + + pager = E_NEW(Pager, 1); + if (!pager) return NULL; + + pager->evas = zone->container->bg_evas; + + o = evas_object_rectangle_add(pager->evas); + pager->base = o; + evas_object_color_set(o, 128, 128, 128, 0); + evas_object_pass_events_set(o, 0); + evas_object_repeat_events_set(o, 0); + evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_DOWN, _pager_cb_mouse_down, pager); + evas_object_show(o); + + o = edje_object_add(pager->evas); + pager->screen = o; + edje_object_file_set(o, + /* FIXME: "default.eet" needs to come from conf */ + e_path_find(path_themes, "default.eet"), + "modules/pager/screen"); + evas_object_show(o); + + pager->ev_handler_border_resize = + ecore_event_handler_add(E_EVENT_BORDER_RESIZE, + _pager_cb_event_border_resize, pager); + pager->ev_handler_border_move = + ecore_event_handler_add(E_EVENT_BORDER_MOVE, + _pager_cb_event_border_move, pager); + pager->ev_handler_border_add = + ecore_event_handler_add(E_EVENT_BORDER_ADD, + _pager_cb_event_border_add, pager); + pager->ev_handler_border_remove = + ecore_event_handler_add(E_EVENT_BORDER_REMOVE, + _pager_cb_event_border_remove, pager); + pager->ev_handler_border_hide = + ecore_event_handler_add(E_EVENT_BORDER_HIDE, + _pager_cb_event_border_hide, pager); + pager->ev_handler_border_show = + ecore_event_handler_add(E_EVENT_BORDER_SHOW, + _pager_cb_event_border_show, pager); + pager->ev_handler_border_desk_set = + ecore_event_handler_add(E_EVENT_BORDER_DESK_SET, + _pager_cb_event_border_desk_set, pager); + pager->ev_handler_zone_desk_count_set = + ecore_event_handler_add(E_EVENT_ZONE_DESK_COUNT_SET, + _pager_cb_event_zone_desk_count_set, pager); + + _pager_zone_set(pager, zone); + + pager->gmc = e_gadman_client_new(pager->zone->container->gadman); + e_gadman_client_domain_set(pager->gmc, "module.pager", _pager_count++); + e_gadman_client_zone_set(pager->gmc, pager->zone); + e_gadman_client_policy_set(pager->gmc, + E_GADMAN_POLICY_ANYWHERE | + E_GADMAN_POLICY_HMOVE | + E_GADMAN_POLICY_VMOVE | + E_GADMAN_POLICY_HSIZE | + E_GADMAN_POLICY_VSIZE); + e_gadman_client_min_size_set(pager->gmc, 8, 8); + e_gadman_client_max_size_set(pager->gmc, 256, 256); + e_gadman_client_auto_size_set(pager->gmc, 64, 64); + e_gadman_client_align_set(pager->gmc, 0.0, 1.0); + e_gadman_client_resize(pager->gmc, 80, 60); + e_gadman_client_change_func_set(pager->gmc, _pager_cb_gmc_change, pager); + e_gadman_client_load(pager->gmc); + + return pager; +} + +void +_pager_destroy(Pager *pager) +{ + if (pager->base) evas_object_del(pager->base); + if (pager->screen) evas_object_del(pager->screen); + e_object_del(E_OBJECT(pager->gmc)); + + _pager_zone_leave(pager); + ecore_event_handler_del(pager->ev_handler_border_resize); + ecore_event_handler_del(pager->ev_handler_border_move); + ecore_event_handler_del(pager->ev_handler_border_add); + ecore_event_handler_del(pager->ev_handler_border_remove); + ecore_event_handler_del(pager->ev_handler_border_hide); + ecore_event_handler_del(pager->ev_handler_border_show); + ecore_event_handler_del(pager->ev_handler_border_desk_set); + ecore_event_handler_del(pager->ev_handler_zone_desk_count_set); + + E_FREE(pager); +} + +static void +_pager_zone_set(Pager *pager, E_Zone *zone) +{ + int desks_x, desks_y, x, y; + E_Desk *current; + + pager->zone = zone; + e_object_ref(E_OBJECT(zone)); + e_zone_desk_count_get(zone, &desks_x, &desks_y); + current = e_desk_current_get(zone); + pager->xnum = desks_x; + pager->ynum = desks_y; + + for (x = 0; x < desks_x; x++) + for (y = 0; y < desks_y; y++) + { + Pager_Desk *pd; + E_Desk *desk; + + desk = e_desk_at_xy_get(zone, x, y); + pd = _pager_desk_new(pager, desk); + pager->desks = evas_list_append(pager->desks, pd); + } + evas_object_resize(pager->base, pager->fw * desks_x, pager->fh * desks_y); +} + +static void +_pager_zone_leave(Pager *pager) { - e_object_del(E_OBJECT(m)); + Evas_List *list; + e_object_unref(E_OBJECT(pager->zone)); + + for (list = pager->desks; list; list = list->next) + { + _pager_desk_destroy(list->data); + } + evas_list_free(pager->desks); } static Pager_Desk * -_pager_desk_create(Pager *e, E_Desk *desk) +_pager_desk_new(Pager *pager, E_Desk *desk) { - Pager_Desk *new; + Pager_Desk *pd; + Pager_Win *pw; + + E_Border *win; + Evas_Object *o; - E_Desk *next; - int xpos, ypos, xcount, ycount, found; - - new = E_NEW(Pager_Desk, 1); + Evas_List *wins; + int xpos, ypos, xcount, ycount; + + pd = E_NEW(Pager_Desk, 1); e_zone_desk_count_get(desk->zone, &xcount, &ycount); for (xpos = 0; xpos < xcount; xpos++) for (ypos = 0; ypos < ycount; ypos++) { - next = e_desk_at_xy_get(desk->zone, xpos, ypos); - if (next == desk) + if (desk == e_desk_at_xy_get(desk->zone, xpos, ypos)) { - new->xpos = xpos; - new->ypos = ypos; + pd->xpos = xpos; + pd->ypos = ypos; break; } } if (desk == e_desk_current_get(desk->zone)) { - new->current = 1; - evas_object_move(e->screen, e->fx, e->fy); + pd->current = 1; + evas_object_move(pager->screen, pager->fx + (pager->fw * pd->xpos), + pager->fy + (pager->fh * pd->ypos)); } - new->desk = desk; + pd->desk = desk; e_object_ref(E_OBJECT(desk)); + pd->owner = pager; - o = edje_object_add(e->evas); - new->obj = o; + o = edje_object_add(pager->evas); + pd->obj = o; edje_object_file_set(o, /* FIXME: "default.eet" needs to come from conf */ e_path_find(path_themes, "default.eet"), "modules/pager/desk"); evas_object_pass_events_set(o, 1); - evas_object_resize(o, e->fw, e->fh); - evas_object_move(o, e->fx + (new->xpos * e->fw), e->fy + (new->ypos * e->fh)); + evas_object_resize(o, pager->fw, pager->fh); + evas_object_move(o, pager->fx + (pd->xpos * pager->fw), pager->fy + (pd->ypos * pager->fh)); evas_object_show(o); - evas_object_raise(e->screen); - return new; -} + evas_object_raise(pager->screen); -static void -_pager_desk_destroy(Pager_Desk *d) -{ - if (d->obj) evas_object_del(d->obj); - e_object_unref(E_OBJECT(d->desk)); - - while (d->wins) + /* Add windows to the desk */ + wins = desk->clients; + while (wins) { - _pager_window_destroy((Pager_Win *) d->wins->data); - d->wins = evas_list_remove_list(d->wins, d->wins); + win = wins->data; + if (win->new_client) + { + wins = wins->next; + continue; + } + pw = _pager_window_new(pd, win); + + pd->wins = evas_list_append(pd->wins, pw); + wins = wins->next; } - E_FREE(d); + return pd; } static void -_pager_window_move(Pager *e, Pager_Win *w) +_pager_desk_destroy(Pager_Desk *desk) { - Evas_Coord ww, hh; - double scalex, scaley; - evas_output_viewport_get(e->evas, NULL, NULL, &ww, &hh); - scalex = (double) e->fw / ww; - scaley = (double) e->fh / hh; - - evas_object_resize(w->obj, w->border->w * scalex, w->border->h * scaley); - evas_object_move(w->obj, - e->fx + (w->owner->xpos * e->fw) + (w->border->x * scalex), - e->fy + (w->owner->ypos * e->fh) + (w->border->y * scaley)); + Evas_List *list; + + if (desk->obj) evas_object_del(desk->obj); + e_object_unref(E_OBJECT(desk->desk)); + + for (list = desk->wins; list; list = list->next) + { + _pager_window_destroy(list->data); + } + evas_list_free(desk->wins); + E_FREE(desk); } static Pager_Win * -_pager_window_create(Pager *e, E_Border *border, Pager_Desk *owner) +_pager_window_new(Pager_Desk *owner, E_Border *border) { Pager_Win *new; Evas_Object *o; E_App *app; int visible; - Evas_Coord ww, hh; double scalex, scaley; - - evas_output_viewport_get(e->evas, NULL, NULL, &ww, &hh); - scalex = e->fw / ww; - scaley = e->fy / hh; - + + scalex = owner->owner->fw / owner->owner->zone->w; + scaley = owner->owner->fy / owner->owner->zone->h; + new = E_NEW(Pager_Win, 1); new->border = border; e_object_ref(E_OBJECT(border)); visible = !border->iconic; new->owner = owner; - o = edje_object_add(e->evas); + o = edje_object_add(owner->owner->evas); new->obj = o; edje_object_file_set(o, /* FIXME: "default.eet" needs to come from conf */ @@ -364,12 +442,12 @@ evas_object_pass_events_set(o, 1); if (visible) evas_object_show(o); - evas_object_raise(e->screen); + evas_object_raise(owner->owner->screen); app = e_app_window_name_class_find(border->client.icccm.name, border->client.icccm.class); if (app) { - o = edje_object_add(e->evas); + o = edje_object_add(owner->owner->evas); new->icon = o; edje_object_file_set(o, app->path, "icon"); if (visible) @@ -377,291 +455,149 @@ edje_object_part_swallow(new->obj, "WindowIcon", o); } - _pager_window_move(e, new); + _pager_window_move(owner->owner, new); return new; } -static void -_pager_window_destroy(Pager_Win *w) -{ - if (w->obj) evas_object_del(w->obj); - if (w->icon) evas_object_del(w->icon); - - e_object_unref(E_OBJECT(w->border)); - E_FREE(w); -} - static void -_pager_container_set(Pager *e) +_pager_window_destroy(Pager_Win *win) { - int desks_x, desks_y, x, y; - Evas_Object *o; - E_Desk *current; - Evas_List *wins; - E_App *app; - E_Zone *zone; - Evas_List *zones; - E_Container *con; - - con = e_container_current_get(_pager_manager_current_get(e)); - for(zones = con->zones; zones; zones = zones->next) - { - zone = zones->data; - - e_zone_desk_count_get(zone, &desks_x, &desks_y); - - for (x = 0; x < desks_x; x++) - for (y = 0; y < desks_y; y++) - { - Pager_Desk *sym; - E_Desk *desk; + if (win->obj) evas_object_del(win->obj); + if (win->icon) evas_object_del(win->icon); - desk = e_desk_at_xy_get(zone, x, y); - sym = _pager_desk_create(e, desk); - e->desks = evas_list_append(e->desks, sym); - - wins = desk->clients; - while (wins) - { - Pager_Win *win; - E_Border *bd; - - bd = wins->data; - if (bd->new_client) - { - wins = wins->next; - continue; - } - win = _pager_window_create(e, bd, sym); - - sym->wins = evas_list_append(sym->wins, win); - wins = wins->next; - } - } - evas_object_resize(e->base, e->fw * desks_x, e->fh * desks_y); - } + e_object_unref(E_OBJECT(win->border)); + E_FREE(win); } static void -_pager_zone_set(Pager *e, E_Zone *zone) +_pager_draw(Pager *pager) { - int desks_x, desks_y, x, y; - Evas_Object *o; - E_Desk *current; - Evas_List *wins; - E_App *app; - - e_zone_desk_count_get(zone, &desks_x, &desks_y); - current = e_desk_current_get(zone); - - for (x = 0; x < desks_x; x++) - for (y = 0; y < desks_y; y++) - { - Pager_Desk *sym; - E_Desk *desk; - - desk = e_desk_at_xy_get(zone, x, y); - sym = _pager_desk_create(e, desk); - e->desks = evas_list_append(e->desks, sym); - - wins = desk->clients; - while (wins) - { - Pager_Win *win; - E_Border *bd; - - bd = wins->data; - if (bd->new_client) - { - wins = wins->next; - continue; - } - win = _pager_window_create(e, bd, sym); + Evas_List *desks; + Pager_Desk *desk; + Evas_List *wins; + Pager_Win *win; - sym->wins = evas_list_append(sym->wins, win); - wins = wins->next; - } - } - evas_object_resize(e->base, e->fw * desks_x, e->fh * desks_y); -} + evas_object_move(pager->base, pager->fx, pager->fy); + evas_object_resize(pager->base, pager->fw * pager->xnum, pager->fh * pager->ynum); + evas_object_resize(pager->screen, pager->fw, pager->fh); -static void -_pager_zone_leave(Pager *e) -{ - while (e->desks) + desks = pager->desks; + while (desks) { - _pager_desk_destroy((Pager_Desk *) e->desks->data); - e->desks = evas_list_remove_list(e->desks, e->desks); - } -} + desk = desks->data; + evas_object_resize(desk->obj, pager->fw, pager->fh); + evas_object_move(desk->obj, pager->fx + (pager->fw * desk->xpos), + pager->fy + (pager->fh * desk->ypos)); + if (desk->current) + evas_object_move(pager->screen, pager->fx + (pager->fw * desk->xpos), + pager->fy + (pager->fh * desk->ypos)); -static void -_pager_container_leave(Pager *e) -{ - while (e->desks) - { - _pager_desk_destroy((Pager_Desk *) e->desks->data); - e->desks = evas_list_remove_list(e->desks, e->desks); + wins = desk->wins; + while (wins) + { + win = wins->data; + _pager_window_move(pager, win); + + wins = wins->next; + } + desks = desks->next; } } static void -_pager_desk_set(Pager *p, E_Desk *desk) +_pager_window_move(Pager *pager, Pager_Win *win) { - Evas_List *desks; - int x, y, desks_x, desks_y; - - e_zone_desk_count_get(desk->zone, &desks_x, &desks_y); - desks = p->desks; - for (x = 0; x < desks_x; x++) - for (y = 0; y < desks_y; y++) - { - Pager_Desk *pd; - int left, right, top, bottom; - - pd = desks->data; - left = p->fx + x * p->fw; - top = p->fy + y * p->fh; + double scalex, scaley; + scalex = (double) pager->fw / pager->zone->w; + scaley = (double) pager->fh / pager->zone->h; - if (pd->desk == desk) - { - pd->current = 1; - evas_object_move(p->screen, left, top); - } - else - pd->current = 0; - desks = desks->next; - } + evas_object_resize(win->obj, win->border->w * scalex, win->border->h * scaley); + evas_object_move(win->obj, + pager->fx + (win->owner->xpos * pager->fw) + (win->border->x * scalex), + pager->fy + (win->owner->ypos * pager->fh) + (win->border->y * scaley)); } static void -_pager_cb_down(void *data, Evas *e, Evas_Object *obj, void *event_info) +_pager_cb_mouse_down(void *data, Evas *e, Evas_Object *obj, void *event_info) { Evas_Event_Mouse_Down *ev; - Pager *p; - E_Container *con = NULL; + Pager *pager; ev = event_info; - p = data; - con = e_container_current_get(_pager_manager_current_get(p)); + pager = data; if (ev->button == 3) { - e_menu_activate_mouse(p->config_menu, e_zone_current_get(con), + e_menu_activate_mouse(pager->config_menu, pager->zone, ev->output.x, ev->output.y, 1, 1, E_MENU_POP_DIRECTION_DOWN); - e_util_container_fake_mouse_up_all_later(con); + e_util_container_fake_mouse_up_all_later(pager->zone->container); } else if (ev->button == 1) { - int xcount, ycount; - Evas_Coord xx, yy, x, y; - E_Zone *zone; - E_Desk *desk; - E_Container *con; - - con = e_container_current_get(_pager_manager_current_get(p)); - zone = e_zone_current_get(con); - e_zone_desk_count_get(zone, &xcount, &ycount); - evas_pointer_canvas_xy_get(p->evas, &xx, &yy); + Evas_Coord x, y; + int xpos, ypos; + Evas_List *list; + Pager_Desk *desk; - for (x = 0; x < xcount; x++) - for (y = 0; y < ycount; y++) - { - int left, right, top, bottom; - left = p->fx + x * p->fw; - right = left + p->fw; - top = p->fy + y * p->fh; - bottom = top + p->fh; + evas_pointer_canvas_xy_get(pager->evas, &x, &y); - if (left <= xx && xx < right && top <= yy && yy < bottom) - { - desk = e_desk_at_xy_get(zone, x, y); - if (desk) - { - e_desk_show(desk); - _pager_desk_set(p, desk); - } - else - { - printf("PAGER ERROR - %d, %d seems to be out of bounds\n", x, y); - } - } - } + xpos = (x - pager->fx) / pager->fw; + ypos = (y - pager->fy) / pager->fh; + for (list = pager->desks; list; list = list->next) + { + desk = list->data; + + if ((desk->xpos == xpos) && (desk->ypos == ypos)) + { + desk->current = 1; + e_desk_show(desk->desk); + evas_object_move(pager->screen, + pager->fx + xpos * pager->fw, + pager->fy + ypos * pager->fh); + } + else + { + desk->current = 0; + } + } } } static Pager_Desk * -_pager_desk_find(Pager *e, E_Desk *desk) +_pager_desk_find(Pager *pager, E_Desk *desk) { Pager_Desk *pd; Evas_List *desks; - desks = e->desks; + desks = pager->desks; while (desks) { pd = desks->data; -#if 0 - printf("Desk Find: (search,current)%p:%p\n", desk, pd->desk); -#endif if (pd->desk == desk) return pd; -#if 0 - printf("Zone Find: (search,current)%p:%p\n", desk->zone, pd->desk->zone); -#endif desks = desks->next; } return NULL; } -static Pager_Desk * -_pager_border_find(Pager *e, E_Border *border) -{ - int x, y; - int desks_x, desks_y; - E_Desk *desk = NULL; - Pager_Desk *result = NULL; - E_Zone *zone = NULL; - - if(border) - { - zone = border->zone; - e_zone_desk_count_get(zone, &desks_x, &desks_y); - printf("Desks_X, Desks_Y, DeskFind -> %i,%i:%p\n", desks_x, desks_y, border->desk); - for (x = 0; x < desks_x; x++) - for (y = 0; y < desks_y; y++) - { - desk = e_desk_at_xy_get(zone, x, y); - printf("Desk %i,%i:%p\n", x, y, desk); - if(desk == border->desk) - { - if((result = _pager_desk_find(e, desk))) - return(result); - } - } - } - return NULL; -} - -static Pager_Win * -_pager_window_find(Pager *e, E_Border *border) +static Pager_Win * +_pager_window_find(Pager *pager, E_Border *border) { Evas_List *desks, *wins; + Pager_Desk *pd; + Pager_Win *win; - desks = e->desks; + desks = pager->desks; while (desks) { - Pager_Desk *next; - - next = desks->data; - wins = next->wins; + pd = desks->data; + wins = pd->wins; while (wins) { - Pager_Win *next2; - - next2 = wins->data; - if (next2->border == border) - return next2; + win = wins->data; + if (win->border == border) + return win; wins = wins->next; } desks = desks->next; @@ -671,68 +607,40 @@ static void _pager_cb_gmc_change(void *data, E_Gadman_Client *gmc, E_Gadman_Change change) -{ - Pager *p; +{ + Pager *pager; Evas_Coord x, y, w, h; - Evas_Coord xx, yy, ww, hh, deskw, deskh; - E_Zone *zone; + Evas_Coord deskw, deskh; int xcount, ycount; Evas_List *desks, *wins; Pager_Desk *desk; Pager_Win *win; - E_Container *con; - p = data; - con = e_container_current_get(_pager_manager_current_get(p)); - zone = e_zone_current_get(con); - e_zone_desk_count_get(zone, &xcount, &ycount); + pager = data; + e_zone_desk_count_get(pager->zone, &xcount, &ycount); - e_gadman_client_geometry_get(p->gmc, &x, &y, &w, &h); + e_gadman_client_geometry_get(pager->gmc, &x, &y, &w, &h); deskw = w / xcount; deskh = h / ycount; - p->fx = x; - p->fy = y; - p->fw = deskw; - p->fh = deskh; + pager->fx = x; + pager->fy = y; + pager->fw = deskw; + pager->fh = deskh; if (change == E_GADMAN_CHANGE_MOVE_RESIZE) { - evas_object_move(p->base, x, y); - evas_object_resize(p->base, w, h); - evas_object_resize(p->screen, deskw, deskh); - - desks = p->desks; - while (desks) - { - desk = desks->data; - evas_object_resize(desk->obj, deskw, deskh); - evas_object_move(desk->obj, x + (deskw * desk->xpos), - y + (deskh * desk->ypos)); - if (desk->current) - evas_object_move(p->screen, x + (deskw * desk->xpos), - y + (deskh * desk->ypos)); - - wins = desk->wins; - while (wins) - { - win = wins->data; - _pager_window_move(p, win); - - wins = wins->next; - } - desks = desks->next; - } + _pager_draw(pager); } else if (change == E_GADMAN_CHANGE_RAISE) { - evas_object_raise(p->base); - - desks = p->desks; + evas_object_raise(pager->base); + + desks = pager->desks; while (desks) { desk = desks->data; evas_object_raise(desk->obj); - + wins = desk->wins; while (wins) { @@ -744,42 +652,42 @@ desks = desks->next; } - evas_object_raise(p->screen); + evas_object_raise(pager->screen); } -} +} -static int +static int _pager_cb_event_border_resize(void *data, int type, void *event) { - Pager *e; + Pager *pager; Pager_Win *win; E_Event_Border_Resize *ev; - - e = data; + + pager = data; ev = event; - if((win = _pager_window_find(e, ev->border))) + if ((win = _pager_window_find(pager, ev->border))) { - _pager_window_move(e, win); + _pager_window_move(pager, win); } else { - printf("ERROR: event_border_resize %p:%p\n",event, ev->border); + printf("ERROR: event_border_resize %p:%p\n", event, ev->border); } return 1; } -static int +static int _pager_cb_event_border_move(void *data, int type, void *event) { - Pager *e; + Pager *pager; Pager_Win *win; E_Event_Border_Resize *ev; - e = data; + pager = data; ev = event; - if((win = _pager_window_find(e, ev->border))) + if((win = _pager_window_find(pager, ev->border))) { - _pager_window_move(e, win); + _pager_window_move(pager, win); } else { @@ -788,43 +696,29 @@ return 1; } -static int +static int _pager_cb_event_border_add(void *data, int type, void *event) { - Pager *e; + Pager *pager; E_Event_Border_Add *ev; - Pager_Win *new; + E_Border *border; + Pager_Win *win; Pager_Desk *desk; - - e = data; + + pager = data; ev = event; - if (_pager_window_find(e, ev->border)) + border = ev->border; + if (_pager_window_find(pager, border)) { + /* FIXME; may have switched desk! */ printf("event_border_add, window found :'(\n"); return 1; } - if ((desk = _pager_desk_find(e, ((E_Border *) ev->border)->desk))) + if ((desk = _pager_desk_find(pager, border->desk))) { - new = _pager_window_create(data, ev->border, desk); - desk->wins = evas_list_append(desk->wins, new); -#if 0 - printf("event_border_add, window created :) :) :)\n"); -#endif - } -/* - * Correct me if I am wrong, but will the desk not previously been found above, - * as _pager_desk find iterates all available, so if it has not matched we are - * "out of zone" - if I am right we can remove _pager_border_find - * - * FIXME decide - else if ((desk = _pager_border_find(e, ((E_Border *) ev->border)))) - { - new = _pager_window_create(data, ev->border, desk); - desk->wins = evas_list_append(desk->wins, new); -#if 0 - printf("event_border_add, window created from zone :) :) :)\n"); -#endif - }*/ + win = _pager_window_new(desk, border); + desk->wins = evas_list_append(desk->wins, win); + } else { printf("event_border_add, desk not found :'(\n"); @@ -832,18 +726,21 @@ return 1; } -static int +static int _pager_cb_event_border_remove(void *data, int type, void *event) { - Pager *e; + Pager *pager; E_Event_Border_Remove *ev; + E_Border *border; Pager_Win *old; Pager_Desk *desk; - e = data; + pager = data; ev = event; - old = _pager_window_find(e, ev->border); - desk = _pager_desk_find(e, ((E_Border *) ev->border)->desk); + border = ev->border; + + old = _pager_window_find(pager, border); + desk = _pager_desk_find(pager, border->desk); if (old && desk) { desk->wins = evas_list_remove(desk->wins, old); @@ -852,7 +749,7 @@ return 1; } -static int +static int _pager_cb_event_border_hide(void *data, int type, void *event) { Pager_Win *win; @@ -870,7 +767,7 @@ return 1; } -static int +static int _pager_cb_event_border_show(void *data, int type, void *event) { Pager_Win *win; @@ -890,22 +787,22 @@ return 1; } -static int +static int _pager_cb_event_border_desk_set(void *data, int type, void *event) { - Pager *e; + Pager *pager; Pager_Win *win; Pager_Desk *desk; E_Event_Border_Desk_Set *ev; - e = data; + pager = data; ev = event; - win = _pager_window_find(e, ev->border); - desk = _pager_desk_find(e, ev->border->desk); + win = _pager_window_find(pager, ev->border); + desk = _pager_desk_find(pager, ev->border->desk); if (win && desk) { win->owner = desk; - _pager_window_move(e, win); + _pager_window_move(pager, win); } return 1; } @@ -913,24 +810,64 @@ static int _pager_cb_event_zone_desk_count_set(void *data, int type, void *event) { - Pager *e; + Pager *pager; + Pager_Desk *pd, *new; + E_Event_Zone_Desk_Count_Set *ev; + E_Desk *desk; - e = data; - // FIXME need to update display with sizes etc - return 1; -} + Evas_List *desks; -static E_Manager* -_pager_manager_current_get(Pager *e) -{ - Evas_List *l; - E_Manager *result; - for(l = e->managers; l; l = l->next) + int desks_x, desks_y; + int max_x, max_y; + int x, y; + + pager = data; + ev = event; + e_zone_desk_count_get(ev->zone, &desks_x, &desks_y); + + max_x = MAX(pager->xnum, desks_x); + max_y = MAX(pager->ynum, desks_y); + + if ((pager->xnum == desks_x) && (pager->ynum == desks_y)) + return 1; + + pager->fw = (pager->fw * pager->xnum) / desks_x; + pager->fh = (pager->fh * pager->ynum) / desks_y; + for (x = 0; x < max_x; x++) { - result = l->data; - if(result->visible) - return(result); + for (y = 0; y < max_y; y++) + { + if ((x >= pager->xnum) || (y >= pager->ynum)) + { + /* Add desk */ + desk = e_desk_at_xy_get(ev->zone, x, y); + pd = _pager_desk_new(pager, desk); + pager->desks = evas_list_append(pager->desks, pd); + } + else if ((x >= desks_x) || (y >= desks_y)) + { + /* Remove desk */ + for (desks = pager->desks; desks; desks = desks->next) + { + pd = desks->data; + if ((pd->xpos == x) && (pd->ypos == y)) + break; + } + if (pd->current) + { + desk = e_desk_current_get(ev->zone); + new = _pager_desk_find(pager, desk); + new->current = 1; + } + pager->desks = evas_list_remove(pager->desks, pd); + _pager_desk_destroy(pd); + } + } } - return(NULL); + pager->xnum = desks_x; + pager->ynum = desks_y; + + _pager_draw(pager); + return 1; } =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e/src/modules/pager/e_mod_main.h,v retrieving revision 1.9 retrieving revision 1.10 diff -u -3 -r1.9 -r1.10 --- e_mod_main.h 22 Jan 2005 01:06:22 -0000 1.9 +++ e_mod_main.h 1 Feb 2005 18:21:46 -0000 1.10 @@ -13,18 +13,21 @@ struct _Pager { - Evas_List *managers; + E_Zone *zone; + Evas_List *desks; + E_Menu *config_menu; - E_Container *con; Evas *evas; Evas_Object *base, *screen; - Evas_List *desks; - + /* E_Config_DD *conf_edd;*/ Config *conf; Evas_Coord fx, fy, fw, fh; E_Gadman_Client *gmc; + + /* Current nr. of desktops */ + int xnum, ynum; Ecore_Event_Handler *ev_handler_border_resize; Ecore_Event_Handler *ev_handler_border_move; @@ -38,27 +41,29 @@ struct _Pager_Desk { + E_Desk *desk; + Pager *owner; Evas_List *wins; + Evas_Object *obj; int xpos, ypos; - E_Desk *desk; - int current:1; + int current : 1; }; struct _Pager_Win { + E_Border *border; + Pager_Desk *owner; + Evas_Object *obj; Evas_Object *icon; - - Pager_Desk *owner; - E_Border *border; }; -EAPI void *init (E_Module *m); -EAPI int shutdown (E_Module *m); -EAPI int save (E_Module *m); -EAPI int info (E_Module *m); -EAPI int about (E_Module *m); +EAPI void *init (E_Module *module); +EAPI int shutdown (E_Module *module); +EAPI int save (E_Module *module); +EAPI int info (E_Module *module); +EAPI int about (E_Module *module); #endif ------------------------------------------------------- This SF.Net email is sponsored by: IntelliVIEW -- Interactive Reporting Tool for open source databases. Create drag-&-drop reports. Save time by over 75%! Publish reports on the web. Export to DOC, XLS, RTF, etc. Download a FREE copy at http://www.intelliview.com/go/osdn_nl _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs