curs_mouse(3x) curs_mouse(3x)
has_mouse, getmouse, ungetmouse, mousemask, wenclose, mouse_trafo, wmouse_trafo, mouseinterval - curses によるマウス・インターフェイス
#include <curses.h> typedef unsigned long mmask_t; typedef struct { short id; /* 複数デバイス識別用ID */ int x, y, z; /* イベント座標 */ mmask_t bstate; /* ボタン状態ビット */ } MEVENT; bool has_mouse(void); int getmouse(MEVENT *event); int ungetmouse(MEVENT *event); mmask_t mousemask(mmask_t newmask, mmask_t *oldmask); bool wenclose(const WINDOW *win, int y, int x); bool mouse_trafo(int* pY, int* pX, bool to_screen); bool wmouse_trafo(const WINDOW* win, int* pY, int* pX, bool to_screen); int mouseinterval(int erval);
これらの関数は ncurses(3x) からマウスイベントへの インターフェイスを提供します。 マウスイベントは wgetch 入力ストリームの 擬似キー値 KEY_MOUSE で表されます。 (訳注: wgetch … curs_getch(3x) 参照)
マウスイベントを可視化するには mousemask 関数を使います。 これはマウスイベントを報告するように設定します。 デフォルトでは、マウスイベントは報告されません。 この関数は、どのマウスイベントが報告されるかを示すマスクを 返します。完全に失敗した場合は 0 を返します。 oldmask が NULL でない場合、この関数は指定されたウインドウの 以前のマウスイベント・マスクの値をポインタの指す場所に 格納します。 (訳注: ウインドウに関連付ける引数はありません) 副作用として、mousemask にゼロを設定するとマウスポインタが オフになることがあります。非ゼロ値のマスクを設定すると、 オンになることがあります。 これが起こるかどうかはデバイス依存です。
定義されたマウスイベント型マスクを次の表に示します。 名前 説明 --------------------------------------------------------------------- BUTTON1_PRESSED マウスボタン 1 押下 (押されること) BUTTON1_RELEASED マウスボタン 1 解放 (離されること) BUTTON1_CLICKED マウスボタン 1 クリック BUTTON1_DOUBLE_CLICKED マウスボタン 1 ダブルクリック BUTTON1_TRIPLE_CLICKED マウスボタン 1 トリプルクリック --------------------------------------------------------------------- BUTTON2_PRESSED マウスボタン 2 押下 BUTTON2_RELEASED マウスボタン 2 解放 BUTTON2_CLICKED マウスボタン 2 クリック BUTTON2_DOUBLE_CLICKED マウスボタン 2 ダブルクリック BUTTON2_TRIPLE_CLICKED マウスボタン 2 トリプルクリック --------------------------------------------------------------------- BUTTON3_PRESSED マウスボタン 3 押下 BUTTON3_RELEASED マウスボタン 3 解放 BUTTON3_CLICKED マウスボタン 3 クリック BUTTON3_DOUBLE_CLICKED マウスボタン 3 ダブルクリック BUTTON3_TRIPLE_CLICKED マウスボタン 3 トリプルクリック --------------------------------------------------------------------- BUTTON4_PRESSED マウスボタン 4 押下 BUTTON4_RELEASED マウスボタン 4 解放 BUTTON4_CLICKED マウスボタン 4 クリック BUTTON4_DOUBLE_CLICKED マウスボタン 4 ダブルクリック BUTTON4_TRIPLE_CLICKED マウスボタン 4 トリプルクリック --------------------------------------------------------------------- BUTTON5_PRESSED マウスボタン 5 押下 BUTTON5_RELEASED マウスボタン 5 解放 BUTTON5_CLICKED マウスボタン 5 クリック BUTTON5_DOUBLE_CLICKED マウスボタン 5 ダブルクリック BUTTON5_TRIPLE_CLICKED マウスボタン 5 トリプルクリック --------------------------------------------------------------------- BUTTON_SHIFT ボタンの状態変化中にシフト押下 BUTTON_CTRL ボタンの状態変化中にコントロール押下 BUTTON_ALT ボタンの状態変化中に Alt 押下 ALL_MOUSE_EVENTS すべてのボタン状態変化を報告する REPORT_MOUSE_POSITION マウスの動きを報告する ---------------------------------------------------------------------
ウインドウでマウスイベントの種類が可視になった後、 そのウインドウで wgetch 関数を呼び出すと、マウスイベントが キューにあることを知らせるため KEY_MOUSE を返します。 イベントのデータを読み出し、キューからイベントを 取り出すには、getmouse を呼び出します。 この関数は、指定のウインドウでマウスイベントが実際に 可視ならば OK を、そうでなければ ERR を返します。 getmouse が OK を返したとき、イベント構造体の座標 y と x として置かれたデータは、文字を置くマスの、画面に相対的な 座標です。 返された状態マスクは、イベントの種類を示すため、きっかり 1 ビットがセットされています。 キュー中の対応するデータは無効としてマークされます。 続けて getmouse を呼び出すと、キューから次に古い項目を 取り出します。
ungetmouse 関数の動作は ungetch に似ています。 KEY_MOUSE イベントを入力キューに戻し、そのイベントと 与えられた (ボタン) 状態データや、マスの画面に相対的な座標を 結びつけます。 (訳注: ungetch … curs_getch(3x) 参照)
wenclose 関数はマスの画面に相対的な座標の与えられた組が 与えられたウインドウに含まれるかどうかを調べ、 そうであれば TRUE を、そうでなければ FALSE を返します。 これはマウスイベントの位置がどのウインドウに含まれるかを 決めるために便利です。
wmouse_trafo 関数は、与えられた座標の組を stdscr に相対的な 座標から与えられたウインドウに相対的な座標へと変換します。 または、その逆を行います。 変換結果である stdscr に相対的な座標は、常にウインドウに 相対的な座標と同じとは限りません。 これは、他の用途のために画面の最上部または最下部の行を 予約するしくみがあるためです。(例えば ripoffline と slk_init 呼び出しを参照) o 引数 to_screen が TRUE のとき、ポインタ pY, pX は ウインドウ win 内の座標を参照していなければなりません。 これらはウインドウに相対的な座標に変換され、 ポインタを通して値が返されます。 正常に変換されると、関数は TRUE を返します。 o 引数のどれかが NULL だったとき、 または位置がウインドウの中でないとき、FALSE を返します。 o 引数 to_screen が FALSE のとき、pY, pX は ウインドウに相対的な座標を参照していなければなりません。 ウインドウ win がこの点を含んでいれば、これらは stdscr に 相対的な座標に変換されます。 この場合、関数は TRUE を返します。 o 引数のどれかが NULL だったとき、 または位置がウインドウの中でないとき、FALSE を返します。 正常に変換されると、参照される座標は変換後の座標に 単に置き換えられます。
mouse_trafo 関数は win として stdscr を使って wmouse_trafo と同じ変換を行います。
mouseinterval 関数は、クリックとして認識される押下と解放の イベントの間に経過する最大の時間 (千秒単位) を設定します。 (訳注: 千分の 1 秒単位か) クリックの分離を無効にするには mouseinterval(0) を 使ってください。 この関数は以前の間隔値を返します。 値を変化させずに時間間隔を得るには mouseinterval(-1) を 使ってください。 デフォルト値は 1/6 秒です。
has_mouse 関数はマウスドライバが正常に初期化されていれば TRUE を返します。 入力が cooked モードのとき、マウスイベントは無視されること、 そして入力ループを終了するために改行を期待する getstr のような 関数によって cooked モードがウインドウでシミュレート されているときマウスイベントはエラー音を発生させることに 注意してください。 (訳注: cooked モード … curs_inopts(3x) 参照)
getmouse と ungetmouse は失敗のとき整数 ERR を、 正常終了のとき OK を返します。 getmouse 次の場合にエラーを返します。 o マウスドライバが初期化されていなかったとき、 またはマスク引数がゼロのとき (訳注: mousemask の newmask か) o キューにそれ以上イベントがない場合にもエラーを返します ungetmouse キューに空きがない場合にエラーを返します。 mousemask は報告可能なイベントのマスクを返します。 mouseinterval は直前の間隔値を返します。ただし端末が 初期化されていなかった場合を除きます。この場合には 最大の間隔値 (166) を返します。 wenclose と wmouse_trafo はそれぞれの調査結果によって TRUE または FALSE を返すブール値関数です。
これらの呼び出しは ncurses(3x) 用に設計されており、 SVr4 curses, 4.4BSD curses, その他 curses の以前の バージョンにはみられません。 機能が存在するかどうかをプリプロセッサを使って調べるために マクロ NCURSES_MOUSE_VERSION が提供されます。 インターフェイスが変更されると、NCURSES_MOUSE_VERSION の値は 増加します。 ncurses を構成するとき NCURSES_MOUSE_VERSION に次の値が 設定されます。 1 予約されたイベントのための定義を持ちます。 マスクは 28 ビットを使います。 2 ボタン 5 の定義を加え、予約されたイベントのための定義を 削除しています。 マスクは 29 ビットを使います。 MEVENT 構造体のメンバの順序は保証されません。 将来、構造体に追加の項目が加えられるかもしれません。 ncurses(3x) では、これらの呼び出しは xterm の組込みマウス(追跡) API も、プラットフォーム依存の以下を含むドライバも使うように 実装されています。 o Alessandro Rubini's gpm server o FreeBSD sysmouse o OS/2 EMX サポートされていない構成を使っている場合、マウスイベントは ncurses(3x) で可視になりません。(そして mousemask 関数は常に 0 を返します。) terminfo 収録項目に XM 文字列が含まれていれば、 xterm マウスドライバがマウス操作のために端末を初期化する方法を 制御するために使われます。 デフォルトで、XM が見つからない場合、xterm の プライベート・モード 1000 に対応するのは \E[?1000%?%p1%{1}%=%th%el%; です。 イベント構造体のメンバ z は現在使われていません。 これは (感圧式などの) タッチスクリーンや3Dマウス、 トラックボール、パワーグローブで使うことを意図したものです。 ALL_MOUSE_EVENTS クラスは REPORT_MOUSE_POSITION を含みません。 両者は別のものです。 例えば、xterm では、ホイールマウス、スクロールマウスは 位置情報をボタン 4 または 5 の一連の押下として送信し、 ボタン解放とのマッチングをしません。
xterm でのマウスイベントは、もし mousemask で有効に なっている場合には、実のところ cooked モードの間、 無視されません。 代わりに xterm マウス報告シーケンスが読み込んだ文字列中に 現れます。 keypad ビットがオフのウインドウでは xterm のマウスイベントは 種々のファンクションキーに変換されるため正しく検出されません。 terminfo 記述で kmous を "\E[M" に設定しなくてはなりません (xterm からのマウスクリックの応答の開始) 。 kmous の他の値も許されますが、同じ仮定のもとで、 つまり応答の開始としてです。 (訳注: keypad … curs_inopts(3x) 参照) xterm マウス・プロトコルをサポートする端末を 識別するのに役立つ標準的な端末応答が存在しないため、 環境変数 $TERM が "xterm" を含んでいるか、 または端末記述の中に kmous が定義されている場合に、 端末がマウスイベントを送れるものと ncurses は仮定します。
curses(3x), curs_kernel(3x), curs_slk(3x), curs_variables(3x). curs_mouse(3x)