diff --git a/src/core/file_processor.c b/src/core/file_processor.c index 8b5f020..8e596d7 100644 --- a/src/core/file_processor.c +++ b/src/core/file_processor.c @@ -66,20 +66,21 @@ void file_list(file_args_t *f_args, query_args_t *q_args) { } } -int32_t ui_file_select(file_args_t *f_args, query_args_t *q_args, int32_t idx) { - fl_item_t *l_selected; /* from the list */ +static bool fl_add_cb(void *_dst, void *_src); + +int32_t ui_file_select(file_args_t *f_args, query_args_t *q_args, fl_item_t *l_selected) { fl_item_t *f_selected = &(f_args->f_selected); /* new copy of file struct (list be cleared) */ struct stat st = {0}; - l_selected = NULL; /* TODO: FIX */ - if (l_selected == NULL) { return -1; } memcpy(f_selected, l_selected, sizeof(fl_item_t)); + fl_add_cb(f_selected, l_selected); + if (stat(DOWNLOADS_DIR, &st) == -1) { mkdir(DOWNLOADS_DIR, 0700); } @@ -315,7 +316,7 @@ void clear_file_in_query(query_args_t *q_args) { } void init_file_args(file_args_t *f_args, app_t *app) { - w_ui_file_list_t *fui = NULL; + w_ui_file_list_t *fui = app->main_ui.ui; f_args->file_d = 0; f_args->f_selected.name = NULL; f_args->f_selected.size = 0; @@ -327,6 +328,8 @@ void init_file_args(file_args_t *f_args, app_t *app) { f_args->f_list = fui->f_list; } } + f_args->f_list = fui->f_list; + app->file_args = f_args; } static void fl_q_extract(fl_item_t *f, char *line) { @@ -360,8 +363,12 @@ static bool fl_add_cb(void *_dst, void *_src) { dst->size = src->size; - dst->description = malloc(sizeof(char) * (strlen(src->description) + 1)); - strcpy(dst->description, src->description); + if (src->description != NULL) { + dst->description = malloc(sizeof(char) * (strlen(src->description) + 1)); + strcpy(dst->description, src->description); + } else { + dst->description = NULL; + } dst->name = malloc(sizeof(char) * (strlen(src->name) + 1)); strcpy(dst->name, src->name); @@ -394,7 +401,9 @@ void fl_clear(fl_item_t **start, fl_item_t **arg_current) { current = *start; do { - free(current->description); + if (current->description != NULL) { + free(current->description); + } free(current->name); free(current); } while ((current = next) != NULL); diff --git a/src/core/file_processor.h b/src/core/file_processor.h index 00f584d..cba43c7 100644 --- a/src/core/file_processor.h +++ b/src/core/file_processor.h @@ -14,7 +14,7 @@ int file_upload_start(query_args_t *q_args); int file_upload(query_args_t *q_args); int32_t file_upload_open(char *dpath, char *fname, query_args_t *q_args); void fl_clear(fl_item_t **start, fl_item_t **arg_current); -int32_t ui_file_select(file_args_t *f_args, query_args_t *q_args, int32_t idx); +int32_t ui_file_select(file_args_t *f_args, query_args_t *q_args, fl_item_t *ptr); void clear_file_in_query(query_args_t *q_args); #endif \ No newline at end of file diff --git a/src/core/query.c b/src/core/query.c index ad7a1af..41065b6 100644 --- a/src/core/query.c +++ b/src/core/query.c @@ -50,13 +50,10 @@ void query_loop(app_t *app) { int32_t sd = app->params->sd; size_t qlen; int sr; - static file_args_t file_args; w_cb_args_t d_args = { .app = app, .element = NULL, .data = NULL, .resp_data.code = cbrc_none}; - init_file_args(&file_args, app); query_args->sd = sd; - app->file_args = &file_args; for (;;) { /* update screen */ diff --git a/src/main.c b/src/main.c index 701fbec..44a405a 100644 --- a/src/main.c +++ b/src/main.c @@ -14,8 +14,9 @@ #include #include -#include #include "alert.h" +#include "core/file_processor.h" +#include #include #include @@ -27,6 +28,7 @@ int main(int argc, char **argv) { app_t app; params_t params; query_args_t q_args; + file_args_t file_args; app_init_nc(); @@ -42,6 +44,7 @@ int main(int argc, char **argv) { app.query_args = &q_args; main_window_set(&app, mw_fl_server); + init_file_args(&file_args, &app); /* init client to connect to the server */ app.params->sd = init_client(); diff --git a/src/windows/file_list.c b/src/windows/file_list.c index 10addf5..24870a8 100644 --- a/src/windows/file_list.c +++ b/src/windows/file_list.c @@ -57,6 +57,8 @@ static void w_fl_cb(w_cb_args_t *args) { case KEY_DOWN: if (fui->current_idx < fui->current_count - 1) { fui->current_idx++; + if (fui->f_selected == NULL) fui->f_selected = fui->f_list->start; + fui->f_selected = fui->f_selected->next; } else if (fui->current_page < fui->pages) { app->query_args->state = S_FILE_LIST; server_send_string(app->query_args, "%s %d %d\n", q_prefix, @@ -69,6 +71,7 @@ static void w_fl_cb(w_cb_args_t *args) { case KEY_UP: if (fui->current_idx > 0) { fui->current_idx--; + fui->f_selected = fui->f_selected->previous; } else if (fui->current_page > 1) { app->query_args->state = S_FILE_LIST; server_send_string(app->query_args, "%s %d %d\n", q_prefix, @@ -110,7 +113,7 @@ static void w_fl_cb(w_cb_args_t *args) { 1); w_fl_reset(fui); case '\n': - ui_file_select(app->file_args, app->query_args, fui->current_idx + 1); + ui_file_select(app->file_args, app->query_args, dlist_get_ptr(fui->f_selected)); break; } } @@ -187,12 +190,11 @@ void *w_fl_init(app_t *app) { fui->activate_last = false; fui->active_search = false; fui->search_key = bfromcstrrangealloc(12, 64, ""); - fui->start = NULL; - fui->current = NULL; fui->w.sz.x = getmaxx(app->win); fui->w.sz.y = getmaxy(app->win); fui->f_list = dlist_init(NULL, fl_item_t, NULL); + fui->f_selected = NULL; if (app->file_args != NULL) { app->file_args->f_list = fui->f_list; } @@ -246,10 +248,12 @@ void w_fl_draw(w_ui_file_list_t *fui) { sz_x -= 1; /* do not count the borders */ p_y = 1; p_x = 1; + + dlist_node_t *wp_bac = dlist_get_wp(fui->f_list); + dlist_set_wp(fui->f_list, fui->f_list->start); fl_item_t *el = dlist_it_next(fui->f_list); fl_item_t *active_el = dlist_get_ptr(fui->f_selected); int32_t cur_el_idx = 0; - box(fui->win_list, 0, 0); if (fui->start != NULL) { @@ -287,6 +291,8 @@ void w_fl_draw(w_ui_file_list_t *fui) { cur_el_idx++; } while ((el = dlist_it_next(fui->f_list)) != NULL && p_y < sz_y_f); + dlist_set_wp(fui->f_list, wp_bac); + p_x = 1; int32_t p_len;