--- lbbs/src/screen.c 2025/11/08 08:21:31 1.127 +++ lbbs/src/screen.c 2025/11/08 09:05:59 1.128 @@ -303,8 +303,9 @@ int get_data(int row, int col, char *pro int eol; int display_len; char input_str[5]; - wchar_t wcs[2]; int str_len = 0; + wchar_t wcs[2]; + int wc_len; char c; buffer[buf_size - 1] = '\0'; @@ -351,8 +352,18 @@ int get_data(int row, int col, char *pro str_len++; offset--; } - display_len--; - col_cur--; + + if (mbstowcs(wcs, buffer + offset, 1) == (size_t)-1) + { + log_error("mbstowcs() error\n"); + } + wc_len = (UTF8_fixed_width ? 2 : wcwidth(wcs[0])); + + if (wc_len == 2) + { + display_len--; + col_cur--; + } } memmove(buffer + offset, buffer + offset + str_len, (size_t)(len - offset - str_len)); @@ -415,7 +426,17 @@ int get_data(int row, int col, char *pro str_len++; offset--; } - col_cur--; + + if (mbstowcs(wcs, buffer + offset, 1) == (size_t)-1) + { + log_error("mbstowcs() error\n"); + } + wc_len = (UTF8_fixed_width ? 2 : wcwidth(wcs[0])); + + if (wc_len == 2) + { + col_cur--; + } } col_cur--; @@ -437,7 +458,17 @@ int get_data(int row, int col, char *pro str_len++; c = (c & 0x7f) << 1; } - col_cur++; + + if (mbstowcs(wcs, buffer + offset, 1) == (size_t)-1) + { + log_error("mbstowcs() error\n"); + } + wc_len = (UTF8_fixed_width ? 2 : wcwidth(wcs[0])); + + if (wc_len == 2) + { + col_cur++; + } } else { @@ -517,7 +548,10 @@ int get_data(int row, int col, char *pro { log_error("mbstowcs() error\n"); } - if (len + str_len > buf_size - 1 || display_len + (UTF8_fixed_width ? 2 : wcwidth(wcs[0])) > max_display_len) // No enough space for Chinese character + wc_len = (UTF8_fixed_width ? 2 : wcwidth(wcs[0])); + + if (len + str_len > buf_size - 1 || + display_len + wc_len > max_display_len) // No enough space for Chinese character { outc('\a'); iflush(); @@ -528,13 +562,13 @@ int get_data(int row, int col, char *pro memcpy(buffer + offset, input_str, (size_t)str_len); len += str_len; buffer[len] = '\0'; - display_len += 2; + display_len += wc_len; moveto(row, col_cur); prints("%s", buffer + offset); prints("%*s", max_display_len - display_len, ""); - col_cur += 2; + col_cur += wc_len; moveto(row, col_cur); iflush();