EN JA
curs_getch(3X)
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);

 

解説

getchwgetchmvgetch および mvwgetch ルーチンはウィンドウから文字を読み込みます。遅延なしモードにおいて、入力が待っていない場合、値 ERR は返されます。遅延モードにおいて、システムがテキストをプログラムのために渡すまで、プログラムは待ちます。 cbreak の設定によって、これは 1 文字 (cbreak モード) の後か、あるいは最初の改行 (nocbreak モード) の後にあります。半遅延モードにおいて、文字がタイプされるか、指定されたタイムアウトに到達するまで、プログラムは待ちます。

もし noecho が設定されていなければ、文字も次の規則にしたがって指定されたウィンドウへエコーされるでしょう。文字が現在の erase 文字、左矢印あるいはバックスペースである場合、カーソルは左に 1 スペース移動されます、そしてその画面位置はあたかも delch が呼ばれたかのように、削除されます。文字の値が他の KEY_ 定義である場合、ユーザは beep 呼び出しで警告を受けます。そうでなければ、文字は、画面に単に出力されます。

ウィンドウがパッド (詰め物) でなく、それが wrefresh への最後の呼び出し以来移動されたか修正された場合、 wrefresh は別の文字が読み込まれる前に呼び出されます。

keypadTRUE で、ファンクションキーが押される場合、そのファンクションキーのためのトークンは 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_RESIZEKEY_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 を押すと getchKEY_ENTER を返します。

getchwgetchmvgetch あるいは mvwgetch を使用する場合、nocbreak モード ( nocbreak) および echo モード ( echo) は同時に使用されてはなりません。各文字がタイプされる時、tty ドライバの状態に依存して、プログラムは望ましくない結果を生成するかもしれません。

getchmvgetch および mvwgetch はマクロであるかもしれないことに注意してください。

歴史的に、キーパッドマクロのセットは、AT&T 7300、aka 3B1、aka Safari 4 の極端なファンクションキーリッチキーボードによって大部分は定義されました。現代のパソコンは、通常これらの小さな部分集合だけを持っています。 IBM PC スタイルコンソールは、典型的に KEY_UPKEY_DOWNKEY_LEFTKEY_RIGHTKEY_HOMEKEY_ENDKEY_NPAGEKEY_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 に割り込み、 errnoEINTR を設定して 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) に説明されています。