diff --git a/src/app.c b/src/app.c index 5f37273..d33e55c 100644 --- a/src/app.c +++ b/src/app.c @@ -41,6 +41,11 @@ app_t *app_init(app_t *app) { keypad(app->win, TRUE); + app->callback_after_notification = NULL; + + app->modal.is_initiated = false; + app->modal.needs_destroy = false; + /* refresh the windows */ wnoutrefresh(app->win); doupdate(); diff --git a/src/app.h b/src/app.h index 0b57f74..005c784 100644 --- a/src/app.h +++ b/src/app.h @@ -15,7 +15,7 @@ typedef enum { modal_color_pair = 3, } app_color; -typedef struct { +typedef struct app_t { WINDOW *win; w_dialogue_t modal; params_t *params; @@ -23,6 +23,7 @@ typedef struct { query_args_t *query_args; file_args_t *file_args; void (*active_callback)(w_cb_args_t *args); + void (*callback_after_notification)(struct app_t *); void *active_widget; wchar_t *top_text; main_window_t main_ui; diff --git a/src/draw_modal.c b/src/draw_modal.c index 5ef0d46..1dfeef5 100644 --- a/src/draw_modal.c +++ b/src/draw_modal.c @@ -1,9 +1,9 @@ /* SPDX-License-Identifier: MIT */ /* Copyright (c) 2026 Oleksandr Zhylin */ +#include "main.h" #include #include -#include "main.h" static void (*active_callback_backup)(w_cb_args_t *) = NULL; diff --git a/src/file_processor.c b/src/file_processor.c index 6a12314..c272a30 100644 --- a/src/file_processor.c +++ b/src/file_processor.c @@ -332,7 +332,7 @@ static void fl_add(fl_item_t **cur, fl_item_t **start, char *line) { char *descr_begin = NULL; int h_len; char *name_begin = strchr(line, '[') + 1; - char *name_end = strrchr(line, ']'); + char *name_end = strchr(line, ']'); int name_len = name_end - name_begin; fl_item_t *fitem = malloc(sizeof(fl_item_t)); sscanf(name_end, "] %zu %s%n", &(fitem->size), fowner, &h_len); diff --git a/src/query.c b/src/query.c index fda3ed0..7dadbdc 100644 --- a/src/query.c +++ b/src/query.c @@ -30,6 +30,7 @@ #include "dialogue.h" #include "file_processor.h" #include "main.h" +#include "main_window.h" #include "server.h" #include "types.h" @@ -77,12 +78,18 @@ void query_loop(app_t *app) { } } if (query_args->state == S_NEXT_ACTION) { - query_args->from_server = TRUE; - if (ERR == process_query(app)) { - EXIT_APP("*** error while processing query ***", app, 1) + if (app->callback_after_notification != NULL) { + app->callback_after_notification(app); + app->callback_after_notification = NULL; + continue; + } else { + query_args->from_server = TRUE; + if (ERR == process_query(app)) { + EXIT_APP("*** error while processing query ***", app, 1) + } + query_args->state = S_WAIT_SERVER; + continue; } - query_args->state = S_WAIT_SERVER; - continue; } else { sr = select(maxfd + 1, &readfds, NULL, NULL, NULL); if (sr == -1) { @@ -143,9 +150,19 @@ int upload_confirm_cb(app_t *app, char *query, int q_len) { w_notification("File upload", dc_normal, "File %s is uploaded to the server!", app->query_args->file->name); - main_window_set(app, mw_f_desc); + int desc_answer = + w_bool_ask("Write file description", "Yes", "No", true, + "Would you like to write description for the file %s?", + app->query_args->file->name); + if (desc_answer) { + main_window_set(app, mw_f_desc); + app->query_args->state = S_WAIT_USER_DESCRIPTION; + } else { + server_send_string(app->query_args, "[Empty description]\n:END:\n"); + app->query_args->state = WAIT_CLIENT; + main_window_set(app, mw_fl_server); + } /* clear_file_in_query(app->query_args); */ - app->query_args->state = S_WAIT_USER_DESCRIPTION; return 0; } return 1; /* TODO: Error case */ @@ -277,7 +294,7 @@ static int process_command(app_t *app, wait_server_cb *callback) { while ((qlen = query_extract_from_buf(q_args->buf, &(q_args->buf_used), &query))) { if (callback == NULL) { - process_server_command(query, qlen, app); + res = process_server_command(query, qlen, app); } else { res = callback(app, query, qlen); } diff --git a/src/server.c b/src/server.c index 9b89ea3..6503dcc 100644 --- a/src/server.c +++ b/src/server.c @@ -146,10 +146,10 @@ int process_server_command(char *line, int l_len, app_t *app) { return 0; } - q_args->state = S_PREP_SERVER_MESSAGE; - server_print_message_cb(app, line, l_len); + if (q_args->state == S_NEXT_ACTION) return 1; - return -1; + q_args->state = S_PREP_SERVER_MESSAGE; + return server_print_message_cb(app, line, l_len); } void ask_uname_and_password(params_t *params) { diff --git a/src/windows/file_list.c b/src/windows/file_list.c index 3c4b7e4..89230cc 100644 --- a/src/windows/file_list.c +++ b/src/windows/file_list.c @@ -175,7 +175,7 @@ void *w_fl_init(app_t *app) { app->main_ui.b_keys_len = 4; app->main_ui.cb_b_press = (w_cb_press_t)process_user_input; app->main_ui.reset = w_fl_reset_app; - app->main_ui.draw = (draw_f_t *) w_fl_draw; + app->main_ui.draw = (draw_f_t *)w_fl_draw; app->active_callback = w_fl_cb; fui->w.callback = w_fl_cb; w_init(&(fui->w), NULL, &(app->win), ""); @@ -227,8 +227,8 @@ void w_fl_reset(w_ui_file_list_t *fl_ui) { } void w_fl_reset_app(void *app) { - app_t *_app = (app_t *) app; - w_ui_file_list_t *fl_ui = (w_ui_file_list_t *) _app->main_ui.ui; + app_t *_app = (app_t *)app; + w_ui_file_list_t *fl_ui = (w_ui_file_list_t *)_app->main_ui.ui; w_fl_reset(fl_ui); } @@ -314,6 +314,7 @@ void w_fl_draw(w_ui_file_list_t *fui) { curs_set(true); wmove(win, p_y, p_x + p_len); } else { + curs_set(false); int32_t l_pad = 0; sprintf(p_info, "P: %d/%d F: %d L: %d%n", fui->current_page, fui->pages, fui->current_count, fui->full_count, &p_len); @@ -350,7 +351,8 @@ void w_fl_draw(w_ui_file_list_t *fui) { mvwprintw(i_win, p_y, p_x, "Name: "); p_x = 8; /* 7 (size of "Name: ") + 1 */ - u_utf8_curs_printw(i_win, &p_y, &p_x, active_el->name, sz_x - p_x - 2, true); + u_utf8_curs_printw(i_win, &p_y, &p_x, active_el->name, sz_x - p_x - 2, + true); p_x = 1; size_to_text(active_el->size, size_text); diff --git a/src/windows/text_edit.c b/src/windows/text_edit.c index 0fadb54..dd15642 100644 --- a/src/windows/text_edit.c +++ b/src/windows/text_edit.c @@ -1,6 +1,9 @@ /* SPDX-License-Identifier: MIT */ /* Copyright (c) 2026 Oleksandr Zhylin */ +#include "../file_processor.h" +#include "../server.h" +#include "../windows/main_window.h" #include #include #include @@ -13,12 +16,10 @@ #include #include #include -#include "../server.h" -#include "../file_processor.h" -#include "../windows/main_window.h" #include "d_array.h" #include "text_edit.h" +#include "file_list.h" #include "widget_core.h" /* TODO: расширять capacity линии при достижении лимита */ @@ -40,6 +41,8 @@ static void w_te_cb(w_cb_args_t *args) { switch (key) { case KEY_BACKSPACE: case KEY_DL: + if (fui->cur_line->len == 0) + break; if (fui->cur_line_pos == fui->cur_line->len && fui->cur_line->len > 0) { fui->cur_line->text[--fui->cur_line_pos] = 0; fui->cur_line->len--; @@ -167,6 +170,16 @@ static struct action_key action_keys[] = { {.key = "F9", .title = "Quit", .code = KEY_F(9)}, }; +void callback_after_notification(app_t *app) { + clear_file_in_query(app->query_args); + int a_len; + main_window_set(app, mw_fl_server); + w_ui_file_list_t *fui = app->main_ui.ui; + server_send_string(app->query_args, "file list %d %d\n%n", fui->max_lines, + fui->current_page, &a_len); + app->query_args->state = S_FILE_LIST; +} + static int32_t process_user_input(app_t *app, w_cb_args_t *d_args) { int32_t c; w_te_ui_t *fui = (w_te_ui_t *)app->query_args->main_ui->ui; @@ -192,8 +205,8 @@ static int32_t process_user_input(app_t *app, w_cb_args_t *d_args) { strncpy(app->query_args->file->description + text_pos, ":END:\n", sizeof(":END:\n")); server_send_string(app->query_args, app->query_args->file->description); - clear_file_in_query(app->query_args); - main_window_set(app, mw_fl_server); + app->query_args->state = S_WAIT_SERVER; + app->callback_after_notification = callback_after_notification; /* Save */ break; case KEY_F(8): @@ -245,6 +258,7 @@ w_te_ui_t *w_te_init_win(app_t *app) { fui->sym_count = 0; fui->lines_count = 1; fui->lines_top_indent = 0; + fui->cur_line_pos = 0; return fui; }