curses を使用する端末について

ユーザーのプログラムの機能は、 プログラムを実行する端末の機能によって部分的に制限されます。

この項では、端末の初期化およびその機能の識別に関する情報を提供します。

複数の端末の操作

curses を使用すれば、 入力と出力に 1 つまたは複数の端末を使用することができます。 端末サブルーチンによって、新規端末を確立し、入力処理と出力処理を切り替え、 端末の機能を取り出すことができます。

initscr サブルーチンを使用すれば、 1 つのデフォルト・スクリーンで curses を開始することができます。 アプリケーションが複数の端末に出力を送信する場合は、 newterm サブルーチンを使用してください。 端末ごとに、 newterm サブルーチンを呼び出してください。 端末がスクリーン指向のプログラムをサポートできないときに、 アプリケーションが行指向モードで実行を継続できるように、 エラー状態の指示を必要とする場合にも、newterm サブルーチンを使用します。

完了すると、プログラムは、使用した端末ごとに endwin サブルーチンを呼び出す必要があります。 同じ端末について、newterm サブルーチンを複数回呼び出す場合、最初に参照した端末は、endwin サブルーチンを呼び出す最後の端末でなければなりません。

set_term サブルーチンは、異なる端末間で入出力処理を切り替えます。

端末の機能の判別

curses には、端末の機能を判別するための以下のサブルーチンがあります。
サブルーチン 説明
has_ic 端末に文字挿入機能があるかどうかを判別します。
has_il 端末に行挿入機能があるかどうかを判別します。
ロング・ネーム 端末の詳細名を戻します。

longname サブルーチンは、 現在の端末に関する詳細記述が入っている静的領域を指すポインターを戻します。 この静的領域は、initscr または newterm サブルーチンへのコールの後にのみ定義されます。 複数の端末で longname サブルーチンを使用する必要がある場合、newterm サブルーチンへの各コールによって、 この領域が上書きされます。 set_term サブルーチンへのコールによって、 値は復元されません。 その代わりに、 newterm サブルーチンへのコールの間に、この領域を保管してください。

端末が文字挿入機能と文字削除機能を持っている場合、has_ic サブルーチンは TRUE を戻します。

端末が行挿入機能と行削除機能を持っているか、 またはスクロール領域を使用して、 この機能をシミュレートできる場合、has_il サブルーチンは TRUE を戻します。 scrollok または idlok サブルーチンを使用して物理スクロールをオンにすることが適切かどうかを検査するために、has_il サブルーチンを使用します。

端末の入力モードと出力モードの設定

入出力を制御するサブルーチンは、アプリケーションがデータを取り出し、 ユーザーに表示する方法を決定します。

入力モード

特殊な入力文字には、フロー制御文字、割り込み文字、消去文字、 および抹消 (kill) 文字があります。 互いに排他的な以下の curses モードによって、アプリケーションは、 入力文字の効果を制御することができます。

Cooked モード
このモードは、すべての特殊文字をアプリケーションの外側で操作して、 通常の一度に 1 行の処理を行います。 効果は、標準モードの入力処理と同じです。 nocbreak( ) のコールによってこのモードに入る場合、ISIG と IXON フラグの状態は変更されず、noraw( ) のコールによってこのモードに入る場合は、 設定が行われます。

インプリメントされたシステムは、 サポートされるすべてのロケールからの消去文字と抹消 (kill) 文字を、 文字の幅に関係なく、サポートします。

cbreak モード
ユーザーが入力した文字は、アプリケーションにすぐに使用可能になり、curses は消去文字に対しても抹消 (kill) 文字に対しても特殊な処理を行いません。 アプリケーションは独自の行編集を行うため、また、 打ち切り文字を使用してタスク を打ち切るために cbreak モードを選択することができます。 このモードには非標準モードの Case B 入力処理と同じ効果があります (MIN が 1 に設定され、ICRNL がクリアされます)。 このモードに入る場合、ISIG と IXON フラグの状態は変更されません。
Half-delay モード
この効果は、cbreak と同じです。 例外は、文字が使用可能になるか、 またはアプリケーションによって定義された時間間隔が経過するかのどちらかが発生するまで、 入力関数が待つことです。 このモードには非標準モードの Case C 入力処理と同じ効果があります (TIME がアプリケーションによって指定された値に設定されます)。 このモードに入る場合、ISIG と IXON フラグの状態は変更されません。
Raw モード
Raw モードでは、 端末の入力に対する最大限の制御がアプリケーションに与えられます。 アプリケーションは各文字を入力されたとおりに見ます。 これには、非標準モードの Case D 入力処理と同じ効果があります。 このモードに入る時、ISIG と IXON フラグがクリアされます。

端末インターフェース設定値は、 プロセスが curses を初期化するために initscr または newterm サブルーチンを呼び出す時、および endwin サブルーチンが呼び出されてこれらの設定値を復元する時に記録されます。 curses 操作のための初期入力モードは、インプリメントされたシステムが拡張 curses 準拠をサポートしない場合には指定されません。 その場合、初期入力モードは cbreak モードになります。

BREAK キーの振る舞いは、curses によって設定されていないディスプレイ・ドライバーの他のビットによって異なります。

遅延モード

以下の互いに排他的な遅延モードは、 関数のコール時に端末の入力待ちがない場合に、 特定の curses 関数がアプリケーションに戻る速さを指定します。
遅延 説明
No Delay 関数は失敗します。
遅延 アプリケーションは、 インプリメントされたシステムがアプリケーションにテキストをパススルーするまで待ちます。 cbreak モードまたは Raw モードが設定されている場合、 これは 1 つの文字の後です。 それ以外の場合、これは最初の改行文字、行の終わり文字、 またはファイルの終わり文字の後です。

ファンクション・キー処理に対する No Delay モードの効果は未指定です。

エコー・モードの処理

エコー・モードは、 入力された文字を curses がスクリーンにエコーするかどうかを決定します。 エコー・モードの効果は、 ウィンドウに接続された端末に関連する termios 構造体のローカル・モード・フィールドのエコー・フラグの効果と似ています。 ただし、curses は、呼び出されると、常にエコー・フラグをクリアして、 オペレーティング・システムがエコーを実行しないようにします。 curses の文字エコーのメソッドは、端末入力の追加処理を実行するので、 オペレーティング・システムの文字のエコーの方法とは異なります。

エコー・モードで、curses は独自のエコーを実行します。 アプリケーションが呼び出した入力関数によって、 addch サブルーチンが呼び出されたかのように、すべての可視入力文字が、 カーソル移動および折り返しなどの結果として起こるすべての効果とともに、 現在のウィンドウまたは指定されたウィンドウのカーソル位置に保管されます。

エコー・モードでない場合、 入力のエコーはアプリケーションが実行しなければなりません。 アプリケーションは、頻繁にスクリーンの制御域で独自のエコーを実行するか、 あるいはエコーをまったく実行しないために、 エコー・モードを使用不可にします。

同期端末およびネットワーク非同期端末では、 エコー処理が端末によって直接実行されるので、エコー処理をオフにできない場合があります。 このような端末で実行するアプリケーションは、 入力したすべての文字がスクリーン上のカーソル位置に現れることを認識する必要があります。

サブルーチンのエコー処理ファミリーの一部を以下に示します。
サブルーチン 説明
cbreak または nocbreak 端末を CBREAK モードにしたり、このモードを解除したりします。
出力の削除 出力遅延をミリ秒単位で設定します。
echo または noecho 入力された文字のスクリーンへのエコーを制御します。
ハーフ遅延 指定された長さの時間、ブロックした後に入力がない場合には、ERR が戻されます。
nl または nonl curses が出力時に改行を復帰とライン・フィードに変換し、 入力時に戻りを改行に変換するかどうかを決定します。
raw または noraw 端末をこのモードにするか、またはこのモードを解除します。

cbreak サブルーチンは、 raw サブルーチンによって実行される関数のサブセットを実行します。 cbreak モードでは、ユーザーが入力した文字はすぐにプログラムで使用することができます。 また、消去文字または抹消 (kill) 文字の処理は実行できません。 RAW モードと異なり、 割り込み文字とフロー文字が処理されます。 他の場合、tty ドライバーは改行または復帰が入力されるまで、 入力された文字をバッファーに入れます。

注: CBREAK モードは、tty ドライバーによる変換を使用不可にします。

delay_output サブルーチンは、出力遅延を指定されたミリ秒数に設定します。 このサブルーチンは、プロセッサーの一時停止の代わりに埋め込み文字を使用するので、 このサブルーチンを過度に使用してはなりません。

echo サブルーチンは、端末をエコー・モードにします。 エコー・モードで、curses はユーザーが入力した文字を端末の物理カーソル位置に書き出します。 noecho サブルーチンは、端末をエコー・モードから解除します。

nl および nonl サブルーチンは、それぞれ、出力時に curses が改行を復帰および改行に変換するかどうかを制御します。 curses が入力時に復帰を改行に変換するかどうか。 最初は、このような変換が行われます。 このような変換を使用不可にすることによって、curses サブルーチン・ライブラリーはライン・フィード機能をさらに制御して、 カーソルの振る舞いをより速くすることができます。

nocbreak サブルーチンは、端末を cbreak モードから解除します。

raw サブルーチンは、端末をロー・モードにします。 raw モードでは、 ユーザーが入力した文字はすぐにプログラムで使用することができます。 さらに、割り込み文字、終了文字、中断文字、およびフロー制御文字は、cbreak モードの場合のように単一の文字を生成する代わりに、 解釈されずに渡されます。 noraw サブルーチンは、端末をロー・モードから解除します。

terminfo および termcap ファイルの使用

curses は初期化時に TERM 環境変数を検査して、 端末タイプを識別します。 次に、curses は端末の機能を示す定義を探します。 通常、この情報は、TERMINFO 環境変数によって指定されるローカル・ディレクトリーまたは /usr/share/lib/terminfo ディレクトリーに保持されます。 すべての curses プログラムは最初に TERMINFO 環境変数が定義されているかどうかを検査します。 この変数が定義されていない場合、 /usr/share/lib/terminfo ディレクトリーが検査されます。

例えば、 TERM 変数が次のように設定されているとします。vt100TERMINFO 変数が /usr/mark/myterms ファイルに設定されている場合、curses は /usr/mark/myterms/v/vt100 ファイルを検査します。 このファイルが存在しない場合、curses は /usr/share/lib/terminfo/v/vt100 ファイルを検査します。

さらに、端末記述を指定変更するために、LINES および COLUMNS 環境変数を設定することができます。

terminfo サブルーチンを使用するプログラムの作成

terminfo サブルーチンは、プログラムが terminfo データベースを直接処理する必要がある場合に使用します。 例えば、これらのサブルーチンを使用して、ファンクション・キーをプログラミングすることができます。 他のすべての場合は、curses サブルーチンがより適切なので、これらのサブルーチンの使用をお勧めします。

端末の初期化

プログラムは、 setupterm サブルーチンを呼び出すことによって開始する必要があります。 通常、このサブルーチンは、initscr または newterm サブルーチンへのコールによって間接的に呼び出されます。 setupterm サブルーチンは、terminfo データベースに定義されている端末依存変数を読み取ります。 terminfo データベースには、ブール変数、 数字変数、および文字列変数が組み込まれます。 これらの terminfo 変数はすべて、 指定された端末に関して定義されている値を使用します。 このデータベースを読み取った後、setupterm サブルーチンは、端末定義を使用して、cur_term 変数を初期化します。 複数の端末を使用している場合、set_curterm サブルーチンを使用すれば、cur_term 変数を特定の端末に設定することができます。

もう 1 つのサブルーチン restarttermは、 setupterm サブルーチンに似ています。 ただし、このサブルーチンは、 メモリーを以前の状態に復元した後に呼び出されます。 例えば、scr_restore サブルーチンを呼び出した後に、restartterm を呼び出します。 restartterm サブルーチンは、 入力オプションと出力オプションがメモリーの保管時と同じであることを想定していますが、 端末タイプとボー・レートは異なる可能性があると想定しています。

del_curterm サブルーチンは、 指定された端末に関する機能情報が入っているスペースを解放します。

ヘッダー・ファイル

curses.h および term.h ファイルを以下の順序でプログラムに組み込んでください。

#include <curses.h>
#include <term.h>

これらのファイルには、terminfo データベース内の文字列、数字、 およびフラグの定義が入っています。

端末機能の処理

パラメーター化されたすべての文字列を tparm サブルーチンを介して渡し、 インスタンスを生成します。 tputs または putp サブルーチンを使用して、 すべての terminfo 文字列および tparm サブルーチンの出力を印刷してください。

サブルーチン 説明
書き込み tputs サブルーチンへのショートカットを提供します。
tparm パラメーターを持つ文字列のインスタンスを生成します。
tputs 与えられた文字列に埋め込み情報を適用して、出力します。

端末機能を獲得して渡すために、以下のサブルーチンを使用します。

サブルーチン 説明
tigetflag 指定されたブール機能の値を戻します。 機能がブール以外の場合には、 -1 が戻されます。
tigetnum 指定された数字機能の値を戻します。 機能が数字以外の場合には、-2 が戻されます。
tigetstr 指定された文字列機能の値を戻します。 指定された機能が文字列以外の場合、tigetstr サブルーチンは (char *) -1 の値を戻します。

プログラムの終了

ユーザーのプログラムの終了時に、tty モードを元の状態に復元してください。 それを行うには、reset_shell_mode サブルーチンを呼び出します。 ユーザーのプログラムがカーソル・アドレッシングを使用する場合、 プログラムは、始動時に enter_ca_mode 文字列を出力し、 終了時に exit_ca_mode 文字列を出力する必要があります。

シェル・エスケープを使用するプログラムは、シェルを呼び出す前に、 reset_shell_mode サブルーチンを呼び出し、exit_ca_mode 文字列を出力する必要があります。 シェルから戻った後、 プログラムは enter_ca_mode 文字列を出力して、reset_prog_mode サブルーチンを呼び出す必要があります。 このプロセスは、終了時に endwin サブルーチンを呼び出す標準の curses 操作と異なります。

下位レベル・スクリーン・サブルーチン

下位レベルのスクリーン操作には、 以下のサブルーチンを使用します。

サブルーチン 説明
ripoffline (ripoffline) stdscr から単一行を除去します。
「scr_dump」 仮想スクリーンの内容を、指定されたファイルにダンプします。
scr_init curses データ構造体を、指定されたファイルから初期化します。
scr_restore 仮想スクリーンを、以前にダンプしたファイルの内容に復元します。

termcap サブルーチン

ユーザーのプログラムが端末情報に関する termcap ファイルを使用する場合、termcap サブルーチンが移行援助プログラムとして組み込まれます。 パラメーターは termcap サブルーチンの場合と同様です。 curses は terminfo データベースを使用してサブルーチンをエミュレートします。 以下の termcap サブルーチンが用意されています。

サブルーチン 説明
tgetent setupterm サブルーチンをエミュレートします。
tgetflag termcap ID に関するブール・エントリーを戻します。
tgetnum termcap ID に関する数字エントリーを戻します。
tgetstr termcap ID に関する文字列エントリーを戻します。
tgoto tparm サブルーチンを複写します。 tgoto サブルーチンからの出力は、tputs サブルーチンに渡す必要があります。

termcap 記述から terminfo 記述への変換

captoinfo コマンドは、 termcap 記述を terminfo 記述に変換します。 以下の例は captoinfo コマンドが機能する仕方を示しています。
captoinfo /usr/lib/libtermcap/termcap.src

このコマンドは /usr/lib/libtermcap/termcap.src ファイルを terminfo ソースに変換します。 captoinfo コマンドは、 出力を標準出力に書き出し、 コメントおよび他の情報をファイルに保存します。

TTY の操作

以下の関数は、端末モードの状態の保管または復元を行います。

関数 説明
サベティ (savetty) tty モードの状態を保管します。
リセット可能 tty モードの状態を、savetty サブルーチンが最後に呼び出された時点の状態に復元します。

同期端末およびネットワーク非同期端末

メインフレーム環境では、同期端末、 ネットワーク同期 (NWA) 端末または非標準の直接接続非同期端末を頻繁に使用し、 ブロック・モードでホストと通信します。 すなわち、ユーザーは端末で複数の文字を入力してから、特殊キーを押して、 ホストへの文字の送信を開始します。

注: 任意のサイズのブロックをホストに送信することは可能ですが、1 回のキー・ストロークのみで文字を送信することは不可能であり、望ましいことではありません。 このようなことを行うと、 単一文字入力を使用するアプリケーションに、 重大な問題が生じる可能性があります。

出力

端末への出力に関連するすべての操作で、curses インターフェースを使用することができます。 ただし、端末によっては、refresh ルーチンが更新を実行するために、 スクリーンの内容全体を再描画しなければならない場合があります。

このような各操作の前にスクリーンのクリアも必要である場合、 望ましくない結果が生じる可能性があります。

INPUT

同期 (ブロック・モード) 端末と NWA 端末の操作の性質のために、curses 入力関数のすべてまたはいずれかがサポートされない可能性があります。 特に、以下の点について注意してください。
  • 単一文字入力はできない可能性があります。 端末で入力したすべての文字をホストに送信するために、 特殊キーを押さなければならない場合があります。
  • エコーを使用不可にできない場合があります。 文字エコーが端末によって直接実行される場合があります。 このように振る舞う端末では、入力を実行するすべての curses アプリケーションは、 入力したすべての文字がスクリーン上のカーソルの位置に現れることを認識する必要があります。 これは、ウィンドウ内のカーソルの位置に必ずしも対応しません。