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: New pager code - much improved and faster - done "the E way" as much as possible may need ironing out in a few places but is stable. issues: Zone support not really there, needs work (I only have one zone :() Window icon overlays (new feature) only work if module disabled and re-enabled (the border add calls are too soon it seems) =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e/src/modules/pager/e_mod_main.c,v retrieving revision 1.18 retrieving revision 1.19 diff -u -3 -r1.18 -r1.19 --- e_mod_main.c 12 Jan 2005 09:49:20 -0000 1.18 +++ e_mod_main.c 14 Jan 2005 15:24:29 -0000 1.19 @@ -12,19 +12,38 @@ */ /* 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 void _pager_cb_down(void *data, Evas *e, Evas_Object *obj, void *event_info); -static void _pager_cb_up(void *data, Evas *e, Evas_Object *obj, void *event_info); -static void _pager_cb_move(void *data, Evas *e, Evas_Object *obj, void *event_info); -static int _pager_cb_event_container_resize(void *data, int type, void *event); +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 Pager_Desk *_pager_desk_create(Pager *e, 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 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 Pager_Desk *_pager_desk_find(Pager *e, E_Desk *desk); +static Pager_Win *_pager_window_find(Pager *e, E_Border *border); + +static void _pager_cb_down(void *data, Evas *e, Evas_Object *obj, void *event_info); +static void _pager_cb_up(void *data, Evas *e, Evas_Object *obj, void *event_info); +static void _pager_cb_move(void *data, Evas *e, Evas_Object *obj, void *event_info); +static int _pager_cb_event_container_resize(void *data, int type, void *event); + +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); +static int _pager_cb_event_border_add(void *data, int type, void *event); +static int _pager_cb_event_border_remove(void *data, int type, void *event); +static int _pager_cb_event_border_hide(void *data, int type, void *event); +static int _pager_cb_event_border_show(void *data, int type, void *event); +static int _pager_cb_event_border_desk_set(void *data, int type, void *event); -static int _pager_cb_event_border_events(void *data, int type, void *event); - -static void _pager_reconfigure(Pager *e); -static void _pager_refresh(Pager *e); +static void _pager_reconfigure(Pager *e); #define PAGER_MIN_W 10 #define PAGER_MIN_H 7 @@ -175,27 +194,30 @@ e->ev_handler_border_resize = ecore_event_handler_add(E_EVENT_BORDER_RESIZE, - _pager_cb_event_border_events, e); + _pager_cb_event_border_resize, e); e->ev_handler_border_move = ecore_event_handler_add(E_EVENT_BORDER_MOVE, - _pager_cb_event_border_events, e); + _pager_cb_event_border_move, e); e->ev_handler_border_add = ecore_event_handler_add(E_EVENT_BORDER_ADD, - _pager_cb_event_border_events, e); + _pager_cb_event_border_add, e); e->ev_handler_border_remove = ecore_event_handler_add(E_EVENT_BORDER_REMOVE, - _pager_cb_event_border_events, e); + _pager_cb_event_border_remove, e); e->ev_handler_border_hide = ecore_event_handler_add(E_EVENT_BORDER_HIDE, - _pager_cb_event_border_events, e); + _pager_cb_event_border_hide, e); e->ev_handler_border_show = ecore_event_handler_add(E_EVENT_BORDER_SHOW, - _pager_cb_event_border_events, e); + _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_events, e); - + _pager_cb_event_border_desk_set, e); + + _pager_zone_set(e, e_zone_current_get(e->con)); _pager_reconfigure(e); + evas_object_resize(e->screen, e->fw, e->fh); + evas_object_move(e->base, e->fx, e->fy); return e; } @@ -205,26 +227,21 @@ free(e->conf); E_CONFIG_DD_FREE(e->conf_edd); - evas_object_del(e->base); - evas_object_free(e->base); - evas_object_del(e->screen); - evas_object_free(e->screen); - - while(e->desks) + if (e->base) { - evas_object_del(e->desks->data); - evas_object_free(e->desks->data); - e->desks = evas_list_remove_list(e->desks, e->desks); + evas_object_del(e->base); + evas_object_free(e->base); } - - while(e->wins) + if (e->screen) { - evas_object_del(e->wins->data); - evas_object_free(e->wins->data); - e->wins = evas_list_remove_list(e->wins, e->wins); + evas_object_del(e->screen); + evas_object_free(e->screen); } + _pager_zone_leave(e); ecore_event_handler_del(e->ev_handler_container_resize); + + 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); @@ -256,143 +273,245 @@ e_object_del(E_OBJECT(m)); } -static void -_pager_reconfigure(Pager *e) +static Pager_Desk * +_pager_desk_create(Pager *e, E_Desk *desk) { - Evas_Coord ww, hh; - E_Zone *zone; - int xcount, ycount; - - evas_output_viewport_get(e->evas, NULL, NULL, &ww, &hh); - e->fx = e->conf->x * (ww - e->conf->width); - e->fy = e->conf->y * (hh - e->conf->height); - e->fw = e->conf->width; - e->fh = e->conf->height; + Pager_Desk *new; + Evas_Object *o; + E_Desk *next; + int xpos, ypos, xcount, ycount, found; + + new = 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) + { + new->xpos = xpos; + new->ypos = ypos; + break; + } + } + if (desk == e_desk_current_get(desk->zone)) + { + new->current = 1; + evas_object_move(e->screen, e->fx, e->fy); + } + new->desk = desk; + e_object_ref(E_OBJECT(desk)); - zone = e_zone_current_get(e->con); - e_zone_desk_count_get(zone, &xcount, &ycount); - e->tw = e->fw * xcount; - e->th = e->fh * ycount; + o = edje_object_add(e->evas); + new->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); - _pager_refresh(e); + 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_show(o); + + return new; } -static void -_pager_refresh(Pager *e) +static void +_pager_desk_destroy(Pager_Desk *d) { - E_Zone *zone; - E_Desk *desk, *current; - E_Border *border; - Evas_List *clients, *desks, *wins; - - Evas_Object *desk_obj, *win_obj; - int desks_x, desks_y, x, y, top, toptmp; - Evas_Coord px, py, ww, hh; - double scalex, scaley; + if (d->obj) + { + evas_object_del(d->obj); + evas_object_free(d->obj); + } - zone = e_zone_current_get(e->con); - e_zone_desk_count_get(zone, &desks_x, &desks_y); + e_object_unref(E_OBJECT(d->desk)); - evas_object_resize(e->base, e->fw * desks_x, e->fh * desks_y); - evas_object_move(e->base, e->fx, e->fy); + while (d->wins) + { + _pager_window_destroy((Pager_Win *) d->wins->data); + d->wins = evas_list_remove_list(d->wins, d->wins); + } + E_FREE(d); +} +static void +_pager_window_move(Pager *e, Pager_Win *w) +{ + 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(e->screen, e->fw, e->fh); - desks = e->desks; - wins = e->wins; + 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)); +} + +static Pager_Win * +_pager_window_create(Pager *e, E_Border *border, Pager_Desk *owner) +{ + 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; + + 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); + new->obj = o; + edje_object_file_set(o, + /* FIXME: "default.eet" needs to come from conf */ + e_path_find(path_themes, "default.eet"), + "modules/pager/window"); + evas_object_pass_events_set(o, 1); + if (visible) + evas_object_show(o); + app = e_app_window_name_class_find(border->client.icccm.name, + border->client.icccm.class); + /* FIXME: here we do not get the info, the app has not populated the icccm */ + if (app) + { + o = edje_object_add(e->evas); + new->icon = o; + edje_object_file_set(o, app->path, "icon"); + if (visible) + evas_object_show(o); + edje_object_part_swallow(new->obj, "WindowIcon", o); + } + + _pager_window_move(e, new); + return new; +} + +static void +_pager_window_destroy(Pager_Win *w) +{ + if (w->obj) + { + evas_object_del(w->obj); + evas_object_free(w->obj); + } + if (w->icon) + { + evas_object_del(w->icon); + evas_object_free(w->icon); + } + + e_object_unref(E_OBJECT(w->border)); + E_FREE(w); +} + +static void +_pager_zone_set(Pager *e, E_Zone *zone) +{ + 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); - px = e->fx + (x * e->fw); - py = e->fy + (y * e->fh); + sym = _pager_desk_create(e, desk); + e->desks = evas_list_append(e->desks, sym); - if (desks) + wins = desk->clients; + while (wins) { - desk_obj = (Evas_Object *) desks->data; /* re-use the objects if possible */ - desks = desks->next; + Pager_Win *win; + E_Border *bd; + + bd = wins->data; + win = _pager_window_create(e, bd, sym); + + sym->wins = evas_list_append(sym->wins, win); + wins = wins->next; } - else - { - desk_obj = edje_object_add(e->evas); - edje_object_file_set(desk_obj, - /* FIXME: "default.eet" needs to come from conf */ - e_path_find(path_themes, "default.eet"), - "modules/pager/desk"); - evas_object_pass_events_set(desk_obj, 1); - e->desks = evas_list_append(e->desks, desk_obj); - } - evas_object_resize(desk_obj, e->fw, e->fh); - evas_object_move(desk_obj, px, py); - evas_object_show(desk_obj); + } + evas_object_resize(e->base, e->fw * desks_x, e->fy * desks_y); +} - top = evas_object_layer_get(desk_obj); +static void +_pager_zone_leave(Pager *e) +{ + while (e->desks) + { + _pager_desk_destroy((Pager_Desk *) e->desks->data); + e->desks = evas_list_remove_list(e->desks, e->desks); + } +} - clients = desk->clients; - while (clients) - { - Evas_Coord winx, winy, winw, winh; - border = (E_Border *) clients->data; - if (border->iconic) - { - clients = clients->next; - continue; - } - winx = (Evas_Coord) ((double) border->x) * scalex; - winy = (Evas_Coord) ((double) border->y) * scaley; - winw = (Evas_Coord) ((double) border->w) * scalex; - winh = (Evas_Coord) ((double) border->h) * scaley; +static void +_pager_desk_set(Pager *p, E_Desk *desk) +{ + Evas_List *desks; + int x, y, desks_x, desks_y; - if (wins) - { - win_obj = (Evas_Object *) wins->data; - wins = wins->next; - } - else - { - win_obj = edje_object_add(e->evas); - edje_object_file_set(win_obj, - /* FIXME: "default.eet" needs to come from conf */ - e_path_find(path_themes, "default.eet"), - "modules/pager/window"); - evas_object_pass_events_set(win_obj, 1); + 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; - e->wins = evas_list_append(e->wins, win_obj); - } - evas_object_resize(win_obj, winw, winh); - evas_object_move(win_obj, px + winx, py + winy); - evas_object_show(win_obj); - - toptmp = evas_object_layer_get(win_obj); - if (toptmp > top) - top = toptmp; + pd = desks->data; + left = p->fx + x * p->fw; + top = p->fy + y * p->fh; - clients = clients->next; - } - if (desk == current) + if (pd->desk == desk) { - evas_object_move(e->screen, px, py); - evas_object_layer_set(e->screen, top + 1); + pd->current = 1; + evas_object_move(p->screen, left, top); } + else + pd->current = 0; + desks = desks->next; } +} - /* hide objects not needed; */ - while (desks) - { - desk_obj = (Evas_Object *) desks->data; - evas_object_hide(desk_obj); - desks = desks->next; - } - while (wins) - { - win_obj = (Evas_Object *) wins->data; - evas_object_hide(win_obj); - wins = wins->next; - } +static void +_pager_reconfigure(Pager *e) +{ + Evas_Coord ww, hh; + E_Zone *zone; + int xcount, ycount; + + evas_output_viewport_get(e->evas, NULL, NULL, &ww, &hh); + e->fx = e->conf->x * (ww - e->conf->width); + e->fy = e->conf->y * (hh - e->conf->height); + e->fw = e->conf->width; + e->fh = e->conf->height; + + zone = e_zone_current_get(e->con); + e_zone_desk_count_get(zone, &xcount, &ycount); + e->tw = e->fw * xcount; + e->th = e->fh * ycount; + + _pager_zone_leave(e); + _pager_zone_set(e, zone); } static void @@ -423,6 +542,50 @@ p->clickhacky = p->yy; } +static Pager_Desk * +_pager_desk_find(Pager *e, E_Desk *desk) +{ + Evas_List *desks; + + desks = e->desks; + while (desks) + { + Pager_Desk *next; + + next = desks->data; + if (next->desk == desk) + return next; + desks = desks->next; + } + return NULL; +} + +static Pager_Win * +_pager_window_find(Pager *e, E_Border *border) +{ + Evas_List *desks, *wins; + + desks = e->desks; + while (desks) + { + Pager_Desk *next; + + next = desks->data; + wins = next->wins; + while (wins) + { + Pager_Win *next2; + + next2 = wins->data; + if (next2->border == border) + return next2; + wins = wins->next; + } + desks = desks->next; + } + return NULL; +} + static void _pager_cb_up(void *data, Evas *e, Evas_Object *obj, void *event_info) { @@ -460,7 +623,7 @@ { desk = e_desk_at_xy_get(zone, x, y); e_desk_show(desk); - evas_object_move(p->screen, left, top); + _pager_desk_set(p, desk); } } } @@ -479,10 +642,13 @@ _pager_cb_move(void *data, Evas *e, Evas_Object *obj, void *event_info) { Evas_Event_Mouse_Move *ev; - Pager *p; - Evas_Coord cx, cy, sw, sh, tw, th; - E_Zone *zone; - int xcount, ycount; + Pager *p; + Evas_Coord cx, cy, sw, sh, tw, th, dx, dy, xx, yy, ww, hh; + E_Zone *zone; + int xcount, ycount; + Evas_List *desks, *wins; + Pager_Desk *desk; + Pager_Win *win; evas_pointer_canvas_xy_get(e, &cx, &cy); evas_output_viewport_get(e, NULL, NULL, &sw, &sh); @@ -496,27 +662,46 @@ larger (rounding etc) these will vie exactly the right result */ tw = p->fw * xcount; th = p->fh * ycount; + dx = cx - p->xx; + dy = cy - p->yy; if (p->move) { - p->fx += cx - p->xx; - p->fy += cy - p->yy; - if (p->fx < 0) p->fx = 0; - if (p->fy < 0) p->fy = 0; - if (p->fx + tw > sw) p->fx = sw - tw; - if (p->fy + th > sh) p->fy = sh - th; - _pager_refresh(p); + if (p->fx + dx < 0) dx = 0 - p->fx; + if (p->fx + dx + tw > sw) dx = sw - (p->fx + tw); + if (p->fy + dy < 0) dy = 0 - p->fy; + if (p->fy + dy + th > sh) dy = sh - (p->fy + th); + p->fx += dx; + p->fy += dy; + + evas_object_move(p->base, p->fx, p->fy); + + desks = p->desks; + while (desks) + { + desk = desks->data; + + evas_object_geometry_get(desk->obj, &xx, &yy, &ww, &hh); + evas_object_move(desk->obj, xx + dx, yy + dy); + + wins = desk->wins; + while (wins) + { + win = wins->data; + + evas_object_geometry_get(win->obj, &xx, &yy, &ww, &hh); + evas_object_move(win->obj, xx + dx, yy + dy); + + wins = wins->next; + } + + desks = desks->next; + } + + evas_object_geometry_get(p->screen, &xx, &yy, &ww, &hh); + evas_object_move(p->screen, xx + dx, yy + dy); } else if (p->resize) { - Evas_Coord dx, dy; - E_Zone *zone; - int xcount, ycount; - - zone = e_zone_current_get(p->con); - e_zone_desk_count_get(zone, &xcount, &ycount); - dx = cx - p->xx; - dy = cy - p->yy; - p->tw += dx; p->th += dy; p->fw = p->tw / xcount; @@ -533,7 +718,30 @@ p->th = sh - p->fy; p->fh = p->th / ycount; } - _pager_refresh(p); + + evas_object_resize(p->base, p->fw * xcount, p->fh * ycount); + + evas_object_resize(p->screen, p->fw, p->fh); + desks = p->desks; + while (desks) + { + desk = desks->data; + evas_object_resize(desk->obj, p->fw, p->fh); + evas_object_move(desk->obj, p->fx + (desk->xpos * p->fw), + p->fy + (desk->ypos * p->fh)); + + wins = desk->wins; + while (wins) + { + win = wins->data; + _pager_window_move(p, win); + + wins = wins->next; + } + + desks = desks->next; + } + } p->xx = ev->cur.canvas.x; p->yy = ev->cur.canvas.y; @@ -542,19 +750,128 @@ static int _pager_cb_event_container_resize(void *data, int type, void *event) { - Pager *e; + Pager *e; e = data; _pager_reconfigure(e); return 1; } -static int -_pager_cb_event_border_events(void *data, int type, void *event) +static int +_pager_cb_event_border_resize(void *data, int type, void *event) +{ + Pager *e; + Pager_Win *win; + E_Event_Border_Resize *ev; + + e = data; + ev = event; + win = _pager_window_find(e, ev->border); + _pager_window_move(e, win); + return 1; +} + +static int +_pager_cb_event_border_move(void *data, int type, void *event) +{ + Pager *e; + Pager_Win *win; + E_Event_Border_Resize *ev; + + e = data; + ev = event; + win = _pager_window_find(e, ev->border); + _pager_window_move(e, win); + return 1; +} + +static int +_pager_cb_event_border_add(void *data, int type, void *event) +{ + Pager *e; + E_Event_Border_Add *ev; + Pager_Win *new; + Pager_Desk *desk; + + e = data; + ev = event; + desk = _pager_desk_find(e, ((E_Border *) ev->border)->desk); + + if (desk) + { + new = _pager_window_create(data, ev->border, desk); + + desk->wins = evas_list_append(desk->wins, new); + } + return 1; +} + +static int +_pager_cb_event_border_remove(void *data, int type, void *event) +{ + Pager *e; + E_Event_Border_Remove *ev; + Pager_Win *old; + Pager_Desk *desk; + + e = data; + ev = event; + old = _pager_window_find(e, ev->border); + desk = _pager_desk_find(e, ((E_Border *) ev->border)->desk); + if (old && desk) + { + desk->wins = evas_list_remove(desk->wins, old); + _pager_window_destroy(old); + } + return 1; +} + +static int +_pager_cb_event_border_hide(void *data, int type, void *event) +{ + Pager_Win *win; + Pager *e; + E_Event_Border_Hide *ev; + + e = data; + ev = event; + win = _pager_window_find(e, ev->border); + if (win && ev->border->desk->visible) + { + evas_object_hide(win->obj); + evas_object_hide(win->icon); + } + return 1; +} + +static int +_pager_cb_event_border_show(void *data, int type, void *event) +{ + Pager_Win *win; + Pager *e; + E_Event_Border_Show *ev; + + e = data; + ev = event; + win = _pager_window_find(e, ev->border); + if (win) + { + evas_object_show(win->obj); + evas_object_show(win->icon); + } + return 1; +} + +static int +_pager_cb_event_border_desk_set(void *data, int type, void *event) { Pager *e; + E_Event_Border_Desk_Set *ev; + /* FIXME do something */ + e = data; - _pager_refresh(e); + ev = event; return 1; } + =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e/src/modules/pager/e_mod_main.h,v retrieving revision 1.5 retrieving revision 1.6 diff -u -3 -r1.5 -r1.6 --- e_mod_main.h 12 Jan 2005 09:49:20 -0000 1.5 +++ e_mod_main.h 14 Jan 2005 15:24:29 -0000 1.6 @@ -3,6 +3,8 @@ typedef struct _Config Config; typedef struct _Pager Pager; +typedef struct _Pager_Desk Pager_Desk; +typedef struct _Pager_Win Pager_Win; struct _Config { @@ -15,7 +17,7 @@ E_Menu *config_menu; Evas *evas; Evas_Object *base, *screen; - Evas_List *desks, *wins; + Evas_List *desks; E_Container *con; E_Config_DD *conf_edd; @@ -39,6 +41,25 @@ Evas_Coord clickhackx, clickhacky; }; +struct _Pager_Desk +{ + Evas_List *wins; + Evas_Object *obj; + int xpos, ypos; + + E_Desk *desk; + int current:1; +}; + +struct _Pager_Win +{ + 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); ------------------------------------------------------- The SF.Net email is sponsored by: Beat the post-holiday blues Get a FREE limited edition SourceForge.net t-shirt from ThinkGeek. It's fun and FREE -- well, almost....http://www.thinkgeek.com/sfshirt _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs