ncurses `doupdate`で端末のサイズを変更するとどうなりますか?

ncurses `doupdate`で端末のサイズを変更するとどうなりますか?

ncurses の関数は、doupdate必要に応じて画面サイズを更新しようとします。

ncurses/tty/tty_update.c:

if ((SP_PARM->_endwin == ewSuspend)
|| _nc_handle_sigwinch(SP_PARM)) {
/*
 * This is a transparent extension:  XSI does not address it,
 * and applications need not know that ncurses can do it.
 *
 * Check if the terminal size has changed while curses was off
 * (this can happen in an xterm, for example), and resize the
 * ncurses data structures accordingly.
 */
_nc_update_screensize(SP_PARM);
}

私の質問は次のとおりです

端末のサイズを変更するとどうなりますか?後ろに確認は完了しましたが、今後実際に端末に記録された内容はありますか?関数が新しいサイズで端末に書き込むが古いサイズを信頼する場合、プログラムが中断または定義されていない他の動作は発生しますか?

_nc_flush表示されたテキストと端末制御文字を出力ファイル記述子にフラッシュするようです。しかし、サイズの問題がある場合に発生する可能性のある最悪の状況が何であるかはまだわかりません。いつも回復可能ですか?つまり、ライブラリが正しい端末サイズを見つけた場合、競合が発生せず、すべてが再び正常に機能しますか?

ベストアンサー1

コメントに同意します。 ncursesが新しいサイズまたは拡張サイズを取得する前に端末のサイズを変更すると、多くのことは発生しません。一部の文字は「間違った」場所に書き込まれる可能性がありますが、ncursesは実際の場所を決定できません。存在する端末画面では、画面の内容を記録する配列の制限を超えてこの情報を誤用することはできません。

処理された問題は、SIGWINCHncursesが実行されていることを確認することです。「危険」信号ハンドラの外部での作業。シグナルハンドラは、ncursesが(安全に)確認できる変数のみを設定します。

アプリケーションは戻りSIGWINCH時期を検出できます。復帰の副作用として(参照wgetchKEY_RESIZEKEY_RESIZEノートマニュアルページで)ncursesは渡されます。機内通話装置到着clearok(ユーザーがリフレッシュを強制するためにいくつかの特殊キーを押す必要性が減ります):

もしclearokと言うTRUEパラメータとして次の呼び出し wrefresh このウィンドウを使用すると、画面が完全に消去され、画面全体が最初から再描画されます。画面内容が次のような場合 不確実な、または場合によってはより楽しい視覚効果のため。もしwin議論clearokグローバル変数です curscr、次の電話 wrefresh どのウィンドウでも作業すると、画面が消去され、最初から再描画されます。

実際にはこれだけで十分です(KEY_RESIZEncursesができない作業を再描画するように思い出させるように設計されたプログラムの場合)。これdialogたとえば、プログラムはそのようなことをします(参照:ソースコード)

アプリケーション開発者は依然としてシステムメッセージを処理するために再描画キーを望むかもしれない。wall(画面が複雑になることがあります。)

おすすめ記事