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は実際の場所を決定できません。存在する端末画面では、画面の内容を記録する配列の制限を超えてこの情報を誤用することはできません。
処理された問題は、SIGWINCH
ncursesが実行されていることを確認することです。「危険」信号ハンドラの外部での作業。シグナルハンドラは、ncursesが(安全に)確認できる変数のみを設定します。
アプリケーションは戻りSIGWINCH
時期を検出できます。復帰の副作用として(参照wgetch
KEY_RESIZE
KEY_RESIZE
ノートマニュアルページで)ncursesは渡されます。機内通話装置到着clearok
(ユーザーがリフレッシュを強制するためにいくつかの特殊キーを押す必要性が減ります):
もし
clearok
と言うTRUE
パラメータとして次の呼び出しwrefresh
このウィンドウを使用すると、画面が完全に消去され、画面全体が最初から再描画されます。画面内容が次のような場合 不確実な、または場合によってはより楽しい視覚効果のため。もしwin
議論clearok
グローバル変数ですcurscr
、次の電話wrefresh
どのウィンドウでも作業すると、画面が消去され、最初から再描画されます。
実際にはこれだけで十分です(KEY_RESIZE
ncursesができない作業を再描画するように思い出させるように設計されたプログラムの場合)。これdialog
たとえば、プログラムはそのようなことをします(参照:ソースコード)
アプリケーション開発者は依然としてシステムメッセージを処理するために再描画キーを望むかもしれない。wall
(画面が複雑になることがあります。)