curs_inopts(3x) curs_inopts(3x)
cbreak, nocbreak, echo, noecho, halfdelay, intrflush, keypad, meta, nodelay, notimeout, raw, noraw, noqiflush, qiflush, timeout, wtimeout, typeahead - curses 入力オプション
#include <curses.h> int cbreak(void); int nocbreak(void); int echo(void); int noecho(void); int halfdelay(int tenths); int intrflush(WINDOW *win, bool bf); int keypad(WINDOW *win, bool bf); int meta(WINDOW *win, bool bf); int nodelay(WINDOW *win, bool bf); int raw(void); int noraw(void); void noqiflush(void); void qiflush(void); int notimeout(WINDOW *win, bool bf); void timeout(int delay); void wtimeout(WINDOW *win, int delay); int typeahead(int fd);
アプリケーションが端末からの入力を扱う方法を変更するような いくつかの関数を ncurses ライブラリは用意しています。 いくつかは包括的で、すべてのウインドウに適用され、 その他は特定のウインドウにのみ適用されます。 特定のウインドウ用の設定は、新しいウインドウや 派生したウインドウには自動的に適用されません。 もし同じ挙動が必要ならば、各ウインドウにこれらを 適用しなければなりません。
通常、 tty ドライバは改行か復帰が押されるまで、打たれた 文字をバッファリングします。 cbreak ルーチンは行のバッファリングと erase/kill 文字処理 (割り込みとフロー制御文字は影響されません) を無効にし、 打った文字をプログラムがすぐに使えるようにします。 nocbreak ルーチンは端末を通常 (=cooked) モードに戻します。 モードが継承されるため、端末は、初め cbreak モードかも しれませんし、そうでないかもしれません。そのため、明示的に cbreak または nocbreak を呼び出す必要があります。 curses を使う最も対話的なプログラムは cbreak モードに 設定します。 cbreak は raw を無効にすることに注意してください。 [これらのルーチンが echo や noecho とどう相互作用するかに ついては curs_getch(3x) を参照してください。]
echo と noecho ルーチンは、打った文字をそのまま getch で エコーするかどうかを制御します。 tty ドライバによるエコーは常に無効ですが、初めは getch が エコーモードなので、打った文字はエコーされます。 最も対話的なプログラムは、画面上の制限された領域に自分で エコーするか、全くエコーしないため、 noecho を呼び出して エコーを無効にします。 [これらのルーチンが cbreak や nocbreak とどう 相互作用するかについては curs_getch(3x) を参照してください。]
halfdelay ルーチンは半遅延モードに使います。これは cbreak モードと同じように、打った文字をすぐにプログラムが 使えるようにします。 しかし 0.1 * tenths 秒間の入力待ちをした後、 何も打たれなかった場合、 ERR が返ります。 tenths の値は 1 から 255 の間でなければなりません。 半遅延モードから抜けるには nocbreak を使ってください。
intrflush オプションが有効 ( bf が TRUE ) でキーボードの 割り込みキー ( interrupt, break, quit ) が押されたとき、 tty ドライバの待ち行列 (キュー) 内のすべての出力は一掃され、 割り込みに対する応答が速くなる効果をもたらしますが、 画面上に何があるかという、 curses の持つ情報が狂います。 このオプションを無効 ( bf が FALSE ) にすると、一掃を 防ぎます。 このオプションのデフォルト値は tty ドライバの設定から 引き継ぎます。 ウインドウ引数は無視されます。
keypad オプションは端末のキーパッドを有効にします。 有効な場合 ( bf が TRUE ) 、ファンクションキー類 (矢印キーなど) を押すと、 wgetch はファンクションキー類を 表す KEY_LEFT のような単一の値を返します。 無効な場合 ( bf が FALSE ) 、 curses は ファンクションキー類を特別扱いせず、プログラムは エスケープ・シーケンスそのものを解釈しなければなりません。 端末のキーパッドをオン (送信可能) にしたり オフ (ローカル用) にしたりできるならば、 このオプションをオンにすると、 wgetch が呼び出された時に 端末のキーパッドがオンになります。 keypad のデフォルト値は FALSE です。
初期状態では、 tty ドライバの制御モードによって端末が返す 有効ビット数が 7 ビットになるか 8 ビットになるかが決まります [ termio(7) を参照]。 強制的に 8 ビットを返すようにするには、 meta(win, TRUE); を 実行します。これは POSIX では端末の CS8 フラグを セットすることと同等です。 強制的に 7 ビットを返すようにするには、 meta(win, FALSE); を 実行します。これは POSIX では端末の CS7 フラグを セットすることと同等です。 ウインドウ引数 win は常に無視されます。 terminfo の機能項目 smm (meta_on) と rmm (meta_off) が 定義されている端末では、 meta(win, TRUE) が呼び出された時に smm が、 meta(win, FALSE) が呼び出された時に rmmが 端末に送られます。
nodelay オプションは getch 呼び出しを入力待ちなしとします。 入力の準備ができていなければ、 getch は ERR を返します。 無効な場合 ( bf が FALSE ) 、 getch はキーが押されるまで 待ちます。
入力されたエスケープ・シーケンスを変換する間、 wgetch は 次の文字を待つタイマをセットします。 notimeout(win, TRUE) が呼び出されると、 wgetch はタイマを セットしません。 タイムアウトの目的は、ファンクションキーから受け取った シーケンスとユーザが打ったものとを区別することです。
raw と noraw ルーチンによって端末が raw モードに入ったり 抜けたりします。 raw モードは打った文字がすぐにそのままプログラムに 渡される点で cbreak モードと同じです。 違いは、 raw モードでは interrupt, quit, suspend, および フロー制御文字がシグナルを発生させる代わりに、すべて 変換されずに渡されることです。 BREAK キーの挙動は curses が設定しない tty ドライバの 他のビットに依存します。
noqiflush ルーチンを使うと、 INTR, QUIT, SUSP 文字に伴う 入力キューと出力キューの通常の一掃をしません。 [ termio(7) を参照] qiflush を呼び出すと、両キューはこれらの制御キーを読んだ時に 一掃されます。 シグナルハンドラを抜けた後、割り込みが起きなかったかのように 出力を続けたい場合、シグナルハンドラの中で noqiflush() を 呼び出したくなることもあるでしょう。
timeout と wtimeout ルーチンは、指定のウインドウが 読み込み時に入力待ちをするかしないかを設定します。 delay が負ならば入力待ちをし、入力があるまで待ち続けます。 delay がゼロならば入力待ちをしません。読み込みを待っている 入力がなければ、読み込みルーチンは ERR を返します。 delay が正ならば delay ミリ秒待って、まだ入力がなければ、 ERR を返します。 したがって、これらのルーチンは nodelay と同じ機能に加え、 delay ミリ秒だけ待つことができるという機能を追加しています ( delay が正のとき) 。
curses ライブラリは画面を更新している間、周期的に 入力先読みをして "行の内容変更の最適化" をしています。 入力を検出し、それが tty から来たものならば、現在の更新は 再び refresh か doupdate が呼び出されるまで先延ばしにします。 これにより、あらかじめ入力されたコマンドに対する応答を より速くできます。 通常、 newterm に渡された入力 FILE ポインタか、 initscr が 使われたならば stdin が、この入力先読みに使われます。 typeahead ルーチンはこれらに代えて、入力先読みに使う ファイルディスクリプタ fd を指定します。 fd が -1 ならば入力先読みをしません。
整数を返すすべてのルーチンは、上のルーチン説明で特記して いないかぎり、失敗した場合に整数値 ERR を、正常終了の場合に OK ( SVr4 は「 ERR 以外の整数値」としか指定していません) を 返します。 X/Open はエラーの条件を何も定義していません。この実装では、 ウインドウ引数を取る関数は、それがヌルのときにエラーを 返します。 端末が初期化されていなかったとき、すべての関数はやはり エラーを返します。 さらにまた、 halfdelay 引数が 1 から 255 の範囲の外だったときに エラーを返します。
これらの関数は、 XSI Curses standard, Issue 4 に記載されて います。 ncurses ライブラリは XPG4 standard と AT&T curses の 実装における歴史的な習慣に従って、 curses が端末の状態を 初期化するときに echo ビットをクリアします。 BSD curses は少し異なり、初期化時には echo ビットを 放置しますが、 BSD の raw 呼び出しは副作用としてこれをオフに します。 移植性のために最善なのは、プログラムが通常モード (cooked) であっても初期化の直後に echo か noecho を明示的に設定する ことです。 初めて keypad が有効になった時、 ncurses は現在の端末記述に 対するキーの定義を読み込みます。 もし端末記述が拡張文字列機能項目を含むならば、 たとえば tic の -x オプションを使って (から) ncurses はまた、 "k" で始まる名前の機能項目に対応するキーを定義します。 対応するキーコードが生成され、そして (以前の端末記述の 読み込みに依存して) プログラムを実行するごとに異なる値と なるかもしれません。 生成されたキーコードは keyname 関数で認識されます (そして curses の key-names に使われている "K" でなく、 terminfo の機能項目名を示す "k" で始まる名前を返します) 。 他方、アプリケーションは与えられた文字列に対して特定の キーコードを確立するために define_key を使うことができます。 アプリケーションはこれにより、 tigetstr を使って 拡張機能項目の存在を検査することと、必要に応じてキーコードを 割り当て直すことができます。 低レベルのアプリケーションは tigetstr を使って どのような特定の文字列機能項目の定義でも得ることができます。 キーコードを返すために curses の wgetch や同様の関数を使う、 より高レベルのアプリケーションは、文字列が読み込まれる順序を 当てにすることができます。 もし 2 つ以上のキー定義が同じ文字列値を持つならば、 wgetch は 1 つのキーコードのみを返します。 ( ncurses を含む) ほとんどの curses の実装は、 文字列機能項目名の配列によって定義された順序でキー定義を 読み込みます。 最後に読み込まれるキーが、返されるキーコードを決めます。 ncurses では、キー定義として変換された拡張機能項目を 持つこともできます。 これらは定義済みのキーの後に読み込まれ、もし機能項目の値が 以前に読み込まれたキー定義と同じならば、後のほうの定義が 使われます。
echo, noecho, halfdelay, intrflush, meta, nodelay, notimeout, noqiflush, qiflush, timeout, wtimeout は マクロであるかもしれないことに注意してください。 noraw と nocbreak 呼び出しは歴史的な習慣にしたがって、 それぞれ raw モードと cbreak モードから 通常 ('cooked') モードへ戻ろうとします。 raw/noraw と cbreak/nocbreak 呼び出しを混用すると、 tty ドライバの制御状態を予測あるいは理解することが 困難になるので推奨しません。
curses(3x), curs_getch(3x), curs_initscr(3x), curs_util(3x), define_key(3x), termio(7) curs_inopts(3x)