diff --git a/CMakeLists.txt b/CMakeLists.txt index 006dfd3..987d5c6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -23,6 +23,7 @@ add_subdirectory(src/modals) add_subdirectory(src/lib) add_subdirectory(src/utils) add_subdirectory(src/windows) +add_subdirectory(src/core) add_subdirectory(src) diff --git a/TODO.md b/TODO.md index c844be6..d5d0268 100644 --- a/TODO.md +++ b/TODO.md @@ -1,13 +1,16 @@ # TODO: ## Current: -- [ ] Sorting in the file list (local files) -- [ ] Resume download -- [ ] Separate common structures in the common.h +- [ ] Sorting in the file list (local files): + - [ ] Testing env + - [ ] Test dlist + - [ ] Dlist sort ## Global tasks: - [ ] Testing - [ ] Documentation +- [ ] Resume download +- [ ] Separate common structures in the common.h ## Features: - [ ] Files removal diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index f2bdb97..ee7a67e 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -20,17 +20,21 @@ elseif( endif() endif() -file(GLOB M_SOURCES "*.c") - if(DEV_WIDGET) - list(FILTER M_SOURCES EXCLUDE REGEX "main\\.c$") + target_sources(zbbs-client-tui + PRIVATE + main_dev_widget.c +) else() - list(FILTER M_SOURCES EXCLUDE REGEX "main_dev_widget\\.c$") + target_sources(zbbs-client-tui + PRIVATE + main.c +) endif() -target_sources(zbbs-client-tui - PRIVATE - ${M_SOURCES} +add_library(common INTERFACE) +target_sources(common + PUBLIC FILE_SET HEADERS FILES common.h ) target_link_libraries(zbbs-client-tui @@ -41,5 +45,6 @@ target_link_libraries(zbbs-client-tui bstring windows utils + common ${CURSES_LIBRARIES} ) \ No newline at end of file diff --git a/src/common.h b/src/common.h index d339357..1b5dd30 100644 --- a/src/common.h +++ b/src/common.h @@ -4,8 +4,22 @@ #ifndef COMMON_H #define COMMON_H +#include +#include +#include +#include #include +#define LOCAL_PORT 1999 +#define SERVER_PORT 2000 +#define LISTEN_QLEN 32 +#define INBUFSIZE 1024 +#define DOWNLOADS_DIR "./Downloads" +#define DIALOGUE_TITLE 64 +#define DIALOGUE_TEXT 4096 +#define INPUT_TEXT DIALOGUE_TITLE +#define PACKAGE_SIZE INBUFSIZE * 10 + typedef struct { int32_t cur_y, cur_x; int32_t max_y, max_x; @@ -25,4 +39,270 @@ struct action_key { int (*callback)(void *app, void *d_args); }; +typedef struct fl_item { + size_t size; + char *name; + char *description; + char *owner; + struct fl_item *next; +} fl_item_t; + +enum main_window_type { + mw_fl_server, /* file list on the server */ + mw_fl_local, /* local file list */ + mw_f_desc, /* file description */ +}; + +typedef void(draw_f_t)(void *fui); + +typedef struct main_window { + enum main_window_type type; + void *ui; /* structure which describes window UI */ + int32_t (*cb_b_press)(void *app, void *args); /* callback on button press */ + void (*cb_ui_refresh)(void *app); /* refresh callback */ + void (*reset)(void *app); /* function to reset the state of the window */ + draw_f_t *draw; + struct action_key *b_keys; + int32_t b_keys_len; +} main_window_t; + + +typedef struct file_args { + int file_d; + fl_item_t f_selected; + fl_item_t *l_start; + fl_item_t *l_current; +} file_args_t; + + +typedef struct params { + unsigned short port; + unsigned addr; + char *uname; + char *pass; + char privileges; + int32_t sd; + int32_t is_connected : 1; +} params_t; + +enum state { + /* TUI-based */ + S_N_D, + S_ASK_SEVER_IP, + S_ASK_LOGIN_TYPE, + S_ASK_LOGIN_USER, + S_ASK_REGISTER, + S_WAIT_SERVER, + S_PREP_SERVER_MESSAGE, + S_PRINT_SERVER_MESSAGE, + S_FILE_LIST, + S_WAIT_PASS, + /* S_FILE_SELECT, */ + S_DOWNLOAD_FILE, + S_UPLOAD_PARAMS, + S_UPLOAD_FILE, + /* S_UPLOAD_FILE_SELECT, */ + S_UPLOAD_REQUESTED, + S_UPLOAD_SERVER_FINISHES, + S_ASK_USER_BEFORE_LOGIN, + S_ERR, + S_NEXT_ACTION, + S_WAIT_REGISTER_CONFIRMATION, + S_WAIT_USER_DESCRIPTION, + /* Legacy */ + WAIT_SERVER_INIT, + WAIT_SERVER, + WAIT_REGISTER, + WAIT_REGISTER_CONFIRMATION, + WAIT_CLIENT, +}; + +enum package_signal { sig_continue, sig_cancel, sig_finish, sig_pause }; + +typedef struct { + enum package_signal signal; + size_t package_size; +} s_file_pd_t; /* file package descriptor */ + +typedef struct p_file { + char *name; + char *path; + char *description; + size_t size; + size_t rest; + size_t package_rest; + int32_t it_count; + size_t it_interval; + enum package_signal signal; + int fd; +} p_file_t; + +typedef struct query_args { + int32_t sd; + int32_t buf_used; + p_file_t *file; + enum state state; + char buf[INBUFSIZE]; + bool from_server; + params_t *params; + struct { + char *text; + int32_t capacity; + int32_t size; + } server_message; + main_window_t *main_ui; + void *progress_bar; + void *active_dialogue; + void *notification; +} query_args_t; + +enum w_dialogue_color_scheme { dc_normal, dc_alert }; + +enum w_g_type { g_content, g_action }; + +enum w_g_dir { + horizontal, + vertical, +}; + +enum w_type { + w_end, + w_button, + w_box, + w_group, + w_input, + w_checkbox, + w_progress, +}; + +enum w_val_type { + val_num, + val_ptr, + val_nul, +}; + +struct w_val_t { + enum w_val_type type; + union { + void *ptr; + int32_t num; + } val; +}; + +typedef struct { + int32_t id; + int32_t idx; /* element index in the group */ + void *element; + enum w_type type; + enum w_g_type g_type; + bool is_default; + struct w_val_t val; +} w_g_el_t; + +/* widget callback response code */ +enum w_cbrp_code { + cbrc_none, /* default */ + cbrp_val, + cbrp_g_el, /* element of type group_el_t */ + cbrp_err +}; + +enum w_pmt_attrs { + PMT_POS_CENTER = 01, + PMT_ALIGN_CENTER = 03, +}; + +/* widget callback response data */ +typedef struct { + enum w_cbrp_code code; + struct w_val_t val; +} w_cbrp_data; + +typedef struct { + void *app; + void *element; + void *data; + w_cbrp_data resp_data; + void *active_el; +} w_cb_args_t; + +typedef int32_t (*w_cb_press_t)(void *app, void *data); + +typedef void (*w_cb_t)(w_cb_args_t *args); + +typedef struct w_t { + int32_t id; + char title[DIALOGUE_TITLE]; + struct { + int32_t y; + int32_t x; + } cur; /* cursor position */ + struct { + int32_t y; + int32_t x; + } sz; /* size */ + struct { + int32_t y; + int32_t x; + } m; /* margin (relative to the parent) */ + struct { + int32_t y; + int32_t x; + } ps; /* position (relative to the window) */ + WINDOW *const *parent_win; + struct w_t *w_parent; + w_cb_t callback; +} w_t; + +typedef struct group_el_init_t { + enum w_type type; + bool is_default; + bool is_hidden_value; + char label[DIALOGUE_TITLE]; + int32_t length; + enum w_g_dir direction; + union { + int32_t num; + } val; + struct group_el_init_t *children; +} w_group_el_init_t; + +typedef struct group_t { + w_t w; + w_g_el_t *elements; + enum w_g_dir direction; + int32_t count; + int32_t first_id, last_id; + struct group_t *parent_group; +} w_group_t; + +typedef struct { + w_t w; + WINDOW *win; + w_group_t *g_content; + w_group_t *g_action; + w_g_el_t *active_el; + char text[DIALOGUE_TEXT]; + bool is_initiated; + bool needs_update; + bool needs_destroy; + coordinates_t *p_coordinates; + enum w_dialogue_color_scheme color_scheme; + d_array_ptr_t id_map; +} w_dialogue_t; + +typedef struct app_t { + WINDOW *win; + w_dialogue_t modal; + params_t *params; + coordinates_t coordinates; + 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; +} app_t; + #endif \ No newline at end of file diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt new file mode 100644 index 0000000..3c4f938 --- /dev/null +++ b/src/core/CMakeLists.txt @@ -0,0 +1,23 @@ +add_library(core STATIC) + +file(GLOB M_SOURCES "*.c") + +target_sources(core + PRIVATE + ${M_SOURCES} + PUBLIC + FILE_SET HEADERS + FILES + core.h +) +target_link_libraries(core + PRIVATE + common + widget_core + widget + bstring + utils + modals + windows +) + diff --git a/src/app.c b/src/core/app.c similarity index 99% rename from src/app.c rename to src/core/app.c index d33e55c..116084e 100644 --- a/src/app.c +++ b/src/core/app.c @@ -1,7 +1,7 @@ /* SPDX-License-Identifier: MIT */ /* Copyright (c) 2026 Oleksandr Zhylin */ -#include "../app.h" +#include "app.h" #include #include #include diff --git a/src/app.h b/src/core/app.h similarity index 56% rename from src/app.h rename to src/core/app.h index 005c784..60a04f3 100644 --- a/src/app.h +++ b/src/core/app.h @@ -4,9 +4,7 @@ #ifndef APP_H #define APP_H -#include "../main.h" -#include "../common.h" -#include "dialogue.h" +#include #include #include #include @@ -15,20 +13,6 @@ typedef enum { modal_color_pair = 3, } app_color; -typedef struct app_t { - WINDOW *win; - w_dialogue_t modal; - params_t *params; - coordinates_t coordinates; - 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; -} app_t; - app_t *app_init(app_t *app); void app_init_nc(void); void app_destroy(app_t *app, int32_t exit_code); diff --git a/src/connection.c b/src/core/connection.c similarity index 98% rename from src/connection.c rename to src/core/connection.c index 71cf921..aca801d 100644 --- a/src/connection.c +++ b/src/core/connection.c @@ -1,8 +1,8 @@ /* SPDX-License-Identifier: MIT */ /* Copyright (c) 2026 Oleksandr Zhylin */ -#include "alert.h" -#include "main.h" +#include "app.h" +#include #include #include #include diff --git a/src/connection.h b/src/core/connection.h similarity index 95% rename from src/connection.h rename to src/core/connection.h index 5c74653..a10eaf8 100644 --- a/src/connection.h +++ b/src/core/connection.h @@ -3,7 +3,7 @@ #ifndef CONNECTION_H #define CONNECTION_H -#include "main.h" + #include bool connect_to_server(app_t *params); diff --git a/src/core/core.h b/src/core/core.h new file mode 100644 index 0000000..17b0206 --- /dev/null +++ b/src/core/core.h @@ -0,0 +1,12 @@ +#ifndef CORE_H +#define CORE_H + +#include "app.h" +#include "connection.h" +#include "draw_modal.h" +#include "file_processor.h" +#include "fs.h" +#include "query.h" +#include "server.h" + +#endif \ No newline at end of file diff --git a/src/draw_modal.c b/src/core/draw_modal.c similarity index 98% rename from src/draw_modal.c rename to src/core/draw_modal.c index 1dfeef5..b88a076 100644 --- a/src/draw_modal.c +++ b/src/core/draw_modal.c @@ -1,7 +1,6 @@ /* SPDX-License-Identifier: MIT */ /* Copyright (c) 2026 Oleksandr Zhylin */ -#include "main.h" #include #include diff --git a/src/draw_modal.h b/src/core/draw_modal.h similarity index 98% rename from src/draw_modal.h rename to src/core/draw_modal.h index 5fb8576..9aa5e40 100644 --- a/src/draw_modal.h +++ b/src/core/draw_modal.h @@ -3,6 +3,8 @@ #ifndef DRAW_MODAL_H #define DRAW_MODAL_H + #include + void app_draw_modal(app_t *app); #endif \ No newline at end of file diff --git a/src/file_processor.c b/src/core/file_processor.c similarity index 99% rename from src/file_processor.c rename to src/core/file_processor.c index c272a30..71769f8 100644 --- a/src/file_processor.c +++ b/src/core/file_processor.c @@ -2,7 +2,6 @@ /* Copyright (c) 2026 Oleksandr Zhylin */ #include "alert.h" -#include "dialogue.h" #include "server.h" #include #include @@ -20,10 +19,10 @@ #include #include #include -#include +#include +#include #include "file_processor.h" -#include "main.h" #include "query.h" static void fl_add(fl_item_t **cur, fl_item_t **start, char *fname); diff --git a/src/file_processor.h b/src/core/file_processor.h similarity index 97% rename from src/file_processor.h rename to src/core/file_processor.h index ae085e4..8a70555 100644 --- a/src/file_processor.h +++ b/src/core/file_processor.h @@ -4,7 +4,7 @@ #ifndef FILE_PROCESSOR_H #define FILE_PROCESSOR_H -#include "main.h" +#include "common.h" void file_list(file_args_t *f_args, query_args_t *q_args); void file_download(file_args_t *f_args, query_args_t *q_args); @@ -16,4 +16,5 @@ 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); void clear_file_in_query(query_args_t *q_args); + #endif \ No newline at end of file diff --git a/src/fs.c b/src/core/fs.c similarity index 100% rename from src/fs.c rename to src/core/fs.c diff --git a/src/fs.h b/src/core/fs.h similarity index 100% rename from src/fs.h rename to src/core/fs.h diff --git a/src/query.c b/src/core/query.c similarity index 99% rename from src/query.c rename to src/core/query.c index 7dadbdc..4ff17aa 100644 --- a/src/query.c +++ b/src/core/query.c @@ -1,7 +1,6 @@ /* SPDX-License-Identifier: MIT */ /* Copyright (c) 2026 Oleksandr Zhylin */ -#include "query.h" #include #include #include @@ -23,13 +22,12 @@ #include #include #include -#include +#include "app.h" +#include "query.h" #include "alert.h" #include "connection.h" -#include "dialogue.h" #include "file_processor.h" -#include "main.h" #include "main_window.h" #include "server.h" #include "types.h" diff --git a/src/query.h b/src/core/query.h similarity index 93% rename from src/query.h rename to src/core/query.h index 740e39c..d4e7113 100644 --- a/src/query.h +++ b/src/core/query.h @@ -4,8 +4,6 @@ #ifndef QUERY_H #define QUERY_H -#include "../app.h" -#include "main.h" #include void query_loop(app_t *); diff --git a/src/server.c b/src/core/server.c similarity index 99% rename from src/server.c rename to src/core/server.c index 6503dcc..320bee7 100644 --- a/src/server.c +++ b/src/core/server.c @@ -1,9 +1,8 @@ /* SPDX-License-Identifier: MIT */ /* Copyright (c) 2026 Oleksandr Zhylin */ -#include "../app.h" +#include "app.h" #include "dialogue.h" -#include "main.h" #include "query.h" #include #include @@ -18,7 +17,7 @@ #include #include #include -#include +#include void ask_uname_and_password(params_t *params); void ask_register(params_t *params, char *email); diff --git a/src/server.h b/src/core/server.h similarity index 91% rename from src/server.h rename to src/core/server.h index e7f63fa..95ffc22 100644 --- a/src/server.h +++ b/src/core/server.h @@ -4,8 +4,8 @@ #ifndef SERVER_H #define SERVER_H -#include "../app.h" -#include "main.h" +#include + int process_server_command(char *line, int l_len, app_t *app); void ask_register(params_t *params, char *email); void server_send_string(query_args_t *q, const char *fmt, ...); diff --git a/src/main.c b/src/main.c index 847b872..701fbec 100644 --- a/src/main.c +++ b/src/main.c @@ -14,12 +14,10 @@ #include #include -#include "../app.h" +#include #include "alert.h" -#include "connection.h" -// #include "file_list.h" -#include "main.h" -#include "query.h" +#include +#include int32_t m_id = 0; diff --git a/src/main.h b/src/main.h index 0c2f53b..8ff61a9 100644 --- a/src/main.h +++ b/src/main.h @@ -9,129 +9,4 @@ #include #include -#define LOCAL_PORT 1999 -#define SERVER_PORT 2000 -#define LISTEN_QLEN 32 -#define INBUFSIZE 1024 -#define DOWNLOADS_DIR "./Downloads" -#define DIALOGUE_TITLE 64 -#define DIALOGUE_TEXT 4096 -#define INPUT_TEXT DIALOGUE_TITLE -#define PACKAGE_SIZE INBUFSIZE * 10 - -typedef struct params { - unsigned short port; - unsigned addr; - char *uname; - char *pass; - char privileges; - int32_t sd; - int32_t is_connected : 1; -} params_t; - -enum state { - /* TUI-based */ - S_N_D, - S_ASK_SEVER_IP, - S_ASK_LOGIN_TYPE, - S_ASK_LOGIN_USER, - S_ASK_REGISTER, - S_WAIT_SERVER, - S_PREP_SERVER_MESSAGE, - S_PRINT_SERVER_MESSAGE, - S_FILE_LIST, - S_WAIT_PASS, - /* S_FILE_SELECT, */ - S_DOWNLOAD_FILE, - S_UPLOAD_PARAMS, - S_UPLOAD_FILE, - /* S_UPLOAD_FILE_SELECT, */ - S_UPLOAD_REQUESTED, - S_UPLOAD_SERVER_FINISHES, - S_ASK_USER_BEFORE_LOGIN, - S_ERR, - S_NEXT_ACTION, - S_WAIT_REGISTER_CONFIRMATION, - S_WAIT_USER_DESCRIPTION, - /* Legacy */ - WAIT_SERVER_INIT, - WAIT_SERVER, - WAIT_REGISTER, - WAIT_REGISTER_CONFIRMATION, - WAIT_CLIENT, -}; - -enum package_signal { sig_continue, sig_cancel, sig_finish, sig_pause }; - -typedef struct { - enum package_signal signal; - size_t package_size; -} s_file_pd_t; /* file package descriptor */ - -typedef struct p_file { - char *name; - char *path; - char *description; - size_t size; - size_t rest; - size_t package_rest; - int32_t it_count; - size_t it_interval; - enum package_signal signal; - int fd; -} p_file_t; - -typedef struct fl_item { - size_t size; - char *name; - char *description; - char *owner; - struct fl_item *next; -} fl_item_t; - -typedef struct file_args { - int file_d; - fl_item_t f_selected; - fl_item_t *l_start; - fl_item_t *l_current; -} file_args_t; - -enum main_window_type { - mw_fl_server, /* file list on the server */ - mw_fl_local, /* local file list */ - mw_f_desc, /* file description */ -}; - -typedef void(draw_f_t)(void *fui); - -typedef struct main_window { - enum main_window_type type; - void *ui; /* structure which describes window UI */ - int32_t (*cb_b_press)(void *app, void *args); /* callback on button press */ - void (*cb_ui_refresh)(void *app); /* refresh callback */ - void (*reset)(void *app); /* function to reset the state of the window */ - draw_f_t *draw; - struct action_key *b_keys; - int32_t b_keys_len; -} main_window_t; - -typedef struct query_args { - int32_t sd; - int32_t buf_used; - p_file_t *file; - enum state state; - char buf[INBUFSIZE]; - bool from_server; - params_t *params; - struct { - char *text; - int32_t capacity; - int32_t size; - } server_message; - main_window_t *main_ui; - void *progress_bar; - void *active_dialogue; - void *notification; -} query_args_t; - #endif \ No newline at end of file diff --git a/src/modals/CMakeLists.txt b/src/modals/CMakeLists.txt index 026bb6f..919a6b2 100644 --- a/src/modals/CMakeLists.txt +++ b/src/modals/CMakeLists.txt @@ -2,13 +2,13 @@ add_library(modals STATIC) file(GLOB M_SOURCES "*.c") -target_link_directories(modals - PRIVATE - "../widget/" - "../widget_core/" - "../lib/" - "../utils/" -) +# target_link_directories(modals +# PRIVATE +# "../widget/" +# "../widget_core/" +# "../lib/" +# "../utils/" +# ) target_link_libraries(modals PRIVATE @@ -16,6 +16,8 @@ target_link_libraries(modals widget_core bstring utils + common + windows ) target_sources(modals diff --git a/src/modals/ask_server_addr.c b/src/modals/ask_server_addr.c index 19b83a7..ff86a30 100644 --- a/src/modals/ask_server_addr.c +++ b/src/modals/ask_server_addr.c @@ -4,7 +4,8 @@ #include #include #include -#include "../connection.h" +#include +#include #include "group.h" typedef struct { diff --git a/src/modals/load_pr.c b/src/modals/load_pr.c index 1ffd835..c25f515 100644 --- a/src/modals/load_pr.c +++ b/src/modals/load_pr.c @@ -1,15 +1,15 @@ -#include "../server.h" -#include "../windows/file_list.h" -#include "alert.h" -#include "dialogue.h" -#include "group.h" -#include "utils.h" +#include +#include #include #include #include #include #include +#include "alert.h" +#include "dialogue.h" +#include "group.h" + void dwn_pr_modal_cb(w_cb_args_t *args) { /* only cancel action */ int32_t key = *((int32_t *)args->data); diff --git a/src/modals/login_credentials.c b/src/modals/login_credentials.c index 6c42b41..5241b22 100644 --- a/src/modals/login_credentials.c +++ b/src/modals/login_credentials.c @@ -6,7 +6,8 @@ #include #include -#include "../server.h" +#include +#include typedef struct { w_button_t *element; diff --git a/src/modals/login_option.c b/src/modals/login_option.c index aef2501..fd45d61 100644 --- a/src/modals/login_option.c +++ b/src/modals/login_option.c @@ -6,7 +6,8 @@ #include #include -#include "../server.h" +#include +#include typedef struct { w_button_t *element; diff --git a/src/modals/register.c b/src/modals/register.c index 78a828f..70f2536 100644 --- a/src/modals/register.c +++ b/src/modals/register.c @@ -8,7 +8,7 @@ #include "alert.h" #include "group.h" -#include "../server.h" +#include typedef struct { w_button_t *element; diff --git a/src/modals/upload_props_dialogue.c b/src/modals/upload_props_dialogue.c index 7888ee5..9db8eb0 100644 --- a/src/modals/upload_props_dialogue.c +++ b/src/modals/upload_props_dialogue.c @@ -1,15 +1,14 @@ -#include "checkbox.h" -#include "group.h" -#include "widget_core.h" #include #include -#include #include #include +#include + #include #include - -#include "../server.h" +#include +#include "checkbox.h" +#include "group.h" void upload_props_dialogue_modal_cb(w_cb_args_t *args) { w_cb_args_t d_args; diff --git a/src/widget/CMakeLists.txt b/src/widget/CMakeLists.txt index ddc5b95..5440794 100644 --- a/src/widget/CMakeLists.txt +++ b/src/widget/CMakeLists.txt @@ -7,6 +7,8 @@ target_link_libraries(widget bstring widget_core utils + common + core ) target_sources(widget diff --git a/src/widget/alert.c b/src/widget/alert.c index ffb6d53..0988b0d 100644 --- a/src/widget/alert.c +++ b/src/widget/alert.c @@ -1,6 +1,6 @@ #include "alert.h" #include "dialogue.h" -#include "widget_core.h" +#include #include #include #include diff --git a/src/widget/alert.h b/src/widget/alert.h index 9a20b65..331c82a 100644 --- a/src/widget/alert.h +++ b/src/widget/alert.h @@ -1,8 +1,9 @@ #ifndef W_ALERT_H #define W_ALERT_H -#include "../app.h" +#include #include +#include void w_alert_init(app_t *app); void w_alert(const char *message); diff --git a/src/widget/button.c b/src/widget/button.c index 4202ef3..4791e73 100644 --- a/src/widget/button.c +++ b/src/widget/button.c @@ -8,7 +8,8 @@ #include #include "button.h" -#include "../app.h" + +#include w_button_t *init_button(WINDOW **win, w_t *w_parent, char *label) { w_button_t *btn = malloc(sizeof(w_button_t)); diff --git a/src/widget/checkbox.c b/src/widget/checkbox.c index c9c9f39..cc37bf6 100644 --- a/src/widget/checkbox.c +++ b/src/widget/checkbox.c @@ -6,7 +6,7 @@ #include #include -#include "../app.h" +#include #include "checkbox.h" #include diff --git a/src/widget/dialogue.c b/src/widget/dialogue.c index 990c2fb..6f5af3b 100644 --- a/src/widget/dialogue.c +++ b/src/widget/dialogue.c @@ -11,6 +11,7 @@ #include #include #include +#include static void (*active_callback_backup)(w_cb_args_t *) = NULL; diff --git a/src/widget/dialogue.h b/src/widget/dialogue.h index a98c6da..39f3432 100644 --- a/src/widget/dialogue.h +++ b/src/widget/dialogue.h @@ -4,31 +4,14 @@ #ifndef W_DIALOGUE_H #define W_DIALOGUE_H -#include "../common.h" -#include "group.h" +#include #include #include #include #include + #define MAX_IDS 64 -enum w_dialogue_color_scheme { dc_normal, dc_alert }; - -typedef struct { - w_t w; - WINDOW *win; - w_group_t *g_content; - w_group_t *g_action; - w_g_el_t *active_el; - char text[DIALOGUE_TEXT]; - bool is_initiated; - bool needs_update; - bool needs_destroy; - coordinates_t *p_coordinates; - enum w_dialogue_color_scheme color_scheme; - d_array_ptr_t id_map; -} w_dialogue_t; - void w_dialogue_init(w_dialogue_t *d, const char title[], const char text[], coordinates_t *p_coordinates); void w_dialogue_vinit(w_dialogue_t *dialogue, const char title[], diff --git a/src/widget/group.h b/src/widget/group.h index 418f25d..06eb9c2 100644 --- a/src/widget/group.h +++ b/src/widget/group.h @@ -7,28 +7,7 @@ #include #include #include - -typedef struct group_el_init_t { - enum w_type type; - bool is_default; - bool is_hidden_value; - char label[DIALOGUE_TITLE]; - int32_t length; - enum w_g_dir direction; - union { - int32_t num; - } val; - struct group_el_init_t *children; -} w_group_el_init_t; - -typedef struct group_t { - w_t w; - w_g_el_t *elements; - enum w_g_dir direction; - int32_t count; - int32_t first_id, last_id; - struct group_t *parent_group; -} w_group_t; +#include w_group_t *w_group_init(WINDOW **win, w_t *w_parent, w_group_el_init_t *children, d_array_ptr_t *id_map, enum w_g_dir dir, diff --git a/src/widget/input.c b/src/widget/input.c index 38c9f84..969f67e 100644 --- a/src/widget/input.c +++ b/src/widget/input.c @@ -6,7 +6,8 @@ #include #include -#include "../app.h" +#include +#include #include "input.h" #include #include diff --git a/src/widget/input.h b/src/widget/input.h index aa9fde5..6499a48 100644 --- a/src/widget/input.h +++ b/src/widget/input.h @@ -4,7 +4,6 @@ #ifndef W_INPUT_H #define W_INPUT_H -#include "../main.h" #include #include diff --git a/src/widget/progress_bar.c b/src/widget/progress_bar.c index faf43ca..1ce0390 100644 --- a/src/widget/progress_bar.c +++ b/src/widget/progress_bar.c @@ -2,7 +2,7 @@ /* Copyright (c) 2026 Oleksandr Zhylin */ #include "progress_bar.h" -#include "../app.h" +#include #include #include #include diff --git a/src/widget_core/CMakeLists.txt b/src/widget_core/CMakeLists.txt index 330d1f4..f627020 100644 --- a/src/widget_core/CMakeLists.txt +++ b/src/widget_core/CMakeLists.txt @@ -5,6 +5,7 @@ file(GLOB M_SOURCES "*.c") target_link_libraries(widget_core PRIVATE utils + common ) target_sources(widget_core diff --git a/src/widget_core/widget_core.c b/src/widget_core/widget_core.c index 272ee4f..b657492 100644 --- a/src/widget_core/widget_core.c +++ b/src/widget_core/widget_core.c @@ -6,7 +6,6 @@ so it is separated from the widget directory */ #include "widget_core.h" -#include "../main.h" #include #include #include diff --git a/src/widget_core/widget_core.h b/src/widget_core/widget_core.h index 9a676dd..96f8d3a 100644 --- a/src/widget_core/widget_core.h +++ b/src/widget_core/widget_core.h @@ -4,104 +4,9 @@ #ifndef WIDGET_CORE_H #define WIDGET_CORE_H -#include "../main.h" #include #include - -enum w_g_type { g_content, g_action }; - -enum w_g_dir { - horizontal, - vertical, -}; - -enum w_type { - w_end, - w_button, - w_box, - w_group, - w_input, - w_checkbox, - w_progress, -}; - -enum w_val_type { - val_num, - val_ptr, - val_nul, -}; - -struct w_val_t { - enum w_val_type type; - union { - void *ptr; - int32_t num; - } val; -}; - -typedef struct { - int32_t id; - int32_t idx; /* element index in the group */ - void *element; - enum w_type type; - enum w_g_type g_type; - bool is_default; - struct w_val_t val; -} w_g_el_t; - -/* widget callback response code */ -enum w_cbrp_code { - cbrc_none, /* default */ - cbrp_val, - cbrp_g_el, /* element of type group_el_t */ - cbrp_err -}; - -/* widget callback response data */ -typedef struct { - enum w_cbrp_code code; - struct w_val_t val; -} w_cbrp_data; - -typedef struct { - void *app; - void *element; - void *data; - w_cbrp_data resp_data; - void *active_el; -} w_cb_args_t; - -typedef void (*w_cb_t)(w_cb_args_t *args); -typedef int32_t (*w_cb_press_t)(void *app, void *data); - -typedef struct w_t { - int32_t id; - char title[DIALOGUE_TITLE]; - struct { - int32_t y; - int32_t x; - } cur; /* cursor position */ - struct { - int32_t y; - int32_t x; - } sz; /* size */ - struct { - int32_t y; - int32_t x; - } m; /* margin (relative to the parent) */ - struct { - int32_t y; - int32_t x; - } ps; /* position (relative to the window) */ - WINDOW *const *parent_win; - struct w_t *w_parent; - w_cb_t callback; -} w_t; - -enum w_pmt_attrs { - PMT_POS_CENTER = 01, - PMT_ALIGN_CENTER = 03, -}; +#include void w_init(w_t *w, w_t *w_parent, WINDOW **win, char *title); int32_t w_get_max_line_len(const char *text, int32_t *line_count); diff --git a/src/windows/CMakeLists.txt b/src/windows/CMakeLists.txt index ea2e816..8eb3739 100644 --- a/src/windows/CMakeLists.txt +++ b/src/windows/CMakeLists.txt @@ -2,13 +2,13 @@ add_library(windows STATIC) file(GLOB M_SOURCES "*.c") -target_link_directories(windows - PRIVATE - "../widget/" - "../widget_core/" - "../lib/" - "../utils/" -) +# target_link_directories(windows +# PRIVATE +# "../widget/" +# "../widget_core/" +# "../lib/" +# "../utils/" +# ) target_link_libraries(windows PRIVATE @@ -16,6 +16,8 @@ target_link_libraries(windows widget_core bstring utils + core + common ) target_sources(windows diff --git a/src/windows/file_list.c b/src/windows/file_list.c index 89230cc..682f3f9 100644 --- a/src/windows/file_list.c +++ b/src/windows/file_list.c @@ -2,10 +2,8 @@ /* Copyright (c) 2026 Oleksandr Zhylin */ #include "file_list.h" -#include "../app.h" -#include "../file_processor.h" -#include "../fs.h" -#include "../server.h" +#include +#include #include "main_window.h" #include #include diff --git a/src/windows/file_list.h b/src/windows/file_list.h index 6f833ee..2b47eb5 100644 --- a/src/windows/file_list.h +++ b/src/windows/file_list.h @@ -4,7 +4,6 @@ #ifndef W_FILE_LIST_H #define W_FILE_LIST_H -#include "../app.h" #include #include #include diff --git a/src/windows/fs_file_list.c b/src/windows/fs_file_list.c index 0c673e5..f44dd12 100644 --- a/src/windows/fs_file_list.c +++ b/src/windows/fs_file_list.c @@ -15,9 +15,11 @@ #include #include -#include "../file_processor.h" -#include "../fs.h" -#include "../server.h" +#include +#include +#include +#include + #include "alert.h" #include "fs_file_list.h" #include "main_window.h" diff --git a/src/windows/fs_file_list.h b/src/windows/fs_file_list.h index 5503b3a..cc326ff 100644 --- a/src/windows/fs_file_list.h +++ b/src/windows/fs_file_list.h @@ -4,7 +4,6 @@ #ifndef W_LFL_H /* LOCAL FILE LIST */ #define W_LFL_H -#include "../app.h" #include #include #include diff --git a/src/windows/main_window.c b/src/windows/main_window.c index 7031ec3..9dd00d3 100644 --- a/src/windows/main_window.c +++ b/src/windows/main_window.c @@ -6,6 +6,9 @@ #include "fs_file_list.h" #include "text_edit.h" +#include +#include + void main_window_set(app_t *app, enum main_window_type type) { if (app->main_ui.ui != NULL) { main_window_destroy(app); diff --git a/src/windows/main_window.h b/src/windows/main_window.h index e1b05aa..ff6e3a9 100644 --- a/src/windows/main_window.h +++ b/src/windows/main_window.h @@ -4,7 +4,7 @@ #ifndef MAIN_WINDOW_H #define MAIN_WINDOW_H -#include "../app.h" +#include void main_window_set(app_t *app, enum main_window_type type); void main_window_draw(app_t *app); diff --git a/src/windows/text_edit.c b/src/windows/text_edit.c index 089f1c8..b4f314f 100644 --- a/src/windows/text_edit.c +++ b/src/windows/text_edit.c @@ -1,9 +1,6 @@ /* SPDX-License-Identifier: MIT */ /* Copyright (c) 2026 Oleksandr Zhylin */ -#include "../file_processor.h" -#include "../server.h" -#include "../windows/main_window.h" #include #include #include @@ -17,10 +14,15 @@ #include #include +#include +#include +#include + #include "d_array.h" #include "file_list.h" #include "text_edit.h" #include "widget_core.h" +#include "main_window.h" /* TODO: расширять capacity линии при достижении лимита */ diff --git a/src/windows/text_edit.h b/src/windows/text_edit.h index eaa0468..a22e8ec 100644 --- a/src/windows/text_edit.h +++ b/src/windows/text_edit.h @@ -4,7 +4,6 @@ #ifndef W_TEXT_EDIT_H /* LOCAL FILE LIST */ #define W_TEXT_EDIT_H -#include "../app.h" #include #include #include