mirror of
https://git.pwmt.org/pwmt/zathura.git
synced 2025-02-27 14:54:38 +01:00
Display recent files in completion (fixes #490)
Signed-off-by: Sebastian Ramacher <sebastian+dev@ramacher.at>
This commit is contained in:
parent
83fe96e814
commit
4e5ae52bc5
3 changed files with 60 additions and 8 deletions
|
@ -820,6 +820,28 @@ Defines if the last/first page should be wrapped
|
||||||
* Value type: Boolean
|
* Value type: Boolean
|
||||||
* Default value: false
|
* Default value: false
|
||||||
|
|
||||||
|
|
||||||
|
show-directories
|
||||||
|
^^^^^^^^^^^^^^^^
|
||||||
|
Defines if the directories should be displayed in completion.
|
||||||
|
|
||||||
|
* Value type: Boolean
|
||||||
|
* Default value: true
|
||||||
|
|
||||||
|
show-hidden
|
||||||
|
^^^^^^^^^^^
|
||||||
|
Defines if hidden files and directories should be displayed in completion.
|
||||||
|
|
||||||
|
* Value type: Boolean
|
||||||
|
* Default value: false
|
||||||
|
|
||||||
|
show-recent
|
||||||
|
^^^^^^^^^^^
|
||||||
|
Defines if recent files should be displayed in completion.
|
||||||
|
|
||||||
|
* Value type: Boolean
|
||||||
|
* Default value: true
|
||||||
|
|
||||||
scroll-page-aware
|
scroll-page-aware
|
||||||
^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^
|
||||||
Defines if scrolling by half or full pages stops at page boundaries.
|
Defines if scrolling by half or full pages stops at page boundaries.
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
#include "completion.h"
|
#include "completion.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
#include "page.h"
|
#include "page.h"
|
||||||
|
#include "database.h"
|
||||||
|
|
||||||
#include <girara/session.h>
|
#include <girara/session.h>
|
||||||
#include <girara/settings.h>
|
#include <girara/settings.h>
|
||||||
|
@ -32,7 +33,7 @@ compare_case_insensitive(const char* str1, const char* str2)
|
||||||
|
|
||||||
static girara_list_t*
|
static girara_list_t*
|
||||||
list_files(zathura_t* zathura, const char* current_path, const char* current_file,
|
list_files(zathura_t* zathura, const char* current_path, const char* current_file,
|
||||||
unsigned int current_file_length, bool is_dir, bool check_file_ext)
|
size_t current_file_length, bool is_dir, bool check_file_ext)
|
||||||
{
|
{
|
||||||
if (zathura == NULL || zathura->ui.session == NULL || current_path == NULL) {
|
if (zathura == NULL || zathura->ui.session == NULL || current_path == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -113,15 +114,20 @@ error_free:
|
||||||
}
|
}
|
||||||
|
|
||||||
static girara_completion_t*
|
static girara_completion_t*
|
||||||
list_files_for_cc(zathura_t* zathura, const char* input, bool check_file_ext)
|
list_files_for_cc(zathura_t* zathura, const char* input, bool check_file_ext, bool include_history)
|
||||||
{
|
{
|
||||||
girara_completion_t* completion = girara_completion_init();
|
girara_completion_t* completion = girara_completion_init();
|
||||||
girara_completion_group_t* group = girara_completion_group_create(zathura->ui.session, NULL);
|
girara_completion_group_t* group = girara_completion_group_create(zathura->ui.session, "files");
|
||||||
|
girara_completion_group_t* history_group = NULL;
|
||||||
|
|
||||||
gchar* path = NULL;
|
gchar* path = NULL;
|
||||||
gchar* current_path = NULL;
|
gchar* current_path = NULL;
|
||||||
|
|
||||||
if (completion == NULL || group == NULL) {
|
if (include_history == true) {
|
||||||
|
history_group = girara_completion_group_create(zathura->ui.session, "recent files");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (completion == NULL || group == NULL || (include_history == true && history_group == NULL)) {
|
||||||
goto error_free;
|
goto error_free;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -169,12 +175,12 @@ list_files_for_cc(zathura_t* zathura, const char* input, bool check_file_ext)
|
||||||
|
|
||||||
/* get current file */
|
/* get current file */
|
||||||
gchar* current_file = is_dir ? "" : basename(path);
|
gchar* current_file = is_dir ? "" : basename(path);
|
||||||
int current_file_length = strlen(current_file);
|
const size_t current_file_length = strlen(current_file);
|
||||||
|
|
||||||
/* 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) {
|
||||||
girara_list_t* names = list_files(zathura, current_path, current_file, current_file_length, is_dir, check_file_ext);
|
girara_list_t* names = list_files(zathura, current_path, current_file, current_file_length, is_dir, check_file_ext);
|
||||||
if (!names) {
|
if (names == NULL) {
|
||||||
goto error_free;
|
goto error_free;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -184,10 +190,26 @@ list_files_for_cc(zathura_t* zathura, const char* input, bool check_file_ext)
|
||||||
girara_list_free(names);
|
girara_list_free(names);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (include_history == true) {
|
||||||
|
girara_list_t* recent_files = zathura_db_get_recent_files(zathura->database);
|
||||||
|
if (recent_files == NULL) {
|
||||||
|
goto error_free;
|
||||||
|
}
|
||||||
|
|
||||||
|
const size_t path_len = strlen(path);
|
||||||
|
GIRARA_LIST_FOREACH(recent_files, const char*, iter, file)
|
||||||
|
if (strncmp(path, file, path_len) == 0) {
|
||||||
|
girara_completion_group_add_element(history_group, file, NULL);
|
||||||
|
}
|
||||||
|
GIRARA_LIST_FOREACH_END(recent_files, const char*, iter, file);
|
||||||
|
girara_list_free(recent_files);
|
||||||
|
}
|
||||||
|
|
||||||
g_free(path);
|
g_free(path);
|
||||||
g_free(current_path);
|
g_free(current_path);
|
||||||
|
|
||||||
girara_completion_add_group(completion, group);
|
girara_completion_add_group(completion, group);
|
||||||
|
girara_completion_add_group(completion, history_group);
|
||||||
|
|
||||||
return completion;
|
return completion;
|
||||||
|
|
||||||
|
@ -196,6 +218,9 @@ error_free:
|
||||||
if (completion) {
|
if (completion) {
|
||||||
girara_completion_free(completion);
|
girara_completion_free(completion);
|
||||||
}
|
}
|
||||||
|
if (history_group) {
|
||||||
|
girara_completion_group_free(history_group);
|
||||||
|
}
|
||||||
if (group) {
|
if (group) {
|
||||||
girara_completion_group_free(group);
|
girara_completion_group_free(group);
|
||||||
}
|
}
|
||||||
|
@ -213,7 +238,10 @@ cc_open(girara_session_t* session, const char* input)
|
||||||
g_return_val_if_fail(session->global.data != NULL, NULL);
|
g_return_val_if_fail(session->global.data != NULL, NULL);
|
||||||
zathura_t* zathura = session->global.data;
|
zathura_t* zathura = session->global.data;
|
||||||
|
|
||||||
return list_files_for_cc(zathura, input, true);
|
bool show_recent = true;
|
||||||
|
girara_setting_get(zathura->ui.session, "show-recent", &show_recent);
|
||||||
|
|
||||||
|
return list_files_for_cc(zathura, input, true, show_recent);
|
||||||
}
|
}
|
||||||
|
|
||||||
girara_completion_t*
|
girara_completion_t*
|
||||||
|
@ -223,7 +251,7 @@ cc_write(girara_session_t* session, const char* input)
|
||||||
g_return_val_if_fail(session->global.data != NULL, NULL);
|
g_return_val_if_fail(session->global.data != NULL, NULL);
|
||||||
zathura_t* zathura = session->global.data;
|
zathura_t* zathura = session->global.data;
|
||||||
|
|
||||||
return list_files_for_cc(zathura, input, false);
|
return list_files_for_cc(zathura, input, false, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
girara_completion_t*
|
girara_completion_t*
|
||||||
|
|
|
@ -212,6 +212,8 @@ config_load_default(zathura_t* zathura)
|
||||||
girara_setting_add(gsession, "show-hidden", &bool_value, BOOLEAN, false, _("Show hidden files and directories"), NULL, NULL);
|
girara_setting_add(gsession, "show-hidden", &bool_value, BOOLEAN, false, _("Show hidden files and directories"), NULL, NULL);
|
||||||
bool_value = true;
|
bool_value = true;
|
||||||
girara_setting_add(gsession, "show-directories", &bool_value, BOOLEAN, false, _("Show directories"), NULL, NULL);
|
girara_setting_add(gsession, "show-directories", &bool_value, BOOLEAN, false, _("Show directories"), NULL, NULL);
|
||||||
|
bool_value = true;
|
||||||
|
girara_setting_add(gsession, "show-recent", &bool_value, BOOLEAN, false, _("Show recent files"), NULL, NULL);
|
||||||
bool_value = false;
|
bool_value = false;
|
||||||
girara_setting_add(gsession, "open-first-page", &bool_value, BOOLEAN, false, _("Always open on first page"), NULL, NULL);
|
girara_setting_add(gsession, "open-first-page", &bool_value, BOOLEAN, false, _("Always open on first page"), NULL, NULL);
|
||||||
bool_value = false;
|
bool_value = false;
|
||||||
|
|
Loading…
Add table
Reference in a new issue