From 0231b6c0161fbaf5f4ccb9c20a5a483f801e661f Mon Sep 17 00:00:00 2001 From: Junior Rantila Date: Sun, 3 Mar 2024 09:44:07 +0100 Subject: [PATCH] Only commit successful directory changes If you try to cd into a directory that you don't have permissions to open, the file browser would become blank with no way to recover since we had already changed the file browser state before knowing if the directory change would succeed. This patch ensures that we only commit the directory change after we've successfully read it. --- src/file_browser.c | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/src/file_browser.c b/src/file_browser.c index d4afb45e..7084356a 100644 --- a/src/file_browser.c +++ b/src/file_browser.c @@ -105,26 +105,32 @@ Errno fb_change_dir(File_Browser *fb) const char *dir_name = fb->files.items[fb->cursor]; - fb->dir_path.count -= 1; + String_Builder new_path = { 0 }; + da_append_many(&new_path, fb->dir_path.items, fb->dir_path.count); - // TODO: fb->dir_path grows indefinitely if we hit the root - sb_append_cstr(&fb->dir_path, "/"); - sb_append_cstr(&fb->dir_path, dir_name); - - String_Builder result = {0}; - normpath(sb_to_sv(fb->dir_path), &result); - da_move(&fb->dir_path, result); - sb_append_null(&fb->dir_path); + new_path.count -= 1; - printf("Changed dir to %s\n", fb->dir_path.items); + // TODO: fb->dir_path grows indefinitely if we hit the root + sb_append_cstr(&new_path, "/"); + sb_append_cstr(&new_path, dir_name); - fb->files.count = 0; - fb->cursor = 0; - Errno err = read_entire_dir(fb->dir_path.items, &fb->files); + String_Builder result = { 0 }; + normpath(sb_to_sv(new_path), &result); + da_move(&new_path, result); + sb_append_null(&new_path); + Files new_files = { 0 }; + Errno err = read_entire_dir(new_path.items, &new_files); if (err != 0) { return err; } + + da_move(&fb->files, new_files); + da_move(&fb->dir_path, new_path); + fb->cursor = 0; + + printf("Changed dir to %s\n", fb->dir_path.items); + qsort(fb->files.items, fb->files.count, sizeof(*fb->files.items), file_cmp); return 0;