curs_getch(3X) | curs_getch(3X) |
名称
getch, wgetch, mvgetch, mvwgetch, ungetch, has_key - curses 端末キーボードから文字を取得する (または押し戻す)書式
#include <curses.h>int getch(void);
int wgetch(WINDOW *win);
int mvgetch(int y, int x);
int mvwgetch(WINDOW *win, int y, int x);
int ungetch(int ch);
int has_key(int ch);
解説
getch、 wgetch、 mvgetch および mvwgetch ルーチンはウィンドウから文字を読み込みます。遅延なしモードにおいて、入力が待っていない場合、値 ERR は返されます。遅延モードにおいて、システムがテキストをプログラムのために渡すまで、プログラムは待ちます。 cbreak の設定によって、これは 1 文字 (cbreak モード) の後か、あるいは最初の改行 (nocbreak モード) の後にあります。半遅延モードにおいて、文字がタイプされるか、指定されたタイムアウトに到達するまで、プログラムは待ちます。もし noecho が設定されていなければ、文字も次の規則にしたがって指定されたウィンドウへエコーされるでしょう。文字が現在の erase 文字、左矢印あるいはバックスペースである場合、カーソルは左に 1 スペース移動されます、そしてその画面位置はあたかも delch が呼ばれたかのように、削除されます。文字の値が他の KEY_ 定義である場合、ユーザは beep 呼び出しで警告を受けます。そうでなければ、文字は、画面に単に出力されます。
ウィンドウがパッド (詰め物) でなく、それが wrefresh への最後の呼び出し以来移動されたか修正された場合、 wrefresh は別の文字が読み込まれる前に呼び出されます。
keypad が TRUE で、ファンクションキーが押される場合、そのファンクションキーのためのトークンは raw (生の) 文字の代わりに返されます。あり得るファンクションキーは名前が KEY_ で始まる 8 ビットの文字の範囲の外側の値を持つマクロとして <curses.h> に定義されます。したがって、ファンクションキーの返り値を保持するための変数は、 short サイズかより大きくなければなりません。
ファンクションキーの始まりでありうる文字が受け取られる (それは現代の端末上で、エスケープ文字意味します) 場合、 curses はタイマをセットします。シーケンスの残りが指定された時間内に来ない場合、文字はそのまま渡されます。そうでなければ、ファンクションキーの値が返されます。この理由のために、多くの端末が、ユーザがエスケープキーを押す時とプログラムにエスケープが返される間の遅延を経験します。
ungetch ルーチンは、次の呼び出しによって wgetch に返される入力キュー上に ch を戻します。すべてのウィンドウのためには、たった 1 つのキューがあります。
ファンクションキー
keypad が利用可能になった場合、 <curses.h> に定義された下記のファンクションキーは、 getch によって返さなければなりません。これらのすべてが任意の特別の端末で必ずサポートされるとは限らないことに注意してください。名前 | キー 名 |
KEY_BREAK | 中断 (break) キー |
KEY_DOWN | 4 つの矢印キー ... |
KEY_UP | |
KEY_LEFT | |
KEY_RIGHT | |
KEY_HOME | ホーム (home) キー (upward+left arrow) |
KEY_BACKSPACE | バックスペース |
KEY_F0 | ファンクションキー; 64 個のキーの空間が予約されている。 |
KEY_F( n) | For 0 ≤ n ≤ 63 |
KEY_DL | 行削除 |
KEY_IL | 行挿入 |
KEY_DC | 文字削除 |
KEY_IC | 文字挿入または挿入モードに入る |
KEY_EIC | 文字挿入モードを出る |
KEY_CLEAR | 画面クリア |
KEY_EOS | 画面の終りまでクリア |
KEY_EOL | 行の終りまでクリア |
KEY_SF | 前方に 1 行スクロール |
KEY_SR | (逆)後方に 1 行スクロール |
KEY_NPAGE | 次ページ |
KEY_PPAGE | 前ページ |
KEY_STAB | タブセット |
KEY_CTAB | タブクリア |
KEY_CATAB | 全タブクリア |
KEY_ENTER | 入力 (enter) または送信 |
KEY_SRESET | ソフト (部分) リセット |
KEY_RESET | リセットまたはハードリセット |
KEY_PRINT | プリントまたはコピー |
KEY_LL | ホームダウンまたは最下部 (bottom) (lower left) |
KEY_A1 | keypad の上左 |
KEY_A3 | keypad の上右 |
KEY_B2 | keypa の中央 |
KEY_C1 | keypad の下左 |
KEY_C3 | keypad の下右 |
KEY_BTAB | バックタブキー |
KEY_BEG | 開始 (beg(inning)) キー |
KEY_CANCEL | キャンセル (cancel) キー |
KEY_CLOSE | クローズ (close) キー |
KEY_COMMAND | コマンド (command) キー |
KEY_COPY | コピー (copy) キー |
KEY_CREATE | クリエイト (create) キー |
KEY_END | エンド (end) キー |
KEY_EXIT | 終了 (exit) キー |
KEY_FIND | 検索 (find) キー |
KEY_HELP | ヘルプ (help) キー |
KEY_MARK | マーク (mark) キー |
KEY_MESSAGE | メッセージ (message) キー |
KEY_MOUSE | マウスイベント読み込み |
KEY_MOVE | 移動 (move) キー |
KEY_NEXT | 次オブジェクトキー |
KEY_OPEN | オープン (open) キー |
KEY_OPTIONS | オプションキー |
KEY_PREVIOUS | 前オブジェクトキー |
KEY_REDO | 再実行 (redo) キー |
KEY_REFERENCE | 参照 (ref(erence)) キー |
KEY_REFRESH | リフレッシュ (refresh) キー |
KEY_REPLACE | 置換 (replace) キー |
KEY_RESIZE | 画面リサイズ (resized) |
KEY_RESTART | リスタート (restart) キー |
KEY_RESUME | リジューム (resume) キー |
KEY_SAVE | 保存 (save) キー |
KEY_SBEG | シフトした開始 (beginning) キー |
KEY_SCANCEL | シフトしたキャンセル (cancel) キー |
KEY_SCOMMAND | シフトしたコマンド (command) キー |
KEY_SCOPY | シフトしたコピー (copy) キー |
KEY_SCREATE | シフトしたクリエイト (create) キー |
KEY_SDC | シフトした文字削除キー |
KEY_SDL | シフトした行削除キー |
KEY_SELECT | セレクト (select) キー |
KEY_SEND | シフトしたエンド (end) キー |
KEY_SEOL | シフトした行クリアキー |
KEY_SEXIT | シフトした終了 (exit) キー |
KEY_SFIND | シフトした検索 (find) キー |
KEY_SHELP | シフトしたヘルプ (help) キー |
KEY_SHOME | シフトしたホーム (home) キー |
KEY_SIC | シフトしたインプット (input) キー |
KEY_SLEFT | シフトした左矢印キー |
KEY_SMESSAGE | シフトしたメッセージ (message) キー |
KEY_SMOVE | シフトした移動 (move) キー |
KEY_SNEXT | シフトしたネクスト (next) キー |
KEY_SOPTIONS | シフトしたオプション (options) キー |
KEY_SPREVIOUS | シフトした前 (prev) キー |
KEY_SPRINT | シフトしたプリント (print) キー |
KEY_SREDO | シフトした再実行 (redo) キー |
KEY_SREPLACE | シフトした置換 (replace) キー |
KEY_SRIGHT | シフトした右矢印 |
KEY_SRSUME | シフトしたリジューム (resume) キー |
KEY_SSAVE | シフトした保存 (save) キー |
KEY_SSUSPEND | シフトしたサスペンド (suspend) キー |
KEY_SUNDO | シフトしたアンドゥ (undo) キー |
KEY_SUSPEND | サスペンド (suspend) キー |
KEY_UNDO | アンドゥ (undo) キー |
キーパッドはこのように配置されています。
A1 | up | A3 |
left | B2 | right |
C1 | down | C3 |
has_key ルーチンは上記のリストからキー値をとり、現在の端末のタイプがその値のキーを認識するかどうかにしたがって、 TRUE または FALSE を返します。いくつかの値が、実際のキー、例えば KEY_RESIZE と KEY_MOUSE、に対応していないことに注意してください。 KEY_RESIZE に関する詳細については、 resizeterm(3X) を、 KEY_MOUSE の議論については curs_mouse(3X) を参照してください。
戻り値
すべてのルーチンは、失敗すると整数 ERR を返します。成功して終了すれば、 ERR 以外の整数値 (ungetch() の場合は OK) を返します。- ungetch
- FIFO にそれ以上の余地がなければ、エラーを返します。
- wgetch
- ウィンドウポインタが NULL である、またはタイムアウトがどんなデータも持っていなくて期限が切れるなら、エラーを返します。
注
単一の文字関数のためにプログラマによってエスケープキーを使用することは、キーパッドコードが下記ファンクションキーシーケンスを捜す間に、それが 1 秒以内の遅延が生じるので、落胆します。いくつかのキーが共通に使用される制御キー、例えば、 KEY_ENTER 対コントロール/M、 KEY_BACKSPACE 対コントロール/H、と同じであるかもしれないことにに注意してください。いくつかの curses の実装は、それらの制御キーが特別に扱われるか、terminfo 定義を使用するかどうかによって異なります。 ncurses は terminfo 定義を使用します。 KEY_ENTER がコントロール/M と書いてあれば、利用者がコントロール/M を押すと getch は KEY_ENTER を返します。
getch、 wgetch、 mvgetch あるいは mvwgetch を使用する場合、nocbreak モード ( nocbreak) および echo モード ( echo) は同時に使用されてはなりません。各文字がタイプされる時、tty ドライバの状態に依存して、プログラムは望ましくない結果を生成するかもしれません。
getch、 mvgetch および mvwgetch はマクロであるかもしれないことに注意してください。
歴史的に、キーパッドマクロのセットは、AT&T 7300、aka 3B1、aka Safari 4 の極端なファンクションキーリッチキーボードによって大部分は定義されました。現代のパソコンは、通常これらの小さな部分集合だけを持っています。 IBM PC スタイルコンソールは、典型的に KEY_UP、 KEY_DOWN、 KEY_LEFT、 KEY_RIGHT、 KEY_HOME、 KEY_END、 KEY_NPAGE、 KEY_PPAGE およびファンクションキー 1 〜 12 をそこそこサポートします。 Ins キーは、 KEY_IC に通常マップされます。
移植性
*get* 関数は XSI Curses standard, Issue 4 に記述されています。それらは単一バイトの文字だけを読み込みます。標準は、それらが失敗すれば ERR を返すことを明記していますが、エラー条件は明記していません。KEY_ またはバックスペース文字の入力でのこれらの関数の echo の振る舞いは、 SVr4 文書で明記されませんでした。この記述は XSI Curses 規格から導入されます。
シグナル操作が存在する場合に getch および同類の振る舞いは、 SVr4 および XSI Curses 文書に明記されていません。歴史的な curses 実装の下では、それは、オペレーティングシステムのシグナル受け取り操作の実装は、進行中に read(2) 呼び出しが中断するどうかに依存して、そしてまた、(いくつかの実装で) 入力タイムアウトまたは非ブロッキングモード hsd が設定されたかどうかに依存して変わりました。
移植性ついて関心を持っているプログラマは、次の 2 つのケースのどちらかを準備するべきです。 (a) シグナルの受け取りは getch に割り込みません。 (b) シグナルの受け取りは getch に割り込み、 errno に EINTR を設定して ERR を返します。 ncurses 実装の下では、シグナル操作は決して getch に割り込みません。
has_key 関数は ncurses に特有です。それを使用するどんなコードも NCURSES_VERSION (目玉) マクロで条件付きとなるように勧めます。
関連項目
curses(3X), curs_inopts(3X), curs_mouse(3X), curs_move(3X), curs_refresh(3X), resizeterm(3X).ワイド文字 (ncursesw) ライブラリでの比較関数は、 curs_get_wch(3X) に説明されています。