mirror of
https://git.pwmt.org/pwmt/zathura.git
synced 2024-12-29 09:55:59 +01:00
sort files in :open
This commit is contained in:
parent
c75eaf4c43
commit
58e25e8733
2 changed files with 58 additions and 40 deletions
96
completion.c
96
completion.c
|
@ -15,6 +15,57 @@
|
||||||
#include <girara/utils.h>
|
#include <girara/utils.h>
|
||||||
#include <girara/datastructures.h>
|
#include <girara/datastructures.h>
|
||||||
|
|
||||||
|
static girara_list_t*
|
||||||
|
list_files(zathura_t* zathura, const char* current_path, const char* current_file, int current_file_length, bool is_dir)
|
||||||
|
{
|
||||||
|
/* read directory */
|
||||||
|
GDir* dir = g_dir_open(current_path, 0, NULL);
|
||||||
|
if (dir == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
girara_list_t* res = girara_sorted_list_new2((girara_compare_function_t)g_strcmp0,
|
||||||
|
(girara_free_function_t)g_free);
|
||||||
|
|
||||||
|
/* read files */
|
||||||
|
char* name = NULL;
|
||||||
|
while ((name = (char*) g_dir_read_name(dir)) != NULL) {
|
||||||
|
char* e_name = g_filename_display_name(name);
|
||||||
|
int e_length = strlen(e_name);
|
||||||
|
|
||||||
|
if (e_name == NULL) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((current_file_length > e_length) || strncmp(current_file, e_name,
|
||||||
|
current_file_length)) {
|
||||||
|
g_free(e_name);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
char* full_path = g_strdup_printf("%s%s%s", current_path, is_dir ? "" : "/", e_name);
|
||||||
|
if (full_path == NULL) {
|
||||||
|
g_free(e_name);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (g_file_test(full_path, G_FILE_TEST_IS_DIR) == true) {
|
||||||
|
char* tmp_path = full_path;
|
||||||
|
full_path = g_strdup_printf("%s/", full_path);
|
||||||
|
g_free(tmp_path);
|
||||||
|
girara_list_append(res, full_path);
|
||||||
|
} else if (file_valid_extension(zathura, full_path) == true) {
|
||||||
|
girara_list_append(res, full_path);
|
||||||
|
} else {
|
||||||
|
g_free(full_path);
|
||||||
|
}
|
||||||
|
g_free(e_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
g_dir_close(dir);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
girara_completion_t*
|
girara_completion_t*
|
||||||
cc_open(girara_session_t* session, const char* input)
|
cc_open(girara_session_t* session, const char* input)
|
||||||
{
|
{
|
||||||
|
@ -87,50 +138,19 @@ cc_open(girara_session_t* session, const char* input)
|
||||||
|
|
||||||
/* read directory */
|
/* read directory */
|
||||||
if (g_file_test(current_path, G_FILE_TEST_IS_DIR) == TRUE) {
|
if (g_file_test(current_path, G_FILE_TEST_IS_DIR) == TRUE) {
|
||||||
GDir* dir = g_dir_open(current_path, 0, NULL);
|
girara_list_t* names = list_files(zathura, current_path, current_file, current_file_length, is_dir);
|
||||||
if (dir == NULL) {
|
if (!names) {
|
||||||
goto error_free;
|
goto error_free;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* read files */
|
GIRARA_LIST_FOREACH(names, const char*, iter, file)
|
||||||
char* name = NULL;
|
girara_completion_group_add_element(group, file, NULL);
|
||||||
while ((name = (char*) g_dir_read_name(dir)) != NULL) {
|
GIRARA_LIST_FOREACH_END(names, const char*, iter, file);
|
||||||
char* e_name = g_filename_display_name(name);
|
girara_list_free(names);
|
||||||
int e_length = strlen(e_name);
|
|
||||||
|
|
||||||
if (e_name == NULL) {
|
|
||||||
goto error_free;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((current_file_length > e_length) || strncmp(current_file, e_name,
|
|
||||||
current_file_length)) {
|
|
||||||
g_free(e_name);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
char* full_path = g_strdup_printf("%s%s%s", current_path, is_dir ? "" : "/", e_name);
|
|
||||||
if (full_path == NULL) {
|
|
||||||
g_free(e_name);
|
|
||||||
goto error_free;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (g_file_test(full_path, G_FILE_TEST_IS_DIR) == true) {
|
|
||||||
char* tmp_path = full_path;
|
|
||||||
full_path = g_strdup_printf("%s/", full_path);
|
|
||||||
g_free(tmp_path);
|
|
||||||
girara_completion_group_add_element(group, full_path, NULL);
|
|
||||||
} else if (file_valid_extension(zathura, full_path) == true) {
|
|
||||||
girara_completion_group_add_element(group, full_path, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
g_free(full_path);
|
|
||||||
g_free(e_name);
|
|
||||||
}
|
|
||||||
|
|
||||||
g_dir_close(dir);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
g_free(path);
|
g_free(path);
|
||||||
|
g_free(current_path);
|
||||||
|
|
||||||
girara_completion_add_group(completion, group);
|
girara_completion_add_group(completion, group);
|
||||||
|
|
||||||
|
|
|
@ -12,8 +12,6 @@
|
||||||
|
|
||||||
#define PLUGIN_REGISTER_FUNCTION "plugin_register"
|
#define PLUGIN_REGISTER_FUNCTION "plugin_register"
|
||||||
|
|
||||||
// typedef struct zathura_document_s zathura_document_t;
|
|
||||||
|
|
||||||
typedef bool (*zathura_document_open_t)(zathura_document_t* document);
|
typedef bool (*zathura_document_open_t)(zathura_document_t* document);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in a new issue