XInput2 拡張機能

構造体など
XIDeviceInfoデバイス情報
XIKeyClassInfoキークラス情報
XIButtonClassInfoボタンクラス情報
XIValuatorClassInfoバリュエータのクラス情報
XIScrollClassInfoスクロールクラス情報
XITouchClassInfoタッチクラス情報
XIGestureClassInfoジェスチャークラス情報
イベントマスクイベントマスク
イベントタイプイベントタイプ
XIButtonStateボタンの押し状態
XIModifierState
XIGroupState
キーの修飾子とグループの状態
XIValuatorStateバリュエータの状態
XIAnyHierarchyChangeInfoデバイス階層の変更
XIGrabModifiersグラブ修飾子
関数
XIQueryVersion拡張機能のバージョンを取得
XIQueryDevice入力デバイスの情報を返す
XIFreeDeviceInfoXIDeviceInfo を解放
XISelectEventsXI2 イベントの選択
XIGetSelectedEventsイベントマスクの取得
XIQueryPointer現在のポインタ位置を取得
XIWarpPointerポインタの位置を移動
XIDefineCursorデバイスのカーソルを変更
XIUndefineCursorデバイスのカーソルを元に戻す
XIChangeHierarchyデバイス階層を変更
XISetClientPointerClientPointer をセットする
XIGetClientPointerClientPointer のデバイス ID を返す
XISetFocusデバイスのフォーカスを変更
XIGetFocusデバイスのフォーカスを取得
グラブ
XIGrabDeviceデバイスをアクティブグラブする
XIUngrabDeviceアクティブなグラブを解除
XIAllowEvents凍結したイベントの解放
XIAllowTouchEventsタッチイベントの凍結解除
XIGrabButtonボタンのパッシブグラブ
XIUngrabButtonボタンのパッシブグラブを解除
XIGrabKeycodeキーのパッシブグラブをセット
XIUngrabKeycodeキーのパッシブグラブを解除
XIGrabEnterポインタがウィンドウに入った時にグラブさせる
XIUngrabEnterEnter グラブを解除
XIGrabFocusInウィンドウがフォーカスされた時にグラブさせる
XIUngrabFocusInフォーカスグラブを解除
XIGrabTouchBeginタッチ開始のグラブ
XIUngrabTouchBeginタッチ開始のグラブを解除
XIGrabPinchGestureBeginピンチジェスチャー開始のグラブ
XIUngrabPinchGestureBeginピンチジェスチャー開始のグラブを解除
XIGrabSwipeGestureBeginスワイプジェスチャー開始のグラブ
XIUngrabSwipeGestureBeginスワイプジェスチャー開始のグラブを解除
プロパティ
XIListPropertiesデバイスのプロパティリストを返す
XIChangePropertyデバイスのプロパティを変更
XIDeletePropertyデバイスのプロパティを削除
XIGetPropertyデバイスのプロパティを取得
ポインタバリア
XIBarrierReleasePointerポインタバリアから解放
XIBarrierReleasePointers複数デバイスをポインタバリアから解放
イベント
XIEventXI2 共通イベント
XIHierarchyEventデバイス階層の変更時
XIDeviceChangedEventデバイスの機能変更時
XIDeviceEvent各デバイスイベント
XIRawEventドライバによる生の情報
XIEnterEventEnter/Leave/FocusIn/FocusOut
XIPropertyEventデバイスのプロパティが変化した時
XITouchOwnershipEventタッチの所有者が変更された
XIBarrierEventバリアとデバイス間の対話
XIGesturePinchEventピンチジェスチャー
XIGestureSwipeEventスワイプジェスチャー
#include <X11/extensions/XInput2.h>
-lXi
[pkgconfig] xi

ver 2.1 でスムーズスクロール、ver 2.2 でマルチタッチ、ver 2.3 でバリア、ver 2.4 でジェスチャーの機能が追加。
構造体など
typedef struct
{
    int     deviceid;
    char    *name;
    int     use;
    int     attachment;
    Bool    enabled;
    int     num_classes;
    XIAnyClassInfo **classes;
} XIDeviceInfo;

typedef struct
{
    int type;
    int sourceid;
} XIAnyClassInfo;
デバイス情報
deviceid
デバイスの一意の ID。
deviceid はデバイスが存続している間は一意ですが、デバイスが削除されると、サーバーはその ID を再利用する可能性があります。
name
デバイスの名前
use
デバイスのタイプ

XIMasterPointerデバイスはマスターポインタであり、attachment はペアリングされたマスターキーボードのデバイス ID。
XIMasterKeyboardデバイスはマスターキーボードであり、attachment はペアリングされたマスターポインタの ID。
XISlavePointerデバイスはスレーブデバイスであり、現在、attachment で指定されたマスターポインタに接続されています。
XISlaveKeyboardデバイスはスレーブデバイスであり、現在、attachment で指定されたマスターキーボードに接続されています。
XIFloatingSlaveデバイスは現在どのマスターデバイスにも接続されていない、スレーブデバイスです。
attachment の値は未定義です。
enabled
デバイスが現在有効であり、イベントを送信できるかどうか。
無効化されたデバイスはイベントを送信しません。
num_classes
classes の数
classes
デバイスの各クラスの構造体のポインタの配列。
type ごとに個別の構造体があるため、実際に使用する際は、ポインタを型変換する必要がある。
type と sourceid は、常にすべての構造体の先頭にある。

type は、入力クラスのタイプ。
XIKeyClass, XIButtonClass, XIValuatorClass, XIScrollClass, XITouchClass, XIGestureClass

sourceid は、このクラスの生成元のデバイス ID です。
マスターデバイスの場合、通常、現在イベントを送信しているスレーブデバイスの ID です。
スレーブデバイスの場合、通常、そのデバイスの ID です。
typedef struct
{
   int type;
   int sourceid;
   int num_keycodes;
   int *keycodes;
} XIKeyClassInfo;
キークラス情報
num_keycodes
このデバイスで使用できるキーコード (物理ボタン) の数。少なくとも1つはある。
keycodes
デバイスが送信できる num_keycodes 個のキーコードのリスト。
typedef struct
{
   int    type;
   int    sourceid;
   int    num_buttons;
   Atom   *labels;
   XIButtonState state;
} XIButtonClassInfo;

typedef struct {
   int mask_len;
   unsigned char *mask;
} XIButtonState;
ポインタボタンとしてイベントを送信できる場合、ボタンクラスが1つある。
※実際にそのデバイスに存在するボタンの情報ではなく、X のポインタボタンとしての情報。
num_buttons
このデバイスで使用できるボタンの数。1 以上。
labels
このデバイスの各ボタンラベルを示すアトムの配列 (num_buttons 個)。
値が None でない場合、ラベルは物理デバイスのボタン順で名前を示す。

Button Left
Button Middle
Button Right
Button Wheel Up
Button Wheel Down
Button Horiz Wheel Left
Button Horiz Wheel Right
Button Side
Button Extra
state
クライアントから見た時の、現在のボタンの押し状態 (ボタンマッピングが適用された後)。
mask_len は mask の長さ (バイト単位)。
ボタンが現在論理的に押されている場合、先頭のバイト&下位ビットから順に、ボタン番号 0 からの各ビットが ON になる。
X のボタン番号がそのままビット位置に対応するため、Button1 は bit1 (0x02) となり、一番最初のビットは使用されない。
typedef struct
{
   int         type;
   int         sourceid;
   int         number;
   Atom        label;
   double      min;
   double      max;
   double      value;
   int         resolution;
   int         mode;
} XIValuatorClassInfo;
座標などを送信できるデバイスでは、0 個以上の XIValuatorClass を持つことができる。
number
このデバイスで各バリュエータを識別するための番号 (0〜)
label
None でない場合、種類を示すアトム
min,max
許可される最小値と最大値。
両方ともゼロの場合、このデバイスには最小値も最大値もない。
value
現在の値
resolution
デバイスの解像度を units/m で指定します
mode
XIModeAbsolute の場合、絶対座標を送信します。
XIModeRelative の場合、相対座標を送信します。
//ver 2.1
typedef struct
{
   int         type;
   int         sourceid;
   int         number;
   int         scroll_type;
   double      increment;
   int         flags;
} XIScrollClassInfo;
Valuator のスクロール機能。
各 XIScrollClassInfo に対して、同じ番号を持つ XIValuatorClassInfo がデバイス上に存在します。
number
このスクロール情報が適用される物理デバイス上の Valuator 番号
scroll_type
スクロールのタイプ。
XIScrollTypeVertical または XIScrollTypeHorizontal
increment
下へスクロールする時の 1 単位とみなされる値
flags
このスクロール情報に適用するフラグ。
XIScrollFlagNoEmulationサーバーは、このバリュエーターでのバリュエーター変更に関する、従来のボタンイベントをエミュレートしません。
XIScrollFlagPreferredこの軸はこのスクロールタイプの優先軸となり、次の目的で使用されます。
ドライバーが従来のスクロールボタンイベントを送信するときの、XI_Motion イベントのエミュレーション。
//ver 2.1
typedef struct
{
   int  type;
   int  sourceid;
   int  mode;
   int  num_touches;
} XITouchClassInfo;
XITouchClassInfo を備えたデバイスは、続いてポインタイベントを送信する可能性があります。
バリュエーターは、それぞれの XIValuatorClass クラスで定義する必要があります。
評価者はポインタイベントとタッチイベントの両方を送信できます。
mode
タッチスクリーンなどの直接入力タッチデバイスの場合は XIDirectTouch、タッチパッドなどの間接入力デバイスの場合は XIDependentTouch です。
XIDirectTouch デバイスの場合、タッチイベントは、タッチが発生した位置のウィンドウに送信されます。
XIDependentTouch デバイスの場合、タッチイベントはデバイスのスプライトの位置にあるウィンドウに送信されます。
num_touches
デバイスがサポートする同時タッチの最大数を定義します。
num_touches が 0 の場合は、同時タッチの最大数が未定義または指定されていないことを意味します。
このフィールドはガイドとしてのみ使用する必要があり、デバイスはその機能について嘘をつきます。
//ver 2.4
typedef struct
{
    int type;
    int sourceid;
    int num_touches;
} XIGestureClassInfo;
ジェスチャークラス情報
num_touches
デバイスがサポートする同時タッチの最大数を定義します。
num_touches が 0 の場合は、同時タッチの最大数が未定義または指定されていないことを意味します。
このフィールドはガイドとしてのみ使用する必要があり、デバイスはその機能について嘘をつきます。
XI_DeviceChangedMask
XI_KeyPressMask
XI_KeyReleaseMask
XI_ButtonPressMask
XI_ButtonReleaseMask
XI_MotionMask
XI_EnterMask
XI_LeaveMask
XI_FocusInMask
XI_FocusOutMask
XI_HierarchyChangedMask
XI_PropertyEventMask
XI_RawKeyPressMask
XI_RawKeyReleaseMask
XI_RawButtonPressMask
XI_RawButtonReleaseMask
XI_RawMotionMask
XI_TouchBeginMask
XI_TouchEndMask
XI_TouchOwnershipChangedMask
XI_TouchUpdateMask
XI_RawTouchBeginMask
XI_RawTouchEndMask
XI_RawTouchUpdateMask
XI_BarrierHitMask
XI_BarrierLeaveMask
イベントマスク
XI_DeviceChanged (1)
XI_KeyPress
XI_KeyRelease
XI_ButtonPress
XI_ButtonRelease
XI_Motion
XI_Enter
XI_Leave
XI_FocusIn
XI_FocusOut
XI_HierarchyChanged
XI_PropertyEvent
XI_RawKeyPress
XI_RawKeyRelease
XI_RawButtonPress
XI_RawButtonRelease
XI_RawMotion
XI_TouchBegin
XI_TouchUpdate
XI_TouchEnd
XI_TouchOwnership
XI_RawTouchBegin
XI_RawTouchUpdate
XI_RawTouchEnd
XI_BarrierHit
XI_BarrierLeave
XI_GesturePinchBegin
XI_GesturePinchUpdate
XI_GesturePinchEnd
XI_GestureSwipeBegin
XI_GestureSwipeUpdate
XI_GestureSwipeEnd (32)
イベントタイプ
typedef struct {
    int mask_len;
    unsigned char *mask;
} XIButtonState;
ボタンの押し状態
mask_len
mask のバイト数
mask
マスクデータ (可変長)
typedef struct
{
    int    base;
    int    latched;
    int    locked;
    int    effective;
} XIModifierState;

typedef XIModifierState XIGroupState;
値の詳細は、XKB と同じ。
修飾子の場合は、ShiftMask、LockMask、ControlMask、Mod1Mask〜Mod5Mask のフラグ。
グループの場合は、グループインデックス。
typedef struct {
    int           mask_len;
    unsigned char *mask;
    double        *values;
} XIValuatorState;
バリュエータの現在値が、可変数個分格納されている。

mask_len は mask のバイト数。
mask は、各デバイスのバリュエータ番号 (0〜) をビットとしたフラグ。
mask の各ビットが ON の場合、対応するバリュエータの現在の値が、順番に values に格納されている。

例えば、mask で bit0, bit5 が ON になっている場合、このデバイスのバリュエータ番号 0 と 5 の値があるということなので、values[0] にバリュエータ番号 0 の値、values[1] にバリュエータ番号 5 の値がある。
//共用体
typedef union {
    int                   type;
    XIAddMasterInfo       add;
    XIRemoveMasterInfo    remove;
    XIAttachSlaveInfo     attach;
    XIDetachSlaveInfo     detach;
} XIAnyHierarchyChangeInfo;

//type = XIAddMaster
typedef struct {
    int    type;
    char*  name;
    Bool   send_core;
    Bool   enable;
} XIAddMasterInfo;

//type = XIRemoveMaster
typedef struct {
    int  type;
    int  deviceid;
    int  return_mode; /* XIAttachToMaster, XIFloating */
    int  return_pointer;
    int  return_keyboard;
} XIRemoveMasterInfo;

//type = XIAttachSlave
typedef struct {
    int  type;
    int  deviceid;
    int  new_master;
} XIAttachSlaveInfo;

//type = XIDetachSlave
typedef struct {
    int  type;
    int  deviceid;
} XIDetachSlaveInfo;
デバイス階層の変更
type
XIAddMaster新しいマスターポインタとキーボードを作成
XIRemoveMasterデバイスと、ペアリングされたマスターデバイスを削除
XIAttachSlaveデバイスを新しいマスターデバイスに接続
XIDetachSlaveデバイスをマスターデバイスから切り離し、フローティングにする。
すでにフローティングになっている場合は、変更は行われません。
XIAddMasterInfo/name
「<name> pointer」「<name> keyboard」という名前で、新しいマスターポインタとマスターキーボードを作成する。
XIAddMasterInfo/send_core
True の場合、デバイスは X コアイベントを送信します。
XIAddMasterInfo/enable
True の場合、デバイスはすぐに有効になります。
XIRemoveMaster/deviceid
削除するデバイスのID
XIRemoveMaster/return_mode
XIAttachToMaster の場合、デバイスまたは、そのペアになっているマスターデバイスにアタッチされているすべてのポインタが、return_pointer にアタッチされます。同様に、すべてのキーボードは return_keyboard に接続されます。
XIFloating の場合、接続されているすべてのデバイスは、フローティングに設定されます。
XIAttachSlaveInfo/new_master
接続先の新しいマスターデバイスの ID
typedef struct
{
    int  modifiers;
    int  status;
} XIGrabModifiers;
グラブ修飾子
関数
Status XIQueryVersion(Display *dpy, int *major_version_inout, int *minor_version_inout);
クライアントがサポートする XI2 バージョンをサーバーに通知し、サーバーがサポートするバージョンを返します。

クライアントは、XGetExtensionVersion の代わりに XIQueryVersion を使用する必要があります。
これにより、サーバーは、クライアントによって指定されたバージョンに応じて、クライアントを異なる方法で処理する場合があります。

クライアントが以前に XIQueryVersion を呼び出したことがある場合、結果は、以前に要求されたバージョンと、現在要求されているバージョンによって異なります。
以前または現在の要求されたバージョンが 2.2 未満である場合、または要求されたメジャーバージョン番号が一致しない場合、同じクライアントによる XIQueryVersion の連続呼び出しは、常に、最初に返された major.minor バージョンを返します。
クライアントが後続の呼び出しで、最初に返された major.minor バージョンよりも低いバージョンを要求すると、BadValue エラーが発生します。

要求されたバージョンがすべて 2.2 以降の場合、同じメジャーバージョンを持つ、同じクライアントによる XIQueryVersion の連続呼び出しは、要求されたバージョンを返しますが、サーバーは要求されたバージョン番号の中で最も高いもの、またはサポートされている最も高いバージョンに従って動作します。

※XI2 用の QueryExtension はないため、以下のようにする。
XQueryExtension(dpy, "XInputExtension", &opcode, &event, &error)
major_version_inout,minor_version_inout
クライアントが要求する XI2 バージョンを指定しておく。
そのバージョン以下で、サーバーがサポートしているバージョンが返る。
※major_version_inout は 2 以上であること。それ以外の場合、BadValue エラーが発生する。
戻り値
サーバーが XI2 をサポートしていない場合、BadRequest を返します。それ以外の場合、Success を返します。
どちらの場合も、major_version_inout と minor_version_inout は、サーバーでサポートされているバージョンに設定されます。
※返ったバージョンの確認はクライアントが別途行うこと。
XIDeviceInfo *XIQueryDevice(Display *dpy, int deviceid, int *ndevices_return);
1 つ以上の入力デバイスに関する情報を返します。
deviceid
情報を取得するデバイスのID。
XIAllDevices (0) で、すべてのデバイス。
XIAllMasterDevices (1) で、すべてのマスターデバイスを取得します。
ndevices_return
情報を取得したデバイスの数が返る
戻り値
XIDeviceInfo 構造体の配列のポインタが返る。XIFreeDeviceInfo() で解放する。
void XIFreeDeviceInfo(XIDeviceInfo *info);
XIQueryDevice() で返されたポインタを解放する。
int XISelectEvents(Display *dpy, Window win, XIEventMask *masks, int num_masks);

typedef struct {
    int deviceid;
    int mask_len;
    unsigned char *mask;
} XIEventMask;
指定ウィンドウで、XI2 イベントを選択します。
指定されたデバイスに対して、以前に選択されたイベントマスクを上書きするので、すべてのイベントの選択をまとめて指定する形になります。

※マスターデバイスで XI_KeyPress などのイベントを選択した場合、X の KeyPress などの通常イベントは報告されません。
ただし、スレーブデバイスのみでイベントを選択した場合は、そのスレーブデバイスを操作した時のみ XI2 イベントが送信され、それ以外は通常の X イベントが送信されます。
masks
イベントマスクの配列。

deviceid が有効なデバイスの場合、イベントマスクはこのデバイスに対してのみ選択されます。
deviceid が XIAllDevices または XIAllMasterDevices の場合、イベントマスクは、すべてのデバイス、またはすべてのマスターデバイスに対して選択されます。

mask_len は、mask のバイト数。
mask は可変長で、先頭バイトから順に、(1 << event_type) のビットマスクを格納します。
num_masks
masks の個数
XIEventMask *XIGetSelectedEvents(Display *dpy, Window win, int *num_masks_return);
指定されたウィンドウ上で、このクライアントによって選択されたイベントを返します。

XIAllDevices および XIAllMasterDevices を含む、すべてのデバイスの選択されたイベントマスクを返します。
num_masks_return
イベントマスクの数が返る。
イベントが一つも選択されていない場合は 0。
内部エラーが発生した場合は、-1。
戻り値
イベントマスクの配列が返る。XFree() で解放する。
イベントが選択されていない、またはエラー時は、NULL。
Bool XIQueryPointer(Display *display, int deviceid, Window win, Window *root, Window *child,
    double *root_x, double *root_y, double *win_x, double *win_y,
    XIButtonState *buttons, XIModifierState *mods, XIGroupState *group);
デバイスのポインターが論理的に置かれているルートウィンドウと、ルートウィンドウの原点を基準としたポインターの座標を返します。

False を返した場合、ポインタは指定されたウィンドウと同じスクリーン上になく、child に None を返し、win_x と win_y に 0 を返します。
True を返した場合、win_x および win_y に返されるポインタ座標は、指定されたウィンドウの原点を基準としています。
この場合、ポインタがあればそれを含む子を返し、それ以外の場合は None を child に返します。

XIQueryPointer は XQueryPointer と同じですが、デバイスを明示的に指定します。
BadDevice エラーと BadWindow エラーを生成する可能性があります。
root
ポインタがあるルートウィンドウが返る
child
ポインタ上の子ウィンドウが返る。なければ None。
root_x,root_y
ルート座標位置が返る
win_x,win_y
win のウィンドウ原点での位置が返る
buttons
現在のボタンの倫理状態が返る。mask メンバは XFree() で解放する。
mods
マスターポインターとペアになっているキーボードから、現在の修飾子が返る
group
キーボードのグループが返る
戻り値
True でポインタは指定されたウィンドウと同じスクリーン上にある
Bool XIWarpPointer(Display *display, int deviceid, Window src_win, Window dst_win, double src_x, double src_y,
    unsigned int src_width, unsigned int src_height, double dst_x, double dst_y);
ポインタの位置を移動する。

この関数を呼び出す理由はほとんどありません。通常、ポインタはユーザーに任せるべきです。
ただし、この関数を使用すると、ユーザーがポインタをある位置から別の位置に瞬時に移動したかのようにイベントが生成されます。
アクティブなポインタグラブの confine_to ウィンドウの外にポインタを移動することはできません。ポインタは、confine_to ウィンドウの最も近い端までしか移動しません。

BadDevice エラーと BadWindow エラーを生成する可能性があります。
src_win
ソースウィンドウ or None
dst_win
宛先ウィンドウ or None。
None の場合、現在位置から相対移動する。
ウィンドウの場合、dst_win の原点位置を基準として移動する。
src_x,src_y,src_width,src_height
src_win が None でない場合、ポインタがソースウィンドウ上の指定矩形内に含まれている場合のみ、移動を実行する。
幅が 0 の場合、ウィンドウ幅から src_x を引いた値になる。
高さが 0 の場合、ウィンドウ高さから src_y を引いた値になる。
Status XIDefineCursor(Display *display, int deviceid, Window win, Cursor cursor);
デバイスのポインタがウィンドウ内にあるときに使用されるカーソルを設定する。
deviceid
マスターポインタデバイスである必要があります。そうでない場合は、BadDevice エラーが返されます。
cursor
カーソル or None。
None の場合、XIUndefineCursor と同等になります。
Status XIUndefineCursor(Display *display, int deviceid, Window win);
このウィンドウに対する、以前の XIDefineCursor の効果を元に戻します。
ポインタがウィンドウ内にある場合、ウィンドウのデフォルトのカーソルが使用されるようになります。
デフォルトのカーソルが定義されていない場合は、このデバイスの親のカーソルが使用されます (定義されている場合)、または親のデフォルトのカーソルが使用されます。

BadDevice エラーと BadWindow エラーを生成する可能性があります。
Status XIChangeHierarchy(Display *display, XIAnyHierarchyChangeInfo *changes, int num_changes);
マスターデバイスを作成または削除するか、スレーブデバイスの接続を変更することにより、デバイス階層を変更します。

変更を順番に処理し、すぐに有効になります。
エラーが発生した場合、処理は中止され、エラーがクライアントに報告されます。すでに行われた変更は引き続き有効です。

変更が成功した場合、XIHierarchyEvent イベントが生成されます。
changes
変更するリスト。
type は、XIAddMaster、XIRemoveMaster、XIAttachSlave、XIDetachSlave です。
タイプごとに構造体が異なるので、共用体から各タイプごとの値を設定する。
num_changes
changes の数。0 以下の場合、何も行わない。
Status XISetClientPointer(Display *dpy, Window win, int deviceid);
指定されたウィンドウを所有するクライアントの、ClientPointer デバイスを設定します。
ClientPointer として設定できるのは、マスターポインタデバイスのみです。

ClientPointer は、非 XI プロトコルのリクエストおよび応答のコアポインターとして認識されるデバイスです。
プロトコルメッセージがデバイス依存のデータを必要とし、デバイスが明示的に指定されていない場合は、そのたびに ClientPointer デバイスを使用してデータが取得されます。
たとえば、XQueryPointer は ClientPointer の座標を返します。
win
None の場合、リクエスト元のクライアントが指定される。
Bool XIGetClientPointer(Display *dpy, Window win, int *deviceid);
指定されたウィンドウを所有するクライアントの、ClientPointer のデバイス ID を返します。
win
None の場合、リクエスト元のクライアントが指定される。
deviceid
デバイス ID が返る
戻り値
クライアントに ClientPointer 指定がある場合は True。
Status XISetFocus(Display *dpy, int deviceid, Window focus, Time time);
指定されたデバイスのフォーカスと、その最終フォーカス変更時刻を変更します。
指定した時刻が、現在の最終フォーカス変更時刻より早い場合、または現在の X サーバー時刻より遅い場合は、効果はありません。
それ以外の場合、最終フォーカス変更時刻は指定された時刻に設定されます (CurrentTime は現在の X サーバー時間に置き換えられます)。

XISetFocus により、X サーバーはコア、XI、および XI2 フォーカスイベントを生成します。

マスターポインタデバイス、または接続されたスレーブデバイスにフォーカスを設定しようとすると、BadDevice エラーが発生します。
focus
None の場合、新しいフォーカスウィンドウが設定されるまで、このデバイスによるすべてのキーボードイベントは破棄されます。
それ以外の場合、それがデバイスのフォーカスウィンドウになります。
生成されたデバイスイベントが、通常このウィンドウまたはその下位ウィンドウの 1 つに報告される場合、イベントは通常どおり報告されます。
それ以外の場合、イベントはフォーカスウィンドウを基準にして報告されます。

指定されたフォーカスウィンドウは、XISetFocus の呼び出し時に表示可能である必要があります。そうでない場合は、BadMatch エラーが発生します。
後でフォーカスウィンドウが表示できなくなると、フォーカスは親 (または最も近い表示可能な祖先) に戻ります。
フォーカスが戻ると、X サーバーはコア、XI、および XI2 フォーカスイベントを生成しますが、最終フォーカス変更時間は影響を受けません。
Status XIGetFocus(Display *dpy, int deviceid, Window *focus_return);
デバイスのフォーカスを取得
グラブ
Status XIGrabDevice(Display *dpy, int deviceid, Window grab_window, Time time, Cursor cursor,
    int grab_mode, int paired_device_mode, Bool owner_events, XIEventMask *mask);
デバイスをアクティブにグラブします。
それ以降のデバイスイベントは、取得しているクライアントにのみ報告されます。
XIGrabDevice は、このクライアントによるアクティブなデバイスのグラブを上書きします。

デバイスが、接続されたスレーブデバイスの場合、クライアントがデバイスのグラブを解除すると、デバイスはマスターデバイスから自動的に切断され、同じマスターデバイスに再接続されます。
グラブの結果としてデバイスがフローティングになっているときに、マスターデバイスが取り外された場合、グラブが非アクティブ化されると、デバイスはフローティング状態のままになります。

成功した場合、最後のデバイス取得時刻は、指定された時刻に設定されます。CurrentTime は、現在の X サーバー時間に置き換えられます。
cursor
None でない場合、このカーソルはクライアントが XIUngrabDevice を呼び出すまで表示されます。
grab_mode
XIGrabModeAsync の場合、デバイスイベント処理は通常どおり続行されます。
デバイスが現在このクライアントによって凍結されている場合、デバイスイベントの処理が再開されます。

XIGrabModeSync の場合、デバイスの状態 (クライアントアプリケーションから見える) は凍結しているように見え、X サーバーは、グラブしているクライアントが XIAllowEvents 呼び出しを発行するか、デバイスのグラブが解放されるまで、それ以上のデバイスイベントを生成しません。
デバイスが凍結している間、実際のデバイスの変更は失われません。これらは、後の処理のためにサーバーのキューに入れられるだけです。
pared_device_mode
XIGrabModeAsync の場合、ペアになったマスターデバイスからのイベントの処理は、グラブのアクティブ化の影響を受けません。

XIGrabModeSync の場合、ペアリングされたマスターデバイスの状態 (クライアントアプリケーションから見える) は凍結しているように見え、取得しているクライアントが XIAllowEvents 呼び出しを発行するか、デバイスの取得が解放されるまで、X サーバーはこのデバイスからさらなるイベントを生成しません。
デバイスが凍結している間、実際のイベントは失われません。これらは、後の処理のためにサーバーのキューに入れられるだけです。
デバイスがスレーブデバイスの場合、paired_device_mode は無視されます。
owner_events
False の場合、生成されたすべてのデバイスイベントが、イベントマスクで選択されていれば、grab_window に関してレポートされます。
True の場合、生成されたデバイスイベントが、通常このクライアントに報告される場合は、通常どおり報告されます。
それ以外の場合、イベントは grab_window に関してレポートされ、イベントマスクで指定されている場合にのみレポートされます。
戻り値
デバイスが他のクライアントによってアクティブにグラブされている場合、XIGrabDevice は失敗し、AlreadyGrabbed を返します。
grab_window が表示できない場合は失敗し、GrabNotViewable を返します。
別のクライアントのアクティブなグラブによってデバイスが凍結されている場合、失敗して GrabFrozen を返します。
指定された時刻が、最後のデバイスの取得時刻よりも早い場合、または現在の X サーバーの時刻よりも遅い場合、処理は失敗し、GrabInvalidTime を返します。
それ以外の場合、Success。
Status XIUngrabDevice(Display *dpy, int deviceid, Time time);
このクライアントが XIGrabDevice、XIGrabKey、XIGrabButton からデバイスをアクティブにグラブしている場合、デバイスとキューに入れられたイベントを解放します。
他のデバイスがグラブによって凍結されている場合、XUngrabDevice はそれらを解除します。
指定された時刻が最後のデバイス取得時刻より早い場合、または現在の X サーバー時刻より遅い場合、デバイスおよびキューに入れられたイベントを解放しません。
アクティブなデバイスグラブのイベントウィンドウが表示できなくなった場合、X サーバーは自動的に XIUngrabDevice リクエストを実行します。
Status XIAllowEvents(Display *display, int deviceid, int event_mode, Time time);
クライアントがデバイスをフリーズさせた場合、XIAllowEvents リクエストはキューに入れられたイベントの一部を解放します。
また、タッチグラブと所有権の処理を処理するためにも使用されます。

指定された時刻が、クライアントの最新のアクティブなグラブの最後のグラブ時刻よりも早い場合、または指定された時刻が現在の X サーバー時刻よりも遅い場合、この関数は効果がありません。
XIAcceptTouch および XIRejectTouch のイベントモードを持つリクエストの time パラメーターは CurrentTime である必要があります。
event_mode
XIAsyncDevice指定されたデバイスが、クライアントによってフリーズされている場合、そのデバイスのイベント処理は通常どおり続行されます。
複数の個別のグラブに代わって、クライアントによってデバイスが複数回フリーズされた場合、XIAsyncDevice はすべてのグラブを解除します。
指定されたデバイスが、クライアントによってフリーズされていない場合、XIAsyncDevice は効果がありませんが、デバイスはクライアントによってグラブされている必要はありません。
XISyncDevice指定されたデバイスがフリーズされており、クライアントによってアクティブにグラブされている場合、そのデバイスのイベント処理は、次のボタンを押すか離すか、キーを押すか離すか、またはジェスチャ開始イベントまたは終了イベント (グラブに応じて) がレポートされるまで、通常どおり続行されます。
このとき、指定されたデバイスが再びフリーズしたように見えます。
ただし、報告されたイベントによってグラブが解放された場合、指定されたデバイスはフリーズしません。
指定されたデバイスがクライアントによってフリーズされていないか、クライアントによってグラブされていない場合、XISyncDevice は効果がありません。
XIReplayDevice指定されたデバイスが、クライアントによってアクティブにグラブされており、クライアントに送信されたイベントの結果としてフリーズされている場合 (XIGrabButton のアクティベーション、または XISyncDevice を使用した以前の XIAllowEvents から)、グラブが解放され、そのイベントが完全に再処理されます。
ただし、今回のリクエストでは、解放されたばかりのグラブのグラブウィンドウ以上 (ルート方向) のパッシブグラブは無視されます。
指定されたデバイスがクライアントによってグラブされていない場合、またはイベントの結果としてフリーズされていない場合、リクエストは効果がありません。
ジェスチャ開始イベントが再生される場合、元のグラブクライアントは XI_GesturePinchEnd または XI_GestureSwipeEnd イベントを受け取ります。
XIAsyncPairedDeviceペアリングされたマスターデバイスが、クライアントによってフリーズされた場合、そのデバイスのイベント処理は通常どおり続行されます。
ペアリングされたデバイスが、複数の個別のグラブに代わって、クライアントによって複数回フリーズされた場合、XIAsyncPairedDevice はすべてのデバイスをフリーズします。
XIAsyncPairedDevice は、デバイスがクライアントによってフリーズされていない場合は効果がありませんが、それらのデバイスはクライアントによってグラブされている必要はありません。
deviceid がスレーブデバイスを指定している場合、XIAsyncPairedDevice は効果がありません。
XISyncPairデバイスとペアになったマスターデバイスの両方が、クライアントによってフリーズされている場合、次の XI_ButtonPress、XI_ButtonRelease、XI_KeyPress、XI_KeyRelease イベントが、グラブされたデバイスのクライアントに報告されるまで (両方のデバイスの) イベント処理が通常どおり続行されます (デバイスのボタンイベント、ポインタ、キーボードのキーイベントなど)。その時点でデバイスが再びフリーズしたように見えます。
ただし、報告されたイベントによってグラブが解放された場合、デバイスはフリーズしません (ただし、他のデバイスがまだグラブされている場合、そのデバイスの後続のイベントによって両方のデバイスがフリーズします)。
XISyncPair は、デバイスとペアリングされたマスターデバイスの両方が、クライアントによってフリーズされない限り、効果はありません。
デバイスまたはペアリングされたマスターデバイスが、2 つの個別のグラブに代わって、クライアントによって 2 回フリーズされた場合、XISyncPair は両方のデバイスをフリーズします (ただし、その後の XISyncPair のフリーズは各デバイスを 1 回だけフリーズします)。
deviceid がスレーブデバイスを指定している場合、XISyncPair は効果がありません。
XIAsyncPairデバイスとペアリングされたマスターデバイスが、クライアントによってフリーズされた場合、両方のデバイスのイベント処理は通常どおり続行されます。
2 つの個別のグラブのために、クライアントによってデバイスが 2 回フリーズされた場合、両方のデバイスをフリーズします。
XIAsyncPair は、デバイスとペアリングされたマスターデバイスの両方が、クライアントによってフリーズされない限り、効果はありません。
deviceid がスレーブデバイスを指定している場合、XIAsyncPair は効果がありません。
XIAcceptTouchクライアントは、タッチシーケンスを所有すると、そのシーケンスを制御したとみなされます。
TouchEnd イベントは、grab_window の子ウィンドウでタッチシーケンスを取得したか、イベント選択を通じてタッチシーケンスのイベントを受信した、タッチシーケンスをリッスンするすべてのクライアントに送信されます。これらのクライアントは TouchUpdate イベントを受信しなくなります。
XIRejectTouchクライアントはタッチシーケンスに興味を持たなくなり、XI_TouchEnd イベントを受け取ります。
クライアントがシーケンスの現在の所有者である場合、所有権は次のリスナーに渡されます。
Status XIAllowTouchEvents(Display *display, int deviceid, unsigned int touchid, Window grab_window, int event_mode);
タッチイベントの凍結解除
touchid
承認または拒否するタッチシーケンスの ID。
XIAcceptTouch および XIRejectTouch 以外のイベントモードでは、値は無視されます。
grab_window
タッチシーケンス グラブを受け入れるか拒否するウィンドウ。
XIAcceptTouch および XIRejectTouch 以外のイベントモードでは、値は無視されます。
int XIGrabButton(Display *display, int deviceid, int button, Window grab_window, Cursor cursor,
    int grab_mode, int paired_device_mode, int owner_events, XIEventMask *mask, int num_modifiers, XIGrabModifiers *modifiers_inout);
ボタンのパッシブグラブを設定する。
将来、デバイスはアクティブにグラブされます。
XIGrabDevice の場合と同様、最後のグラブ時刻はボタンが押された時刻に設定され、次の条件がすべて真の場合は、XI_ButtonPress イベントが報告されます。

  • デバイスがグラブされておらず、指定されたボタンまたはキーコードが論理的に押されて、指定された修飾キーが修飾子デバイス上で論理的に押されていて、他のボタンまたは修飾キーが論理的に押されていないときに、イベントが発生します。
  • グラブウィンドウがフォーカスウィンドウの祖先であるか、またはグラブウィンドウがフォーカスウィンドウの子孫であり、デバイスが含まれているかのいずれかです。
  • 同じボタン/修飾子の組み合わせに対するパッシブグラブは、grab_window の祖先には存在しません。

残りの引数の解釈は XIGrabDevice と同様です。
デバイスの論理状態ですべてのボタンまたはキーが解放されると、アクティブなグラブは自動的に終了します (修飾キーの論理状態とは関係ありません)。

デバイスが接続されたスレーブデバイスの場合、グラブがアクティブになると、デバイスはマスターデバイスから自動的に切り離され、グラブが非アクティブになると、同じマスターデバイスに再接続されます。
グラブの結果として、デバイスがフローティングになっているときに、マスターデバイスが取り外された場合、グラブが非アクティブ化されると、デバイスはフローティング状態のままになります。

同じクライアントによる、同じウィンドウ上の、同じボタン/修飾子の組み合わせに対する以前のグラブをすべて上書きします。

他のクライアントが、同じウィンドウ上で、同じボタン/修飾子の組み合わせを使用して XIGrabButton をすでに発行している場合、BadAccess エラーが発生します。
XIAnyModifier または XIAnyButton を使用する場合、いずれかの組み合わせで競合するグラブがある場合は、リクエストは完全に失敗し、XIBadAccess エラーが発生します (グラブは確立されません)。
XIGrabButton は、アクティブなグラブには影響しません。
deviceid
マスターポインタを指定している場合、ボタングラブの修飾子デバイスは、ペアになったマスターデバイスになります。
それ以外の場合、修飾子デバイスは、deviceid で指定されたデバイスになります。
modifiers_inout
XIAnyModifier の修飾子は、すべての可能な修飾子の組み合わせ (修飾子なしの組み合わせを含む) に対して、グラブリクエストを発行することと同等です。
指定されたすべての修飾子に、現在キーコードが割り当てられている必要はありません。

XIAnyButton のボタンは、可能なすべてのボタンに対するリクエストを発行することと同等です。
それ以外の場合、指定されたボタンが現在物理ボタンに割り当てられている必要はありません。
戻り値
成功時は 0。
1 つ以上の修飾子の組み合わせをグラブできなかった場合、失敗した組み合わせの数を返し、modifiers_inout には、失敗した組み合わせとそれぞれのエラーコードが含まれます。
Status XIUngrabButton(Display *display, int deviceid, int button, Window grab_window, int num_modifiers, XIGrabModifiers *modifiers);
ボタンのパッシブグラブを解除
int XIGrabKeycode(Display *display, int deviceid, int keycode, Window grab_window, int grab_mode,
    int paired_device_mode, int owner_events, XIEventMask *mask, int num_modifiers, XIGrabModifiers *modifiers_inout);
キーのパッシブグラブをセット
Status XIUngrabKeycode(Display *display, int deviceid, int keycode, Window grab_window, int num_modifiers, XIGrabModifiers *modifiers);
キーのパッシブグラブを解除
int XIGrabEnter(Display *display, int deviceid, Window grab_window, Cursor cursor, int grab_mode,
    int paired_device_mode, int owner_events, XIEventMask *mask, int num_modifiers, XIGrabModifiers *modifiers_inout);
将来的には、デバイスがグラブされておらず、ポインタがウィンドウに入った場合、デバイスはアクティブにグラブされます。
ポインタがウィンドウから離れるか、アクティブなグラブは自動的に終了します。
Status XIUngrabEnter(Display *display, int deviceid, Window grab_window, int num_modifiers, XIGrabModifiers *modifiers);
Enter グラブを解除
int XIGrabFocusIn(Display *display, int deviceid, Window grab_window, int grab_mode, int paired_device_mode,
    int owner_events, XIEventMask *mask, int num_modifiers, XIGrabModifiers *modifiers_inout);
将来的には、デバイスがグラブされておらず、ウィンドウがフォーカスされた場合、デバイスはアクティブにグラブされます。
フォーカスが別のウィンドウに設定されると、アクティブなグラブは自動的に終了します。
Status XIUngrabFocusIn(Display *display, int deviceid, Window grab_window, int num_modifiers, XIGrabModifiers *modifiers);
フォーカスグラブを解除
int XIGrabTouchBegin(Display *display, int deviceid, Window grab_window, int owner_events,
    XIEventMask *mask, int num_modifiers, XIGrabModifiers *modifiers_inout);
タッチ開始のグラブ
Status XIUngrabTouchBegin(Display *display, int deviceid, Window grab_window, int num_modifiers, XIGrabModifiers *modifiers);
タッチ開始のグラブを解除
int XIGrabPinchGestureBegin(Display *display, int deviceid, Window grab_window, int grab_mode,
    int paired_device_mode, int owner_events, XIEventMask *mask, int num_modifiers, XIGrabModifiers *modifiers_inout);
ピンチジェスチャー開始のグラブ
Status XIUngrabPinchGestureBegin(Display *display, int deviceid, Window grab_window, int num_modifiers, XIGrabModifiers *modifiers);
ピンチジェスチャー開始のグラブを解除
int XIGrabSwipeGestureBegin(Display *display, int deviceid, Window grab_window, int grab_mode,
    int paired_device_mode, int owner_events, XIEventMask *mask, int num_modifiers, XIGrabModifiers *modifiers_inout);
スワイプジェスチャー開始のグラブ
Status XIUngrabSwipeGestureBegin(Display *display, int deviceid, Window grab_window, int num_modifiers, XIGrabModifiers *modifiers);
スワイプジェスチャー開始のグラブを解除
プロパティ
Atom *XIListProperties(Display *display, int deviceid, int *num_props_return);
deviceid で指定された入力デバイスに関連付けられたプロパティのリストを返します。
各デバイスには任意の数のプロパティを付けることができ、その一部はドライバーやサーバーによって作成され、その他は実行時にクライアントによって作成されます。
num_props_return
プロパティの名前のリストが返る。XFree() で解放する。
void XIChangeProperty(Display *display, int deviceid, Atom property, Atom type, int format, int mode, unsigned char *data, int num_items);
デバイスのプロパティを変更し、X サーバーに、そのデバイスの XIPropertyNotify イベントを生成させます。

プロパティの有効期間は、保存したクライアントに関連付けられません。
プロパティは、明示的に削除されるまで、デバイスが削除されるまで、またはサーバーがリセットされるまで残ります。
プロパティの最大サイズはサーバーに依存し、サーバーが使用可能なメモリの量に応じて動的に変化する可能性があります (容量が足りない場合は BadAlloc エラーとなります)。
format
8, 16, 32。
データはそれぞれ、char, uint16_t, uint32_t の配列として扱う。
mode
XIPropModeReplace で値の置き換え。
XIPropModePrepend で、先頭にデータを挿入。
XIPropModeAppend で、末尾にデータを追加。

追加/挿入の場合、タイプと形式は既存のプロパティ値と一致する必要があります。一致しない場合は、BadMatch エラーが発生します。
プロパティが未定義の場合は、長さ 0 のデータを使用して、正しい型と形式で定義されているものとして扱われます。
void XIDeleteProperty(Display *display, int deviceid, Atom property);
指定されたデバイスでプロパティが定義されている場合にのみ、指定されたプロパティを削除し、プロパティが存在しない場合を除き、X サーバーにデバイスの XIPropertyNotify イベントを生成させます。
Status XIGetProperty(Display *display, int deviceid, Atom property, long offset, long length, Bool delete_property,
    Atom type, Atom *type_return, int *format_return, unsigned long *num_items_return,
    unsigned long *bytes_after_return, unsigned char **data);
デバイスのプロパティを取得する。

基本的に、XGetWindowProperty() と同じ。
ただし、format = 32 の場合、データは uint32_t の配列となる。
type
XIAnyPropertyType で、任意のタイプ
data
確保されたポインタが返る。XFree() で解放する。
戻り値
Success で成功
ポインタバリア
void XIBarrierReleasePointer(Display *display, int deviceid, PointerBarrier barrier, BarrierEventID eventid);
ポインタがポインタバリア (Xfixes 拡張機能) によって拘束されている場合は、ポインタをバリアから解放し、次の動作で、ポインタがバリアを通過できるようにします。
ポインタがバリアから離れた場合、このリクエストは何も行いません。

このリクエストは、指定されたバリア イベント シーケンスのポインタのみを解放します。
ポインタがバリアから離れるか、バリアを通過すると、XI_BarrierLeave イベントが生成されます。
このバリアによって制限される今後のポインタの移動には、新しいイベント ID が割り当てられ、新しい XIBarrierReleasePointer リクエストが必要になります。

ポインタが現在バリアによってブロックされていない場合、またはバリア イベント シーケンスが終了している場合、このリクエストは何も行いません。
barrier
XFixesCreatePointerBarrier() で作成されたポイントバリア
void XIBarrierReleasePointers(Display *display, XIBarrierReleasePointerInfo *barriers, int num_barriers);

typedef struct
{
    int              deviceid;
    PointerBarrier   barrier;
    BarrierEventID   eventid;
} XIBarrierReleasePointerInfo;
複数デバイスをポインタバリアから解放
イベント
typedef struct {
    int           type;    /* GenericEvent */
    unsigned long serial;
    Bool          send_event;
    Display       *display;
    int           extension; /* XI extension offset */
    int           evtype;
    Time          time;
} XIEvent;
Xlib の関数でイベントを読み込んだ後、xev.type が GenericEvent、xev.xcookie.extension が XI の opcode と同じである場合は、XGetEventData(disp, ev) で追加のデータを取得する。
その後、XGenericEventCookie の data メンバに、実際の XI2 イベントのデータが格納されているため、(XIEvent *)xev.xcookie.data というようにポインタを型変換して、イベントの値を読み込む。
イベントを処理した後は、XFreeEventData() で追加のデータを解放する。
extension
この値が、XQueryExtension で取得した opcode と同じであれば、XI のイベントである。
typedef struct {
    int           type;
    unsigned long serial;
    Bool          send_event;
    Display       *display;
    int           extension;
    int           evtype;  /* XI_HierarchyChanged */
    Time          time;
    int           flags;
    int           num_info;
    XIHierarchyInfo *info;
} XIHierarchyEvent;

typedef struct {
    int    deviceid;
    int    attachment;
    int    use;
    Bool   enabled;
    int    flags;
} XIHierarchyInfo;
デバイス階層の変更時。

※1 つの階層変更で複数のデバイスが影響を受ける可能性があります。
XIHierarchyEvent の deviceid は、常に最初に影響を受けるデバイスです。
クライアントは deviceid を無視し、代わりにデバイスリストを使用する必要があります。
flags
XIMasterAddedマスターデバイスが追加された
XIMasterRemovedマスターデバイスが削除された
XISlaveAddedスレーブデバイスが追加された
XISlaveRemovedスレーブデバイスが削除された
XISlaveAttachedスレーブデバイスが接続された
XISlaveDetachedスレーブデバイスが取り外された
XIDeviceEnabledデバイスが有効になった
XIDeviceDisabledデバイスが無効になった
num_info
info の数
info
現在の階層情報。
enabled は、デバイスが有効でイベントを送信できる場合は True。
無効になっているマスターデバイスは、接続されて有効になっているスレーブデバイスからのイベントを転送しません。
typedef struct {
    int           type;     /* GenericEvent */
    unsigned long serial;
    Bool          send_event;
    Display       *display;
    int           extension;
    int           evtype;   /* XI_DeviceChanged */
    Time          time;
    int           deviceid;
    int           sourceid;
    int           reason;
    int           num_classes;
    XIAnyClassInfo **classes;
} XIDeviceChangedEvent;
デバイスの機能が変更されるたびに送信されます。
これは、新しいスレーブデバイスが、マスターデバイス経由でイベントを送信することによって、または、物理デバイスが実行時に機能を変更することによって、発生する可能性があります。
deviceid
変更されたデバイスの ID
sourceid
新しいクラスのソース
reason
変更された理由。
XISlaveSwitch (1)このデバイスを介してイベントを送信する、スレーブデバイスが変更された。
ソースは新しいスレーブデバイスを指定します。マスターデバイスでのみ発生します。
XIDeviceChange (2)デバイス自体は他の手段 (物理デバイスの変更など) を通じて変更されており、ソースはデバイス自体です。
classes
デバイスによって提供される、利用可能なクラスの詳細。クラスが提供される順序は未定義です。
typedef struct {
    int           type;
    unsigned long serial;
    Bool          send_event;
    Display       *display;
    int           extension;
    int           evtype;
    Time          time;
    int           deviceid;
    int           sourceid;
    int           detail;
    Window        root;
    Window        event;
    Window        child;
    double        root_x;
    double        root_y;
    double        event_x;
    double        event_y;
    int           flags;
    XIButtonState       buttons;
    XIValuatorState     valuators;
    XIModifierState     mods;
    XIGroupState        group;
} XIDeviceEvent;
ボタン押し、ボタン離し、ポインタ移動、キー押し、キー離しなど、デバイスの論理状態が変化するたびに生成されます。
evtype
XI_KeyPress、XI_KeyRelease、XI_ButtonPress、XI_ButtonRelease、XI_Motion のいずれか。
ver 2.2 の場合、XI_TouchBegin、XI_TouchUpdate、XI_TouchEnd も含む。
detail
ポインタボタン番号 or キーコード or タッチID or 0
flags
XIKeyRepeat1<<16(KeyPress 時) キーリピートによって生成されたキー押し。
KeyPress(0)..KeyPress(XIKeyRepeat)..KeyPress(XIKeyRepeat)..KeyRelease(0) というように送られてくる。
コア X とは異なり、キーリピート間では、XI_KeyRelease は生成されない。
XIPointerEmulated1<<16(ポインタ時) 古いクライアントのために、XI2 によってエミュレートされたイベント。
Rel Vert Scroll 軸または Rel Horiz Scroll 軸の、スムーズスクロールイベント (XI_Motion) も同時に生成された場合、このフラグは、XI_ButtonPress および XI_RawButtonPress イベント (Button 4〜7) で設定されます。
また、ダイレクトタッチデバイスによって生成される Motion、ButtonPress、ButtonRelease イベントでも設定されます。
XITouchPendingEnd1<<16(タッチ時) タッチが物理的に終了したが、別のクライアントがまだグラブを保持しているため、すべてのグラブクライアントが所有権を受け入れるか渡すまで、タッチは生きていると見なされることを意味します。
TouchPendingEnd を持つイベントが受信されると、タッチはそれ以上 TouchUpdate イベントを生成しません。
XITouchEmulatingPointer1<<17(タッチ時) ポインタイベントをエミュレートするタッチイベントで設定されます。
buttons
このイベント発生前のボタンの状態。
※このイベントで押されたボタンは含まない。
valuators
このデバイスのバリュエータの値。
※デバイスによっては、バリュエータの値が前回と同じだと、イベントでその値が送られてこない場合があるので、毎回必要な値の場合は、前回の値を記録しておくこと。
mods
このイベント発生前の XKB 修飾子の状態
group
このイベント発生前の XKB キーグループの状態
typedef struct {
    int           type;
    unsigned long serial;
    Bool          send_event;
    Display       *display;
    int           extension;
    int           evtype;
    Time          time;
    int           deviceid;
    int           sourceid;
    int           detail;
    int           flags;
    XIValuatorState valuators;
    double        *raw_values;
} XIRawEvent;
ドライバによって提供される生のデータと、サーバーで使用される、変換されたデータの両方を提供します。
変換には、軸クリッピングと加速が含まれますが、これらに限定されません。
変換されたバリュエータデータは生データと同じになる場合があります。この場合、生の評価者データと変換された評価者データの両方が提供されます。

RawEvent はすべてのルートウィンドウに、排他的に送信されます。
XI 2.0 をサポートするクライアントは、デバイスがグラブされていない場合、または、デバイスがクライアントによってグラブされているが、デバイスが別のクライアントによってグラブされている場合には、RawEvent を受信しません。
XI 2.1 以降をサポートするクライアントは、デバイスが別のクライアントによってグラブされた場合でも、常に RawEvent を受信します。

v2.1
evtype
XI_RawKeyPress, XI_RawKeyRelease, XI_RawButtonPress, XI_RawButtonRelease, XI_RawMotion
XI_RawTouchBegin, XI_RawTouchUpdate, XI_RawTouchEnd
sourceid
イベントを最初に生成したソースデバイスの ID。
XI 2.1 をサポートしていないクライアントの場合、sourceid は未定義です。
detail
ボタン番号 or キーコード or タッチID
valuators
変換されたバリュエータ値
raw_values
バリュエータの生データ値 (valuators のマスクは共通)
typedef struct {
    int           type;
    unsigned long serial;
    Bool          send_event;
    Display       *display;
    int           extension;
    int           evtype;
    Time          time;
    int           deviceid;
    int           sourceid;
    int           detail;
    Window        root;
    Window        event;
    Window        child;
    double        root_x;
    double        root_y;
    double        event_x;
    double        event_y;
    int           mode;
    Bool          focus;
    Bool          same_screen;
    XIButtonState       buttons;
    XIModifierState     mods;
    XIGroupState        group;
} XIEnterEvent;

typedef XIEnterEvent XILeaveEvent;
typedef XIEnterEvent XIFocusInEvent;
typedef XIEnterEvent XIFocusOutEvent;
Enter または Leave イベントは、デバイスのポインタが、ウィンドウに出入りするたびに送信されます。
FocusIn または FocusOut イベントは、デバイスのフォーカスがウィンドウに設定されるか、ウィンドウから離れるたびに送信されます。

Enter/Leave イベントの場合、キーの修飾子とグループの状態は、デバイスがマスターデバイスの場合は、ペアリングされたマスターデバイスの状態。
デバイスが接続されたスレーブデバイスの場合は、接続されたマスターキーボードの状態。
デバイスがフローティングスレーブデバイスの場合は、0 になります。

FocusIn/Out イベントの場合、ボタンの状態は、デバイスがマスターデバイスの場合は、ペアリングされたマスターデバイスの状態。
デバイスが接続されたスレーブデバイスの場合は、接続されたマスターキーボードの状態。
デバイスがフローティングスレーブデバイスの場合は、0 になります。
evtype
XI_Enter, XI_Leave, XI_FocusIn, XI_FocusOut
sourceid
ポインタを動かしたデバイスの ID
detail
イベントウィンドウと、ポインタが入力または移動したウィンドウとの関係。

XINotifyAncestor, XINotifyVirtual, XINotifyInferior, XINotifyNonlinear, XINotifyNonlinearVirtual,
XINotifyPointer, XINotifyPointerRoot, XINotifyDetailNone
mode
XINotifyNormal, XINotifyGrab, XINotifyUngrab, XINotifyWhileGrabbed, XINotifyPassiveGrab, XINotifyPassiveUngrab
focus
イベントウィンドウが、フォーカスウィンドウまたはフォーカスウィンドウの下位である場合、True。
このフィールドは、FocusIn/Out イベントでは使用されない。
same_screen
イベントウィンドウが、ポインタがあるルートウィンドウと同じスクリーン上にあるか
buttons
イベント発生前のボタンの状態
mods
イベント発生前の XKB 修飾子の状態
group
イベント発生前の XKB のキーグループ状態
typedef struct {
    int           type;
    unsigned long serial;
    Bool          send_event;
    Display       *display;
    int           extension;
    int           evtype;   /* XI_PropertyEvent */
    Time          time;
    int           deviceid;
    Atom          property;
    int           what;
} XIPropertyEvent;
デバイスのプロパティが変化した時
what
XIPropertyDeleted で、プロパティが削除された。
XIPropertyCreated で、プロパティが作成された。
XIPropertyModified で、プロパティが変更された。
typedef struct {
    int           type;
    unsigned long serial;
    Bool          send_event;
    Display       *display;
    int           extension;
    int           evtype;
    Time          time;
    int           deviceid;
    int           sourceid;
    unsigned int  touchid;
    Window        root;
    Window        event;
    Window        child;
    int           flags;
} XITouchOwnershipEvent;
所有権が変更され、クライアントが touchid で指定されたタッチシーケンスの所有者になったことを示します。
typedef struct {
    int           type;
    unsigned long serial;
    Bool          send_event;
    Display       *display;
    int           extension;
    int           evtype;
    Time          time;
    int           deviceid;
    int           sourceid;
    Window        event;
    Window        root;
    double        root_x;
    double        root_y;
    double        dx;
    double        dy;
    int           dtime;
    int           flags;
    PointerBarrier barrier;
    BarrierEventID eventid;
} XIBarrierEvent;
バリアとポインタデバイス間の対話を示します。
イベントタイプが BarrierHit の場合、ポインタの動きがバリアによってブロックされています。
イベントタイプが BarrierLeave の場合、以前にバリアによってブロックされていたポインターがそのバリアから離れたか、以前の XIBarrierReleasePointer 要求に続いてブロッキングバリアを通過しました。
typedef struct {
    int           type;
    unsigned long serial;
    Bool          send_event;
    Display       *display;
    int           extension;
    int           evtype;
    Time          time;
    int           deviceid;
    int           sourceid;
    int           detail;
    Window        root;
    Window        event;
    Window        child;
    double        root_x;
    double        root_y;
    double        event_x;
    double        event_y;
    double        delta_x;
    double        delta_y;
    double        delta_unaccel_x;
    double        delta_unaccel_y;
    double        scale;
    double        delta_angle;
    int           flags;
    XIModifierState     mods;
    XIGroupState        group;
} XIGesturePinchEvent;
ピンチジェスチャー
typedef struct {
    int           type;
    unsigned long serial;
    Bool          send_event;
    Display       *display;
    int           extension;
    int           evtype;
    Time          time;
    int           deviceid;
    int           sourceid;
    int           detail;
    Window        root;
    Window        event;
    Window        child;
    double        root_x;
    double        root_y;
    double        event_x;
    double        event_y;
    double        delta_x;
    double        delta_y;
    double        delta_unaccel_x;
    double        delta_unaccel_y;
    int           flags;
    XIModifierState     mods;
    XIGroupState        group;
} XIGestureSwipeEvent;
スワイプジェスチャー