X11: XKB (5) - コントロール

コントロール
XkbDescRec 構造体の ctrls には、XKB の機能コントロールに関する情報があります。

#define  XkbMaxLegalKeyCode       255
#define  XkbPerKeyBitArraySize    ((XkbMaxLegalKeyCode+1)/8)

typedef struct {
    unsigned char     mk_dflt_btn;
    unsigned char     num_groups;
    unsigned char     groups_wrap;
    XkbModsRec        internal;
    XkbModsRec        ignore_lock;
    unsigned int      enabled_ctrls;
    unsigned short    repeat_delay;
    unsigned short    repeat_interval;
    unsigned short    slow_keys_delay;
    unsigned short    debounce_delay;
    unsigned short    mk_delay;
    unsigned short    mk_interval;
    unsigned short    mk_time_to_max;
    unsigned short    mk_max_speed;
    short             mk_curve;
    unsigned short    ax_options;
    unsigned short    ax_timeout;
    unsigned short    axt_opts_mask;
    unsigned short    axt_opts_values;
    unsigned int      axt_ctrls_mask;
    unsigned int      axt_ctrls_values;
    unsigned char     per_key_repeat[XkbPerKeyBitArraySize];
} XkbControlsRec, *XkbControlsPtr;
データの取得
XkbGetKeyboard 関数で XkbAllComponentsMask を指定しても、なぜか ctrls ポインタだけは NULL の状態になります。

コントロール情報は、XkbGetControls 関数で個別に取得する必要があります。

Status XkbGetControls(Display *display, unsigned long which, XkbDescPtr xkb);

xkb->ctrls に、which マスクで指定されたデータを取得します。

ctrls->num_groups の値に関しては、いずれかのマスクが指定された場合に常にセットされます。
このキーボードにおけるキーグループの数です。
コントロールについて
コントロールの各機能には、それぞれ、有効/無効の状態と、それぞれの機能に関する属性値 (XkbControlsRec 内の値) が存在します。

機能によっては、有効/無効を切り替えられず、属性値だけが存在する場合があります。
また、属性値が存在せず、有効/無効状態のみ切り替えられる場合があります。
各機能のマスク
XkbRepeatKeysMaskキーリピートの有効/無効。また、遅延時間も変更できる。
コア X のキーリピートと連動しているので、どちらかを有効/無効にすると、もう一方も変更される。

repeat_delay が、キーリピートを開始するまでの初期遅延 (ms)。
repeat_interval が、キーリピート開始後の間隔 (ms)。
XkbSlowKeysMask短い時間の間に、誤って押されたキーを無効にするための機能。
有効な場合、キーが押された時に指定時間待機し、その期間内にキーが離されたときは、キーイベントを生成しない。

slow_keys_delay が、キーが押されてから、サーバーによって受け入れられるまでの遅延期間 (ms)。
XkbBounceKeysMaskキーを離した後すぐに、誤ってもう一度押してしまった時の動作を無効にするための機能。
有効な場合、キーが押された後、指定時間内に同じキーが押された場合は無効にする。

debounce_delay は、キーが押された後、同じキーの別の押下がサーバーによって受け入れられるまでに、キーが無効になる遅延期間 (ms)。
XkbStickyKeysMaskShift キーなどの修飾キーと、他のキーを同時に押すのが難しい場合、修飾キーを1度押して離した時に、ラッチ状態にする。
次に押されたキーでは、その修飾子が ON となり、その後、修飾子は自動的に OFF になる。
修飾キーを2回続けて押すと、ロック状態の ON/OFF になる。

ax_options に、この機能用の3つのフラグがあります (他の機能と共用)。
XkbAX_TwoKeysMask : 通常通り2つのキーが同時に押された時、StickyKeys を自動的にオフにするか。
XkbAX_LatchToLockMask : 修飾キーが2回続けて押された時、修飾子のロック状態を変更するか。
XkbMouseKeysMaskキーボードでマウス制御を行う機能。
有効な場合、指定キーが押された時、キーイベントの代わりに、ポインタイベントを生成する。

mk_dflt_btn は、キーボードでシミュレートされたマウスボタン操作に使用する、マウスボタンの番号 (Button1〜Button5)。
XkbMouseKeysAccelMaskキーボードでマウス制御を行うときの、ポインタ移動の変化。
有効な場合、キーを押し続けている間、ポインタの動きが変化する。無効な場合は、一つのポインタイベントだけが生成される。

mk_delay, mk_interval, mk_time_to_max, mk_max_speed, mk_curve は、制御に関する属性値。
XkbAccessXKeysMaskキー操作で、各コントロールの有効/無効を切り替える。有効な場合、以下の操作が可能になる。

  • Shift キーを単独で 8 秒間押し続けると、SlowKeys コントロールが切り替わります。
  • キーイベントを挟まず、連続して押すまでの遅延が 30 秒未満で、左または右の Shift キーを 5 回連続で押して離すと、StickyKeys コントロールの状態が切り替わります。
  • 2 つ以上の修飾キーを同時に操作すると、StickyKeys コントロールが無効になります。
XkbAccessXTimeoutMask有効な場合、キーボードが指定された期間アイドル状態だった時、ブールコントロールの有効/無効状態を自動的に変更し、AccessXKeys および AccessXFeedback コントロールの属性値を変更します。

ax_timeout, axt_opts_mask, axt_opts_values, axt_ctrls_mask, axt_ctrls_values が属性値です。
XkbAccessXFeedbackMask一部のキーボードが、キーが押されたとき、またはキーが繰り返されたときに、キークリック音を生成できるのと同じように、Xkb は特別なビープ音コードを利用して、コントロールにフィードバックを提供できます。

ax_options にフラグが設定されています。
XkbOverlay1Mask
XkbOverlay2Mask
2つのキーボードオーバーレイを有効/無効にでき、シミュレートされた代替キーコードを生成することができる。
XkbAudibleBellMask有効にすると、プロトコルはサウンドの生成を要求し、X サーバーで実際に本物のサウンドが生成されます。
無効にすると、強制的に要求されない限り、サーバーへのサウンド生成要求は無視されます。
XkbIgnoreGroupLockMask有効にすると、パッシブグラブをアクティブにするときに、キーボードグループのロック状態を考慮しないようにします。
XkbGroupsWrapMask範囲外のグループの処理方法の指定。
groups_wrap で値が指定されます。
XkbInternalModsMaskinternal で、サーバーによって使用され、クライアントに報告されない修飾子を指定します。
XkbIgnoreLockModsMaskignore_lock で、グラブ計算から除外する修飾子を指定します。
XkbPerKeyRepeatMaskper_key_repeat で、各キーごとのキーリピートの有効/無効を指定します。
先頭バイトの下位ビットから順に、キーコードごとのフラグがあります。
XkbControlsEnabledMaskenabled_ctrls に、有効状態になっている機能のフラグ (ここで指定されているマスク) があります。
関数
各機能を有効/無効にしたり、各属性値を個別に変更するには、それぞれの関数を使います。
自動リセット
クライアントが終了した時(異常終了も含む)、各コントロールの有効/無効を、指定した値にリセットすることができます。

Bool XkbSetAutoResetControls(Display *dpy, unsigned int changes,
    unsigned int *auto_ctrls, unsigned int *auto_values);

changes自動リセットの変更対象のコントロールのマスク。
OFF なら、設定は変更されない。
auto_ctrls自動リセットを行うかどうかのコントロールのマスク。
changes = ON, auto_ctrls = ON なら、自動リセットが行われる。
changes = ON, auto_ctrls = OFF なら、自動リセットは行われないように変更される。
auto_values自動リセット時に、機能を有効にするか無効にするかのマスク