From d825c25111497547cb39b446b019660614f3a6cb Mon Sep 17 00:00:00 2001 From: Aldrik Ramaekers Date: Wed, 20 May 2020 14:45:33 +0200 Subject: work --- src/linux/platform.c | 8 ++++++-- src/platform.h | 13 ++++++++++--- src/platform_shared.c | 7 ++++--- src/windows/platform.c | 21 ++++++++++++++++----- 4 files changed, 36 insertions(+), 13 deletions(-) diff --git a/src/linux/platform.c b/src/linux/platform.c index f87b4ac..35c5745 100644 --- a/src/linux/platform.c +++ b/src/linux/platform.c @@ -1408,7 +1408,7 @@ void *platform_open_file_dialog_block(void *arg) return 0; } -void platform_list_files_block(array *list, char *start_dir, array filters, bool recursive, memory_bucket *bucket, bool include_directories, bool *is_cancelled) +void platform_list_files_block(array *list, char *start_dir, array filters, bool recursive, memory_bucket *bucket, bool include_directories, bool *is_cancelled, search_info *info) { assert(list); @@ -1467,17 +1467,21 @@ void platform_list_files_block(array *list, char *start_dir, array filters, bool if (recursive) { + if (info) info->dir_count++; + string_copyn(subdirname_buf, start_dir, MAX_INPUT_LENGTH); string_appendn(subdirname_buf, dir->d_name, MAX_INPUT_LENGTH); string_appendn(subdirname_buf, "/", MAX_INPUT_LENGTH); // do recursive search - platform_list_files_block(list, subdirname_buf, filters, recursive, bucket, include_directories, is_cancelled); + platform_list_files_block(list, subdirname_buf, filters, recursive, bucket, include_directories, is_cancelled, info); } } // we handle DT_UNKNOWN for file systems that do not support type lookup. else if (dir->d_type == DT_REG || dir->d_type == DT_UNKNOWN) { + if (info) info->file_count++; + // check if name matches pattern if ((len = filter_matches(&filters, dir->d_name, &matched_filter)) && len != -1) diff --git a/src/platform.h b/src/platform.h index f7ff050..4be3938 100644 --- a/src/platform.h +++ b/src/platform.h @@ -32,6 +32,12 @@ typedef struct t_file_match char *line_info; // will be null when no match is found } file_match; +typedef struct t_search_info +{ + u64 file_count; + u64 dir_count; +} search_info; + typedef struct t_search_result { array work_queue; @@ -55,7 +61,7 @@ typedef struct t_search_result memory_bucket mem_bucket; bool is_command_line_search; bool threads_closed; - + search_info search_info; char *export_path; char *file_filter; char *directory_to_search; @@ -146,6 +152,7 @@ typedef struct t_list_file_args bool *state; bool *is_cancelled; memory_bucket *bucket; + search_info *info; } list_file_args; typedef enum t_cursor_type @@ -199,8 +206,8 @@ bool get_active_directory(char *buffer); bool set_active_directory(char *path); void platform_show_message(platform_window *window, char *message, char *title); array get_filters(char *filter); -void platform_list_files_block(array *list, char *start_dir, array filters, bool recursive, memory_bucket *bucket, bool include_directories, bool *is_cancelled); -void platform_list_files(array *list, char *start_dir, char *filter, bool recursive, memory_bucket *bucket, bool *is_cancelled, bool *state); +void platform_list_files_block(array *list, char *start_dir, array filters, bool recursive, memory_bucket *bucket, bool include_directories, bool *is_cancelled, search_info *info); +void platform_list_files(array *list, char *start_dir, char *filter, bool recursive, memory_bucket *bucket, bool *is_cancelled, bool *state, search_info *info); void platform_open_file_dialog(file_dialog_type type, char *buffer, char *file_filter, char *start_path); bool platform_get_mac_address(char *buffer, s32 buf_size); bool is_platform_in_darkmode(); diff --git a/src/platform_shared.c b/src/platform_shared.c index 4107ca3..027be46 100644 --- a/src/platform_shared.c +++ b/src/platform_shared.c @@ -81,7 +81,7 @@ void platform_autocomplete_path(char *buffer, bool want_dir) array files = array_create(sizeof(found_file)); array filters = get_filters(name); bool is_cancelled = false; - platform_list_files_block(&files, dir, filters, false, 0, want_dir, &is_cancelled); + platform_list_files_block(&files, dir, filters, false, 0, want_dir, &is_cancelled, 0); s32 index_to_take = -1; if (want_dir) @@ -165,7 +165,7 @@ void *platform_list_files_thread(void *args) char *start_dir = info->start_dir; bool recursive = info->recursive; - platform_list_files_block(info->list, info->start_dir, filters, info->recursive, info->bucket, info->include_directories, info->is_cancelled); + platform_list_files_block(info->list, info->start_dir, filters, info->recursive, info->bucket, info->include_directories, info->is_cancelled, info->info); mutex_lock(&info->list->mutex); //if (!(*info->is_cancelled)) @@ -177,7 +177,7 @@ void *platform_list_files_thread(void *args) return 0; } -void platform_list_files(array *list, char *start_dir, char *filter, bool recursive, memory_bucket *bucket, bool *is_cancelled, bool *state) +void platform_list_files(array *list, char *start_dir, char *filter, bool recursive, memory_bucket *bucket, bool *is_cancelled, bool *state, search_info *info) { list_file_args *args = memory_bucket_reserve(bucket, sizeof(list_file_args)); args->list = list; @@ -188,6 +188,7 @@ void platform_list_files(array *list, char *start_dir, char *filter, bool recurs args->include_directories = 0; args->bucket = bucket; args->is_cancelled = is_cancelled; + args->info = info; thread thr = thread_start(platform_list_files_thread, args); thread_detach(&thr); diff --git a/src/windows/platform.c b/src/windows/platform.c index 0a1357b..263f8d8 100644 --- a/src/windows/platform.c +++ b/src/windows/platform.c @@ -16,7 +16,7 @@ #include #include #include -#include +//#include #include #include #include @@ -158,7 +158,15 @@ inline void platform_set_cursor(platform_window *window, cursor_type type) bool platform_directory_exists(char *path) { - return PathFileExistsA(path) == TRUE; + WIN32_FIND_DATA FindFileData; + HANDLE handle = FindFirstFile(path, &FindFileData) ; + int found = handle != INVALID_HANDLE_VALUE; + if(found) + { + //FindClose(&handle); this will crash + FindClose(handle); + } + return found; } static void create_key_tables() @@ -1038,7 +1046,7 @@ bool set_active_directory(char *path) return SetCurrentDirectory(path); } -void platform_list_files_block(array *list, char *start_dir, array filters, bool recursive, memory_bucket *bucket, bool include_directories, bool *is_cancelled) +void platform_list_files_block(array *list, char *start_dir, array filters, bool recursive, memory_bucket *bucket, bool include_directories, bool *is_cancelled, search_info *info) { assert(list); s32 len = 0; @@ -1121,12 +1129,14 @@ void platform_list_files_block(array *list, char *start_dir, array filters, bool if (recursive) { + if (info) info->dir_count++; + string_copyn(subdirname_buf, start_dir_clean, MAX_INPUT_LENGTH); string_appendn(subdirname_buf, name, MAX_INPUT_LENGTH); string_appendn(subdirname_buf, "\\", MAX_INPUT_LENGTH); // is directory - platform_list_files_block(list, subdirname_buf, filters, recursive, bucket, include_directories, is_cancelled); + platform_list_files_block(list, subdirname_buf, filters, recursive, bucket, include_directories, is_cancelled, info); } } else if ((file_info.dwFileAttributes & FILE_ATTRIBUTE_COMPRESSED) || @@ -1136,6 +1146,8 @@ void platform_list_files_block(array *list, char *start_dir, array filters, bool (file_info.dwFileAttributes & FILE_ATTRIBUTE_READONLY) || (file_info.dwFileAttributes & FILE_ATTRIBUTE_ARCHIVE)) { + if (info) info->file_count++; + if ((len = filter_matches(&filters, name, &matched_filter)) && len != -1) { @@ -1274,7 +1286,6 @@ void platform_init(int argc, char **argv) setlocale(LC_ALL, "en_US.UTF-8"); QueryPerformanceFrequency(&perf_frequency); - CoInitialize(NULL); create_key_tables(); instance = GetModuleHandle(NULL); -- cgit v1.2.3-70-g09d2