--- lbbs/src/editor.c 2025/06/11 10:44:33 1.9 +++ lbbs/src/editor.c 2025/06/11 11:55:50 1.11 @@ -169,7 +169,7 @@ int editor_data_insert(EDITOR_DATA *p_ed // Get accurate offset of first character of CJK at offset position for (i = 0; i < offset; i++) { - if (p_editor_data->p_display_lines[display_line][i] < 0) // GBK + if (p_editor_data->p_display_lines[display_line][i] < 0 || p_editor_data->p_display_lines[display_line][i] > 127) // GBK { i++; } @@ -368,7 +368,7 @@ int editor_data_delete(EDITOR_DATA *p_ed // Get accurate offset of first character of CJK at offset position for (i = 0; i < offset; i++) { - if (p_editor_data->p_display_lines[display_line][i] < 0) // GBK + if (p_editor_data->p_display_lines[display_line][i] < 0 || p_editor_data->p_display_lines[display_line][i] > 127) // GBK { i++; } @@ -417,8 +417,10 @@ int editor_data_delete(EDITOR_DATA *p_ed } else { - log_error("Some strange character at display_line %ld, offset %ld\n", display_line, offset); - return -2; + log_error("Some strange character at display_line %ld, offset %ld: %d %d %d %d\n", + display_line, offset, p_data_line[offset_data_line], p_data_line[offset_data_line + 1], + p_data_line[offset_data_line + 2], p_data_line[offset_data_line + 3]); + str_len = 1; } // Current display line is (almost) empty @@ -586,11 +588,9 @@ int editor_display(EDITOR_DATA *p_editor iflush(); input_ok = 0; + ch = igetch_t(MAX_DELAY_TIME); while (!SYS_server_exit && !input_ok) { - ch = igetch_t(MAX_DELAY_TIME); - input_ok = 1; - // extended key handler if (editor_display_key_handler(&ch, &ctx) != 0) { @@ -668,9 +668,15 @@ int editor_display(EDITOR_DATA *p_editor row_pos += (display_line_out - display_line_in); } col_pos = offset_out + 1; + } - continue; + // Check whether there is additional input + ch = igetch(0); + if (ch == KEY_TIMEOUT) + { + input_ok = 1; } + continue; } else if (ch == KEY_DEL || ch == BACKSPACE) // Del { @@ -716,9 +722,16 @@ int editor_display(EDITOR_DATA *p_editor } } + // Check whether there is additional input + ch = igetch(0); + if (ch == KEY_TIMEOUT) + { + input_ok = 1; + } continue; } + input_ok = 1; switch (ch) { case KEY_NULL: @@ -881,6 +894,10 @@ int editor_display(EDITOR_DATA *p_editor } BBS_last_access_tm = time(0); + if (!input_ok) + { + ch = igetch_t(MAX_DELAY_TIME); + } } continue;