readlineとANSIエスケープコードのみを使用してコンソールチャットクライアントを作成しようとしています。
私の目標は、新しい入力のメッセージの後に常にreadlineプロンプトを表示しながら、端末にチャット履歴のスクロールバックとスクロールを処理させることです。
私は2つのスレッドで次のことを試しました。私のコンソール入力スレッドは次のことを行います。
printf("\x1B[s"); // Save cursor position
message = readline("Prompt > ");
そして、私のメッセージ受信スレッドは次のことを行います。
message = receive_message(); // Blocks for next message
printf("\x1B[u"); // Restore cursor to before the prompt
printf("\x1B[J"); // Erase readline prompt and input (down to bottom of screen)
printf("%s\n", message); // Print the message (where readline was)
printf("\x1B[s"); // Save new cursor position
rl_forced_update_display(); // Restore readline
上記は、 readline入力が折り返されない限り機能します。折り返すと、保存されたカーソル位置の復元が期待どおりに機能せず、垂直位置ではなく、水平位置のみが復元されるように見えます。
入力行が折り返されている場合でも、上記のコードを機能するようにするにはどうすればよいですか?