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
[email protected]
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs