From 1ca9f3f0811e1430bfd4bb207a8c149145525ca3 Mon Sep 17 00:00:00 2001 From: Thomas Leonard Date: Thu, 22 Jul 2004 23:18:19 +0000 Subject: [PATCH] r3597: Bugfix: When opening a new directory with saved settings, the filer would print a warning and then crash. --- ROX-Filer/Help/Changes | 5 +++++ ROX-Filer/src/dir.c | 24 ++++++++++++++++++++++++ ROX-Filer/src/filer.c | 48 ++++++++++++++++++++++++++++++++++++++++++++---- 3 files changed, 73 insertions(+), 4 deletions(-) diff --git a/ROX-Filer/Help/Changes b/ROX-Filer/Help/Changes index c059b8ec..c5719421 100644 --- a/ROX-Filer/Help/Changes +++ b/ROX-Filer/Help/Changes @@ -2,6 +2,11 @@ A RISC OS-like filer for X by Thomas Leonard +23-Jul-2004 +~~~~~~~~~~~ +Bugfix: When opening a new directory with saved settings, the filer would + print a warning and then crash. + 21-Jul-2004 ~~~~~~~~~~~ Changed email address given as the one to send bugs to when using diff --git a/ROX-Filer/src/dir.c b/ROX-Filer/src/dir.c index 918e8928..d453370e 100644 --- a/ROX-Filer/src/dir.c +++ b/ROX-Filer/src/dir.c @@ -78,6 +78,9 @@ gboolean dnotify_wakeup_flag = FALSE; static int dnotify_last_fd = -1; #endif +/* For debugging. Can't detach when this is non-zero. */ +static int in_callback = 0; + GFSCache *dir_cache = NULL; /* Static prototypes */ @@ -196,6 +199,7 @@ void dir_detach(Directory *dir, DirCallback callback, gpointer data) g_return_if_fail(dir != NULL); g_return_if_fail(callback != NULL); + g_return_if_fail(in_callback == 0); for (list = dir->users; list; list = list->next) { @@ -332,6 +336,8 @@ static void dir_set_scanning(Directory *dir, gboolean scanning) if (scanning == dir->scanning) return; + in_callback++; + dir->scanning = scanning; for (next = dir->users; next; next = next->next) @@ -342,6 +348,8 @@ static void dir_set_scanning(Directory *dir, gboolean scanning) scanning ? DIR_START_SCAN : DIR_END_SCAN, NULL, user->data); } + + in_callback--; } /* Notify everyone that the error status of the directory has changed */ @@ -349,12 +357,16 @@ static void dir_error_changed(Directory *dir) { GList *next; + in_callback++; + for (next = dir->users; next; next = next->next) { DirUser *user = (DirUser *) next->data; user->callback(dir, DIR_ERROR_CHANGED, NULL, user->data); } + + in_callback--; } /* This is called in the background when there are items on the @@ -411,6 +423,8 @@ void dir_merge_new(Directory *dir) GPtrArray *gone = dir->gone_items; GList *list; guint i; + + in_callback++; for (list = dir->users; list; list = list->next) { @@ -424,6 +438,8 @@ void dir_merge_new(Directory *dir) user->callback(dir, DIR_REMOVE, gone, user->data); } + in_callback--; + for (i = 0; i < new->len; i++) { DirItem *item = (DirItem *) new->pdata[i]; @@ -509,12 +525,16 @@ static void notify_deleted(Directory *dir, GPtrArray *deleted) if (!deleted->len) return; + in_callback++; + for (next = dir->users; next; next = next->next) { DirUser *user = (DirUser *) next->data; user->callback(dir, DIR_REMOVE, deleted, user->data); } + + in_callback--; } static void mark_unused(gpointer key, gpointer value, gpointer data) @@ -742,6 +762,8 @@ static void dir_force_update_item(Directory *dir, const gchar *leaf) g_ptr_array_add(items, item); + in_callback++; + for (list = dir->users; list; list = list->next) { DirUser *user = (DirUser *) list->data; @@ -749,6 +771,8 @@ static void dir_force_update_item(Directory *dir, const gchar *leaf) user->callback(dir, DIR_UPDATE, items, user->data); } + in_callback--; + out: g_ptr_array_free(items, TRUE); } diff --git a/ROX-Filer/src/filer.c b/ROX-Filer/src/filer.c index e8273ea4..d7311d3f 100644 --- a/ROX-Filer/src/filer.c +++ b/ROX-Filer/src/filer.c @@ -1216,6 +1216,7 @@ FilerWindow *filer_opendir(const char *path, FilerWindow *src_win, DetailsType dtype; SortType s_type; GtkSortType s_order; + Settings *dir_settings = NULL; /* Get the real pathname of the directory and copy it */ real_path = pathdup(path); @@ -1309,21 +1310,61 @@ FilerWindow *filer_opendir(const char *path, FilerWindow *src_win, filer_window->view_type = o_filer_view_type.int_value; } + dir_settings = (Settings *) g_hash_table_lookup(settings_table, + filer_window->sym_path); + if (dir_settings) + { + /* Override the current defaults with the per-directory + * user settings. + */ + if (dir_settings->flags & SET_HIDDEN) + filer_window->show_hidden = dir_settings->show_hidden; + + if (dir_settings->flags & SET_STYLE) + filer_window->display_style = + dir_settings->display_style; + + if (dir_settings->flags & SET_DETAILS) + filer_window->details_type = dir_settings->details_type; + + if (dir_settings->flags & SET_SORT) + { + s_type = dir_settings->sort_type; + s_order = dir_settings->sort_order; + } + + if (dir_settings->flags & SET_THUMBS) + filer_window->show_thumbs = dir_settings->show_thumbs; + + if (dir_settings->flags & SET_FILTER) + filer_set_filter(filer_window, + dir_settings->filter_type, + dir_settings->filter); + } + /* Add all the user-interface elements & realise */ filer_add_widgets(filer_window, wm_class); if (src_win) gtk_window_set_position(GTK_WINDOW(filer_window->window), GTK_WIN_POS_MOUSE); + if (dir_settings) + { + if(dir_settings->flags & SET_POSITION) + gtk_window_move(GTK_WINDOW(filer_window->window), + dir_settings->x, dir_settings->y); + if(dir_settings->flags & SET_SIZE) + filer_window_set_size(filer_window, + dir_settings->width, + dir_settings->height); + } + /* Connect to all the signal handlers */ filer_add_signals(filer_window); display_set_layout(filer_window, dstyle, dtype, TRUE); display_set_sort_type(filer_window, s_type, s_order); - /* Do we have saved settings? */ - check_settings(filer_window); - /* Open the window after a timeout, or when scanning stops. * Do this before attaching, because attach() might tell us to * stop scanning (if a scan isn't needed). @@ -2986,7 +3027,6 @@ static void check_settings(FilerWindow *filer_window) if(set->flags & SET_DETAILS) { details=set->details_type; - /* This next causes a warning */ filer_set_view_type(filer_window, set->view_type); } -- 2.11.4.GIT