XKB: イベント

イベントタイプイベントタイプ(xkb_type)
XkbEventXKB イベント共用体
XkbAnyEventXKB 共通データ
XkbStateNotifyEventXKB の状態変化
XkbIndicatorNotifyEventインディケータの状態/マップが変化した
XkbBellNotifyEventベルイベント
XkbAccessXNotifyEvent補助的なキー操作に関する通知
XkbControlsNotifyEventコントロールの設定が変化した
XkbMapNotifyEventキーマッピングの変更時
XkbActionMessageEventアクションメッセージ
XkbCompatMapNotifyEvent互換性マップ通知
XkbNamesNotifyEvent名前の変更
XkbNewKeyboardNotifyEvent新しいキーボードの通知
XkbExtensionDeviceNotifyEventXInput デバイスのステータス変化
#define XkbNewKeyboardNotify    0
#define XkbMapNotify            1
#define XkbStateNotify          2
#define XkbControlsNotify       3
#define XkbIndicatorStateNotify 4
#define XkbIndicatorMapNotify   5
#define XkbNamesNotify          6
#define XkbCompatMapNotify      7
#define XkbBellNotify           8
#define XkbActionMessage        9
#define XkbAccessXNotify        10
#define XkbExtensionDeviceNotify  11
イベントタイプ(xkb_type)
typedef union _XkbEvent {
    int                            type;
    XkbAnyEvent                    any;
    XkbStateNotifyEvent            state;
    XkbMapNotifyEvent              map;
    XkbControlsNotifyEvent         ctrls;
    XkbIndicatorNotifyEvent        indicators;
    XkbBellNotifyEvent             bell;
    XkbAccessXNotifyEvent          accessx;
    XkbNamesNotifyEvent            names;
    XkbCompatMapNotifyEvent        compat;
    XkbActionMessageEvent          message;
    XkbExtensionDeviceNotifyEvent  device;
    XkbNewKeyboardNotifyEvent      new_kbd;
    XEvent                         core;
} XkbEvent;
XKB イベント共用体
typedef struct {
    int             type;
    unsigned long   serial;
    Bool            send_event;
    Display *       display;
    Time            time;
    int             xkb_type;
    unsigned int    device;
} XkbAnyEvent;
XKB 共通データ
type
event_base + XkbEventCode (0)
device
イベントが生成されたリクエストで XkbUseCoreKbd が指定されていた場合、コアキーボードを指定するために、サーバーによって割り当てられた値がセットされます。
XInput 拡張機能のデバイス ID が指定されていた場合、同じ識別子が指定されます。
typedef struct {
    int            type;
    unsigned long  serial;
    Bool           send_event;
    Display *      display;
    Time           time;
    int            xkb_type;
    int            device;
    unsigned int   changed;
    int            group;
    int            base_group;
    int            latched_group;
    int            locked_group;
    unsigned int   mods;
    unsigned int   base_mods;
    unsigned int   latched_mods;
    unsigned int   locked_mods;
    int            compat_state;
    unsigned char  grab_mods;
    unsigned char  compat_grab_mods;
    unsigned char  lookup_mods;
    unsigned char  compat_lookup_mods;
    int            ptr_buttons;
    KeyCode        keycode;
    char           event_type;
    char           req_major;
    char           req_minor;
} XkbStateNotifyEvent;
修飾子が ON/OFF されたとき、現在のグループが変更されたとき、またはポインタボタンが押されたときや離されたときなど、キーボードの状態が変化した時に来ます。

XkbStateNotify イベントは、現在のキーボード入力フォーカスまたはグラブ状態に関係なく、関係するすべてのクライアントに報告されます。
※(クライアント外のウィンドウを含む) どのウィンドウ上で状態が変化しても、常に、イベントを選択しているすべてのクライアントに送られます。
xkb_type
XkbStateNotify
device
デバイス ID (XkbUseCoreKbd ではない)
changed
何が変更されたかを示すフラグ。
#define XkbModifierStateMask    (1L << 0)
#define XkbModifierBaseMask     (1L << 1)
#define XkbModifierLatchMask    (1L << 2)
#define XkbModifierLockMask     (1L << 3)
#define XkbGroupStateMask       (1L << 4)
#define XkbGroupBaseMask        (1L << 5)
#define XkbGroupLatchMask       (1L << 6)
#define XkbGroupLockMask        (1L << 7)
#define XkbCompatStateMask      (1L << 8)
#define XkbGrabModsMask         (1L << 9)
#define XkbCompatGrabModsMask   (1L << 10)
#define XkbLookupModsMask       (1L << 11)
#define XkbCompatLookupModsMask     (1L << 12)
#define XkbPointerButtonMask        (1L << 13)
#define XkbAllStateComponentsMask   (0x3fff)
group
effective グループのグループインデックス
base_group
base グループのグループインデックス
latched_group
latched グループのグループインデックス
locked_group
locked グループのグループインデックス
mod
effective 修飾子
base_mods
base 修飾子
latched_mods
latched 修飾子
locked_mods
locked 修飾子
compat_state
計算された互換性状態
grab_mods
グラブに使用される修飾子
compat_grab_mods
互換性グラブに使用される修飾子
lookup_mods
シンボルの lookup に使用される修飾子
compat_lookup_mods
互換性の lookup に使用される MOD
ptr_buttons
ポインタボタンのマスク (Button1Mask〜)
keycode
イベントを引き起こしたキーコード。プログラムによる場合は 0
event_type
req_major または req_minor が 0 以外の場合、コアイベントタイプ。
キーイベントによる状態変化の場合、KeyPress または KeyRelease。
ボタンイベントの場合、ButtonPress or ButtonRelease。keycode は ボタン番号。
それ以外の場合は、状態変更を引き起こしたリクエストのコードが req_major,req_minor に設定される。keycode は 0。
req_major
プログラムトリガーの場合はメジャーリクエストコード、それ以外の場合は 0。
拡張機能のオペコードと同じ。
req_minor
プログラムトリガーの場合はマイナーリクエストコード、それ以外の場合は 0
typedef struct _XkbIndicatorNotify {
    int            type;
    unsigned long  serial;
    Bool           send_event;
    Display *      display;
    Time           time;
    int            xkb_type;
    int            device;
    unsigned int   changed;
    unsigned int   state;
} XkbIndicatorNotifyEvent;
インジケーターの状態が変化するたびに、サーバーは関係するすべてのクライアントに XkbIndicatorStateNotify イベントを送信します。
また、インジケーターのマップが変更されるたびに、サーバーは関係するすべてのクライアントに XkbIndicatorMapNotify イベントを送信します。

XkbIndicatorStateNotify イベントを受信するには、XkbIndicatorStateNotifyMask を含む bits_to_change パラメータと value_for_bits パラメータの両方を指定して、XkbSelectEvents を使用します。
XkbIndicatorMapNotify イベントを受信するには、XkbSelectEvents を XkbIndicatorMapNotifyMask とともに使用します。

特定のインジケーターのみのイベントを受信するには、XkbSelectEventDetails を使用します。
events_type パラメーターを XkbIndicatorStateNotify または XkbIndicatorMapNotify に設定し、bits_to_change と value_for_bits の両方の詳細パラメーターを、各ビットが 1 つのインジケーターを指定するマスクに設定し、イベントを受信するインジケーターを指定するビットをオンにします。

クライアントアプリケーションが XkbIndicatorStateNotify イベントまたは XkbIndicatorMapNotify イベントを受信すると、XkbNoteIndicatorChanges を呼び出すことで、XkbIndicatorChangesRec を取得できます。
xkb_type
XkbIndicatorStateNotify or XkbIndicatorMapNotify
changed
変更されたインディケータのマスク
state
すべてのインディケータの現在の状態のマスク
typedef struct _XkbBellNotify {
    int             type;
    unsigned long   serial;
    Bool            send_event;
    Display *       display;
    Time            time;
    int             xkb_type;
    unsigned int    device;
    int             percent;
    int             pitch;
    int             duration;
    unsigned int    bell_class;
    unsigned int    bell_id;
    Atom            name;
    Window          window;
    Bool            event_only;
} XkbBellNotifyEvent;
Xkb は、XkbForceDeviceBell および XkbForceBell の呼び出しから生じるものを除く、すべてのベルに対して XkbBellNotify イベントを生成します。

XkbBellNotify イベントには、イベントの詳細はありません。選択されているか、選択されていないかのどちらかです。
ただし、event_type として XkbBellNotify を使用し、bits_to_change および value_for_bits で XkbAllBellEventsMask を指定して、XkbSelectEventDetails を呼び出すことができます。
xkb_type
XkbBellNotify
percent
要求された音量
pitch
要求されたピッチ (Hz)
duration
要求された期間 (マイクロ秒)
name
要求されたベルの名前
window
イベントに関連付けられたウィンドウ
event_only
False で、サーバーはビープ音を鳴らさなかった
typedef struct {
    int             type; 
    unsigned long   serial;
    Bool            send_event;
    Display *       display;
    Time            time;
    int             xkb_type;
    int             device;
    int             detail;
    KeyCode         keycode;
    int             slowKeysDelay;
    int             debounceDelay;
} XkbAccessXNotifyEvent;
サーバーは、一部のグローバルキーボードコントロールに対して XkbAccessXNotify イベントを生成できます。

イベント選択の詳細マスクは以下。
XkbAXN_SKPressMask    (1<<0)
XkbAXN_SKAcceptMask   (1<<1)
XkbAXN_SKRejectMask   (1<<2)
XkbAXN_SKReleaseMask  (1<<3)
XkbAXN_BKAcceptMask   (1<<4)
XkbAXN_BKRejectMask   (1<<5)
XkbAXN_AXKWarningMask (1<<6)
XkbAXN_AllEventsMask  (0x7f)
xkb_type
XkbAccessXNotify
detail
XkbAXN_SKPressスローキーが有効なときにキーが押された
XkbAXN_SKAcceptキーが受け入れられた (SlowKeys 遅延よりも長く保持された)
XkbAXN_SKRelease受け入れられた SlowKeys キーが離された
XkbAXN_SKRejectキーが拒否された (SlowKeys 遅延が期限切れになる前に離された)
XkbAXN_BKAcceptキーが BounceKeys によって受け入れられた
XkbAXN_BKRejectキーが拒否された (BounceKeys 遅延が期限切れになる前に離された)
XkbAXN_AXKWarningAccessXKeys が StickyKeys または BounceKeys をオン/オフにしようとしている
keycode
イベントが発生したときのキーコード
slowKeysDelay
アクションが SlowKeys に関連している場合、現在の SlowKeys 遅延
debounceDelay
アクションが BounceKeys に関連している場合、現在のデバウンス遅延
typedef struct {
    int            type;
    unsigned long  serial;
    Bool           send_event;
    Display *      display;
    Time           time;
    int            xkb_type;
    int            device;
    unsigned int   changed_ctrls;
    unsigned int   enabled_ctrls;
    unsigned int   enabled_ctrl_changes;
    int            num_groups;
    KeyCode        keycode;
    char           event_type;
    char           req_major;
    char           req_minor;
} XkbControlsNotifyEvent;
コントロールの設定が変化した
xkb_type
XkbCompatMapNotify
changed_ctrls
変化したコントロールのマスク
enabled_ctrls
サーバーで現在有効になっているコントロール
enabled_ctrl_changes
コントロールが有効または無効になった場合のマスク
num_groups
最も多くのグループに属するキーにバインドされているグループの数を報告し、キーボードマッピングが変更されると自動的に更新されます。
keycode
event_type が KeyPress、KeyRelease、DeviceKeyPress、DeviceKeyRelease の場合、変更を引き起こしたキーコード。
event_type が ButtonPress または ButtonRelease の場合、ボタン番号。
それ以外は 0。
event_type
変更を引き起こしたイベントのタイプ。
(KeyPress、KeyRelease、DeviceKeyPress、DeviceKeyRelease、ButtonPress、ButtonRelease のいずれか)
クライアントからのリクエストによる場合、0。
req_major,req_minor
イベントを引き起こしたリクエスト。
typedef struct {
    int            type;
    unsigned long  serial;
    Bool           send_event;
    Display *      display;
    Time           time;
    int            xkb_type;
    int            device;
    unsigned int   changed;
    unsigned int   resized;
    int            first_type;
    int            num_types;
    KeyCode        min_key_code;
    KeyCode        max_key_code;
    KeyCode        first_key_sym;
    KeyCode        first_key_act;
    KeyCode        first_key_behavior;
    KeyCode        first_key_explicit;
    KeyCode        first_modmap_key;
    KeyCode        first_vmodmap_key;
    int            num_key_syms;
    int            num_key_acts;
    int            num_key_behaviors;
    int            num_key_explicit;
    int            num_modmap_keys;
    int            num_vmodmap_keys;
    unsigned int   vmods;
} XkbMapNotifyEvent;
キーマッピングの変更時
xkb_type
XkbMapNotify
changed
変更されたデータのマスク
resized
予約
typedef struct _XkbActionMessage {
    int            type;
    unsigned long  serial;
    Bool           send_event;
    Display *      display;
    Time           time;
    int            xkb_type;
    int            device;
    KeyCode        keycode;
    Bool           press;
    Bool           key_event_follows;
    char           message[XkbActionMessageLength+1];
} XkbActionMessageEvent;
アクションメッセージ
xkb_type
XkbActionMessage
press
True でキーが押された。False で離された。
key_event_follows
KeyPress (press が True の場合) または KeyRelease (press が False の場合) イベントも、クライアントに送信されるかどうかを指定します。
他のすべての Xkb イベントと同様に、現在のキーボードフォーカスに関係なく、イベントを要求しているすべてのクライアントに配信されます。
ただし、条件付きで、XkbActionMessageEvent に続く KeyPress または KeyRelease イベントは、現在のキーボードフォーカスによって選択されているクライアントにのみ送信されます。
次の KeyPress または KeyRelease イベントが、実際に送信されるクライアントに対してのみ、True が設定されます。
message
メッセージアクションで指定された値。NULL で終わることが保証される。
typedef struct {
    int            type;
    unsigned long  serial;
    Bool           send_event;
    Display *      display;
    Time           time;
    int            xkb_type;
    int            device;
    unsigned int   changed_groups;
    int            first_si;
    int            num_si;
    int            num_total_si;
} XkbCompatMapNotifyEvent;
キーボードマッピングが変更されると、サーバーは MappingNotify イベントを自動的に生成します。
互換性マップへの変更の通知を受け取りたい場合は、XkbCompatMapNotify イベントを選択する必要があります。
XkbMapNotify イベントを選択すると、自動生成された MappingNotify イベントを受信しなくなります。
その後、XkbMapNotifyEvent 配信の選択を解除すると、再び MappingNotify イベントを受信します。

自分自身が行った変更だけでなく、他のクライアントが行った変更も通知されることに注意してください。
xkb_type
XkbCompatMapNotify
changed_groups
変更されたグループ互換性マップの数。
互換性マップの対応するコピーを維持している場合、または XkbGetCompatMap を使用してサーバーから新しいコピーを取得している場合、changed_groups は XkbCompatMapRec 構造内のグループ [0..Changed_groups - 1] を参照します。
first_si
最初に変更されたシンボル解釈のインデックス
num_si
変更されたシンボル解釈の数
num_total_si
有効なシンボル解釈の総数です
typedef struct {
    int             type; 
    unsigned long   serial;
    Bool            send_event;
    Display *       display;
    Time            time;
    int             xkb_type; 
    int             device;
    unsigned int    changed;
    int             first_type;
    int             num_types;
    int             first_lvl;
    int             num_lvls;
    int             num_aliases;
    int             num_radio_groups;
    unsigned int    changed_vmods;
    unsigned int    changed_groups;
    unsigned int    changed_indicators;
    int             first_key;
    int             num_keys;
} XkbNamesNotifyEvent;
名前の変更
xkb_type
XkbNamesNotify
typedef struct _XkbNewKeyboardNotify {
    int            type;
    unsigned long  serial;
    Bool           send_event;
    Display *      display;
    Time           time;
    int            xkb_type;
    int            device;
    int            old_device;
    int            min_key_code;
    int            max_key_code;
    int            old_min_key_code;
    int            old_max_key_code;
    unsigned int   changed;
    char           req_major;
    char           req_minor;
} XkbNewKeyboardNotifyEvent;
新しいキーボードの通知
xkb_type
XkbNewKeyboardNotify
changed
XkbNKN_KeycodesMaskキーコード範囲
XkbNKN_GeometryMaskジオメトリ
XkbNKN_DeviceIDMaskデバイスID
XkbAllNewKeyboardEventsMask上記すべて
req_major,req_minor
req_major と req_minor がゼロの場合、デバイスの変更はサーバーへのソフトウェア要求によって引き起こされたものではなく、新しいデバイスのホットプラグなどの自発的な変更が発生しました。
この場合、device は新しい現在の X キーボード デバイスのデバイス識別子ですが、old_device に関して実装に依存しない保証はありません。
old_device は device と同一である場合があります (デバイスが変更された場合、実装者はデバイス指定子を再利用できます)。または異なる場合があります。

req_major と req_minor がゼロであっても、必ずしも物理キーボードデバイスが変更されたことを意味するわけではないことに注意してください。
むしろ、ソフトウェア制御の外での自発的な変化を意味するだけです (一部のシステムには、キーを押すと人格を変更できるキーボードが搭載されています)。

キーボードの変更が XInput ChangeKeyboardDevice リクエストの結果である場合、req_major には XInput メジャーオペコードが含まれ、req_minor には X_ChangeKeyboardDevice のリクエスト番号が含まれます。
この場合、device と old_device は異なり、device は新しい現在の X キーボードデバイスの識別子であり、old_device は以前のデバイスの識別子です。

キーボードの変更が、XkbGetKeyboardByName 関数呼び出しの結果である場合、req_major には Xkb 拡張ベース イベント コードが含まれ、req_minor には Xkb 拡張リクエスト X_kbGetKbdByName のイベントコードが含まれます。
device には新しいデバイスのデバイス識別子が含まれていますが、old_device については決定的なことは何も言えません。
実装に応じて、デバイスと同じである場合もあれば、異なる場合もあります。
typedef struct {
    int            type;
    unsigned long  serial;
    Bool           send_event;
    Display *      display;
    Time           time;
    int            xkb_type;
    int            device;
    unsigned int   reason;
    unsigned int   supported;
    unsigned int   unsupported;
    int            first_btn;      /* first button that changed */
    int            num_btns;       /* number of buttons that changed */
    unsigned int   leds_defined;   /* indicators with names or maps */
    unsigned int   led_state;      /* current state of the indicators */
    int            led_class;      /* feedback class for LED changes */
    int            led_id;         /* feedback ID for LED changes */
} XkbExtensionDeviceNotifyEvent;
XInput デバイスのステータスが変化したとき、または、特定のデバイスで、サポートされていない Xkb 機能を使用しようとしたときに、XkbExtensionDeviceNotify イベントを生成します。
xkb_type
XkbExtensionDeviceNotifyEvent