fs_file_list: fixes for new dual linked list implementation

This commit is contained in:
2026-08-06 18:58:31 +03:00
parent 01b078c8d9
commit 6b20f2f179
3 changed files with 34 additions and 16 deletions
+6 -4
View File
@@ -163,18 +163,20 @@ int dlist_clear_list(dlist_t *dlist, dblist_rm_cb_t cb) {
void *dlist_it_prev(dlist_t *dlist) { void *dlist_it_prev(dlist_t *dlist) {
dlist_node_t *cur_ptr = dlist->work_pointer; dlist_node_t *cur_ptr = dlist->work_pointer;
if (dlist->work_pointer->previous != NULL) { if (cur_ptr != NULL) {
dlist->work_pointer = dlist->work_pointer->previous; dlist->work_pointer = dlist->work_pointer->previous;
}
return cur_ptr->el_ptr; return cur_ptr->el_ptr;
}
return NULL;
} }
void *dlist_it_next(dlist_t *dlist) { void *dlist_it_next(dlist_t *dlist) {
dlist_node_t *cur_ptr = dlist->work_pointer; dlist_node_t *cur_ptr = dlist->work_pointer;
if (dlist->work_pointer->next != NULL) { if (cur_ptr != NULL) {
dlist->work_pointer = dlist->work_pointer->next; dlist->work_pointer = dlist->work_pointer->next;
}
return cur_ptr->el_ptr; return cur_ptr->el_ptr;
}
return NULL;
} }
dlist_node_t *dlist_wind_fwd(dlist_t *dlist, int count) { dlist_node_t *dlist_wind_fwd(dlist_t *dlist, int count) {
+1 -1
View File
@@ -44,8 +44,8 @@ dlist_node_t *dlist_wind_bwd(dlist_t *dlist, int count);
#define dlist_get_working_point(dlist) dlist->current->el_ptr #define dlist_get_working_point(dlist) dlist->current->el_ptr
#define dlist_add_sort(dlist, el_ptr, el_typ, sort_cb, add_cb) \ #define dlist_add_sort(dlist, el_ptr, el_typ, sort_cb, add_cb) \
_dlist_add_sort(dlist, el_ptr, sizeof(el_typ), sort_cb, add_cb) _dlist_add_sort(dlist, el_ptr, sizeof(el_typ), sort_cb, add_cb)
#define dlist_reset_wp_to_st(dlist, st_ptr) dlist->work_pointer = st_ptr
#define dlist_get_ptr(node_ptr) node_ptr->el_ptr #define dlist_get_ptr(node_ptr) node_ptr->el_ptr
#define dlist_set_wp(dlist, node_ptr) dlist->work_pointer = node_ptr #define dlist_set_wp(dlist, node_ptr) dlist->work_pointer = node_ptr
#define dlist_get_wp(dlist) dlist->work_pointer
#endif #endif
+25 -9
View File
@@ -27,13 +27,15 @@
#include "widget_core.h" #include "widget_core.h"
#define fl_add(dlist, el_ptr, prepend) \ #define fl_add(dlist, el_ptr, prepend) \
dlist_add_sort(dlist, el_ptr, w_lfl_item_t, fl_add_cb, prepend) dlist_add(dlist, el_ptr, w_lfl_item_t, fl_add_cb, prepend)
#define fl_add_sort(dlist, el_ptr) \ #define fl_add_sort(dlist, el_ptr) \
dlist_add_sort(dlist, el_ptr, w_lfl_item_t, fl_add_sort_cb, fl_add_cb) dlist_add_sort(dlist, el_ptr, w_lfl_item_t, fl_add_sort_cb, fl_add_cb)
#define fl_clear(f_list) dlist_clear_list(f_list, fl_clear_cb) #define fl_clear(f_list) dlist_clear_list(f_list, fl_clear_cb)
// void w_fl_reset(w_lfl_ui_t *fl_ui); // void w_fl_reset(w_lfl_ui_t *fl_ui);
/* TODO: solve problem with selection */
static size_t get_file_size(char *path) { static size_t get_file_size(char *path) {
int fd = open(path, O_RDONLY); int fd = open(path, O_RDONLY);
if (fd == -1) { if (fd == -1) {
@@ -55,10 +57,16 @@ struct fl_args {
static bool fl_add_cb(void *_dst, void *_src) { static bool fl_add_cb(void *_dst, void *_src) {
w_lfl_item_t *dst = _dst; w_lfl_item_t *dst = _dst;
w_lfl_item_t *src = src; w_lfl_item_t *src = _src;
memcpy(dst, src, sizeof(w_lfl_item_t)); memcpy(dst, src, sizeof(w_lfl_item_t));
dst->name = malloc(strlen(src->name) + 1); dst->name = malloc(strlen(src->name) + 1);
strcpy(src->name, dst->name); strcpy(dst->name, src->name);
if (src->d_name != NULL) {
dst->d_name = malloc(strlen (src->d_name) + 1);
strcpy(dst->d_name, src->d_name);
}
if (src->path != NULL) { if (src->path != NULL) {
dst->path = malloc(strlen(src->path) + 1); dst->path = malloc(strlen(src->path) + 1);
strcpy(dst->path, src->path); strcpy(dst->path, src->path);
@@ -79,6 +87,7 @@ static bool fl_clear_cb(void *el_ptr) {
w_lfl_item_t *el = el_ptr; w_lfl_item_t *el = el_ptr;
free(el->path); free(el->path);
free(el->name); free(el->name);
free(el->d_name);
free(el); free(el);
return 1; return 1;
} }
@@ -125,16 +134,19 @@ static int get_files_from_fs(w_lfl_ui_t *fui, char *path) {
w_lfl_item_t *t_st = NULL, *t_cur = NULL; w_lfl_item_t *t_st = NULL, *t_cur = NULL;
sprintf(name, "/%s", dent->d_name); sprintf(name, "/%s", dent->d_name);
f_args.name = name; f_args.name = name;
f_args.d_name = dent->d_name;
f_args.size = 0; f_args.size = 0;
f_args.d_type = dent->d_type; f_args.d_type = dent->d_type;
fl_add(fui->f_list, &f_args, true); fl_add(fui->f_list, &f_args, true);
fui->files_num++; fui->files_num++;
continue;
} }
/* Hide directories with dot-beginnings */ /* Hide directories with dot-beginnings */
if (!strncmp(dent->d_name, ".", 1)) if (!strncmp(dent->d_name, ".", 1))
continue; continue;
sprintf(name, "/%s", dent->d_name); sprintf(name, "/%s", dent->d_name);
f_args.name = name; f_args.name = name;
f_args.d_name = dent->d_name;
f_args.size = 0; f_args.size = 0;
f_args.d_type = dent->d_type; f_args.d_type = dent->d_type;
fl_add_sort(fui->f_list, &f_args); fl_add_sort(fui->f_list, &f_args);
@@ -149,6 +161,7 @@ static int get_files_from_fs(w_lfl_ui_t *fui, char *path) {
f_args.path = l_path; f_args.path = l_path;
f_args.size = 0; f_args.size = 0;
f_args.d_type = dent->d_type; f_args.d_type = dent->d_type;
f_args.d_name = NULL;
fl_add_sort(fui->f_list, &f_args); fl_add_sort(fui->f_list, &f_args);
fui->files_num++; fui->files_num++;
/* <- LINKS */ /* <- LINKS */
@@ -160,6 +173,7 @@ static int get_files_from_fs(w_lfl_ui_t *fui, char *path) {
f_args.name = dent->d_name; f_args.name = dent->d_name;
f_args.size = get_file_size(dent->d_name); f_args.size = get_file_size(dent->d_name);
f_args.d_type = dent->d_type; f_args.d_type = dent->d_type;
f_args.d_name = NULL;
fl_add_sort(fui->f_list, &f_args); fl_add_sort(fui->f_list, &f_args);
fui->files_num++; fui->files_num++;
/* <- FILES */ /* <- FILES */
@@ -171,6 +185,8 @@ static int get_files_from_fs(w_lfl_ui_t *fui, char *path) {
if (fui->files_num % fui->max_lines) { if (fui->files_num % fui->max_lines) {
fui->pages_num++; fui->pages_num++;
} }
fui->page_start = fui->f_list->start;
fui->fl_selected = fui->f_list->start;
return 0; return 0;
} }
@@ -241,13 +257,13 @@ static void w_lfl_cb(w_cb_args_t *args) {
int32_t key = *((int32_t *)args->data); int32_t key = *((int32_t *)args->data);
bool is_cur_p = 0; /* current page */ bool is_cur_p = 0; /* current page */
app_t *app = (app_t *)args->app; app_t *app = (app_t *)args->app;
dlist_node_t *flwp = fui->f_list->work_pointer; dlist_node_t *flwp = dlist_get_wp(fui->f_list);
dlist_set_wp(fui->f_list, fui->fl_selected); dlist_set_wp(fui->f_list, fui->fl_selected);
switch (key) { switch (key) {
case KEY_DOWN: case KEY_DOWN:
is_cur_p = (fui->current_idx % fui->max_lines || fui->current_idx == 0); is_cur_p = (fui->current_idx % fui->max_lines || fui->current_idx == 0);
if (is_cur_p) { if (is_cur_p) {
dlist_wind_fwd(fui->f_list, fui->max_lines); fui->fl_selected = dlist_it_next(fui->f_list);
} else { /* is_cur_p */ } else { /* is_cur_p */
page_next(fui); page_next(fui);
} }
@@ -255,7 +271,7 @@ static void w_lfl_cb(w_cb_args_t *args) {
break; break;
case KEY_UP: case KEY_UP:
if (fui->current_idx > 0) { if (fui->current_idx > 0) {
dlist_wind_bwd(fui->f_list, fui->max_lines); fui->fl_selected = dlist_it_prev(fui->f_list);
} else { } else {
page_next(fui); page_next(fui);
} }
@@ -271,7 +287,7 @@ static void w_lfl_cb(w_cb_args_t *args) {
open_selected_item(fui, &(args->resp_data)); open_selected_item(fui, &(args->resp_data));
break; break;
} }
dlist_reset_wp_to_st(fui->f_list, flwp); dlist_set_wp(fui->f_list, flwp);
} }
w_lfl_ui_t *w_lfl_init(WINDOW **win, w_t *w_parent) { w_lfl_ui_t *w_lfl_init(WINDOW **win, w_t *w_parent) {
@@ -405,8 +421,8 @@ void w_lfl_draw(w_lfl_ui_t *fui) {
p_y = 1; p_y = 1;
p_x = 1; p_x = 1;
dlist_reset_wp_to_st(fui->f_list, fui->page_start); dlist_set_wp(fui->f_list, fui->page_start);
w_lfl_item_t *el = dlist_get_ptr(fui->page_start); w_lfl_item_t *el = dlist_it_next(fui->f_list);
w_lfl_item_t *active_el = dlist_get_ptr(fui->fl_selected); w_lfl_item_t *active_el = dlist_get_ptr(fui->fl_selected);
box(fui->win_list, 0, 0); box(fui->win_list, 0, 0);