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);


説明


文字の読み込み

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

         echo が有効で、かつウィンドウがパッドでない場合、
       文字は次の規則にしたがって、指定されたウィンドウへエコーさ
       れます。

       o   文字が現在の erase 文字、左矢印あるいはバックスペースで
           ある場合、カーソルは左に 1 桁移動し、その位置はあたかも 
           delch が呼ばれたかのように削除されます。
       
       o   文字の値が他の KEY_ 定義キーである場合、警告として 
           beep が呼び出されます。
       
       o   文字が復帰(キャリッジ・リターン)で、かつ nl が有効な
           場合、エコーされた後、改行(ライン・フィード)に
           変換されます。

       o   それ以外の文字は、単に画面に出力されます。
       
       ウィンドウがパッドでなく、かつ、最後に wrefresh が
       呼び出されて以降に移動または修正された場合、他の文字が読み
       込まれる前に wrefresh が呼び出されます。


キーパッド・モード

         keypadTRUE のとき、ファンクションキーが押されると、
       生の文字コードの代わりに、そのファンクションキーのトークンを
       返します。
         使用可能なファンクションキーは、 <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   最終的に "入力または送信" がこのキーの標準の記述となりま
           す。

         getchwgetchmvgetch あるいは 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_RESIZEncurses で初めて実装された拡張機能です。
       後に NetBSD curses にも追加されました。

         移植性に関心のあるプログラマは、次の 2 つのケースの両方
       に対して準備しなくてはなりません。
        (a) シグナルの受け取りが getch に割り込まない場合。
        (b) シグナルの受け取りが getch に割り込み、 errnoEINTR をセットして ERR を返す場合。 
         ncurses の実装では、シグナル操作は決して getch に割り
       込みません。

         has_key 関数は ncurses に特有です。これを使用するプログ
       ラムはすべて NCURSES_VERSION マクロの条件付きとするよう
       に勧めます。


SEE ALSO 関連項目

       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)