Enlightenment CVS committal Author : codewarrior Project : e17 Module : apps/exhibit
Dir : e17/apps/exhibit/src/bin Modified Files: exhibit_main.c Log Message: big dirs load much faster now. tested on a dir with 3000 images without any gui blocks. note: sorting is done after everything is loaded for now, this needs fixing =================================================================== RCS file: /cvs/e/e17/apps/exhibit/src/bin/exhibit_main.c,v retrieving revision 1.109 retrieving revision 1.110 diff -u -3 -r1.109 -r1.110 --- exhibit_main.c 6 Jul 2007 11:11:49 -0000 1.109 +++ exhibit_main.c 6 Jul 2007 18:58:10 -0000 1.110 @@ -3,9 +3,23 @@ */ #include "exhibit.h" +/* defines the max number of additions to the tree per timer tick */ +#define MAX_INSERTS_PER_ITERATION 200 + +/* defines the timer tick interval for tree inserts */ +#define INSERTS_INTERVAL 0.15 + extern pid_t pid; extern Evas_List *thumb_list; +typedef struct _Ex_Populate_Data Ex_Populate_Data; + +struct _Ex_Populate_Data +{ + char *selected_file; + Ex_Tree_Update update; +}; + Exhibit *e; Evas_List *event_handlers; @@ -202,44 +216,31 @@ return strcasecmp(dir1, dir2); } -void -_ex_main_populate_files(const char *selected_file, Ex_Tree_Update update) +int +_ex_main_populate_files_timer_cb(void *fdata) { - char back[PATH_MAX]; - DIR *dir; + Ex_Populate_Data *data; + int i = 0; + static DIR *dir = NULL; struct dirent *dir_entry; - - _ex_main_image_unset(); - chdir(e->cur_tab->dir); - - if (update == EX_TREE_UPDATE_ALL || update == EX_TREE_UPDATE_DIRS) - { - snprintf(back, PATH_MAX, ".."); - etk_tree_row_append(ETK_TREE(e->cur_tab->dtree), NULL, e->cur_tab->dcol, - etk_theme_icon_path_get(), "actions/go-up_16", back, NULL); - } - - if (e->cur_tab->monitor) + + data = fdata; + if (!dir) { - D(("Removing old monitoring\n")); - ecore_file_monitor_del(e->cur_tab->monitor); - e->cur_tab->monitor = NULL; + if ((dir = opendir(".")) == NULL) + { + if (data) + { + if (data->selected_file) + free(data->selected_file); + free(data); + } + return 0; + } } - if ((dir = opendir(".")) == NULL) - return; - etk_tree_freeze(ETK_TREE(e->cur_tab->itree)); - etk_tree_freeze(ETK_TREE(e->cur_tab->dtree)); - - getcwd(e->cur_tab->cur_path, PATH_MAX); - if (strlen(e->cur_tab->cur_path) < PATH_MAX - 2) - { - int len = strlen(e->cur_tab->cur_path); - e->cur_tab->cur_path[len] = '/'; - e->cur_tab->cur_path[len + 1] = '\0'; - } - etk_entry_text_set(ETK_ENTRY(etk_combobox_entry_entry_get(ETK_COMBOBOX_ENTRY(e->combobox_entry))), e->cur_tab->cur_path); + etk_tree_freeze(ETK_TREE(e->cur_tab->dtree)); while ((dir_entry = readdir(dir)) != NULL) { @@ -247,6 +248,7 @@ char imagereal[PATH_MAX]; struct stat st; + ++i; /* Do not include current dir/above dir */ if ((!strcmp (dir_entry->d_name, ".")) || (!strcmp (dir_entry->d_name, ".."))) continue; @@ -254,10 +256,10 @@ /* Show hidden files and directories? */ if ((!e->options->list_hidden) && (dir_entry->d_name[0] == '.')) continue; - + snprintf(image, PATH_MAX, "%s", dir_entry->d_name); - if (update == EX_TREE_UPDATE_ALL || update == EX_TREE_UPDATE_DIRS) + if (data->update == EX_TREE_UPDATE_ALL || data->update == EX_TREE_UPDATE_DIRS) { if(stat(image, &st) == -1) continue; if(S_ISDIR(st.st_mode)) @@ -273,7 +275,7 @@ } /* If we don't want to do the rtree updating */ - if (update == EX_TREE_UPDATE_DIRS) + if (data->update == EX_TREE_UPDATE_DIRS) continue; if ((!e->options->show_all_filetypes) && (!_ex_file_is_viewable(dir_entry->d_name))) @@ -282,13 +284,19 @@ if(!realpath(image, imagereal)) snprintf(imagereal, PATH_MAX, "%s", image); - _ex_main_itree_add(imagereal, selected_file); + _ex_main_itree_add(imagereal, data->selected_file); + + if (i == MAX_INSERTS_PER_ITERATION) + { + etk_tree_thaw(ETK_TREE(e->cur_tab->itree)); + etk_tree_thaw(ETK_TREE(e->cur_tab->dtree)); + + ecore_timer_add(INSERTS_INTERVAL, _ex_main_populate_files_timer_cb, data); + return 0; + } } - etk_tree_thaw(ETK_TREE(e->cur_tab->itree)); - etk_tree_thaw(ETK_TREE(e->cur_tab->dtree)); - - if (update == EX_TREE_UPDATE_FILES || update == EX_TREE_UPDATE_ALL) + if (data->update == EX_TREE_UPDATE_FILES || data->update == EX_TREE_UPDATE_ALL) { if (e->options->default_sort == EX_SORT_BY_DATE) _ex_sort_date_cb(NULL, NULL); @@ -300,9 +308,12 @@ _ex_sort_resol_cb(NULL, NULL); } - if (update == EX_TREE_UPDATE_ALL || update == EX_TREE_UPDATE_DIRS) - etk_tree_col_sort_full(e->cur_tab->dcol, _ex_main_dtree_compare_cb, - NULL, ETK_TRUE); + if (data->update == EX_TREE_UPDATE_ALL || data->update == EX_TREE_UPDATE_DIRS) + etk_tree_col_sort_full(e->cur_tab->dcol, _ex_main_dtree_compare_cb, + NULL, ETK_TRUE); + + etk_tree_thaw(ETK_TREE(e->cur_tab->itree)); + etk_tree_thaw(ETK_TREE(e->cur_tab->dtree)); if (!e->cur_tab->monitor) { @@ -310,13 +321,58 @@ e->cur_tab->monitor = ecore_file_monitor_add(e->cur_tab->cur_path, _ex_main_monitor_dir, NULL); } + + dir = NULL; + closedir(dir); + free(data->selected_file); + free(data); + return 0; +} + +void +_ex_main_populate_files(const char *selected_file, Ex_Tree_Update update) +{ + char back[PATH_MAX]; + Ex_Populate_Data *data; + + _ex_main_image_unset(); + chdir(e->cur_tab->dir); + + if (update == EX_TREE_UPDATE_ALL || update == EX_TREE_UPDATE_DIRS) + { + snprintf(back, PATH_MAX, ".."); + etk_tree_row_append(ETK_TREE(e->cur_tab->dtree), NULL, e->cur_tab->dcol, + etk_theme_icon_path_get(), "actions/go-up_16", back, NULL); + } + if (e->cur_tab->monitor) + { + D(("Removing old monitoring\n")); + ecore_file_monitor_del(e->cur_tab->monitor); + e->cur_tab->monitor = NULL; + } + + getcwd(e->cur_tab->cur_path, PATH_MAX); + if (strlen(e->cur_tab->cur_path) < PATH_MAX - 2) + { + int len = strlen(e->cur_tab->cur_path); + e->cur_tab->cur_path[len] = '/'; + e->cur_tab->cur_path[len + 1] = '\0'; + } + etk_entry_text_set(ETK_ENTRY(etk_combobox_entry_entry_get(ETK_COMBOBOX_ENTRY(e->combobox_entry))), e->cur_tab->cur_path); + + data = calloc(1, sizeof(Ex_Populate_Data)); + if (selected_file) + data->selected_file = strdup(selected_file); + else + data->selected_file = NULL; + data->update = update; + ecore_timer_add(0.001, _ex_main_populate_files_timer_cb, data); + /* Set the dir to the current dir at the end so we avoid stepdown * like ".." if we just call the refresh on the listing like after a delete */ - e->cur_tab->dir = strdup("."); - - closedir(dir); + e->cur_tab->dir = strdup("."); } void ------------------------------------------------------------------------- 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