From 27911d38863e62e9796b1fb6bc3707e0d76ce265 Mon Sep 17 00:00:00 2001 From: Alexander Zhylin Date: Fri, 6 Mar 2026 15:18:47 +0200 Subject: [PATCH] UTF-8 support (initial commit) --- CMakeLists.txt | 2 +- TODO.md | 3 +-- src/connection.c | 2 +- src/main.c | 2 +- src/modals/alert.c | 2 +- src/modals/ask_server_addr.c | 6 +++--- src/modals/download_pr.c | 2 +- src/modals/login_credentials.c | 2 +- src/modals/login_option.c | 2 +- src/modals/notification.c | 2 +- src/modals/register.c | 2 +- src/modals/server_message.c | 2 +- src/modals/upload_dialogue.c | 2 +- src/modals/upload_props_dialogue.c | 2 +- src/query.c | 2 +- src/utils/utf8.c | 9 +++++++++ src/utils/utf8.h | 7 +++++++ src/utils/utils.h | 1 + src/widget/app.c | 4 +++- src/widget/app.h | 2 +- src/widget/button.c | 2 +- src/widget/dialogue.c | 2 +- src/widget/dialogue.h | 2 +- src/widget/file_list.c | 2 +- src/widget/fs_file_list.c | 11 +++++++++-- src/widget/fs_file_list.h | 2 +- src/widget/group.c | 2 +- src/widget/input.c | 2 +- src/widget/progress_bar.c | 2 +- src/widget_core/widget_core.c | 2 +- src/widget_core/widget_core.h | 2 +- 31 files changed, 57 insertions(+), 32 deletions(-) create mode 100644 src/utils/utf8.c create mode 100644 src/utils/utf8.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 4f644a6..2c7695c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,7 +11,7 @@ if( add_compile_definitions(_GNU_SOURCE) endif() -set(CURSES_NEED_NCURSES TRUE) +set(CURSES_NEED_WIDE TRUE) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) find_package(Curses REQUIRED) diff --git a/TODO.md b/TODO.md index 2858112..e664283 100644 --- a/TODO.md +++ b/TODO.md @@ -17,11 +17,10 @@ - [ ] UTF-8 support ## Future ideas -- [ ] Advanced ui element positioning system - [ ] Get rid of old notification mechanism ## Fixes: -- [ ] Check and fix registration and login +- [x] Check and fix registration and login - [ ] Hotkeys for buttons - [ ] Group elements as lists - [ ] "Server message" to notification diff --git a/src/connection.c b/src/connection.c index 8e354d8..65d6b85 100644 --- a/src/connection.c +++ b/src/connection.c @@ -1,7 +1,7 @@ #include "main.h" #include #include -#include +#include #include #include #include diff --git a/src/main.c b/src/main.c index d199e5f..baed886 100644 --- a/src/main.c +++ b/src/main.c @@ -1,5 +1,5 @@ #include -#include +#include #include #include #include diff --git a/src/modals/alert.c b/src/modals/alert.c index ef5f0ea..a6eeb96 100644 --- a/src/modals/alert.c +++ b/src/modals/alert.c @@ -1,5 +1,5 @@ #include -#include +#include #include #include diff --git a/src/modals/ask_server_addr.c b/src/modals/ask_server_addr.c index 27f3451..cf34086 100644 --- a/src/modals/ask_server_addr.c +++ b/src/modals/ask_server_addr.c @@ -1,6 +1,6 @@ #include #include -#include +#include #include #include #include "../connection.h" @@ -23,13 +23,13 @@ void asa_modal_dialogue_callback(callback_args_t *args) { dialogue_default_callback(&d_args); if (d_args.resp_data.code == cbrp_val) { switch (d_args.resp_data.val.val.num) { - case 0: + case 1: get_ip_port(app->params, in_ip->value, in_port->value); connect_to_server(app); d->needs_destroy = true; app->query_args->state = S_WAIT_SERVER; break; - case 1: + case 2: destroy_app(app, 0); } } diff --git a/src/modals/download_pr.c b/src/modals/download_pr.c index 7d453b1..901e8cf 100644 --- a/src/modals/download_pr.c +++ b/src/modals/download_pr.c @@ -1,6 +1,6 @@ #include "group.h" #include -#include +#include #include #include diff --git a/src/modals/login_credentials.c b/src/modals/login_credentials.c index 13f282f..dd92a01 100644 --- a/src/modals/login_credentials.c +++ b/src/modals/login_credentials.c @@ -1,5 +1,5 @@ #include "group.h" -#include +#include #include #include #include diff --git a/src/modals/login_option.c b/src/modals/login_option.c index 09d4f69..cbf7503 100644 --- a/src/modals/login_option.c +++ b/src/modals/login_option.c @@ -1,5 +1,5 @@ #include "group.h" -#include +#include #include #include #include diff --git a/src/modals/notification.c b/src/modals/notification.c index a4988b3..4fd2976 100644 --- a/src/modals/notification.c +++ b/src/modals/notification.c @@ -1,5 +1,5 @@ #include "group.h" -#include +#include #include #include #include diff --git a/src/modals/register.c b/src/modals/register.c index 3b1f362..4573749 100644 --- a/src/modals/register.c +++ b/src/modals/register.c @@ -1,4 +1,4 @@ -#include +#include #include #include #include diff --git a/src/modals/server_message.c b/src/modals/server_message.c index e7fb528..0a5dfde 100644 --- a/src/modals/server_message.c +++ b/src/modals/server_message.c @@ -1,5 +1,5 @@ #include "group.h" -#include +#include #include #include #include diff --git a/src/modals/upload_dialogue.c b/src/modals/upload_dialogue.c index f1b33df..76ca50a 100644 --- a/src/modals/upload_dialogue.c +++ b/src/modals/upload_dialogue.c @@ -1,6 +1,6 @@ #include "../file_processor.h" #include "group.h" -#include +#include #include #include #include diff --git a/src/modals/upload_props_dialogue.c b/src/modals/upload_props_dialogue.c index def81ec..1b4ba46 100644 --- a/src/modals/upload_props_dialogue.c +++ b/src/modals/upload_props_dialogue.c @@ -1,6 +1,6 @@ #include "group.h" #include -#include +#include #include #include #include diff --git a/src/query.c b/src/query.c index 72df260..e0864dd 100644 --- a/src/query.c +++ b/src/query.c @@ -1,6 +1,6 @@ #include #include -#include +#include #include #include #include diff --git a/src/utils/utf8.c b/src/utils/utf8.c new file mode 100644 index 0000000..03ed128 --- /dev/null +++ b/src/utils/utf8.c @@ -0,0 +1,9 @@ +#include + +size_t count_utf8_code_points(const char *s) { + size_t count = 0; + while (*s) { + count += (*s++ & 0xC0) != 0x80; + } + return count; +} diff --git a/src/utils/utf8.h b/src/utils/utf8.h new file mode 100644 index 0000000..6412f24 --- /dev/null +++ b/src/utils/utf8.h @@ -0,0 +1,7 @@ +#ifndef UTF8_H +#define UTF8_H + +#include +size_t count_utf8_code_points(const char *s); + +#endif \ No newline at end of file diff --git a/src/utils/utils.h b/src/utils/utils.h index be68e58..2b49d74 100644 --- a/src/utils/utils.h +++ b/src/utils/utils.h @@ -1,4 +1,5 @@ #ifndef D_UTILS_H #define D_UTILS_H #include "d_array.h" +#include "utf8.h" #endif \ No newline at end of file diff --git a/src/widget/app.c b/src/widget/app.c index 225cac2..fd21843 100644 --- a/src/widget/app.c +++ b/src/widget/app.c @@ -1,5 +1,6 @@ #include "app.h" -#include +#include +#include #include #include #include @@ -65,6 +66,7 @@ void init_nc() { noecho(); curs_set(false); set_escdelay(50); + setlocale(LC_ALL, ""); if (!has_colors()) { printf("Your terminal does not support color\n"); diff --git a/src/widget/app.h b/src/widget/app.h index 1714e0b..4dfa2db 100644 --- a/src/widget/app.h +++ b/src/widget/app.h @@ -4,7 +4,7 @@ #include "../main.h" #include "../common.h" #include "dialogue.h" -#include +#include #include #include diff --git a/src/widget/button.c b/src/widget/button.c index 3157e7e..3f92639 100644 --- a/src/widget/button.c +++ b/src/widget/button.c @@ -1,4 +1,4 @@ -#include +#include #include #include #include diff --git a/src/widget/dialogue.c b/src/widget/dialogue.c index f76aea0..3b86744 100644 --- a/src/widget/dialogue.c +++ b/src/widget/dialogue.c @@ -1,4 +1,4 @@ -#include +#include #include #include #include diff --git a/src/widget/dialogue.h b/src/widget/dialogue.h index 3d7f017..5041f69 100644 --- a/src/widget/dialogue.h +++ b/src/widget/dialogue.h @@ -3,7 +3,7 @@ #include "../common.h" #include "group.h" -#include +#include #include #include #include diff --git a/src/widget/file_list.c b/src/widget/file_list.c index e4ed0dc..aa3d87a 100644 --- a/src/widget/file_list.c +++ b/src/widget/file_list.c @@ -3,7 +3,7 @@ #include "../fs.h" #include "app.h" #include -#include +#include #include #include #include diff --git a/src/widget/fs_file_list.c b/src/widget/fs_file_list.c index 2ccc854..7d502c5 100644 --- a/src/widget/fs_file_list.c +++ b/src/widget/fs_file_list.c @@ -1,7 +1,7 @@ #include "fs_file_list.h" #include #include -#include +#include #include #include #include @@ -9,6 +9,7 @@ #include #include #include +#include #include void reset_file_list(ui_fs_file_list_t *fl_ui); @@ -181,7 +182,13 @@ void draw_fs_file_list(ui_fs_file_list_t *fl_ui) { wattrset(win, COLOR_PAIR(3) | A_BOLD | A_REVERSE); } p_x = 1; - mvwprintw(win, p_y, p_x, "%s%n", el->name, &p_x); + /* TODO: */ + wchar_t wname[512]; + mbstowcs(wname, el->name, 512); + // wchar_t text[] = L"ВUTF-8 работает! → ★ ℝ 日本語\n"; + mvwaddwstr(win, p_y, p_x++, L"Ё"); + mvwaddwstr(win, p_y, p_x++, L"Ж"); + // mvwprintw(win, p_y, p_x, "%s%n", el->name, &p_x); mvwprintw(win, p_y, p_x + 1, "%*s", sz_x_f - p_x, ""); if (el == fl_ui->current) { wattroff(win, COLOR_PAIR(3) | A_BOLD); diff --git a/src/widget/fs_file_list.h b/src/widget/fs_file_list.h index 538cfdd..418b31a 100644 --- a/src/widget/fs_file_list.h +++ b/src/widget/fs_file_list.h @@ -1,7 +1,7 @@ #ifndef FS_FILE_LIST_H #define FS_FILE_LIST_H #include -#include +#include #include #include diff --git a/src/widget/group.c b/src/widget/group.c index 3836407..bc8f98b 100644 --- a/src/widget/group.c +++ b/src/widget/group.c @@ -5,7 +5,7 @@ #include "input.h" #include "progress_bar.h" #include "widget_core.h" -#include +#include #include #include #include diff --git a/src/widget/input.c b/src/widget/input.c index cf23fdd..e8c5ea9 100644 --- a/src/widget/input.c +++ b/src/widget/input.c @@ -1,4 +1,4 @@ -#include +#include #include #include #include diff --git a/src/widget/progress_bar.c b/src/widget/progress_bar.c index adf1d84..9784bec 100644 --- a/src/widget/progress_bar.c +++ b/src/widget/progress_bar.c @@ -1,6 +1,6 @@ #include "progress_bar.h" #include "app.h" -#include +#include #include #include diff --git a/src/widget_core/widget_core.c b/src/widget_core/widget_core.c index da3c1a7..f287f18 100644 --- a/src/widget_core/widget_core.c +++ b/src/widget_core/widget_core.c @@ -1,6 +1,6 @@ #include "widget_core.h" #include "../main.h" -#include +#include #include #include #include diff --git a/src/widget_core/widget_core.h b/src/widget_core/widget_core.h index 26fa819..c5abd22 100644 --- a/src/widget_core/widget_core.h +++ b/src/widget_core/widget_core.h @@ -2,7 +2,7 @@ #define WIDGET_CORE_H #include "../main.h" -#include +#include #include enum g_type { g_content, g_action };