Enlightenment CVS committal Author : raster Project : e17 Module : apps/e
Dir : e17/apps/e/src/bin Modified Files: e_border.c e_error.c e_gadman.c e_menu.c e_theme.c e_theme.h Log Message: fix dropshadow bug make e_theme stuff check contents of edje files for group requested, if not there, fallback fix shading of windows with shaped windows =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_border.c,v retrieving revision 1.147 retrieving revision 1.148 diff -u -3 -r1.147 -r1.148 --- e_border.c 22 Apr 2005 20:17:25 -0000 1.147 +++ e_border.c 23 Apr 2005 05:16:24 -0000 1.148 @@ -810,6 +810,11 @@ bd->changes.pos = 1; } + if ((bd->shaped) || (bd->client.shaped)) + { + bd->need_shape_merge = 1; + bd->need_shape_export = 1; + } bd->changes.size = 1; bd->shaded = 1; bd->changes.shaded = 1; @@ -892,6 +897,11 @@ bd->x = bd->x - bd->client.w; bd->changes.pos = 1; } + if ((bd->shaped) || (bd->client.shaped)) + { + bd->need_shape_merge = 1; + bd->need_shape_export = 1; + } bd->changes.size = 1; bd->shaded = 0; bd->changes.shaded = 1; @@ -2350,8 +2360,6 @@ static void _e_border_eval(E_Border *bd) { - /* FIXME: get min/max/start size etc. gravity etc. */ - /* fetch any info queued to be fetched */ if (bd->client.icccm.fetch.title) { @@ -2618,7 +2626,7 @@ Evas_Coord cx, cy, cw, ch; int l, r, t, b; int ok; - + if (!bd->client.border.name) { bd->client.border.name = strdup("default"); @@ -2636,10 +2644,9 @@ } o = edje_object_add(bd->bg_evas); bd->bg_object = o; - path = e_theme_file_get("base/theme/borders"); snprintf(buf, sizeof(buf), "widgets/border/%s/border", bd->client.border.name); - ok = edje_object_file_set(o, path, buf); + ok = e_theme_edje_object_set(o, "base/theme/borders", buf); if (ok) { const char *shape_option; @@ -2674,7 +2681,7 @@ } edje_object_part_text_set(o, "title_text", -// "Japanese (hiragana): いろはにほへとちりぬるを"); +// "Japanese (hiragana): いろはにほへとちりぬるを"); bd->client.icccm.title); // printf("SET TITLE2 %s\n", bd->client.icccm.title); evas_object_resize(o, 1000, 1000); @@ -2715,7 +2722,7 @@ edje_object_signal_callback_add(o, "resize_r_start", "*", _e_border_cb_signal_resize_r_start, bd); edje_object_signal_callback_add(o, "resize_br_start", "*", - _e_border_cb_signal_resize_br_start, bd); + _e_border_cb_signal_resize_br_start, bd); edje_object_signal_callback_add(o, "resize_b_start", "*", _e_border_cb_signal_resize_b_start, bd); edje_object_signal_callback_add(o, "resize_bl_start", "*", @@ -2732,7 +2739,7 @@ evas_object_resize(o, bd->w, bd->h); evas_object_show(o); bd->client.border.changed = 0; - + if (bd->icon_object) { if (bd->bg_object) @@ -2746,7 +2753,7 @@ } } } - + if (bd->new_client) { E_Event_Border_Add *ev; @@ -3053,7 +3060,8 @@ { if ((bd->shaped) || (bd->client.shaped)) { - Ecore_X_Window twin; + Ecore_X_Window twin, twin2; + int x, y; twin = ecore_x_window_override_new(bd->win, 0, 0, bd->w, bd->h); if (bd->shaped) @@ -3071,18 +3079,41 @@ rects[1].x = 0; rects[1].y = bd->client_inset.t; rects[1].width = bd->client_inset.l; - rects[1].height = bd->client.h; + rects[1].height = bd->h - bd->client_inset.t - bd->client_inset.b; rects[2].x = bd->w - bd->client_inset.r; rects[2].y = bd->client_inset.t; rects[2].width = bd->client_inset.r; - rects[2].height = bd->client.h; + rects[2].height = bd->h - bd->client_inset.t - bd->client_inset.b; rects[3].x = 0; rects[3].y = bd->h - bd->client_inset.b; rects[3].width = bd->w; rects[3].height = bd->client_inset.b; ecore_x_window_shape_rectangles_set(twin, rects, 4); } - ecore_x_window_shape_window_add_xy(twin, bd->client.win, bd->client_inset.l, bd->client_inset.t); + /* FIXME: need to clip client shape to client container + * with offset for shading, if shading/shaded + */ + twin2 = ecore_x_window_override_new(bd->win, 0, 0, + bd->w - bd->client_inset.l - bd->client_inset.r, + bd->h - bd->client_inset.t - bd->client_inset.b); + x = 0; + y = 0; + if ((bd->shading) || (bd->shaded)) + { + if (bd->shade.dir == E_DIRECTION_UP) + y = bd->h - bd->client_inset.t - bd->client_inset.b - bd->client.h; + else if (bd->shade.dir == E_DIRECTION_LEFT) + x = bd->w - bd->client_inset.l - bd->client_inset.r - bd->client.w; + } + ecore_x_window_shape_window_set_xy(twin2, bd->client.win, + x, y); + ecore_x_window_shape_rectangle_clip(twin2, 0, 0, + bd->w - bd->client_inset.l - bd->client_inset.r, + bd->h - bd->client_inset.t - bd->client_inset.b); + ecore_x_window_shape_window_add_xy(twin, twin2, + bd->client_inset.l, + bd->client_inset.t); + ecore_x_window_del(twin2); ecore_x_window_shape_window_set(bd->win, twin); ecore_x_window_del(twin); } @@ -3369,7 +3400,11 @@ bd->changes.pos = 1; } - + if ((bd->shaped) || (bd->client.shaped)) + { + bd->need_shape_merge = 1; + bd->need_shape_export = 1; + } bd->changes.size = 1; bd->changed = 1; @@ -3432,12 +3467,18 @@ mi = e_menu_item_new(m); e_menu_item_label_set(mi, _("Close")); e_menu_item_callback_set(mi, _e_border_menu_cb_close, bd); - e_menu_item_icon_edje_set(mi, e_theme_file_get("base/theme/borders"), "widgets/border/default/close"); + e_menu_item_icon_edje_set(mi, + e_theme_edje_file_get("base/theme/borders", + "widgets/border/default/close"), + "widgets/border/default/close"); mi = e_menu_item_new(m); e_menu_item_label_set(mi, _("Iconify")); e_menu_item_callback_set(mi, _e_border_menu_cb_iconify, bd); - e_menu_item_icon_edje_set(mi, e_theme_file_get("base/theme/borders"), "widgets/border/default/minimize"); + e_menu_item_icon_edje_set(mi, + e_theme_edje_file_get("base/theme/borders", + "widgets/border/default/minimize"), + "widgets/border/default/minimize"); mi = e_menu_item_new(m); e_menu_item_separator_set(mi, 1); @@ -3447,21 +3488,30 @@ e_menu_item_check_set(mi, 1); e_menu_item_toggle_set(mi, (bd->shaded ? 1 : 0)); e_menu_item_callback_set(mi, _e_border_menu_cb_shade, bd); - e_menu_item_icon_edje_set(mi, e_theme_file_get("base/theme/borders"), "widgets/border/default/shade"); + e_menu_item_icon_edje_set(mi, + e_theme_edje_file_get("base/theme/borders", + "widgets/border/default/shade"), + "widgets/border/default/shade"); mi = e_menu_item_new(m); e_menu_item_label_set(mi, _("Maximized")); e_menu_item_check_set(mi, 1); e_menu_item_toggle_set(mi, (bd->maximized ? 1 : 0)); e_menu_item_callback_set(mi, _e_border_menu_cb_maximize, bd); - e_menu_item_icon_edje_set(mi, e_theme_file_get("base/theme/borders"), "widgets/border/default/maximize"); + e_menu_item_icon_edje_set(mi, + e_theme_edje_file_get("base/theme/borders", + "widgets/border/default/maximize"), + "widgets/border/default/maximize"); mi = e_menu_item_new(m); e_menu_item_label_set(mi, _("Sticky")); e_menu_item_check_set(mi, 1); e_menu_item_toggle_set(mi, (bd->sticky ? 1 : 0)); e_menu_item_callback_set(mi, _e_border_menu_cb_stick, bd); - e_menu_item_icon_edje_set(mi, e_theme_file_get("base/theme/borders"), "widgets/border/default/stick"); + e_menu_item_icon_edje_set(mi, + e_theme_edje_file_get("base/theme/borders", + "widgets/border/default/stick"), + "widgets/border/default/stick"); mi = e_menu_item_new(m); e_menu_item_separator_set(mi, 1); @@ -3469,7 +3519,10 @@ mi = e_menu_item_new(m); e_menu_item_label_set(mi, _("Send To")); e_menu_item_submenu_pre_callback_set(mi, _e_border_menu_sendto_pre_cb, bd); - e_menu_item_icon_edje_set(mi, e_path_find(path_themes, "default.edj"), "widgets/border/default/sendto"); + e_menu_item_icon_edje_set(mi, + e_theme_edje_file_get("base/theme/borders", + "widgets/border/default/sendto"), + "widgets/border/default/sendto"); mi = e_menu_item_new(m); e_menu_item_separator_set(mi, 1); @@ -3869,8 +3922,8 @@ ecore_evas_show(resize_ee); resize_obj = edje_object_add(ecore_evas_get(resize_ee)); - edje_object_file_set(resize_obj, e_theme_file_get("base/theme/borders"), - "widgets/border/default/resize"); + e_theme_edje_object_set(resize_obj, "base/theme/borders", + "widgets/border/default/resize"); snprintf(buf, sizeof(buf), "9999x9999"); edje_object_part_text_set(resize_obj, "text", buf); @@ -3940,8 +3993,8 @@ ecore_evas_layer_set(move_ee, 255); move_obj = edje_object_add(ecore_evas_get(move_ee)); - edje_object_file_set(move_obj, e_theme_file_get("base/theme/borders"), - "widgets/border/default/move"); + e_theme_edje_object_set(move_obj, "base/theme/borders", + "widgets/border/default/move"); snprintf(buf, sizeof(buf), "9999 9999"); edje_object_part_text_set(move_obj, "text", buf); =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_error.c,v retrieving revision 1.16 retrieving revision 1.17 diff -u -3 -r1.16 -r1.17 --- e_error.c 21 Apr 2005 10:09:26 -0000 1.16 +++ e_error.c 23 Apr 2005 05:16:24 -0000 1.17 @@ -78,10 +78,7 @@ e_pointer_ecore_evas_set(ee); o = edje_object_add(e); - if (!edje_object_file_set(o, - e_theme_file_get("base/theme/error"), - "error/main")) - + if (!e_theme_edje_object_set(o, "base/theme/error", "error/main")) { Evas_Coord tw, th; char *newstr; @@ -258,7 +255,7 @@ snprintf(format, sizeof(format), "source='%s' font='%s' size=%d wrap=word", - e_theme_file_get("base/theme/error"), + e_theme_edje_file_get("base/theme/error", "error/main"), "fonts/Edje Vera", 10); text = evas_object_textblock_add(e); evas_object_color_set(text, 0, 0, 0, 255); =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_gadman.c,v retrieving revision 1.30 retrieving revision 1.31 diff -u -3 -r1.30 -r1.31 --- e_gadman.c 21 Apr 2005 10:09:26 -0000 1.30 +++ e_gadman.c 23 Apr 2005 05:16:24 -0000 1.31 @@ -599,9 +599,8 @@ evas_object_layer_set(gmc->control_object, 100); evas_object_move(gmc->control_object, gmc->x, gmc->y); evas_object_resize(gmc->control_object, gmc->w, gmc->h); - edje_object_file_set(gmc->control_object, - e_theme_file_get("base/theme/gadman"), - "gadman/control"); + e_theme_edje_object_set(gmc->control_object, "base/theme/gadman", + "gadman/control"); edje_object_signal_callback_add(gmc->control_object, "move_start", "", _e_gadman_cb_signal_move_start, gmc); edje_object_signal_callback_add(gmc->control_object, "move_stop", "", =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_menu.c,v retrieving revision 1.20 retrieving revision 1.21 diff -u -3 -r1.20 -r1.21 --- e_menu.c 21 Apr 2005 10:09:26 -0000 1.20 +++ e_menu.c 23 Apr 2005 05:16:24 -0000 1.21 @@ -807,9 +807,8 @@ { o = edje_object_add(mi->menu->evas); mi->separator_object = o; - edje_object_file_set(o, - e_theme_file_get("base/theme/menus"), - "widgets/menu/default/separator"); + e_theme_edje_object_set(o, "base/theme/menus", + "widgets/menu/default/separator"); evas_object_show(o); edje_object_size_min_calc(mi->separator_object, &ww, &hh); mi->separator_w = ww; @@ -825,17 +824,15 @@ if ((mi->submenu) || (mi->submenu_pre_cb.func)) { - if (!edje_object_file_set(mi->bg_object, - e_theme_file_get("base/theme/menus"), - "widgets/menu/default/submenu_bg")) + if (!e_theme_edje_object_set(mi->bg_object, "base/theme/menus", + "widgets/menu/default/submenu_bg")) goto no_submenu_item; } else { no_submenu_item: - edje_object_file_set(mi->bg_object, - e_theme_file_get("base/theme/menus"), - "widgets/menu/default/item_bg"); + e_theme_edje_object_set(mi->bg_object, "base/theme/menus", + "widgets/menu/default/item_bg"); } evas_object_show(o); @@ -851,9 +848,8 @@ { o = edje_object_add(mi->menu->evas); mi->toggle_object = o; - edje_object_file_set(o, - e_theme_file_get("base/theme/menus"), - "widgets/menu/default/check"); + e_theme_edje_object_set(o, "base/theme/menus", + "widgets/menu/default/check"); evas_object_pass_events_set(o, 1); evas_object_show(o); e_box_pack_end(mi->container_object, o); @@ -865,9 +861,8 @@ { o = edje_object_add(mi->menu->evas); mi->toggle_object = o; - edje_object_file_set(o, - e_theme_file_get("base/theme/menus"), - "widgets/menu/default/radio"); + e_theme_edje_object_set(o, "base/theme/menus", + "widgets/menu/default/radio"); evas_object_pass_events_set(o, 1); evas_object_show(o); e_box_pack_end(mi->container_object, o); @@ -888,9 +883,8 @@ int icon_w, icon_h; o = edje_object_add(mi->menu->evas); - if (edje_object_file_set(o, - e_theme_file_get("base/theme/menus"), - "widgets/menu/default/icon")) + if (e_theme_edje_object_set(o, "base/theme/menus", + "widgets/menu/default/icon")) { mi->icon_bg_object = o; evas_object_show(o); @@ -956,9 +950,8 @@ { o = edje_object_add(mi->menu->evas); mi->label_object = o; - edje_object_file_set(o, - e_theme_file_get("base/theme/menus"), - "widgets/menu/default/label"); + e_theme_edje_object_set(o, "base/theme/menus", + "widgets/menu/default/label"); /* default label */ edje_object_part_text_set(o, "label", mi->label); evas_object_pass_events_set(o, 1); @@ -980,9 +973,8 @@ { o = edje_object_add(mi->menu->evas); mi->submenu_object = o; - edje_object_file_set(o, - e_theme_file_get("base/theme/menus"), - "widgets/menu/default/submenu"); + e_theme_edje_object_set(o, "base/theme/menus", + "widgets/menu/default/submenu"); evas_object_pass_events_set(o, 1); evas_object_show(o); e_box_pack_end(mi->container_object, o); @@ -1052,9 +1044,8 @@ evas_object_data_set(o, "e_menu", m); evas_object_move(o, 0, 0); evas_object_resize(o, m->cur.w, m->cur.h); - ok = edje_object_file_set(o, - e_theme_file_get("base/theme/menus"), - "widgets/menu/default/background"); + ok = e_theme_edje_object_set(o, "base/theme/menus", + "widgets/menu/default/background"); if (ok) { const char *shape_option; =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_theme.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -3 -r1.2 -r1.3 --- e_theme.c 22 Apr 2005 03:06:27 -0000 1.2 +++ e_theme.c 23 Apr 2005 05:16:24 -0000 1.3 @@ -3,42 +3,37 @@ */ #include "e.h" -/* FIXME: need to make wrapper that can not just find the file but - * detect if the edj has that named group and if not, fall back - */ - /* local subsystem functions */ typedef struct _E_Theme_Result E_Theme_Result; struct _E_Theme_Result { - unsigned char generated : 1; char *file; char *cache; }; -static const char *_e_theme_file_get_internal(char *category, int recursion); +static Evas_Bool _e_theme_mappings_free_cb(Evas_Hash *hash, const char *key, void *data, void *fdata); /* local subsystem globals */ static Evas_Hash *mappings = NULL; +static Evas_Hash *group_cache = NULL; /* externally accessible functions */ int e_theme_init(void) { - /* this is a fallback that is ALWAYS there */ + /* this is a fallback that is ALWAYS there - if all fails things will */ + /* always fall back to the default theme. the rest after this are config */ + /* values users can set */ e_theme_file_set("base", "default.edj"); /* now add more */ - /* FIXME: load these from a config */ + /* FIXME: load these from a config and save them to a config x*/ e_theme_file_set("base/theme", "default.edj"); e_theme_file_set("base/theme/borders", "default.edj"); e_theme_file_set("base/theme/menus", "default.edj"); - e_theme_file_set("base/theme/background", "default.edj"); e_theme_file_set("base/theme/error", "default.edj"); e_theme_file_set("base/theme/gadman", "default.edj"); - e_theme_file_set("base/theme/icons", "default.edj"); - e_theme_file_set("base/theme/cursors", "default.edj"); e_theme_file_set("base/theme/modules", "default.edj"); e_theme_file_set("base/theme/modules/pager", "default.edj"); e_theme_file_set("base/theme/modules/ibar", "default.edj"); @@ -46,33 +41,181 @@ e_theme_file_set("base/theme/modules/battery", "default.edj"); e_theme_file_set("base/theme/modules/cpufreq", "default.edj"); e_theme_file_set("base/theme/modules/temperature", "default.edj"); - /* FIXME: need to not just load, but save TO the config too */ return 1; } int e_theme_shutdown(void) { - /* FIXME; clear out mappings hash */ + if (mappings) + { + evas_hash_foreach(mappings, _e_theme_mappings_free_cb, NULL); + evas_hash_free(mappings); + mappings = NULL; + } + if (group_cache) + { + evas_hash_free(group_cache); + group_cache = NULL; + } return 1; } +int +e_theme_edje_object_set(Evas_Object *o, char *category, char *group) +{ + E_Theme_Result *res; + char buf[256]; + char *p; + + /* find category -> edje mapping */ + res = evas_hash_find(mappings, category); + if (res) + { + char *str; + + /* if found check cached path */ + str = res->cache; + if (!str) + { + /* no cached path */ + str = res->file; + /* if its not an absolute path find it */ + if (str[0] != '/') + str = e_path_find(path_themes, str); + /* save cached value */ + if (str) + res->cache = strdup(str); + } + if (str) + { + void *tres; + int ok; + + snprintf(buf, sizeof(buf), "%s/::/%s", str, group); + tres = evas_hash_find(group_cache, buf); + if (!tres) + { + ok = edje_object_file_set(o, str, group); + /* save in the group cache hash */ + if (ok) + group_cache = evas_hash_add(group_cache, buf, res); + else + group_cache = evas_hash_add(group_cache, buf, (void *)1); + } + else if (tres == (void *)1) + ok = 0; + else + ok = 1; + if (ok) + { + if (tres) + edje_object_file_set(o, str, group); + return 1; + } + } + } + /* no mapping or set failed - fall back */ + strncpy(buf, category, sizeof(buf) - 1); + buf[sizeof(buf) - 1] = 0; + /* shorten string up to and not including last / char */ + p = strrchr(buf, '/'); + if (p) *p = 0; + /* no / anymore - we are already as far back as we can go */ + else return 0; + /* try this category */ + return e_theme_edje_object_set(o, buf, group); +} + const char * -e_theme_file_get(char *category) +e_theme_edje_file_get(char *category, char *group) { - return _e_theme_file_get_internal(category, 0); + E_Theme_Result *res; + char buf[4096]; + char *p; + + /* find category -> edje mapping */ + res = evas_hash_find(mappings, category); + if (res) + { + char *str; + + /* if found check cached path */ + str = res->cache; + if (!str) + { + /* no cached path */ + str = res->file; + /* if its not an absolute path find it */ + if (str[0] != '/') + str = e_path_find(path_themes, str); + /* save cached value */ + if (str) + res->cache = strdup(str); + } + if (str) + { + void *tres; + Evas_List *coll, *l; + int ok; + + snprintf(buf, sizeof(buf), "%s/::/%s", str, group); + tres = evas_hash_find(group_cache, buf); + if (!tres) + { + /* if the group exists - return */ + coll = edje_file_collection_list(str); + ok = 0; + for (l = coll; l; l = l->next) + { + if (!strcmp(coll->data, group)) + { + ok = 1; + break; + } + } + if (coll) edje_file_collection_list_free(coll); + /* save in the group cache hash */ + if (ok) + group_cache = evas_hash_add(group_cache, buf, res); + else + group_cache = evas_hash_add(group_cache, buf, (void *)1); + } + else if (tres == (void *)1) /* special pointer "1" == not there */ + ok = 0; + else + ok = 1; + if (ok) return str; + } + } + /* no mapping or set failed - fall back */ + strncpy(buf, category, sizeof(buf) - 1); + buf[sizeof(buf) - 1] = 0; + /* shorten string up to and not including last / char */ + p = strrchr(buf, '/'); + if (p) *p = 0; + /* no / anymore - we are already as far back as we can go */ + else return ""; + /* try this category */ + return e_theme_edje_file_get(buf, group); } void e_theme_file_set(char *category, char *file) { E_Theme_Result *res; - + + if (group_cache) + { + evas_hash_free(group_cache); + group_cache = NULL; + } res = evas_hash_find(mappings, category); if (res) { mappings = evas_hash_del(mappings, category, res); - free(res->file); + E_FREE(res->file); + E_FREE(res->cache); free(res); } res = calloc(1, sizeof(E_Theme_Result)); @@ -82,38 +225,14 @@ /* local subsystem functions */ -static const char * -_e_theme_file_get_internal(char *category, int recursion) +static Evas_Bool +_e_theme_mappings_free_cb(Evas_Hash *hash, const char *key, void *data, void *fdata) { - const char *str; E_Theme_Result *res; - if (strlen(category) == 0) return NULL; - res = evas_hash_find(mappings, category); - if (!res) - { - char buf[256]; - char *p; - - strncpy(buf, category, sizeof(buf) - 1); - buf[sizeof(buf) - 1] = 0; - p = strrchr(buf, '/'); - if (p) - { - *p = 0; - return - _e_theme_file_get_internal(buf, recursion + 1); - } - return NULL; - } - str = res->cache; - if (!str) - { - str = res->file; - if (str[0] != '/') - str = e_path_find(path_themes, str); - if (str) - res->cache = strdup(str); - } - return str; + res = data; + E_FREE(res->file); + E_FREE(res->cache); + free(res); + return 1; } =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_theme.h,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- e_theme.h 21 Apr 2005 10:09:26 -0000 1.1 +++ e_theme.h 23 Apr 2005 05:16:24 -0000 1.2 @@ -6,10 +6,11 @@ #ifndef E_THEME_H #define E_THEME_H -EAPI int e_theme_init(void); -EAPI int e_theme_shutdown(void); +EAPI int e_theme_init(void); +EAPI int e_theme_shutdown(void); -EAPI const char *e_theme_file_get(char *category); +EAPI int e_theme_edje_object_set(Evas_Object *o, char *category, char *group); +EAPI const char *e_theme_edje_file_get(char *category, char *group); EAPI void e_theme_file_set(char *category, char *file); #endif ------------------------------------------------------- SF email is sponsored by - The IT Product Guide Read honest & candid reviews on hundreds of IT Products from real users. Discover which products truly live up to the hype. Start reading now. http://ads.osdn.com/?ad_id=6595&alloc_id=14396&op=click _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs