From 6616e80768031e855eccbbeadd145b7546ff3ac8 Mon Sep 17 00:00:00 2001 From: Thomas Leonard Date: Tue, 15 Jun 1999 13:15:20 +0000 Subject: [PATCH] r4: Now displays the names of all files in the directory. --- ROX-Filer/src/directory.c | 60 ++++++++++++++---------------------------- ROX-Filer/src/directory.h | 9 +++---- ROX-Filer/src/filer.c | 66 ++++++++++++++++++++++++++++++++++++++++++----- ROX-Filer/src/filer.h | 7 +++++ 4 files changed, 89 insertions(+), 53 deletions(-) diff --git a/ROX-Filer/src/directory.c b/ROX-Filer/src/directory.c index 11fb0524..e1483afc 100644 --- a/ROX-Filer/src/directory.c +++ b/ROX-Filer/src/directory.c @@ -17,61 +17,41 @@ #include "support.h" #include "directory.h" -/* Creates and fills in the files list for a directory. - * Returns TRUE on success, else FALSE and errno gives error. +/* Calls the callback function for each object in the directory. + * '.' and '..' are ignored. + * Returns FALSE on error (errno is set). */ -gboolean directory_scan(Directory *directory) +gboolean directory_scan(Directory *directory, + void (*callback)(char *name, gpointer user_data), + gpointer user_data) { - FileInfo *files; - int files_size, n_files; DIR *dir; struct dirent *next; - gboolean retval; g_return_val_if_fail(directory != NULL, FALSE); - g_return_val_if_fail(directory->files == NULL, FALSE); - - files = g_malloc(sizeof(FileInfo) * 8); - files_size = 8; - n_files = 0; dir = opendir(directory->path); - if (dir) + if (!dir) + return FALSE; + + while ((next = readdir(dir))) { - while ((next = readdir(dir))) - { - char *name = next->d_name; + char *name = next->d_name; - /* Ignore '.' and '..' */ - if (*name == '.' && (name[1] == '\0' + /* Ignore '.' and '..' */ + if (*name == '.' && (name[1] == '\0' || (name[1] == '.' && name[2] == '\0'))) - continue; - - if (n_files >= files_size) - { - files_size += files_size / 2; - files = g_realloc(files, - sizeof(FileInfo) * files_size); - printf("[ resized to %d items ]\n", files_size); - } - files[n_files++].name = g_strdup(name); - } - - /* An error here should be ignored - NFS seems to generate - * unnecessary errors. - */ - - closedir(dir); + continue; - retval = TRUE; + callback(name, user_data); } - else - retval = FALSE; - directory->files = files; - directory->number_of_files = n_files; + /* An error here should be ignored - NFS seems to generate + * unnecessary errors. + */ + closedir(dir); - return retval; + return TRUE; } /* Public methods */ diff --git a/ROX-Filer/src/directory.h b/ROX-Filer/src/directory.h index 04d9cda9..80eba016 100644 --- a/ROX-Filer/src/directory.h +++ b/ROX-Filer/src/directory.h @@ -18,12 +18,9 @@ struct _Directory int number_of_files; }; -struct _FileInfo -{ - char *name; -}; - -gboolean directory_scan(Directory *directory); +gboolean directory_scan(Directory *directory, + void (*callback)(char *name, gpointer user_data), + gpointer data); Directory *directory_new(char *path); void directory_destroy(Directory *dir); diff --git a/ROX-Filer/src/filer.c b/ROX-Filer/src/filer.c index abe6b2d7..d483489e 100644 --- a/ROX-Filer/src/filer.c +++ b/ROX-Filer/src/filer.c @@ -24,6 +24,11 @@ static int number_of_windows = 0; /* Static prototypes */ static void filer_window_destroyed(GtkWidget *widget, FilerWindow *filer_window); +static void scan_callback(char *leafname, gpointer data); +static void draw_item(GtkWidget *widget, + gpointer data, + gboolean selected, + GdkRectangle *area); static void filer_window_destroyed(GtkWidget *widget, @@ -31,11 +36,53 @@ static void filer_window_destroyed(GtkWidget *widget, { directory_destroy(filer_window->dir); g_free(filer_window); - + if (--number_of_windows < 1) gtk_main_quit(); } +static void scan_callback(char *leafname, gpointer data) +{ + FilerWindow *filer_window = (FilerWindow *) data; + FileItem *item; + + item = g_malloc(sizeof(FileItem)); + item->leafname = g_strdup(leafname); + + collection_insert(filer_window->collection, item); + + item->text_width = gdk_string_width(filer_window->window->style->font, + leafname); + + if (item->text_width + 4 > filer_window->collection->item_width) + collection_set_item_size(filer_window->collection, + item->text_width + 4, + filer_window->collection->item_height); +} + +static void draw_item(GtkWidget *widget, + gpointer data, + gboolean selected, + GdkRectangle *area) +{ + FileItem *item = (FileItem *) data; + + gdk_draw_rectangle(widget->window, + widget->style->black_gc, + FALSE, + area->x, area->y, + area->width - 1, area->height - 1); + + gdk_draw_text(widget->window, + widget->style->font, + selected ? widget->style->white_gc + : widget->style->black_gc, + area->x + ((area->width - item->text_width) >> 1), + area->y + area->height - + widget->style->font->descent - 2, + item->leafname, strlen(item->leafname)); +} + void filer_opendir(char *path) { GtkWidget *hbox, *scrollbar, *collection; @@ -44,26 +91,31 @@ void filer_opendir(char *path) filer_window = g_malloc(sizeof(FilerWindow)); filer_window->dir = directory_new(path); - if (!directory_scan(filer_window->dir)) - report_error("Error opening directory", g_strerror(errno)); + collection = collection_new(NULL); + filer_window->collection = COLLECTION(collection); + collection_set_functions(filer_window->collection, + draw_item, NULL); filer_window->window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(filer_window->window), filer_window->dir->path); + gtk_window_set_default_size(GTK_WINDOW(filer_window->window), + 400, 200); hbox = gtk_hbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(filer_window->window), hbox); - collection = collection_new(NULL); gtk_box_pack_start(GTK_BOX(hbox), collection, TRUE, TRUE, 0); - filer_window->collection = COLLECTION(collection); scrollbar = gtk_vscrollbar_new(COLLECTION(collection)->vadj); gtk_box_pack_start(GTK_BOX(hbox), scrollbar, FALSE, TRUE, 0); + gtk_signal_connect(GTK_OBJECT(filer_window->window), "destroy", + filer_window_destroyed, filer_window); + gtk_widget_show_all(filer_window->window); number_of_windows++; - gtk_signal_connect(GTK_OBJECT(filer_window->window), "destroy", - filer_window_destroyed, filer_window); + if (!directory_scan(filer_window->dir, scan_callback, filer_window)) + report_error("Error opening directory", g_strerror(errno)); } diff --git a/ROX-Filer/src/filer.h b/ROX-Filer/src/filer.h index ecc37334..bc79ae4b 100644 --- a/ROX-Filer/src/filer.h +++ b/ROX-Filer/src/filer.h @@ -10,6 +10,7 @@ #include "directory.h" typedef struct _FilerWindow FilerWindow; +typedef struct _FileItem FileItem; struct _FilerWindow { @@ -18,4 +19,10 @@ struct _FilerWindow Directory *dir; }; +struct _FileItem +{ + char *leafname; + int text_width; +}; + void filer_opendir(char *path); -- 2.11.4.GIT