From 01efbd768372b8dca347766b4ccc37fa7b817db3 Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Sat, 22 Jul 2006 21:48:24 +0000 Subject: [PATCH] and some major refinements of efm - the selector code - well its in e_test.c is pretty much almost perfectly working. i have fixed up some e_thumb stuff and allowed e_thumb to be more responsive and skip items that are known to be "generated" and bring them ahead in the list of things to thumb - so kind of a priority skiplist - process what it KNOWS will be already done first quickly and leave the slower stuff until later. efm is fairly well refined now - as above. the test selector works nicely. also added an almost-sha1 generator - use sha1 sums of the path for thumbs - less likelihood of collisions. the prolbme is given the small size of the input data... it's hard to do well - but anyway :) SVN revision: 24128 --- src/bin/Makefile.am | 8 +- src/bin/e_fm.c | 394 ++++++++++++++++++++------------- src/bin/e_fm.h | 21 +- src/bin/e_includes.h | 1 + src/bin/e_sha1.c | 107 +++++++++ src/bin/e_sha1.h | 35 +++ src/bin/e_test.c | 94 +++++++- src/bin/e_thumb.c | 10 +- src/bin/e_thumb_main.c | 143 +++++++----- src/bin/e_utils.c | 71 ++++++ src/bin/e_utils.h | 3 +- src/bin/e_widget_scrollframe.c | 27 +++ src/bin/e_widget_scrollframe.h | 3 + 13 files changed, 692 insertions(+), 225 deletions(-) create mode 100644 src/bin/e_sha1.c create mode 100644 src/bin/e_sha1.h diff --git a/src/bin/Makefile.am b/src/bin/Makefile.am index 401e29deb..51fa6adec 100644 --- a/src/bin/Makefile.am +++ b/src/bin/Makefile.am @@ -164,7 +164,8 @@ e_confirm_dialog.h \ e_int_border_prop.h \ e_entry_dialog.h \ e_fm.h \ -e_widget_scrollframe.h +e_widget_scrollframe.h \ +e_sha1.h enlightenment_src = \ e_user.c \ @@ -305,6 +306,7 @@ e_int_border_prop.c \ e_entry_dialog.c \ e_fm.c \ e_widget_scrollframe.c \ +e_sha1.c \ $(ENLIGHTENMENTHEADERS) enlightenment_SOURCES = \ @@ -345,7 +347,9 @@ e_start_main.c enlightenment_start_LDFLAGS = enlightenment_thumb_SOURCES = \ -e_thumb_main.c +e_thumb_main.c \ +e_sha1.c \ +e_sha1.h enlightenment_thumb_LDFLAGS = @e_libs@ @dlopen_libs@ diff --git a/src/bin/e_fm.c b/src/bin/e_fm.c index 065f02220..89b344cc4 100644 --- a/src/bin/e_fm.c +++ b/src/bin/e_fm.c @@ -3,7 +3,11 @@ */ #include "e.h" -/* IGNORE this code for now! */ +/* FIXME: this is NOT complete. dnd doesnt work. only list view works. + * in icon view it needs to be much better about placement of icons and + * being able to save/load icon placement. it doesn't support backgrounds or + * custom frames or icons yet + */ typedef struct _E_Fm2_Smart_Data E_Fm2_Smart_Data; typedef struct _E_Fm2_Region E_Fm2_Region; @@ -57,20 +61,14 @@ struct _E_Fm2_Icon Evas_Object *obj, *obj_icon; int saved_x, saved_y; int saved_rel; - const char *file; - const char *mime; - const char *label; - const char *comment; - const char *generic; - const char *icon; - const char *link; - struct stat st; + + E_Fm2_Icon_Info info; + unsigned char realized : 1; unsigned char selected : 1; unsigned char last_selected : 1; unsigned char saved_pos : 1; unsigned char odd : 1; - unsigned char mount : 1; }; static const char *_e_fm2_dev_path_map(const char *dev, const char *path); @@ -189,31 +187,33 @@ e_fm2_path_set(Evas_Object *obj, char *dev, char *path) /* internal config for now - don't see a pont making this configurable */ sd->regions.member_max = 32; - if (sd->config) _e_fm2_config_free(sd->config); - sd->config = E_NEW(E_Fm2_Config, 1); - if (!sd->config) return; + if (!sd->config) + { + sd->config = E_NEW(E_Fm2_Config, 1); + if (!sd->config) return; // sd->config->view.mode = E_FM2_VIEW_MODE_ICONS; - sd->config->view.mode = E_FM2_VIEW_MODE_LIST; - sd->config->view.open_dirs_in_place = 1; - sd->config->view.selector = 1; - sd->config->view.single_click = 0; - sd->config->view.no_subdir_jump = 0; - sd->config->icon.icon.w = 64; - sd->config->icon.icon.h = 64; - sd->config->icon.list.w = 24; - sd->config->icon.list.h = 24; - sd->config->icon.fixed.w = 1; - sd->config->icon.fixed.h = 1; - sd->config->icon.extension.show = 0; - sd->config->list.sort.no_case = 1; - sd->config->list.sort.dirs.first = 1; - sd->config->list.sort.dirs.last = 1; - sd->config->selection.single = 0; - sd->config->selection.windows_modifiers = 0; - sd->config->theme.background = NULL; - sd->config->theme.frame = NULL; - sd->config->theme.icons = NULL; - sd->config->theme.fixed = 0; + sd->config->view.mode = E_FM2_VIEW_MODE_LIST; + sd->config->view.open_dirs_in_place = 1; + sd->config->view.selector = 1; + sd->config->view.single_click = 0; + sd->config->view.no_subdir_jump = 0; + sd->config->icon.icon.w = 64; + sd->config->icon.icon.h = 64; + sd->config->icon.list.w = 24; + sd->config->icon.list.h = 24; + sd->config->icon.fixed.w = 1; + sd->config->icon.fixed.h = 1; + sd->config->icon.extension.show = 0; + sd->config->list.sort.no_case = 1; + sd->config->list.sort.dirs.first = 1; + sd->config->list.sort.dirs.last = 0; + sd->config->selection.single = 0; + sd->config->selection.windows_modifiers = 0; + sd->config->theme.background = NULL; + sd->config->theme.frame = NULL; + sd->config->theme.icons = NULL; + sd->config->theme.fixed = 0; + } _e_fm2_scan_stop(obj); _e_fm2_queue_free(obj); @@ -226,7 +226,6 @@ e_fm2_path_set(Evas_Object *obj, char *dev, char *path) if (dev) sd->dev = evas_stringshare_add(dev); sd->path = evas_stringshare_add(path); sd->realpath = _e_fm2_dev_path_map(sd->dev, sd->path); - printf("FM: %s\n", sd->realpath); _e_fm2_scan_start(obj); evas_object_smart_callback_call(obj, "changed", NULL); } @@ -260,6 +259,18 @@ e_fm2_has_parent_get(Evas_Object *obj) return 1; } +EAPI const char * +e_fm2_real_path_get(Evas_Object *obj) +{ + E_Fm2_Smart_Data *sd; + + sd = evas_object_smart_data_get(obj); + if (!sd) return NULL; // safety + if (!evas_object_type_get(obj)) return NULL; // safety + if (strcmp(evas_object_type_get(obj), "e_fm")) return NULL; // safety + return sd->realpath; +} + EAPI void e_fm2_parent_go(Evas_Object *obj) { @@ -280,7 +291,6 @@ e_fm2_parent_go(Evas_Object *obj) E_FREE(path); } -/* EAPI void e_fm2_config_set(Evas_Object *obj, E_Fm2_Config *cfg) { @@ -290,6 +300,15 @@ e_fm2_config_set(Evas_Object *obj, E_Fm2_Config *cfg) if (!sd) return; // safety if (!evas_object_type_get(obj)) return; // safety if (strcmp(evas_object_type_get(obj), "e_fm")) return; // safety + if (sd->config) _e_fm2_config_free(sd->config); + sd->config = NULL; + if (!cfg) return; + sd->config = E_NEW(E_Fm2_Config, 1); + if (!sd->config) return; + memcpy(sd->config, cfg, sizeof(E_Fm2_Config)); + if (cfg->theme.background) sd->config->theme.background = evas_stringshare_add(cfg->theme.background); + if (cfg->theme.frame) sd->config->theme.frame = evas_stringshare_add(cfg->theme.frame); + if (cfg->theme.icons) sd->config->theme.icons = evas_stringshare_add(cfg->theme.icons); } EAPI E_Fm2_Config * @@ -297,12 +316,79 @@ e_fm2_config_get(Evas_Object *obj) { E_Fm2_Smart_Data *sd; + sd = evas_object_smart_data_get(obj); + if (!sd) return NULL; // safety + if (!evas_object_type_get(obj)) return NULL; // safety + if (strcmp(evas_object_type_get(obj), "e_fm")) return NULL; // safety + return sd->config; +} + +EAPI Evas_List * +e_fm2_selected_list_get(Evas_Object *obj) +{ + E_Fm2_Smart_Data *sd; + Evas_List *list = NULL, *l; + E_Fm2_Icon *ic; + + sd = evas_object_smart_data_get(obj); + if (!sd) return NULL; // safety + if (!evas_object_type_get(obj)) return NULL; // safety + if (strcmp(evas_object_type_get(obj), "e_fm")) return NULL; // safety + for (l = sd->icons; l; l = l->next) + { + ic = l->data; + if (ic->selected) + list = evas_list_append(list, &(ic->info)); + } + return list; +} + +EAPI Evas_List * +e_fm2_all_list_get(Evas_Object *obj) +{ + E_Fm2_Smart_Data *sd; + Evas_List *list = NULL, *l; + E_Fm2_Icon *ic; + + sd = evas_object_smart_data_get(obj); + if (!sd) return NULL; // safety + if (!evas_object_type_get(obj)) return NULL; // safety + if (strcmp(evas_object_type_get(obj), "e_fm")) return NULL; // safety + for (l = sd->icons; l; l = l->next) + { + ic = l->data; + list = evas_list_append(list, &(ic->info)); + } + return list; +} + +EAPI void +e_fm2_select_set(Evas_Object *obj, char *file, int select) +{ + E_Fm2_Smart_Data *sd; + Evas_List *l; + E_Fm2_Icon *ic; + sd = evas_object_smart_data_get(obj); if (!sd) return; // safety if (!evas_object_type_get(obj)) return; // safety if (strcmp(evas_object_type_get(obj), "e_fm")) return; // safety + for (l = sd->icons; l; l = l->next) + { + ic = l->data; + if (!strcmp(ic->info.file, file)) + { + if (select) _e_fm2_icon_select(ic); + else _e_fm2_icon_deselect(ic); + } + else + { + if (ic->sd->config->view.single_click) + _e_fm2_icon_deselect(ic); + ic->last_selected = 0; + } + } } -*/ EAPI void e_fm2_pan_set(Evas_Object *obj, Evas_Coord x, Evas_Coord y) @@ -320,7 +406,6 @@ e_fm2_pan_set(Evas_Object *obj, Evas_Coord x, Evas_Coord y) if ((sd->pos.x == x) && (sd->pos.y == y)) return; sd->pos.x = x; sd->pos.y = y; - printf("POS %i %i\n", x, y); if (sd->scroll_job) ecore_job_del(sd->scroll_job); sd->scroll_job = ecore_job_add(_e_fm2_cb_scroll_job, obj); } @@ -398,6 +483,19 @@ _e_fm2_dev_path_map(const char *dev, const char *path) PRT("%s%s", s, path); free(s); } + else if (dev[0] == '/') { + /* dev is a full path - consider it a mountpoint device on its own */ + PRT("%s%s", dev, path); + } + else if (CMP("favorites")) { + /* this is a virtual device - it's where your favorites list is + * stored - a dir with .desktop files or symlinks (in fact anything + * you like + */ + s = e_user_homedir_get(); + PRT("%s/.e/e/fileman/favorites", s); + free(s); + } else if (CMP("dvd") || CMP("dvd-*")) { /* FIXME: find dvd mountpoint optionally for dvd no. X */ /* maybe make part of the device mappings config? */ @@ -524,6 +622,7 @@ _e_fm2_queue_process(Evas_Object *obj) sd->icons = evas_list_sort(sd->icons, evas_list_count(sd->icons), _e_fm2_cb_icon_sort); if (sd->resize_job) ecore_job_del(sd->resize_job); sd->resize_job = ecore_job_add(_e_fm2_cb_resize_job, obj); + evas_object_smart_callback_call(sd->obj, "files_changed", NULL); } static void @@ -866,21 +965,25 @@ _e_fm2_icon_new(E_Fm2_Smart_Data *sd, char *file) E_Fm2_Icon *ic; Evas_Coord mw = 0, mh = 0; Evas_Object *obj, *obj2; - char buf[4096], buf2[4096]; + char buf[4096], *lnk; /* create icon */ ic = E_NEW(E_Fm2_Icon, 1); snprintf(buf, sizeof(buf), "%s/%s", sd->realpath, file); - if (stat(buf, &(ic->st)) == -1) + if (stat(buf, &(ic->info.statinfo)) == -1) { free(ic); return NULL; } ic->sd = sd; - ic->file = evas_stringshare_add(file); - if (readlink(buf, buf2, sizeof(buf2) - 1) == 0) - ic->link = evas_stringshare_add(buf2); - if (e_util_glob_case_match(ic->file, "*.desktop")) + ic->info.file = evas_stringshare_add(file); + lnk = ecore_file_readlink(buf); + if (lnk) + { + ic->info.link = evas_stringshare_add(lnk); + free(lnk); + } + if (e_util_glob_case_match(ic->info.file, "*.desktop")) _e_fm2_icon_desktop_load(ic); switch (sd->config->view.mode) { @@ -956,13 +1059,13 @@ _e_fm2_icon_free(E_Fm2_Icon *ic) { /* free icon, object data etc. etc. */ _e_fm2_icon_unrealize(ic); - if (ic->file) evas_stringshare_del(ic->file); - if (ic->mime) evas_stringshare_del(ic->mime); - if (ic->label) evas_stringshare_del(ic->label); - if (ic->comment) evas_stringshare_del(ic->comment); - if (ic->generic) evas_stringshare_del(ic->generic); - if (ic->icon) evas_stringshare_del(ic->icon); - if (ic->link) evas_stringshare_del(ic->link); + if (ic->info.file) evas_stringshare_del(ic->info.file); + if (ic->info.mime) evas_stringshare_del(ic->info.mime); + if (ic->info.label) evas_stringshare_del(ic->info.label); + if (ic->info.comment) evas_stringshare_del(ic->info.comment); + if (ic->info.generic) evas_stringshare_del(ic->info.generic); + if (ic->info.icon) evas_stringshare_del(ic->info.icon); + if (ic->info.link) evas_stringshare_del(ic->info.link); free(ic); } @@ -1065,20 +1168,20 @@ _e_fm2_icon_label_set(E_Fm2_Icon *ic, Evas_Object *obj) char buf[4096], *p; int len; - if (ic->label) + if (ic->info.label) { - edje_object_part_text_set(obj, "label", ic->label); + edje_object_part_text_set(obj, "label", ic->info.label); return; } if (ic->sd->config->icon.extension.show) - edje_object_part_text_set(obj, "label", ic->file); + edje_object_part_text_set(obj, "label", ic->info.file); else { /* remove extension. handle double extensions like .tar.gz too * also be fuzzy - up to 4 chars of extn is ok - eg .html but 5 or * more is considered part of the name */ - strncpy(buf, ic->file, sizeof(buf) - 2); + strncpy(buf, ic->info.file, sizeof(buf) - 2); buf[sizeof(buf) - 1] = 0; len = strlen(buf); @@ -1101,30 +1204,30 @@ _e_fm2_icon_icon_set(E_Fm2_Icon *ic) char buf[4096]; if (!ic->realized) return; - if (ic->icon) + if (ic->info.icon) { /* custom icon */ /* FIXME: - * if ic->icon == blah then use theme icon - * if ic->icon == blah/blah2 then use theme icon - * if ic->icon == /blah/blah2.xxx then use full path - * if ic->icon == blah.xxx then use relative path to icon dirs - * if ic->icon == blah/blah2.xxx then use relative path to icon dirs + * if ic->info.icon == blah then use theme icon + * if ic->info.icon == blah/blah2 then use theme icon + * if ic->info.icon == /blah/blah2.xxx then use full path + * if ic->info.icon == blah.xxx then use relative path to icon dirs + * if ic->info.icon == blah/blah2.xxx then use relative path to icon dirs */ /* theme icon */ ic->obj_icon = edje_object_add(evas_object_evas_get(ic->sd->obj)); - e_util_edje_icon_set(ic->obj_icon, ic->icon); + e_util_edje_icon_set(ic->obj_icon, ic->info.icon); edje_object_part_swallow(ic->obj, "icon_swallow", ic->obj_icon); evas_object_show(ic->obj_icon); return; } - if (ic->mime) + if (ic->info.mime) { /* use mime type to select icon */ return; } /* fallback */ - if (S_ISDIR(ic->st.st_mode)) + if (S_ISDIR(ic->info.statinfo.st_mode)) { ic->obj_icon = edje_object_add(evas_object_evas_get(ic->sd->obj)); e_theme_edje_object_set(ic->obj_icon, "base/theme/fileman", @@ -1135,48 +1238,48 @@ _e_fm2_icon_icon_set(E_Fm2_Icon *ic) else { if ( - (e_util_glob_case_match(ic->file, "*.jpg")) || - (e_util_glob_case_match(ic->file, "*.jpeg")) || - (e_util_glob_case_match(ic->file, "*.jfif")) || - (e_util_glob_case_match(ic->file, "*.jpe")) || - (e_util_glob_case_match(ic->file, "*.png")) || - (e_util_glob_case_match(ic->file, "*.gif")) || - (e_util_glob_case_match(ic->file, "*.tif")) || - (e_util_glob_case_match(ic->file, "*.tiff")) + (e_util_glob_case_match(ic->info.file, "*.jpg")) || + (e_util_glob_case_match(ic->info.file, "*.jpeg")) || + (e_util_glob_case_match(ic->info.file, "*.jfif")) || + (e_util_glob_case_match(ic->info.file, "*.jpe")) || + (e_util_glob_case_match(ic->info.file, "*.png")) || + (e_util_glob_case_match(ic->info.file, "*.gif")) || + (e_util_glob_case_match(ic->info.file, "*.tif")) || + (e_util_glob_case_match(ic->info.file, "*.tiff")) ) { - snprintf(buf, sizeof(buf), "%s/%s", ic->sd->realpath, ic->file); + snprintf(buf, sizeof(buf), "%s/%s", ic->sd->realpath, ic->info.file); ic->obj_icon = e_thumb_icon_add(evas_object_evas_get(ic->sd->obj)); e_thumb_icon_file_set(ic->obj_icon, buf, NULL); e_thumb_icon_size_set(ic->obj_icon, 64, 64); evas_object_smart_callback_add(ic->obj_icon, "e_thumb_gen", _e_fm2_cb_icon_thumb_gen, ic); - e_thumb_icon_begin(ic->obj_icon); + if (_e_fm2_icon_visible(ic)) e_thumb_icon_begin(ic->obj_icon); edje_object_part_swallow(ic->obj, "icon_swallow", ic->obj_icon); evas_object_show(ic->obj_icon); } else if ( - (e_util_glob_case_match(ic->file, "*.edj")) + (e_util_glob_case_match(ic->info.file, "*.edj")) ) { - snprintf(buf, sizeof(buf), "%s/%s", ic->sd->realpath, ic->file); + snprintf(buf, sizeof(buf), "%s/%s", ic->sd->realpath, ic->info.file); ic->obj_icon = e_thumb_icon_add(evas_object_evas_get(ic->sd->obj)); e_thumb_icon_file_set(ic->obj_icon, buf, "desktop/background"); e_thumb_icon_size_set(ic->obj_icon, 64, 64); evas_object_smart_callback_add(ic->obj_icon, "e_thumb_gen", _e_fm2_cb_icon_thumb_gen, ic); - e_thumb_icon_begin(ic->obj_icon); + if (_e_fm2_icon_visible(ic)) e_thumb_icon_begin(ic->obj_icon); edje_object_part_swallow(ic->obj, "icon_swallow", ic->obj_icon); evas_object_show(ic->obj_icon); } else if ( - (e_util_glob_case_match(ic->file, "*.eap")) + (e_util_glob_case_match(ic->info.file, "*.eap")) ) { - snprintf(buf, sizeof(buf), "%s/%s", ic->sd->realpath, ic->file); + snprintf(buf, sizeof(buf), "%s/%s", ic->sd->realpath, ic->info.file); ic->obj_icon = e_thumb_icon_add(evas_object_evas_get(ic->sd->obj)); e_thumb_icon_file_set(ic->obj_icon, buf, "icon"); e_thumb_icon_size_set(ic->obj_icon, 64, 64); evas_object_smart_callback_add(ic->obj_icon, "e_thumb_gen", _e_fm2_cb_icon_thumb_gen, ic); - e_thumb_icon_begin(ic->obj_icon); + if (_e_fm2_icon_visible(ic)) e_thumb_icon_begin(ic->obj_icon); edje_object_part_swallow(ic->obj, "icon_swallow", ic->obj_icon); evas_object_show(ic->obj_icon); } @@ -1221,50 +1324,16 @@ _e_fm2_icon_deselect(E_Fm2_Icon *ic) static const char * _e_fm2_icon_desktop_url_eval(const char *val) { - char *path, *p, buf[4096], *pd, *e1, *e2; + char *path, *p, *s; if (strlen(val) < 6) return NULL; if (strncmp(val, "file:", 5)) return NULL; - path = val + 5; - buf[0] = 0; - p = path; - pd = buf; - e1 = e2 = NULL; - /* FIXME: evaluate any shell vars - eg: - * $XX/blah/$HOME/blah2/$A$B - */ - while (*p) - { -/* - if (*p == '$') - { - if (e1) - { - e2 = p; - - e1 = NULL; - e2 = NULL; - } - else - e1 = p + 1; - } - else if (e1) - { - if (!(isalnum(*p) || (*p == '_'))) - { - e2 = p; - - e1 = NULL; - e2 = NULL; - } - } - */ - *pd = *p; - p++; - pd++; - } - *pd = 0; - return evas_stringshare_add(buf); + path = (char *)val + 5; + p = e_util_shell_env_path_eval(path); + if (!p) return NULL; + s = evas_stringshare_add(p); + free(p); + return s; } static int @@ -1273,21 +1342,24 @@ _e_fm2_icon_desktop_load(E_Fm2_Icon *ic) char buf[4096], key[256], val[4096]; FILE *f; - snprintf(buf, sizeof(buf), "%s/%s", ic->sd->realpath, ic->file); + snprintf(buf, sizeof(buf), "%s/%s", ic->sd->realpath, ic->info.file); f = fopen(buf, "rb"); if (!f) return 0; if (!fgets(buf, sizeof(buf), f)) goto error; if (strcmp(buf, "[Desktop Entry]\n")) goto error; while (fscanf(f, "%255[^=]=%4095[^\n]\n", key, val) == 2) { - printf("%s=%s\n", key, val); - if (!strcmp(key, "Name")) ic->label = evas_stringshare_add(val); - else if (!strcmp(key, "Comment")) ic->comment = evas_stringshare_add(val); - else if (!strcmp(key, "Generic")) ic->generic = evas_stringshare_add(val); - else if (!strcmp(key, "Icon")) ic->icon = evas_stringshare_add(val); + if (!strcmp(key, "Name")) + ic->info.label = evas_stringshare_add(val); + else if (!strcmp(key, "Comment")) + ic->info.comment = evas_stringshare_add(val); + else if (!strcmp(key, "Generic")) + ic->info.generic = evas_stringshare_add(val); + else if (!strcmp(key, "Icon")) + ic->info.icon = evas_stringshare_add(val); else if (!strcmp(key, "Type")) { - if (!strcmp(val, "Mount")) ic->mount = 1; + if (!strcmp(val, "Mount")) ic->info.mount = 1; else if (!strcmp(val, "Link")) { } @@ -1295,25 +1367,25 @@ _e_fm2_icon_desktop_load(E_Fm2_Icon *ic) goto error; } else if (!strcmp(key, "File")) - ic->link = _e_fm2_icon_desktop_url_eval(val); + ic->info.link = _e_fm2_icon_desktop_url_eval(val); else if (!strcmp(key, "URL")) - ic->link = _e_fm2_icon_desktop_url_eval(val); + ic->info.link = _e_fm2_icon_desktop_url_eval(val); else if (!strcmp(key, "Path")) - ic->link = _e_fm2_icon_desktop_url_eval(val); + ic->info.link = _e_fm2_icon_desktop_url_eval(val); } fclose(f); return 1; error: - if (ic->label) evas_stringshare_del(ic->label); - if (ic->comment) evas_stringshare_del(ic->comment); - if (ic->generic) evas_stringshare_del(ic->generic); - if (ic->icon) evas_stringshare_del(ic->icon); - if (ic->link) evas_stringshare_del(ic->link); - ic->label = NULL; - ic->comment = NULL; - ic->generic = NULL; - ic->icon = NULL; - ic->link = NULL; + if (ic->info.label) evas_stringshare_del(ic->info.label); + if (ic->info.comment) evas_stringshare_del(ic->info.comment); + if (ic->info.generic) evas_stringshare_del(ic->info.generic); + if (ic->info.icon) evas_stringshare_del(ic->info.icon); + if (ic->info.link) evas_stringshare_del(ic->info.link); + ic->info.label = NULL; + ic->info.comment = NULL; + ic->info.generic = NULL; + ic->info.icon = NULL; + ic->info.link = NULL; fclose(f); return 0; } @@ -1347,13 +1419,18 @@ static void _e_fm2_region_realize(E_Fm2_Region *rg) { Evas_List *l; + E_Fm2_Icon *ic; if (rg->realized) return; /* actually create evas objects etc. */ rg->realized = 1; - printf("REG %p REALIZE\n", rg); edje_freeze(); for (l = rg->list; l; l = l->next) _e_fm2_icon_realize(l->data); + for (l = rg->list; l; l = l->next) + { + ic = l->data; + if (ic->selected) evas_object_raise(ic->obj); + } edje_thaw(); } @@ -1365,7 +1442,6 @@ _e_fm2_region_unrealize(E_Fm2_Region *rg) if (!rg->realized) return; /* delete evas objects */ rg->realized = 0; - printf("REG %p UNREALIZE\n", rg); edje_freeze(); for (l = rg->list; l; l = l->next) _e_fm2_icon_unrealize(l->data); edje_thaw(); @@ -1404,7 +1480,7 @@ _e_fm2_cb_icon_mouse_down(void *data, Evas *e, Evas_Object *obj, void *event_inf { /* if its a directory && open dirs in-place is set then change the dir * to be the dir + file */ - if ((S_ISDIR(ic->st.st_mode)) && + if ((S_ISDIR(ic->info.statinfo.st_mode)) && (ic->sd->config->view.open_dirs_in_place) && (!ic->sd->config->view.no_subdir_jump) && (!ic->sd->config->view.single_click) @@ -1413,7 +1489,7 @@ _e_fm2_cb_icon_mouse_down(void *data, Evas *e, Evas_Object *obj, void *event_inf char buf[4096], *dev = NULL; if (ic->sd->dev) dev = strdup(ic->sd->dev); - snprintf(buf, sizeof(buf), "%s/%s", ic->sd->path, ic->file); + snprintf(buf, sizeof(buf), "%s/%s", ic->sd->path, ic->info.file); e_fm2_path_set(ic->sd->obj, dev, buf); E_FREE(dev); } @@ -1507,7 +1583,8 @@ _e_fm2_cb_icon_mouse_down(void *data, Evas *e, Evas_Object *obj, void *event_inf _e_fm2_icon_deselect(ic); else _e_fm2_icon_select(ic); - if (!(S_ISDIR(ic->st.st_mode)) && + if ((!(S_ISDIR(ic->info.statinfo.st_mode)) || + (ic->sd->config->view.no_subdir_jump)) && (ic->sd->config->view.single_click) ) { @@ -1556,7 +1633,6 @@ _e_fm2_cb_scroll_job(void *data) sd = evas_object_smart_data_get(data); if (!sd) return; sd->scroll_job = NULL; - printf("DO scroll!\n"); evas_event_freeze(evas_object_evas_get(sd->obj)); edje_freeze(); _e_fm2_regions_eval(sd->obj); @@ -1625,19 +1701,21 @@ _e_fm2_cb_icon_sort(void *data1, void *data2) ic1 = data1; ic2 = data2; - if (ic1->sd->config->list.sort.dirs.last) + if (ic1->sd->config->list.sort.dirs.first) { - if ((S_ISDIR(ic1->st.st_mode)) != (S_ISDIR(ic2->st.st_mode))) + if ((S_ISDIR(ic1->info.statinfo.st_mode)) != + (S_ISDIR(ic2->info.statinfo.st_mode))) { - if (S_ISDIR(ic1->st.st_mode)) return -1; + if (S_ISDIR(ic1->info.statinfo.st_mode)) return -1; else return 1; } } - else if (ic1->sd->config->list.sort.dirs.first) + else if (ic1->sd->config->list.sort.dirs.last) { - if ((S_ISDIR(ic1->st.st_mode)) != (S_ISDIR(ic2->st.st_mode))) + if ((S_ISDIR(ic1->info.statinfo.st_mode)) != + (S_ISDIR(ic2->info.statinfo.st_mode))) { - if (S_ISDIR(ic1->st.st_mode)) return 1; + if (S_ISDIR(ic1->info.statinfo.st_mode)) return 1; else return -1; } } @@ -1645,8 +1723,8 @@ _e_fm2_cb_icon_sort(void *data1, void *data2) { char buf1[4096], buf2[4096], *p; - strncpy(buf1, ic1->file, sizeof(buf1) - 2); - strncpy(buf2, ic2->file, sizeof(buf2) - 2); + strncpy(buf1, ic1->info.file, sizeof(buf1) - 2); + strncpy(buf2, ic2->info.file, sizeof(buf2) - 2); buf1[sizeof(buf1) - 1] = 0; buf2[sizeof(buf2) - 1] = 0; p = buf1; @@ -1663,7 +1741,7 @@ _e_fm2_cb_icon_sort(void *data1, void *data2) } return strcmp(buf1, buf2); } - return strcmp(ic1->file, ic2->file); + return strcmp(ic1->info.file, ic2->info.file); } static int @@ -1741,6 +1819,10 @@ _e_fm2_obj_icons_place(E_Fm2_Smart_Data *sd) sd->x + ic->x - sd->pos.x, sd->y + ic->y - sd->pos.y); evas_object_resize(ic->obj, ic->w, ic->h); + if (_e_fm2_icon_visible(ic)) + e_thumb_icon_begin(ic->obj_icon); + else + e_thumb_icon_end(ic->obj_icon); } } } diff --git a/src/bin/e_fm.h b/src/bin/e_fm.h index 475939b63..2dbf33ce0 100644 --- a/src/bin/e_fm.h +++ b/src/bin/e_fm.h @@ -15,7 +15,8 @@ typedef enum _E_Fm2_View_Mode E_FM2_VIEW_MODE_LIST /* vertical fileselector list */ } E_Fm2_View_Mode; -typedef struct _E_Fm2_Config E_Fm2_Config; +typedef struct _E_Fm2_Config E_Fm2_Config; +typedef struct _E_Fm2_Icon_Info E_Fm2_Icon_Info; #else #ifndef E_FM_H @@ -81,13 +82,31 @@ struct _E_Fm2_Config } geometry; }; +struct _E_Fm2_Icon_Info +{ + const char *file; + const char *mime; + const char *label; + const char *comment; + const char *generic; + const char *icon; + const char *link; + struct stat statinfo; + unsigned char mount : 1; +}; + EAPI int e_fm2_init(void); EAPI int e_fm2_shutdown(void); EAPI Evas_Object *e_fm2_add(Evas *evas); EAPI void e_fm2_path_set(Evas_Object *obj, char *dev, char *path); EAPI void e_fm2_path_get(Evas_Object *obj, const char **dev, const char **path); +EAPI const char *e_fm2_real_path_get(Evas_Object *obj); EAPI int e_fm2_has_parent_get(Evas_Object *obj); EAPI void e_fm2_parent_go(Evas_Object *obj); +EAPI void e_fm2_config_set(Evas_Object *obj, E_Fm2_Config *cfg); +EAPI E_Fm2_Config *e_fm2_config_get(Evas_Object *obj); +EAPI Evas_List *e_fm2_selected_list_get(Evas_Object *obj); +EAPI Evas_List *e_fm2_all_list_get(Evas_Object *obj); EAPI void e_fm2_pan_set(Evas_Object *obj, Evas_Coord x, Evas_Coord y); EAPI void e_fm2_pan_get(Evas_Object *obj, Evas_Coord *x, Evas_Coord *y); diff --git a/src/bin/e_includes.h b/src/bin/e_includes.h index 9b012ab40..be7545f8a 100644 --- a/src/bin/e_includes.h +++ b/src/bin/e_includes.h @@ -140,3 +140,4 @@ #include "e_entry_dialog.h" #include "e_fm.h" #include "e_widget_scrollframe.h" +#include "e_sha1.h" diff --git a/src/bin/e_sha1.c b/src/bin/e_sha1.c new file mode 100644 index 000000000..f2919350c --- /dev/null +++ b/src/bin/e_sha1.c @@ -0,0 +1,107 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ +#include "e_sha1.h" +#include +#include + +/* externally accessible functions */ + +#define SHSH(n, v) ((((v) << (n)) & 0xffffffff) | ((v) >> (32 - (n)))) + +/* this is ALMOST canonical sha1 - i took some shortcuts to make it smaller + * when handling the last 64 bytes in a buffer to just keep it short. it + * still generates decent hashes either way... + */ +EAPI int +e_sha1_sum(unsigned char *data, int size, unsigned char *dst) +{ + unsigned int digest[5], word[80], wa, wb, wc, wd, we, t; + unsigned char buf[64], *d; + int index, left, i; + const unsigned int magic[4] = + { + 0x5a827999, + 0x6ed9eba1, + 0x8f1bbcdc, + 0xca62c1d6 + }; + + index = 0; + digest[0] = 0x67452301; + digest[1] = 0xefcdab89; + digest[2] = 0x98badcfe; + digest[3] = 0x10325476; + digest[4] = 0xc3d2e1f0; + + for (left = size, d = data; left > 0; left--, d++) + { + if ((index == 0) && (left < 64)) + { + memset(buf, 0, 60); + buf[60] = (size >> 24) & 0xff; + buf[61] = (size >> 16) & 0xff; + buf[62] = (size >> 8) & 0xff; + buf[63] = (size ) & 0xff; + } + buf[index] = *d; + index++; + if ((index == 64) || (left == 1)) + { + if ((left == 1) && (index < 64)) buf[index] = 0x80; + for (i = 0; i < 16; i++) + { + word[i] = (unsigned int)buf[(i * 4) ] << 24; + word[i] |= (unsigned int)buf[(i * 4) + 1] << 16; + word[i] |= (unsigned int)buf[(i * 4) + 2] << 8; + word[i] |= (unsigned int)buf[(i * 4) + 3]; + } + for (i = 16; i < 80; i++) + word[i] = SHSH(1, + word[i - 3 ] ^ word[i - 8 ] ^ + word[i - 14] ^ word[i - 16]); + wa = digest[0]; + wb = digest[1]; + wc = digest[2]; + wd = digest[3]; + we = digest[4]; + for (i = 0; i < 80; i++) + { + if (i < 20) + t = SHSH(5, wa) + ((wb & wc) | ((~wb) & wd)) + + we + word[i] + magic[0]; + else if (i < 40) + t = SHSH(5, wa) + (wb ^ wc ^ wd) + + we + word[i] + magic[1]; + else if (i < 60) + t = SHSH(5, wa) + ((wb & wc) | (wb & wd) | (wc & wd)) + + we + word[i] + magic[2]; + else if (i < 80) + t = SHSH(5, wa) + (wb ^ wc ^ wd) + + we + word[i] + magic[3]; + we = wd; + wd = wc; + wc = SHSH(30, wb); + wb = wa; + wa = t; + } + digest[0] += wa; + digest[1] += wb; + digest[2] += wc; + digest[3] += wd; + digest[4] += we; + index = 0; + } + } + + t = htonl(digest[0]); digest[0] = t; + t = htonl(digest[1]); digest[1] = t; + t = htonl(digest[2]); digest[2] = t; + t = htonl(digest[3]); digest[3] = t; + t = htonl(digest[4]); digest[4] = t; + + memcpy(dst, digest, 5 * 4); + return 1; +} + +/* local subsystem functions */ diff --git a/src/bin/e_sha1.h b/src/bin/e_sha1.h new file mode 100644 index 000000000..008a227f0 --- /dev/null +++ b/src/bin/e_sha1.h @@ -0,0 +1,35 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ +#ifdef E_TYPEDEFS + +#else +#ifndef E_SHA1_H +#define E_SHA1_H + +#ifndef EAPI +# ifdef WIN32 +# ifdef BUILDING_DLL +# define EAPI __declspec(dllexport) +# else +# define EAPI __declspec(dllimport) +# endif +# else +# ifdef __GNUC__ +# if __GNUC__ >= 4 +// BROKEN in gcc 4 on amd64 +//# pragma GCC visibility push(hidden) +# define EAPI __attribute__ ((visibility("default"))) +# else +# define EAPI +# endif +# else +# define EAPI +# endif +# endif +#endif + +EAPI int e_sha1_sum(unsigned char *data, int size, unsigned char *dst); + +#endif +#endif diff --git a/src/bin/e_test.c b/src/bin/e_test.c index 580067f2d..eca033993 100644 --- a/src/bin/e_test.c +++ b/src/bin/e_test.c @@ -601,7 +601,54 @@ _e_test_cb_changed(void *data, Evas_Object *obj, void *event_info) static void _e_test_cb_favorites_selected(void *data, Evas_Object *obj, void *event_info) { - printf("FAV CHANGED\n"); + Evas_List *selected; + E_Fm2_Icon_Info *ici; + + printf("FAV SELECTED\n"); + selected = e_fm2_selected_list_get(obj); + if (!selected) return; + ici = selected->data; + if ((ici->link) && (ici->mount)) + e_fm2_path_set(data, (char *)ici->link, "/"); + else if (ici->link) + e_fm2_path_set(data, NULL, (char *)ici->link); +// FIXME: this should happen on the scrollframe not the fm obj +// e_widget_scrollframe_child_pos_set(data, 0, 0); + evas_list_free(selected); +} + +static void +_e_test_cb_favorites_files_changed(void *data, Evas_Object *obj, void *event_info) +{ + Evas_List *icons, *l; + E_Fm2_Icon_Info *ici; + const char *realpath; + char *p1, *p2; + + printf("FAV LIST CHANGE!\n"); + icons = e_fm2_all_list_get(obj); + if (!icons) return; + realpath = e_fm2_real_path_get(data); + p1 = ecore_file_realpath(realpath); + if (!p1) goto done; + for (l = icons; l; l = l->next) + { + ici = l->data; + if (ici->link) + { + p2 = ecore_file_realpath(ici->link); + if (!strcmp(p1, p2)) + { + e_fm2_select_set(obj, ici->file); + E_FREE(p2); + goto done; + } + E_FREE(p2); + } + } + done: + E_FREE(p1); + evas_list_free(icons); } static void @@ -626,8 +673,26 @@ _e_test_internal(E_Container *con) /* actual files */ ofm = e_fm2_add(dia->win->evas); - /* FIXME: set config */ - e_fm2_path_set(ofm, "~/", "/pix/bg"); + + memset(&fmc, 0, sizeof(E_Fm2_Config)); + fmc.view.mode = E_FM2_VIEW_MODE_LIST; + fmc.view.open_dirs_in_place = 1; + fmc.view.selector = 1; + fmc.view.single_click = 0; + fmc.view.no_subdir_jump = 0; + fmc.icon.list.w = 24; + fmc.icon.list.h = 24; + fmc.icon.fixed.w = 1; + fmc.icon.fixed.h = 1; + fmc.icon.extension.show = 0; + fmc.list.sort.no_case = 1; + fmc.list.sort.dirs.first = 1; + fmc.list.sort.dirs.last = 0; + fmc.selection.single = 1; + fmc.selection.windows_modifiers = 0; + e_fm2_config_set(ofm, &fmc); + + e_fm2_path_set(ofm, "~/", "/"); ob = e_widget_button_add(dia->win->evas, "Up a directory", NULL, _e_test_cb_button, ofm, NULL); e_widget_table_object_append(ot, ob, 1, 0, 1, 1, 0, 0, 1, 0); @@ -646,8 +711,27 @@ _e_test_internal(E_Container *con) /* shortcut list */ ofm = e_fm2_add(dia->win->evas); - /* FIXME: set config */ - e_fm2_path_set(ofm, "~/", "/.e/e/fileman/favorites"); + + memset(&fmc, 0, sizeof(E_Fm2_Config)); + fmc.view.mode = E_FM2_VIEW_MODE_LIST; + fmc.view.open_dirs_in_place = 1; + fmc.view.selector = 1; + fmc.view.single_click = 1; + fmc.view.no_subdir_jump = 1; + fmc.icon.list.w = 24; + fmc.icon.list.h = 24; + fmc.icon.fixed.w = 1; + fmc.icon.fixed.h = 1; + fmc.icon.extension.show = 0; + fmc.list.sort.no_case = 1; + fmc.list.sort.dirs.first = 0; + fmc.list.sort.dirs.last = 0; + fmc.selection.single = 1; + fmc.selection.windows_modifiers = 0; + e_fm2_config_set(ofm, &fmc); + + e_fm2_path_set(ofm, "favorites", "/"); + evas_object_smart_callback_add(ofm, "files_changed", _e_test_cb_favorites_files_changed, ofm2); evas_object_smart_callback_add(ofm, "selected", _e_test_cb_favorites_selected, ofm2); of = e_widget_scrollframe_pan_add(dia->win->evas, ofm, e_fm2_pan_set, e_fm2_pan_get, diff --git a/src/bin/e_thumb.c b/src/bin/e_thumb.c index 9180ab268..256bdcb8c 100644 --- a/src/bin/e_thumb.c +++ b/src/bin/e_thumb.c @@ -121,6 +121,7 @@ e_thumb_icon_begin(Evas_Object *obj) eth = evas_object_data_get(obj, "e_thumbdata"); if (!eth) return; + if (eth->busy) return; if (!eth->file) return; if (!_thumbnailers) { @@ -161,11 +162,7 @@ e_thumb_icon_end(Evas_Object *obj) if (!eth) return; if (eth->queued) _thumb_queue = evas_list_remove(_thumb_queue, eth); eth->queued = 0; - if (eth->busy) - { - printf("REQ DEL %s\n", eth->file); - _e_thumb_gen_end(eth->objid); - } + if (eth->busy) _e_thumb_gen_end(eth->objid); eth->busy = 0; _pending--; if (_pending == 0) _e_thumb_thumbnailers_kill(); @@ -223,6 +220,7 @@ e_thumb_client_del(Ecore_Ipc_Event_Client_Del *e) { if (!evas_list_find(_thumbnailers, e->client)) return; _thumbnailers = evas_list_remove(_thumbnailers, e->client); + if ((!_thumbs) && (!_thumbnailers)) _objid = 0; } /* local subsystem functions */ @@ -300,7 +298,7 @@ _e_thumb_hash_del(int objid) snprintf(buf, sizeof(buf), "%i", objid); _thumbs = evas_hash_del(_thumbs, buf, NULL); - if (!_thumbs) _objid = 0; + if ((!_thumbs) && (!_thumbnailers)) _objid = 0; } static Evas_Object * diff --git a/src/bin/e_thumb_main.c b/src/bin/e_thumb_main.c index 6bb73ea4b..962eb62f6 100644 --- a/src/bin/e_thumb_main.c +++ b/src/bin/e_thumb_main.c @@ -12,6 +12,7 @@ #include #include #include +#include "e_sha1.h" typedef struct _E_Thumb E_Thumb; @@ -29,6 +30,7 @@ static int _e_ipc_cb_server_add(void *data, int type, void *event); static int _e_ipc_cb_server_del(void *data, int type, void *event); static int _e_ipc_cb_server_data(void *data, int type, void *event); static int _e_cb_timer(void *data); +static int _e_thumb_valid(E_Thumb *eth); static void _e_thumb_generate(E_Thumb *eth); static char *_e_thumb_file_id(char *file, char *key); @@ -43,7 +45,8 @@ int main(int argc, char **argv) { int i; - + + nice(20); for (i = 1; i < argc; i++) { if ((!strcmp(argv[i], "-h")) || @@ -168,7 +171,7 @@ _e_ipc_cb_server_data(void *data, int type, void *event) eth->file = strdup(file); if (key) eth->key = strdup(key); _thumblist = evas_list_append(_thumblist, eth); - if (!_timer) _timer = ecore_timer_add(0.001, _e_cb_timer, NULL); + if (!_timer) _timer = ecore_timer_add(0.000001, _e_cb_timer, NULL); } } break; @@ -201,17 +204,36 @@ static int _e_cb_timer(void *data) { E_Thumb *eth; + Evas_List *del_list = NULL, *l; /* take thumb at head of list */ if (_thumblist) { - eth = _thumblist->data; - _thumblist = evas_list_remove_list(_thumblist, _thumblist); - _e_thumb_generate(eth); - if (eth->file) free(eth->file); - if (eth->key) free(eth->key); - free(eth); - if (_thumblist) _timer = ecore_timer_add(0.00001, _e_cb_timer, NULL); + for (l = _thumblist; l; l = l->next) + { + eth = l->data; + if (_e_thumb_valid(eth)) + del_list = evas_list_append(del_list, eth); + } + while (del_list) + { + eth = del_list->data; + del_list = evas_list_remove_list(del_list, del_list); + _thumblist = evas_list_remove(_thumblist, eth); + if (eth->file) free(eth->file); + if (eth->key) free(eth->key); + free(eth); + } + if (_thumblist) + { + eth = _thumblist->data; + _thumblist = evas_list_remove_list(_thumblist, _thumblist); + _e_thumb_generate(eth); + if (eth->file) free(eth->file); + if (eth->key) free(eth->key); + free(eth); + } + if (_thumblist) _timer = ecore_timer_add(0.000001, _e_cb_timer, NULL); else _timer = NULL; } else @@ -219,6 +241,39 @@ _e_cb_timer(void *data) return 0; } +static int +_e_thumb_valid(E_Thumb *eth) +{ + char buf[4096], dbuf[4096], *id, *td; + time_t mtime_orig, mtime_thumb; + + id = _e_thumb_file_id(eth->file, eth->key); + if (!id) return; + + td = strdup(id); + if (!td) + { + free(id); + return; + } + td[2] = 0; + + snprintf(dbuf, sizeof(dbuf), "%s/%s", _thumbdir, td); + snprintf(buf, sizeof(buf), "%s/%s/%s-%ix%i.thm", + _thumbdir, td, id + 2, eth->w, eth->h); + free(id); + free(td); + + mtime_orig = ecore_file_mod_time(eth->file); + mtime_thumb = ecore_file_mod_time(buf); + if (mtime_thumb > mtime_orig) + { + ecore_ipc_server_send(_e_ipc_server, 5, 2, eth->objid, 0, 0, buf, strlen(buf) + 1); + return 1; + } + return 0; +} + static void _e_thumb_generate(E_Thumb *eth) { @@ -240,11 +295,11 @@ _e_thumb_generate(E_Thumb *eth) free(id); return; } - td[3] = 0; + td[2] = 0; snprintf(dbuf, sizeof(dbuf), "%s/%s", _thumbdir, td); snprintf(buf, sizeof(buf), "%s/%s/%s-%ix%i.thm", - _thumbdir, td, id + 3, eth->w, eth->h); + _thumbdir, td, id + 2, eth->w, eth->h); free(id); free(td); @@ -336,56 +391,36 @@ _e_thumb_generate(E_Thumb *eth) ecore_ipc_server_send(_e_ipc_server, 5, 2, eth->objid, 0, 0, buf, strlen(buf) + 1); } +/* FIXME: should use md5 or sha1 sum of the path */ static char * _e_thumb_file_id(char *file, char *key) { - char s[512], *sp; - const char *chmap = - "0123456789abcdef" - "ghijklmnopqrstuv"; - unsigned int id[8], i, t, tt; - int j; - - for (i = 0; i < 8; i++) id[i] = 0x55555555; - - j = 0; - sp = file; - while (*sp) + char s[64]; + const char *chmap = "0123456789abcdef"; + unsigned char *buf, id[20]; + int i, len, lenf; + + len = 0; + lenf = strlen(file); + len += lenf; + len++; + if (key) { - i = ((int)*sp) & 0x7; - id[i] ^= ((int)*sp) << j; - j++; - if (j == 25) j = 0; - sp++; + key += strlen(key); + len++; } + buf = alloca(len); + + strcpy(buf, file); + if (key) strcpy(buf + lenf + 1, key); + + e_sha1_sum(buf, len, id); - sp = key; - if (sp) + for (i = 0; i < 20; i++) { - while (*sp) - { - i = ((int)*sp) & 0x7; - id[i] ^= ((int)*sp) << j; - j++; - if (j == 25) j = 0; - sp++; - } + s[(i * 2) + 0] = chmap[(id[i] >> 4) & 0xf]; + s[(i * 2) + 1] = chmap[(id[i] ) & 0xf]; } - - sp = s; - for (i = 0; i < 8; i++) - { - t = id[i]; - j = 32; - while (j > 0) - { - tt = t & ((1 << 5) - 1); - *sp = chmap[tt]; - t >>= 5; - j -= 5; - sp++; - } - } - *sp = 0; + s[(i * 2)] = 0; return strdup(s); } diff --git a/src/bin/e_utils.c b/src/bin/e_utils.c index 8a05a857e..fa91be2a1 100644 --- a/src/bin/e_utils.c +++ b/src/bin/e_utils.c @@ -595,6 +595,77 @@ e_util_icon_save(Ecore_X_Icon *icon, const char *filename) return ret; } +EAPI char * +e_util_shell_env_path_eval(char *path) +{ + /* evaluate things like: + * $HOME/bling -> /home/user/bling + * $HOME/bin/$HOSTNAME/blah -> /home/user/bin/localhost/blah + * etc. etc. + */ + char buf[4096], *pd, *p, *v1, *v2, *s, *v, *vp; + int esc = 0, invar = 0; + + for (p = path, pd = buf; (pd < (buf + sizeof(buf) - 1)); p++) + { + if (invar) + { + if (!((isalnum(*p)) || (*p == '_'))) + { + v2 = p; + invar = 0; + if ((v2 - v1) > 1) + { + s = alloca(v2 - v1); + strncpy(s, v1 + 1, v2 - v1 - 1); + s[v2 - v1 - 1] = 0; + v = getenv(s); + if (v) + { + vp = v; + while ((*vp) && (pd < (buf + sizeof(buf) - 1))) + { + *pd = *vp; + vp++; + pd++; + } + } + } + if (pd < (buf + sizeof(buf) - 1)) + { + *pd = *p; + pd++; + } + } + } + else + { + if (esc) + { + *pd = *p; + pd++; + } + else + { + if (*p == '\\') esc = 1; + else if (*p == '$') + { + invar = 1; + v1 = p; + } + else + { + *pd = *p; + pd++; + } + } + } + if (*p == 0) break; + } + *pd = 0; + return strdup(buf); +} + /* local subsystem functions */ static void _e_util_container_fake_mouse_up_cb(void *data) diff --git a/src/bin/e_utils.h b/src/bin/e_utils.h index 13441ef67..c71cf3a6d 100644 --- a/src/bin/e_utils.h +++ b/src/bin/e_utils.h @@ -41,6 +41,7 @@ EAPI int e_util_edje_collection_exists(const char *file, const char *co EAPI void e_util_dialog_internal(const char *title, const char *txt); EAPI const char *e_util_filename_escape(const char *filename); EAPI int e_util_icon_save(Ecore_X_Icon *icon, const char *filename); - +EAPI char *e_util_shell_env_path_eval(char *path); + #endif #endif diff --git a/src/bin/e_widget_scrollframe.c b/src/bin/e_widget_scrollframe.c index f21c92b77..8da593cf4 100644 --- a/src/bin/e_widget_scrollframe.c +++ b/src/bin/e_widget_scrollframe.c @@ -42,6 +42,33 @@ e_widget_scrollframe_pan_add(Evas *evas, Evas_Object *pan, void (*pan_set) (Evas return obj; } +EAPI void +e_widget_scrollframe_child_pos_set(Evas_Object *obj, Evas_Coord x, Evas_Coord y) +{ + E_Widget_Data *wd; + + wd = e_widget_data_get(obj); + e_scrollframe_child_pos_set(wd->o_scrollframe, x, y); +} + +EAPI void +e_widget_scrollframe_child_pos_get(Evas_Object *obj, Evas_Coord *x, Evas_Coord *y) +{ + E_Widget_Data *wd; + + wd = e_widget_data_get(obj); + e_scrollframe_child_pos_get(wd->o_scrollframe, x, y); +} + +EAPI void +e_widget_scrollframe_child_region_show(Evas_Object *obj, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h) +{ + E_Widget_Data *wd; + + wd = e_widget_data_get(obj); + e_scrollframe_child_region_show(wd->o_scrollframe, x, y, w, h); +} + /* Private functions */ static void _e_wid_del_hook(Evas_Object *obj) diff --git a/src/bin/e_widget_scrollframe.h b/src/bin/e_widget_scrollframe.h index d66d4a9fb..c0a92c77e 100644 --- a/src/bin/e_widget_scrollframe.h +++ b/src/bin/e_widget_scrollframe.h @@ -7,6 +7,9 @@ #define E_WIDGET_SCROLLFRAME_H EAPI Evas_Object *e_widget_scrollframe_pan_add(Evas *evas, Evas_Object *pan, void (*pan_set) (Evas_Object *obj, Evas_Coord x, Evas_Coord y), void (*pan_get) (Evas_Object *obj, Evas_Coord *x, Evas_Coord *y), void (*pan_max_get) (Evas_Object *obj, Evas_Coord *x, Evas_Coord *y), void (*pan_child_size_get) (Evas_Object *obj, Evas_Coord *x, Evas_Coord *y)); +EAPI void e_widget_scrollframe_child_pos_set(Evas_Object *obj, Evas_Coord x, Evas_Coord y); +EAPI void e_widget_scrollframe_child_pos_get(Evas_Object *obj, Evas_Coord *x, Evas_Coord *y); +EAPI void e_widget_scrollframe_child_region_show(Evas_Object *obj, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h); #endif #endif