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の設定により、cbreak モードでは 1 文字の後、nocbreak モードでは最初の改行の後になります。 半遅延モードでは、プログラムは文字がタイプされるか、指定 されたタイムアウトに達するまで待ちます。 echo が有効で、かつウィンドウがパッドでない場合、 文字は次の規則にしたがって、指定されたウィンドウへエコーさ れます。 o 文字が現在の erase 文字、左矢印あるいはバックスペースで ある場合、カーソルは左に 1 桁移動し、その位置はあたかも delch が呼ばれたかのように削除されます。 o 文字の値が他の KEY_ 定義キーである場合、警告として beep が呼び出されます。 o 文字が復帰(キャリッジ・リターン)で、かつ nl が有効な 場合、エコーされた後、改行(ライン・フィード)に 変換されます。 o それ以外の文字は、単に画面に出力されます。 ウィンドウがパッドでなく、かつ、最後に wrefresh が 呼び出されて以降に移動または修正された場合、他の文字が読み 込まれる前に wrefresh が呼び出されます。
keypad が TRUE のとき、ファンクションキーが押されると、 生の文字コードの代わりに、そのファンクションキーのトークンを 返します。 使用可能なファンクションキーは、 <curses.h> の中で、 名前が KEY_ で始まり 8 ビット文字の範囲外の値を持つマクロと して定義されています。 したがって、ファンクションキーの返り値を入れるための変数は、 short かそれよりも大きくなければなりません。 ファンクションキーの始まりとなりうる文字 (現代の端末上では エスケープ文字を意味します) を受け取ると、 curses はタイマを セットします。シーケンスの残りが指定された時間内に来ない場合、 文字はそのまま渡されます。そうでなければ、ファンクションキー の値が返されます。 この理由により、大半の端末では、ユーザがエスケープキーを押 してからプログラムにエスケープが返されるまでに遅れが発生しま す。
ungetch ルーチンは、入力キューに ch を戻し、次の wgetch 呼び出しで返されるようにします。 入力キューは全ウィンドウに対してただ 1 つしかありません。
次の特殊キーが <curses.h> で定義されています。 o KEY_RESIZE による特殊な場合を除くと、 getch が下記の 値を返すためには keypad を有効にする必要があります。 o これらのすべてが任意の端末で必ずサポートされるとは 限りません。 o 命名規則はわかりにくいかもしれません。resume を RSUME と綴るスペルミスのようなものもあります。terminfo の長い 名前に対応できるキーの名前は、ずっと以前、1980年代に決 められたものです。 名前 キーの名前 ------------------------------------------------- KEY_BREAK 中断キー KEY_DOWN 下矢印キー KEY_UP 上矢印キー KEY_LEFT 左矢印キー KEY_RIGHT 右矢印キー KEY_HOME ホームキー (上+左矢印) KEY_BACKSPACE バックスペース KEY_F0 ファンクションキー; 64 キー分の領 域が予約されている KEY_F(n) 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 入力または送信 KEY_SRESET ソフト (部分) リセット KEY_RESET リセットまたはハードリセット KEY_PRINT プリントまたはコピー KEY_LL ホームダウンまたは最下部 (左下) KEY_A1 キーパッドの左上 KEY_A3 キーパッドの右上 KEY_B2 キーパッドの中央 KEY_C1 キーパッドの左下 KEY_C3 キーパッドの右下 KEY_BTAB バックタブキー KEY_BEG 開始キー KEY_CANCEL キャンセルキー KEY_CLOSE クローズキー KEY_COMMAND コマンドキー KEY_COPY コピーキー KEY_CREATE クリエイトキー KEY_END エンドキー KEY_EXIT 終了キー KEY_FIND 検索キー KEY_HELP ヘルプキー KEY_MARK マークキー KEY_MESSAGE メッセージキー KEY_MOUSE マウスイベント読み込み KEY_MOVE 移動キー KEY_NEXT 次オブジェクトキー KEY_OPEN オープンキー KEY_OPTIONS オプションキー KEY_PREVIOUS 前オブジェクトキー KEY_REDO 再実行キー KEY_REFERENCE 参照キー KEY_REFRESH リフレッシュキー KEY_REPLACE 置換キー KEY_RESIZE 画面リサイズ KEY_RESTART リスタートキー KEY_RESUME リジュームキー KEY_SAVE 保存キー KEY_SBEG シフトした開始キー KEY_SCANCEL シフトしたキャンセルキー KEY_SCOMMAND シフトしたコマンドキー KEY_SCOPY シフトしたコピーキー KEY_SCREATE シフトしたクリエイトキー KEY_SDC シフトした文字削除キー KEY_SDL シフトした行削除キー KEY_SELECT セレクトキー KEY_SEND シフトしたエンドキー KEY_SEOL シフトした行クリアキー KEY_SEXIT シフトした終了キー KEY_SFIND シフトした検索キー KEY_SHELP シフトしたヘルプキー KEY_SHOME シフトしたホームキー KEY_SIC シフトしたインプットキー KEY_SLEFT シフトした左矢印キー KEY_SMESSAGE シフトしたメッセージキー KEY_SMOVE シフトした移動キー KEY_SNEXT シフトしたネクストキー KEY_SOPTIONS シフトしたオプションキー KEY_SPREVIOUS シフトした前キー KEY_SPRINT シフトしたプリントキー KEY_SREDO シフトした再実行キー KEY_SREPLACE シフトした置換キー KEY_SRIGHT シフトした右矢印 KEY_SRSUME シフトしたリジュームキー KEY_SSAVE シフトした保存キー KEY_SSUSPEND シフトしたサスペンドキー KEY_SUNDO シフトしたアンドゥキー KEY_SUSPEND サスペンドキー KEY_UNDO アンドゥキー キーパッドはこのように配置されています。 +-----+------+-------+ | A1 | up | A3 | +-----+------+-------+ |left | B2 | right | +-----+------+-------+ | C1 | down | C3 | +-----+------+-------+ これら定義ずみの値のうち、少数は実際のキーと対応 しません。 o SIGWINCH シグナルが検出されると、 KEY_RESIZE を返しま す。 curs_initscr(3x) と resizeterm(3x) を参照して ください。 keypad が有効か無効かにかかわらず、このコードを返します。 o マウスイベントに対して KEY_MOUSE を返します。 (curs_mouse(3x) を参照してください。) (例えば xterm のマウスプロトコルにより) ncurses は ファンクションキーと同様にエスケープ・シーケンスを 読む必要があるので、このコードは keypad(3x) が有効かどうか に依存します。
has_key ルーチンは、上表のキーコードの値に対して、現在の 端末がその値のキーを認識するかどうかによって、 TRUE または FALSE を返します。 このライブラリは、次の拡張機能をサポートしています。 define_key 与えられた文字列に対するキーコードを定義する (define_key(3x) を参照) key_defined 与えられた文字列に対するキーコードの有無を調べる (key_defined(3x) を参照)
すべてのルーチンは、失敗すると整数 ERR を返します。 成功した場合には、 ERR 以外の整数値 (ungetch() の場合は OK) を返します。 ungetch FIFO にそれ以上の余地がなければ、 ERR を返します。 wgetch ウィンドウポインタがヌルの場合、または何もデータが ないままタイムアウトした場合に、 ERR を返します。 mv で始まる関数は、最初に wmove を使用してカーソルを移動 し、位置がウィンドウの外だった場合、またはウィンドウポインタ がヌルの場合にエラーを返します。
エスケープキーを単一文字として使用しようとすると上手く行か ない場合があります。 キーパッドのコードが後続のファンクション キーシーケンスを待つ間、最高 1 秒に達する遅れが発生するためで す。 いくつかのキーは、一般的な制御キーと等価である可能性がある ことに注意してください。例えば、 KEY_ENTER とcontrol/M、 KEY_BACKSPACE とcontrol/H などです。 これらの制御キーを特別に扱う (そして terminfo を無視する) かどうか、または terminfo の定義を使用するかどうかは、 curses の実装方法により異なる可能性があります。 ncurses は terminfo の定義を使用します。 terminfo で KEY_ENTER を control/M と書いていれば、 getch は control/M を押したときに KEY_ENTER を返します。 一般的に、 KEY_ENTER はテンキーパッドの Enter キーから送 られる文字(列)を表します。 o 端末の記述は最も便利なキーをリストアップしており、 o 通常のキーボードにある Enter キーは復帰と改行の ASCII 文 字として扱われており、 o nl または nonl が呼び出されたかどうかにより、通常のキー ボードにある "Enter" キーを押すと復帰または改行を返し、 o 最終的に "入力または送信" がこのキーの標準の記述となりま す。 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 に記述されて います。 これらは 1バイト文字だけを読み込みます。 XSI Curses standard では、それらが失敗すれば ERR を 返すことを明記していますが、エラーの条件は明記していません。 KEY_ またはバックスペース文字の入力でのこれらの関数の echo の動作は、 SVr4 文書では明記されていません。 この記述は XSI Curses standard から採用されました。 シグナル操作が存在する場合の getch 類の動作は、 SVr4 および XSI Curses 文書には定義されていません。過去の curses の実装では、オペレーティングシステムのシグナル受取 り操作の実装が進行中の read(2) 呼び出しを中断させるかど うかに依存して、そしてまた、(いくつかの実装で) 入力タイム アウトまたは非ブロッキングモードが設定されているかどうか に依存して異なりました。 KEY_MOUSE は XSI Curses では関係のある若干個の terminfo の機能についてのみ記載されていますが、その機能を用いる上 位レベルの関数については触れられていません。 ncurses での 実装は、拡張のひとつとなっています。 KEY_RESIZE は ncurses で初めて実装された拡張機能です。 後に NetBSD curses にも追加されました。 移植性に関心のあるプログラマは、次の 2 つのケースの両方 に対して準備しなくてはなりません。 (a) シグナルの受け取りが getch に割り込まない場合。 (b) シグナルの受け取りが getch に割り込み、 errno に EINTR をセットして ERR を返す場合。 ncurses の実装では、シグナル操作は決して getch に割り 込みません。 has_key 関数は ncurses に特有です。これを使用するプログ ラムはすべて NCURSES_VERSION マクロの条件付きとするよう に勧めます。
curses(3x), curs_inopts(3x), curs_outopts(3x), curs_mouse(3x), curs_move(3x), curs_refresh(3x), resizeterm(3x). ワイド文字用ライブラリ (ncursesw) の対応する関数群は curs_get_wch(3x) で説明しています。 curs_getch(3x)