Enlightenment CVS committal Author : raster Project : e17 Module : apps/e
Dir : e17/apps/e/src/bin Modified Files: e_config.c e_fm_custom.c Log Message: custom file info now works right - rename, del and set. will do recursive stuff - but its only going to be efficient for a small number of custom items (maybe 100 or less). more than that and it might really needs to have a full tree struct in the file. =================================================================== RCS file: /cvs/e/e17/apps/e/src/bin/e_config.c,v retrieving revision 1.242 retrieving revision 1.243 diff -u -3 -r1.242 -r1.243 --- e_config.c 12 May 2007 22:40:03 -0000 1.242 +++ e_config.c 24 May 2007 23:28:54 -0000 1.243 @@ -1151,6 +1151,18 @@ CFG_WHEELBIND(E_BINDING_CONTEXT_BORDER, 1, 1, E_BINDING_MODIFIER_ALT, 0, "desk_linear_flip_by", "1"); + CFG_WHEELBIND(E_BINDING_CONTEXT_POPUP, 0, -1, + E_BINDING_MODIFIER_ALT, 0, + "desk_linear_flip_by", "-1"); + CFG_WHEELBIND(E_BINDING_CONTEXT_POPUP, 1, -1, + E_BINDING_MODIFIER_ALT, 0, + "desk_linear_flip_by", "-1"); + CFG_WHEELBIND(E_BINDING_CONTEXT_POPUP, 0, 1, + E_BINDING_MODIFIER_ALT, 0, + "desk_linear_flip_by", "1"); + CFG_WHEELBIND(E_BINDING_CONTEXT_POPUP, 1, 1, + E_BINDING_MODIFIER_ALT, 0, + "desk_linear_flip_by", "1"); } IFCFGEND; IFCFG(0x0093); /* the version # where this value(s) was introduced */ =================================================================== RCS file: /cvs/e/e17/apps/e/src/bin/e_fm_custom.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -3 -r1.3 -r1.4 --- e_fm_custom.c 23 May 2007 12:07:14 -0000 1.3 +++ e_fm_custom.c 24 May 2007 23:28:54 -0000 1.4 @@ -3,9 +3,12 @@ */ #include "e.h" +static Evas_Bool _e_fm2_custom_file_hash_foreach_list(Evas_Hash *hash, const char *key, void *data, void *fdata); +static Evas_List *_e_fm2_custom_hash_key_base_list(Evas_Hash *hash, const char *str); +static Evas_Bool _e_fm2_custom_file_hash_foreach_sub_list(Evas_Hash *hash, const char *key, void *data, void *fdata); +static Evas_List *_e_fm2_custom_hash_key_sub_list(Evas_Hash *hash, const char *str); static Evas_Bool _e_fm2_custom_file_hash_foreach(Evas_Hash *hash, const char *key, void *data, void *fdata); static Evas_Bool _e_fm2_custom_file_hash_foreach_save(Evas_Hash *hash, const char *key, void *data, void *fdata); -static void _e_fm2_custom_file_info_clean(void); static void _e_fm2_custom_file_info_load(void); static void _e_fm2_custom_file_info_save(void); static void _e_fm2_custom_file_info_free(void); @@ -18,13 +21,12 @@ static int _e_fm2_custom_writes = 0; -/* FIXME: this is ery delicate. keeping the eet file open is a recipe - * for distater. it already is. we need to ONLY open the file for writing when - * writing - write to tmp file then atomically rename it to the real config. - * also need to handle tree moves and deletes. if u rename or delete a - * parent node - delete all children too. - +/* FIXME: this uses a flat path key for custom file info. this is fine as + * long as we only expect a limited number of custom info nodes. if we + * start to see whole dire trees stored this way things will suck. we need + * to use a tree struct to store this so deletes and renmes are sane. */ + /* externally accessible functions */ EAPI int e_fm2_custom_file_init(void) @@ -85,26 +87,8 @@ _e_fm2_custom_file_info_load(); if (!_e_fm2_custom_file) return NULL; - /* get any custom info for the path in our metadata - if non exists, - * return NULL. This may mean loading upa chunk of metadata off disk - * on demand and caching it */ - if (_e_fm2_flush_timer) - { - ecore_timer_del(_e_fm2_flush_timer); - _e_fm2_flush_timer = ecore_timer_add(1.0, _e_fm2_custom_file_cb_timer_save, NULL); - } -// printf("FIND CUSTOM %s\n", path); + if (_e_fm2_flush_timer) e_fm2_custom_file_flush(); cf = evas_hash_find(_e_fm2_custom_hash, path); - if (cf) return cf; - cf = eet_data_read(_e_fm2_custom_file, _e_fm2_custom_file_edd, path); - if (cf) - _e_fm2_custom_hash = evas_hash_add(_e_fm2_custom_hash, path, cf); - if (cf) - { - printf("CUSTOM FILE for %s:\n" - " type=%i,icon=%s,valid=%i\n", - path, cf->icon.type, cf->icon.icon, cf->icon.valid); - } return cf; } @@ -113,12 +97,7 @@ { _e_fm2_custom_file_info_load(); if (!_e_fm2_custom_file) return; - if (_e_fm2_flush_timer) - { - ecore_timer_del(_e_fm2_flush_timer); - _e_fm2_flush_timer = ecore_timer_add(1.0, _e_fm2_custom_file_cb_timer_save, NULL); - } - /* set custom metadata for a file path - save it to the metadata (or queue it) */ + if (_e_fm2_flush_timer) e_fm2_custom_file_flush(); if (evas_hash_find(_e_fm2_custom_hash, path) != cf) { E_Fm2_Custom_File *cf2; @@ -132,74 +111,92 @@ if (cf->label) cf2->label = evas_stringshare_add(cf->label); _e_fm2_custom_hash = evas_hash_add(_e_fm2_custom_hash, path, cf2); - cf = cf2; } } -/* - printf("SET CUSTOM %s %p %s %i %i\n", - path, cf, cf->icon.icon, cf->icon.type, cf->icon.valid); - printf("_e_fm2_custom_file = %p, _e_fm2_custom_file_edd=%p\n", - _e_fm2_custom_file, _e_fm2_custom_file_edd); - */ -// eet_data_write(_e_fm2_custom_file, _e_fm2_custom_file_edd, path, cf, 1); _e_fm2_custom_writes = 1; } EAPI void e_fm2_custom_file_del(const char *path) { - E_Fm2_Custom_File *cf; - + Evas_List *list, *l; + E_Fm2_Custom_File *cf2; + _e_fm2_custom_file_info_load(); if (!_e_fm2_custom_file) return; - /* delete a custom metadata entry for a path - save changes (or queue it) */ - if (_e_fm2_flush_timer) - { - ecore_timer_del(_e_fm2_flush_timer); - _e_fm2_flush_timer = ecore_timer_add(1.0, _e_fm2_custom_file_cb_timer_save, NULL); - } -/* printf("DEL CUSTOM %s\n",path);*/ - cf = evas_hash_find(_e_fm2_custom_hash, path); - if (cf) + if (_e_fm2_flush_timer) e_fm2_custom_file_flush(); + + list = _e_fm2_custom_hash_key_base_list(_e_fm2_custom_hash, path); + if (list) { - _e_fm2_custom_hash = evas_hash_del(_e_fm2_custom_hash, path, cf); - if (cf->icon.icon) evas_stringshare_del(cf->icon.icon); - if (cf->label) evas_stringshare_del(cf->label); - free(cf); + for (l = list; l; l = l->next) + { + cf2 = evas_hash_find(_e_fm2_custom_hash, l->data); + if (cf2) + { + _e_fm2_custom_hash = evas_hash_del(_e_fm2_custom_hash, + l->data, cf2); + if (cf2->icon.icon) evas_stringshare_del(cf2->icon.icon); + if (cf2->label) evas_stringshare_del(cf2->label); + free(cf2); + } + } + evas_list_free(list); } - // FIXME: ad to changeset (delete set) -// eet_delete(_e_fm2_custom_file, path); _e_fm2_custom_writes = 1; } EAPI void e_fm2_custom_file_rename(const char *path, const char *new_path) { - E_Fm2_Custom_File *cf; + E_Fm2_Custom_File *cf, *cf2; + Evas_List *list, *l; void *dat; int size; _e_fm2_custom_file_info_load(); if (!_e_fm2_custom_file) return; - /* rename file path a to file paht b in the metadata - if the path exists */ - if (_e_fm2_flush_timer) - { - ecore_timer_del(_e_fm2_flush_timer); - _e_fm2_flush_timer = ecore_timer_add(1.0, _e_fm2_custom_file_cb_timer_save, NULL); + if (_e_fm2_flush_timer) e_fm2_custom_file_flush(); + cf2 = evas_hash_find(_e_fm2_custom_hash, path); + if (cf2) + { + _e_fm2_custom_hash = evas_hash_del(_e_fm2_custom_hash, path, cf2); + cf = evas_hash_find(_e_fm2_custom_hash, new_path); + if (cf) + { + if (cf->icon.icon) evas_stringshare_del(cf->icon.icon); + if (cf->label) evas_stringshare_del(cf->label); + free(cf); + } + _e_fm2_custom_hash = evas_hash_add(_e_fm2_custom_hash, new_path, cf2); } - cf = evas_hash_find(_e_fm2_custom_hash, path); - if (cf) + list = _e_fm2_custom_hash_key_base_list(_e_fm2_custom_hash, path); + if (list) { - _e_fm2_custom_hash = evas_hash_del(_e_fm2_custom_hash, path, cf); - _e_fm2_custom_hash = evas_hash_add(_e_fm2_custom_hash, new_path, cf); + for (l = list; l; l = l->next) + { + cf2 = evas_hash_find(_e_fm2_custom_hash, l->data); + if (cf2) + { + char buf[PATH_MAX]; + + strcpy(buf, new_path); + strcat(buf, l->data + strlen(path)); + _e_fm2_custom_hash = evas_hash_del(_e_fm2_custom_hash, + l->data, cf2); + cf = evas_hash_find(_e_fm2_custom_hash, buf); + if (cf) + { + if (cf->icon.icon) evas_stringshare_del(cf->icon.icon); + if (cf->label) evas_stringshare_del(cf->label); + free(cf); + } + _e_fm2_custom_hash = evas_hash_add(_e_fm2_custom_hash, + buf, cf2); + } + } + evas_list_free(list); } - // FIXME: ad to changeset (delete set) -// dat = eet_read(_e_fm2_custom_file, path, &size); -// if (dat) -// { -// eet_write(_e_fm2_custom_file, new_path, dat, size, 1); -// free(dat); -// } _e_fm2_custom_writes = 1; } @@ -209,16 +206,64 @@ if (!_e_fm2_custom_file) return; if (_e_fm2_flush_timer) ecore_timer_del(_e_fm2_flush_timer); _e_fm2_flush_timer = ecore_timer_add(1.0, _e_fm2_custom_file_cb_timer_save, NULL); -/* - if (_e_fm2_flush_timer) ecore_timer_del(_e_fm2_flush_timer); - _e_fm2_flush_timer = ecore_timer_add(1.0, _e_fm2_custom_file_cb_timer_save, NULL); - _e_fm2_custom_file_info_save(); - _e_fm2_custom_file_info_free(); - */ } /**/ +struct _E_Custom_List +{ + Evas_List *l; + const char *base; + int base_len; +}; + +static Evas_Bool +_e_fm2_custom_file_hash_foreach_list(Evas_Hash *hash, const char *key, void *data, void *fdata) +{ + struct _E_Custom_List *cl; + + cl = fdata; + if (!strncmp(cl->base, key, cl->base_len)) + cl->l = evas_list_append(cl->l, key); + return 1; +} + +static Evas_List * +_e_fm2_custom_hash_key_base_list(Evas_Hash *hash, const char *str) +{ + struct _E_Custom_List cl; + + cl.l = NULL; + cl.base = str; + cl.base_len = strlen(cl.base); + evas_hash_foreach(hash, + _e_fm2_custom_file_hash_foreach_list, &cl); + return cl.l; +} + +static Evas_Bool +_e_fm2_custom_file_hash_foreach_sub_list(Evas_Hash *hash, const char *key, void *data, void *fdata) +{ + struct _E_Custom_List *cl; + + cl = fdata; + if (!strncmp(cl->base, key, strlen(key))) + cl->l = evas_list_append(cl->l, key); + return 1; +} + +static Evas_List * +_e_fm2_custom_hash_key_sub_list(Evas_Hash *hash, const char *str) +{ + struct _E_Custom_List cl; + + cl.l = NULL; + cl.base = str; + evas_hash_foreach(hash, + _e_fm2_custom_file_hash_foreach_sub_list, &cl); + return cl.l; +} + static Evas_Bool _e_fm2_custom_file_hash_foreach(Evas_Hash *hash, const char *key, void *data, void *fdata) { @@ -239,33 +284,11 @@ ef = fdata; cf = data; - printf("W NEW %s %p\n", key, ef); eet_data_write(ef, _e_fm2_custom_file_edd, key, cf, 1); return 1; } static void -_e_fm2_custom_file_info_clean(void) -{ - char **list; - int i, num; - - /* FIXME: this could be nasty on interactivity */ - _e_fm2_custom_file_info_load(); - if (!_e_fm2_custom_file) return; - - list = eet_list(_e_fm2_custom_file, "*", &num); - for (i = 0; i < num; i++) - { - if (!ecore_file_exists(list[i])) - eet_delete(_e_fm2_custom_file, list[i]); - } - if (list) free(list); - - e_fm2_custom_file_flush(); -} - -static void _e_fm2_custom_file_info_load(void) { char buf[PATH_MAX]; @@ -277,6 +300,26 @@ _e_fm2_custom_file = eet_open(buf, EET_FILE_MODE_READ); if (!_e_fm2_custom_file) _e_fm2_custom_file = eet_open(buf, EET_FILE_MODE_WRITE); + if (_e_fm2_custom_file) + { + E_Fm2_Custom_File *cf; + char **list; + int i, num; + + list = eet_list(_e_fm2_custom_file, "*", &num); + if (list) + { + for (i = 0; i < num; i++) + { + cf = eet_data_read(_e_fm2_custom_file, + _e_fm2_custom_file_edd, list[i]); + if (cf) + _e_fm2_custom_hash = evas_hash_add(_e_fm2_custom_hash, + list[i], cf); + } + free(list); + } + } } static void @@ -284,32 +327,14 @@ { Eet_File *ef; char buf[PATH_MAX], buf2[PATH_MAX]; - char **list; - int i, num, ret; + int ret; - printf("_e_fm2_custom_file_info_save %p %i\n", _e_fm2_custom_file, _e_fm2_custom_writes); if (!_e_fm2_custom_file) return; if (!_e_fm2_custom_writes) return; snprintf(buf, sizeof(buf), "%s/.e/e/fileman/custom.cfg.tmp", e_user_homedir_get()); ef = eet_open(buf, EET_FILE_MODE_WRITE); - printf("%p\n", ef); if (!ef) return; - list = eet_list(_e_fm2_custom_file, "*", &num); - for (i = 0; i < num; i++) - { - void *dat; - int size; - - dat = eet_read(_e_fm2_custom_file, list[i], &size); - if (dat) - { - printf("W OLD %s\n", list[i]); - eet_write(ef, list[i], dat, size, 1); - free(dat); - } - } - if (list) free(list); evas_hash_foreach(_e_fm2_custom_hash, _e_fm2_custom_file_hash_foreach_save, ef); eet_close(ef); @@ -317,7 +342,6 @@ e_user_homedir_get()); eet_close(_e_fm2_custom_file); _e_fm2_custom_file = NULL; - printf("RENAME %s -> %s\n", buf, buf2); ret = rename(buf, buf2); if (ret < 0) { @@ -338,7 +362,8 @@ } if (_e_fm2_custom_hash) { - evas_hash_foreach(_e_fm2_custom_hash, _e_fm2_custom_file_hash_foreach, NULL); + evas_hash_foreach(_e_fm2_custom_hash, + _e_fm2_custom_file_hash_foreach, NULL); evas_hash_free(_e_fm2_custom_hash); _e_fm2_custom_hash = NULL; } ------------------------------------------------------------------------- This SF.net email is sponsored by DB2 Express Download DB2 Express C - the FREE version of DB2 express and take control of your XML. No limits. Just data. Click to get it now. http://sourceforge.net/powerbar/db2/ _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs