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)