XKB: サーバーマップ

定義
struct XkbServerMapRecサーバーマップ
struct XkbBehaviorキーの動作
キーアクション
union XkbActionキーアクション
struct XkbAnyAction任意のアクション
struct XkbModAction修飾子アクション
struct XkbGroupActionグループアクション
struct XkbPtrActionポインタアクション
struct XkbPtrBtnActionポインタボタンアクション
struct XkbPtrDfltActionポインタデフォルトアクション
struct XkbISOActionISO9995 仕様によるロック
struct XkbSwitchScreenAction画面変更アクション
struct XkbCtrlsActionコントロールアクション
struct XkbMessageActionメッセージアクション
struct XkbRedirectKeyActionリダイレクトキーアクション
struct XkbDeviceBtnActionデバイスボタンアクション
struct XkbDeviceValuatorActionバリュエーターアクション
関数
XkbKeyHasActions指定キーコードにアクションが関連付けられているか
XkbKeyNumActions指定キーコードに関連付けられているアクションの数を返す
XkbKeyActionsPtr指定キーコードに関連付けられているアクションへのポインタを返す
XkbKeyAction指定キーコードとインデックスからアクション値を返す
XkbKeyActionEntry指定キーコードとシフト&グループからアクション値を返す
XkbModActionVModsアクションの vmods1,vmods2 を vmods 形式に変換して返す
XkbSetModActionVModsvmods 形式から、アクションの vmods1,vmods2 をセット
XkbSAGroupgroup_XXX を返す
XkbSASetGroupgroup_XXX を設定
XkbPtrActionXhight_XXX,low_XXX から X 座標を取得
XkbPtrActionYhight_YYY,low_YYY から Y 座標を取得
XkbSetPtrActionXX 座標を hight_XXX,low_XXX にセット
XkbSetPtrActionYY 座標を hight_YYY,low_YYY にセット
XkbSAPtrDfltValuevalueXXX を返す
XkbSASetPtrDfltValuevalueXXX をセットする
XkbSAScreenscreenXXX を取得
XkbSASetScreenscreenXXX をセット
XkbActionCtrlsctrls0..3 から値を取得
XkbSAActionSetCtrlsctrls0..3 に値をセット
XkbSARedirectVModsMaskvmods_mask0,1 から値を取得
XkbSARedirectSetVModsMaskvmods_mask0,1 に値をセット
XkbSARedirectVModsvmods0,1 から値を取得
XkbSARedirectSetVModsvmods0,1 に値をセット
XkbGetKeyActionsキーアクションの取得
XkbResizeKeyActionsキーアクション個数のリサイズ
XkbGetKeyBehaviorsキー動作の取得
XkbGetKeyExplicitComponentsexplicit の取得
XkbGetVirtualModsvmods の取得
XkbGetKeyVirtualModMapvmodmap の取得
定義
#define XkbNumVirtualMods 16

typedef struct {
    unsigned short     num_acts;
    unsigned short     size_acts;
    XkbAction *        acts;
    XkbBehavior *      behaviors;
    unsigned short *   key_acts;
    unsigned char *    explicit;
    unsigned char      vmods[XkbNumVirtualMods];
    unsigned short *   vmodmap;
} XkbServerMapRec, *XkbServerMapPtr;
サーバーマップ
num_acts
acts の有効な個数
size_acts
acts の確保個数
acts
キーアクションの配列。
キーが押されたり離された時の動作。
behaviors
キーコードに対応する、キー動作の配列。
key_acts
キーコードに対応する、各キーの acts のインデックス値。
0 の場合、関連付けられたアクションがない。
explicit
キーコードに対応する、マスク値の配列。

クライアントがコアプロトコルリクエストを使用して、キーボードを再マップするたびに、Xkb はマップを調べて、コアプロトコルを使用して指定できないコンポーネントの、デフォルト値を決定します。
この自動再マッピングにより、アプリケーションによって明示的に要求された定義が置き換えられる可能性があるため、Xkb キーボード記述では、各キーの明示的なコンポーネントマスクを定義します。
キーの明示的コンポーネントマスクにリストされている自動再マッピングの側面は、自動キーボードマッピングによって変更されません。

ExplicitKeyType1Group1 に関連付けられたキータイプの自動決定。
ExplicitKeyType2Group2
ExplicitKeyType3Group3
ExplicitKeyType4Group4
ExplicitInterpretシンボル解釈のいずれかのフィールドを問題のキーに適用します。
ExplicitAutoRepeatシンボル解釈での指定に従って、キーのオートリピートステータスを自動的に決定します。
ExplicitBehaviorXkbSI_LockingKey フラグがシンボル解釈で設定されている場合、XkbKB_Lock 動作がキーに自動的に割り当てられます。
ExplicitVModMapキーに割り当てられたアクションと、キーに一致するシンボルの解釈に基づいて、キーの仮想修飾子マップを自動的に決定します。
vmods
各仮想修飾子に対応する、実際の修飾子のマスク。
ShiftMask, LockMask, ControlMask, Mod1Mask 〜 Mod5Mask
vmodmap
キーコードによってインデックスが付けられ、各エントリは、対応するキーにバインドされた仮想修飾子を表すマスク。
ビット位置は、仮想修飾子のインデックスと等しい。

※vmodmap および vmods メンバーは、「マスター」仮想修飾子定義です。
Xkb は、これらのフィールドに対する変更を、仮想修飾子マッピングを使用する、他のすべてのフィールドに自動的に反映します。
typedef struct _XkbBehavior {
    unsigned char  type;
    unsigned char  data;
} XkbBehavior;
■ ラジオグループ

同じラジオグループに属するキーの type フィールドには XkbKB_RadioGroup タイプがあり、data フィールドにはラジオグループインデックスが指定されています。
ラジオグループの名前が XkbNamesRec 構造内にある場合、ラジオグループインデックスは、XkbNamesRec 構造内の radio_group 配列のインデックスになります。
ラジオグループのキーが押されると、ラジオグループ内の別のキーが押されるまで、論理的にダウン状態が維持されます。
このキーが押されると、最初のキーが論理的にアップになり、新しいキーが論理的にダウンになります。
ラジオグループのすべてのキーの動作で XkbKB_RGAllowNone ビットを設定すると、論理的にダウンしているラジオグループのメンバーを押すと、そのメンバーが論理的に離されます。この場合、ラジオグループのどのキーも論理的にダウンしません。
XkbKB_RGAllowNone が設定されていない場合、論理的にダウンしているグループのメンバーを離す方法はありません。
type
キーの動作タイプとフラグ。

XkbKB_DefaultPress,Release イベントは通常どおり処理されます。data フィールドは未使用です。
XkbKB_Lockキーが押されたときに論理的にアップしている (つまり、コアキーマップの対応するビットがクリアされている) 場合、キーの押下は通常どおり処理され、対応する Release は無視されます。
キーが押されたときに論理的に押されている場合、キーの押下は無視されますが、対応する Release は正常に処理されます。
data フィールドは未使用です。
XkbKB_RadioGroupキーが押されたときに、ラジオグループの別のメンバーが論理的にダウンしている場合(ラジオグループのすべてのメンバーが data で指定された同じインデックスを持っている)、サーバーは論理的にダウンしているメンバーのキー Release を合成し、新しいキー Release を処理し、その後、新しいキー押下イベントを通常通り処理する。
キー自体が押されたときに論理的にダウンしている場合、キー押下イベントは無視されますが、対応するキー Release の処理は、フラグの XkbKB_RGAllowNone ビットの値に依存します。
設定されている場合、キーの Release は通常どおり処理されます。それ以外の場合は、キーを離しても無視されます。
他のすべてのキー Release イベントは無視されます。
XkbKB_Overlay1Overlay1 コントロールが有効になっている場合、data はキーコードとして解釈され、このキーからのイベントは、data のキーコードから来たものであるかのように報告されます。
それ以外の場合、Press/Release イベントは通常どおり処理されます。
XkbKB_Overlay2Overlay2
XkbKB_PermanentXkb は、キー動作タイプを Xkb でシミュレートする必要があるかどうか、またはキー動作がキーボードの変更不可能な物理的、電気的、またはソフトウェア的側面を記述するかどうかを指定するマスク XkbKB_Permanent も提供します。
XkbKB_Permanent ビットが type に設定されていない場合、Xkb はソフトウェアで動作をシミュレートします。
それ以外の場合、Xkb はキーボードに依存して動作を実装します。
data
動作タイプによって異なるデータ。
XkbKB_RadioGroup の場合、下位 5bit はグループ番号、上位 3bit はフラグ (XkbKB_RGAllowNone のみ)。
キーアクション
typedef union _XkbAction {
    XkbAnyAction              any;
    XkbModAction              mods;
    XkbGroupAction            group;
    XkbISOAction              iso;
    XkbPtrAction              ptr;
    XkbPtrBtnAction           btn;
    XkbPtrDfltAction          dflt;
    XkbSwitchScreenAction     screen;
    XkbCtrlsAction            ctrls;
    XkbMessageAction          msg;
    XkbRedirectKeyAction      redirect;
    XkbDeviceBtnAction        devbtn;
    XkbDeviceValuatorAction   devval;
    unsigned char             type;
} XkbAction;
キーアクション
#define XkbAnyActionDataSize  7

typedef struct _XkbAnyAction {
    unsigned char  type;
    unsigned char  data[XkbAnyActionDataSize];
} XkbAnyAction;
任意のアクション
type
XkbSA_NoActionアクションを実行しない
XkbSA_SetMods
XkbSA_LatchMods
XkbSA_LockMods
mods
XkbSA_SetGroup
XkbSA_LatchGroup
XkbSA_LockGroup
group
XkbSA_MovePtrptr
XkbSA_PtrBtn
XkbSA_LockPtrBtn
btn
XkbSA_SetPtrDfltdflt
XkbSA_ISOLockiso
XkbSA_SwitchScreenscreen
XkbSA_SetControls
XkbSA_LockControls
ctrls
XkbSA_ActionMessagemsg
XkbSA_RedirectKeyredirect
XkbSA_DeviceBtn
XkbSA_LockDeviceBtn
devbtn
XkbSA_DeviceValuatordevval
data
各タイプごとのデータ。
バイト順の入れ替えを行わないようにするため、2バイト以上の値は、複数のバイト単位の値になっている。
typedef struct _XkbModAction {
    unsigned char     type;
    unsigned char     flags;
    unsigned char     mask;
    unsigned char     real_mods;
    unsigned char     vmods1;
    unsigned char     vmods2;
} XkbModAction;
修飾子アクション
type
XkbSA_SetMods・キーを押すと、アクション修飾子がキーボードの base 修飾子に追加されます。
・キーを離すと、同じ修飾子に影響を与える他のキーが論理的に押されていない限り、キーボードの base 修飾子のアクション修飾子がクリアされます。
・このキーを離したときに、他のキーが物理的に押されておらず、flags に XkbSA_ClearLocks が設定されている場合、キーを離すと、アクション修飾子のロックが解除されます。
XkbSA_LatchModsキーを押すイベントとキーを離すイベントには、XkbSA_SetMods と同じ効果があります。このキーを離したときに物理的にキーが押されていない場合、キーを離したイベントには次の追加の効果があります。

・XkbSA_ClearLocks によってロックが解除された修飾子には、それ以上の効果はありません。
・XkbSA_LatchToLock が設定されている場合、キーを離すとロックが解除され、すでにラッチされている残りのアクション修飾子がラッチ解除されます。
・キーを離すと、XkbSA_ClearLocks と XkbSA_LatchToLock で使用されていないアクション修飾子がラッチされます。
XkbSA_LockMods・キーを押すと、アクション修飾子の base 状態が設定されます。XkbSA_LockNoLock が設定されている場合、キーを押すとアクション修飾子のロック状態も設定されます。

・キーを離すと、同じ修飾子に影響を与える他のキーが押されていない限り、キーボードの base 修飾子のアクション修飾子がすべてクリアされます。XkbSA_LockNoUnlock が設定されておらず、対応するキーが押される前に、いずれかのアクション修飾子がロックされていた場合、キーを離すとロックが解除されます。
flags
XkbSA_UseModMapModsON の場合、アクション修飾子は、キーの修飾子マッピング (client_map -> modmap[keycode]) によってバインドされた修飾子によって決定されます。
それ以外の場合、アクション修飾子は、mask、real_mods、vmods1、vmods2 フィールドで指定された修飾子に設定されます。
XkbSA_ClearLocksこのキー遷移が発生するときに、物理的にキーが押されていない場合、サーバーはアクション修飾子のロックを解除します。
XkbSA_LatchToLocktype = XkbSA_LatchMods で、アクション修飾子がすでにラッチされている場合、サーバーはアクション修飾子をロックします。
XkbSA_LockNoLocktype = XkbSA_LockMods の場合、サーバーはアクション修飾子のロックを解除するだけです。
XkbSA_LockNoUnlocktype = XkbSA_LockMods である場合、サーバーはアクション修飾子のみをロックします。
typedef struct _XkbGroupAction {
    unsigned char   type;
    unsigned char   flags;
    char            group_XXX;
} XkbGroupAction;
グループアクション
type
XkbSA_SetGroup・XkbSA_GroupAbsolute が設定されている場合、キー押下イベントにより、base キーボードグループが、group_XXX フィールドで指定されたグループに変更されます。それ以外の場合、キー押下イベントは、group_XXX フィールドを base キーボードグループに追加することによって、base キーボードグループを変更します。いずれの場合も、結果として得られる有効なキーボードグループは、コントロール構造体の groups_wrap フィールドの値に応じて範囲内に戻されます。

・このキーが押されている間に XkbSA_ISOLock アクションを持つキーが押された場合、このキーを離しても効果はありません。それ以外の場合は、キーを離すと、キーを押した効果がキャンセルされます。

・XkbSA_ClearLocks が設定されており、このキーが離されたときに物理的にキーが押されていない場合、キーを離すと、locked キーボードグループも Group1 に設定されます。
XkbSA_LatchGroupキーを押すイベントとキーを離すイベントには、XkbSA_SetGroup と同じ効果があります。このキーを離したときに物理的にキーが押されていない場合、キーを離したイベントには次の追加の効果があります。

・XkbSA_LatchToLock が設定されており、latched キーボードグループのインデックスが 0 以外の場合、キーを離すと、対応するキーの押下によって適用されたデルタが locked キーボードグループに追加され、latched キーボードグループから減算されます。locked & effective キーボードグループは、コントロール構造体の groups_wrap フィールドの値に従って範囲内に戻されます。

・それ以外の場合、キーを押すと、キー押下デルタが latched キーボードグループに追加されます。
XkbSA_LockGroupXkbSA_GroupAbsolute が設定されている場合、キー押下イベントは、locked キーボードグループを、group_XXX フィールドで指定されたグループに設定します。それ以外の場合、キー押下イベントは、group_XXX フィールドで指定されたグループを、locked キーボードグループに追加します。いずれの場合も、結果として locked & effective キーボードグループは、コントロール構造体の groups_wrap フィールドの値に応じて範囲内に戻されます。

キーを離しても効果はありません。
flags
XkbSA_ClearLocksこのキー遷移が発生するときに、物理的にキーが押されていない場合、サーバーは、キーを離したときに locked キーボードグループを Group1 に設定します。
XkbSA_LatchToLocktype = XkbSA_LatchGroup である場合、アクショングループがすでにラッチされている場合、サーバーはアクショングループをロックします。
XkbSA_GroupAbsolutegroup_XXX フィールドは絶対グループ番号を表します。
それ以外の場合、新しいグループ番号を決定するために、現在のグループに追加されるグループデルタを表します。
typedef struct _XkbPtrAction {
    unsigned char  type;
    unsigned char  flags;
    unsigned char  high_XXX;
    unsigned char  low_XXX;
    unsigned char  high_YYY;
    unsigned char  low_YYY;
} XkbPtrAction;
MouseKeys コントロールが有効になっていない場合、KeyPress および KeyRelease イベントは、アクションが XkbSA_NoAction であるかのように処理されます。
MouseKeys コントロールが有効な場合、XkbSA_MovePtr タイプのサーバーアクションは、通常の KeyPress イベントではなく、コアの MotionNotify イベントを生成するようにサーバーに指示し、対応する KeyRelease イベントは、XkbSA_MovePtr アクションの処理の結果として作成されたマウスキータイマーを無効にします。
type
XkbSA_MovePtr
flags
XkbSA_NoAccelerationOFF で、MouseKeysAccel コントロールが有効になっている場合、KeyPress はこのキーのマウスキータイマーを開始します。
タイマーが期限切れになるたびに、カーソルが移動します。
XkbSA_MoveAbsoluteXON で、構造体の X 部分は新しいポインタの X 座標を指定します。
それ以外の場合は、X 部分が現在のポインタ X 座標に追加されて、新しいポインタ X 座標が決定されます。
XkbSA_MoveAbsoluteYON で、構造体の Y 部分は新しいポインタの Y 座標を指定します。
それ以外の場合は、Y 部分が現在のポインタ Y 座標に追加されて、新しいポインタ Y 座標が決定されます。
high_XXX,low_XXX
2つを組み合わせて、符号付き 16bit 値とする。
typedef struct _XkbPtrBtnAction {
    unsigned char   type;
    unsigned char   flags;
    unsigned char   count;
    unsigned char   button;
} XkbPtrBtnAction;
MouseKeys コントロールが有効になっていない場合、KeyPress および KeyRelease イベントは、アクションが XkbSA_NoAction であるかのように処理されます。
type
XkbSA_PtrBtn・XkbSA_UseDfltButton が設定されている場合、MouseKeys コントロールの mk_dflt_btn 属性で指定されたポインタボタンに対してイベントが生成されます。それ以外の場合、button フィールドで指定されたボタンに対してイベントが生成されます。

・このアクションに指定されたマウスボタンが論理的に押されている場合、キーの押下と対応するキー離しは無視され、効果はありません。それ以外の場合、キーを押すと、通常の KeyPress イベントの代わりに、1 つ以上のコア ポインタボタンイベントが発生します。count が 0 の場合、キーを押すと 1 つの ButtonPress イベントが生成されます。count がゼロより大きい場合、キーを押すと、ButtonPress イベントと ButtonRelease イベントの count ペアが生成されます。

・count が 0 の場合、キーを離すと、対応する KeyPress によって生成されたイベントと、一致するコアポインタ ButtonRelease が生成されます。count が 0 以外の場合、キーを離しても ButtonRelease イベントは発生しません。キー離しによってキー KeyRelease イベントが生成されることはありません。
XkbSA_LockPtrBtn・MouseKeys のデフォルトボタンまたは button で指定されたボタンがロックされていない場合、キーを押すと KeyPress イベントの代わりに ButtonPress イベントが発生し、ボタンがロックされます。ボタンがすでにロックされている場合、または XkbSA_LockNoUnlock が設定されている場合、キーを押しても無視され、効果はありません。

・対応するキーの押下が無視され、XkbSA_LockNoLock が設定されていない場合、キーを離すと KeyRelease イベントの代わりに ButtonRelease イベントが生成され、指定されたボタンのロックが解除されます。対応するキーを押してボタンをロックした場合、キーを離しても無視され、効果はありません。
flags
XkbSA_UseDfltButtonON の場合、アクションは MouseKeys コントロールの mk_dflt_btn 属性で指定されたポインタボタンを使用します。
それ以外の場合、アクションは button フィールドで指定されたポインタボタンを使用します。
XkbSA_LockNoLocktype = XkbSA_LockPtrBtn の場合、サーバーはポインタボタンのロックを解除するだけです。
XkbSA_LockNoUnlocktype = XkbSA_LockPtrBtn の場合、サーバーはポインタボタンのみをロックします。
typedef struct _XkbPtrDfltAction {
    unsigned char   type;
    unsigned char   flags;
    unsigned char   affect;
    char            valueXXX;
} XkbPtrDfltAction;
MouseKeys コントロールが有効になっていない場合、KeyPress および KeyRelease イベントは、アクションが XkbSA_NoAction であるかのように処理されます。
それ以外の場合、このアクションは MouseKeys コントロールの mk_dflt_btn 属性を変更します。
type
XkbSA_SetPtrDflt
flags
XkbSA_DfltBtnAbsolute設定されている場合、valueXXX フィールドは絶対ポインタボタンを表します。
それ以外の場合、valueXXX フィールドは現在のデフォルトボタンに追加される量を表します。
affect
このアクションの結果として何が変化するかを指定します。唯一の有効な値は XkbSA_AffectDfltBtn です。
valueXXX
MouseKeys コントロールの mk_dflt_btn 属性の新しいボタン値を表す。
XkbSA_DfltBtnAbsolute が flags に設定されている場合、valueXXX は使用するボタンを指定します。
それ以外の場合、valueXXX は現在のデフォルトボタンに追加される量を指定します。
どちらの場合も、不正なボタンの選択は範囲内に折り返されます。
typedef struct _XkbISOAction {
    unsigned char   type;
    unsigned char   flags;
    unsigned char   mask;
    unsigned char   real_mods;
    char            group_XXX;
    unsigned char   affect;
    unsigned char   vmods1;
    unsigned char   vmods2;
} XkbISOAction;
XkbISOAction 構造に関連付けられたアクションは、ISO9995 仕様に従って修飾子とグループをロックします。
XkbISOAction を単独で操作すると、単なる CapsLock になります。
別の修飾キーと同時に操作すると、もう一方のキーがロックキーに変わります。
たとえば、ISO_Lock を押し、Control_L を押して離し、ISO_Lock を離すと、Control 修飾子がロックされます。
type
XkbSA_ISOLock
flags
XkbSA_ISODfltIsGroup設定されている場合、アクションは base グループの状態を変更するために使用されます。
解釈を伝えるには、このテーブルの残りのビットに設定する必要があります。

キーを押すと、group_XXX フィールドと flags フィールドの XkbSA_GroupAbsolute ビットで指定されたように base グループが設定されます。
XkbSA_ISOLock アクションによって他のアクションが変換されない場合、キーを離すとグループがロックされます。
それ以外の場合は、キーを離すと、キーを押して設定したグループがクリアされます。
XkbSA_GroupAbsolute設定されている場合、group_XXX フィールドは絶対グループ番号を表します。
それ以外の場合、新しいグループ番号を決定するために現在のグループに追加されるグループデルタを表します。
XkbSA_ISONoAffectMods設定されていない場合、XkbSA_ISOLock アクションと同時に発生する XkbSA_SetMods または XkbSA_LatchMods アクションは、代わりに XkbSA_LockMods アクションとして扱われます。
XkbSA_ISONoAffectGroup設定されていない場合、XkbSA_ISOLock アクションと同時に発生する XkbSA_SetGroup または XkbSA_LatchGroup アクションは、代わりに XkbSA_LockGroup アクションとして扱われます。
XkbSA_ISONoAffectPtr設定されていない場合、XkbSA_ISOLock アクションと同時に発生する XkbSA_PtrBtn アクションは、代わりに XkbSA_LockPtrBtn アクションとして扱われます。
XkbSA_ISONoAffectCtrls設定されていない場合、XkbSA_ISOLock アクションと同時に発生する XkbSA_SetControls アクションは、代わりに XkbSA_LockControls アクションとして扱われます。
XkbSA_ISODfltIsGroup が OFF の場合
XkbSA_ISODfltIsGroup設定されていない場合、アクションは base 修飾子の状態を変更するために使用されます。
このテーブルの残りのビットには、解釈を伝えるために設定しないでください。

キーを押すと、mask、real_mods、vmods1、vmods2 フィールドを使用して、キーボードの base 修飾子にアクション修飾子が設定されます。
XkbSA_ISOLock アクションによって他のアクションが変換されない場合、キーを離すとアクション修飾子がロックされます。
それ以外の場合は、キーを離すと、キーを押すことによって設定された base 修飾子がクリアされます。
XkbSA_UseModMapMods設定されている場合、アクション修飾子は、キーの修飾子マッピングによってバインドされた修飾子によって決定されます。
それ以外の場合、アクション修飾子は、mask、real_mods、vmods1、vmods2 フィールドで指定された修飾子に設定されます。
XkbSA_LockNoLock設定されている場合、サーバーはアクション修飾子のロックを解除するだけです。
XkbSA_LockNoUnlock設定されている場合、サーバーはアクション修飾子のみをロックします。
XkbSA_ISONoAffectMods設定されていない場合、XkbSA_ISOLock アクションと同時に発生する XkbSA_SetMods または XkbSA_LatchMods アクションは、代わりに XkbSA_LockMods アクションとして扱われます。
XkbSA_ISONoAffectGroup設定されていない場合、XkbSA_ISOLock アクションと同時に発生する XkbSA_SetGroup または XkbSA_LatchGroup アクションは、代わりに XkbSA_LockGroup アクションとして扱われます。
XkbSA_ISONoAffectPtr設定されていない場合、XkbSA_ISOLock アクションと同時に発生する XkbSA_PtrBtn アクションは、代わりに XkbSA_LockPtrBtn アクションとして扱われます。
XkbSA_ISONoAffectCtrls設定されていない場合、XkbSA_ISOLock アクションと同時に発生する XkbSA_SetControls アクションは、代わりに XkbSA_LockControls アクションとして扱われます。
affect
XkbSA_ISONoAffectModsXkbSA_ISONoAffectMods が設定されていない場合、XkbISOAction と同時に発生する SA_SetMods または SA_LatchMods アクションは、代わりに SA_LockMods として扱われます。
XkbSA_ISONoAffectGroupXkbSA_ISONoAffectGroup が設定されていない場合、XkbISOAction と同時に発生する SA_SetGroup または SA_LatchGroup アクションは、代わりに SA_LockGroup として扱われます。
XkbSA_ISONoAffectPtrXkbSA_ISONoAffectPtr が設定されていない場合、XkbISOAction と同時に発生する SA_PtrBtn アクションは、代わりに SA_LockPtrBtn として扱われます。
XkbSA_ISONoAffectCtrlsXkbSA_ISONoAffectCtrls が設定されていない場合、XkbISOAction と同時に発生する SA_SetControls アクションは、代わりに SA_LockControls として扱われます。
typedef struct _XkbSwitchScreenAction {
    unsigned char   type;
    unsigned char   flags;
    char            screenXXX;
} XkbSwitchScreenAction;
マルチスクリーンディスプレイ上のアクティブな画面を変更します。

※このアクションはオプションです。サーバーは、要求された動作をサポートしない場合、アクションまたはそのフラグを自由に無視できます。
アクションが無視された場合、XkbSA_NoAction のように動作します。
それ以外の場合、キーを押すイベントとキーを離すイベントは、イベントを生成しません。
type
XkbSA_SwitchScreen
flags
XkbSA_SwitchAbsolute設定されている場合、screenXXX フィールドは新しい画面のインデックスを表します。
それ以外の場合は、現在の画面から新しい画面までのオフセットを表します。
XkbSA_SwitchApplication設定されていない場合、アクションは同じサーバー上の別の画面に切り替わります。
それ以外の場合は、同じ物理ディスプレイを共有する別の X サーバーまたはアプリケーションに切り替える必要があります。
typedef struct _XkbCtrlsAction {
    unsigned char  type;
    unsigned char  flags;
    unsigned char  ctrls3;
    unsigned char  ctrls2;
    unsigned char  ctrls1;
    unsigned char  ctrls0;
} XkbCtrlsAction;
XkbSA_SetControls アクションは、押されたときにブールコントロールを有効にし、離したときに無効にするキーを実装します。
XkbSA_LockControls アクションは、押されたり離されたりするたびにブールコントロールの状態を切り替えるキーを実装するために使用されます。
XkbSA_LockNoLock フラグと XkbSA_LockNoUnlock フラグを使用すると、ブール型コントロールのロックを解除のみまたはロックのみを行うように切り替え動作を変更できます。
type
XkbSA_SetControls・キーを押すと、キーを押した時点でまだ有効になっていなかった、ctrls フィールドで指定されたブール制御が有効になります。
・キーを離すと、キーを押して有効になったコントロールはすべて無効になります。
・このアクションにより、XkbControlsNotify イベントが発生する可能性があります。
XkbSA_LockControls・XkbSA_LockNoLock ビットが flags フィールドに設定されていない場合、キーを押すと、キーを押した時点でまだ有効になっていなかった ctrls フィールドで指定されたコントロールが有効になります。
・XkbSA_LockNoUnlock ビットが flags フィールドに設定されていない場合、キーを離すと、キーを押した時点でまだ無効になっていなかった ctrls フィールドで指定されたコントロールがすべて無効になります。
・このアクションにより、XkbControlsNotify イベントが発生する可能性があります。
flags
XkbSA_LockNoLock設定されており、type = XkbSA_LockControls である場合、サーバーはコントロールのみを無効にします。
XkbSA_LockNoUnlock設定されており、type = XkbSA_LockControls の場合、サーバーはコントロールのみを有効にします。
ctrls0-3
コントロール構造体の enabled_ctrls フィールド内のブールコントロール値
#define XkbActionMessageLength 6

typedef struct _XkbMessageAction {
    unsigned char   type;
    unsigned char   flags;
    unsigned char   message[XkbActionMessageLength];
} XkbMessageAction;
メッセージアクション
type
XkbSA_ActionMessage
flags
XkbSA_MessageOnPress設定されている場合、キー押しイベントは、キーコード、イベントタイプ、および message フィールドの内容を報告する XkbActionMessage イベントを生成します。
XkbSA_MessageOnRelease設定されている場合、キー離しイベントは、キーコード、イベントタイプ、および message フィールドの内容を報告する XkbActionMessage イベントを生成します。
XkbSA_MessageGenKeyEvent設定すると、キー押下イベントとキー解放イベントは、XkbActionMessage イベントを生成するかどうかに関係なく、KeyPress イベントと KeyRelease イベントを生成します。
message
任意の値を設定できる。
typedef struct _XkbRedirectKeyAction {
    unsigned char  type;
    unsigned char  new_key;
    unsigned char  mods_mask;
    unsigned char  mods;
    unsigned char  vmods_mask0;
    unsigned char  vmods_mask1;
    unsigned char  vmods0;
    unsigned char  vmods1;
} XkbRedirectKeyAction;
キーを押すと、実際のキーではなく、 new_key フィールドで指定されたキーに対して KeyPress イベントが発生します。
キーを離すと、実際のキーではなく、 new_key フィールドで指定されたキーに対して KeyRelease イベントが発生します。このイベント時の状態は、離した時の effective キーボード修飾子で構成される。

XkbSA_RedirectKey アクションは通常、イベントを引き起こしたキーと同じデバイス上の、別のキーにリダイレクトします。
ただし、そのデバイスが XInput KeyClass に属していない場合は、このアクションによってコアキーボードデバイス上でイベントが発生します。
(入力拡張機能は、デバイスをクラスに分類することでデバイスを分類します。キーボードおよびキーを持つその他の入力デバイスは、入力拡張機能によって KeyClass デバイスとして分類されます)
type
XkbSA_RedirectKey
new_key
リダイレクトするキー
mods_mask
変更する修飾子のマスク
mods
mods_mask に対応するビットが ON なら、修飾子が ON になる
vmods_mask0,1
変更する仮想修飾子のマスク
vmods0,1
仮想修飾子にバインドされた実際の修飾子を ON にするか OFF にするかのビット
typedef struct _XkbDeviceBtnAction {
    unsigned char    type;
    unsigned char    flags;
    unsigned char    count;
    unsigned char    button;
    unsigned char    device;
} XkbDeviceBtnAction;
通常の KeyPress および KeyRelease イベントの代わりに、XInput のDeviceButtonPress および DeviceButtonRelease イベントを生成します。
type
XkbSA_DeviceBtn・このアクションで指定されたボタンが論理的に押されている場合、キーを押して対応するキーを離しても無視され、効果はありません。
このアクションで指定されたデバイスまたはボタンが不正な場合、このアクションは XkbSA_NoAction のように動作します。

・それ以外の場合、キーを押すと、通常のキー押下イベントの代わりに、1 つ以上の XInput デバイスイベントが発生します。
count フィールドが 0 の場合、キーを押すと 1 つの DeviceButtonPress イベントが生成されます。
count が 0 より大きい場合、キー押下イベントは DeviceButtonPress および DeviceButtonRelease イベントの count ペアを生成します。

・count が 0 の場合、キーを離すと、対応するキーの押下によって生成されたイベントと一致する、XInput の DeviceButtonRelease イベントが生成されます。
count が 0 以外の場合、キーを離しても DeviceButtonRelease イベントは発生しません。
キー離しによって KeyRelease イベントが発生することはありません。
XkbSA_LockDeviceBtn・このアクションで指定されたデバイスまたはボタンが不正な場合、このアクションは XkbSA_NoAction のように動作します。

・それ以外の場合、指定されたボタンがロックされておらず、flags に XkbSA_LockNoLock が設定されていない場合、キーを押すと KeyPress イベントの代わりに XInput の DeviceButtonPress イベントが生成され、ボタンがロックされます。
ボタンがすでにロックされている場合、または flags に XkbSA_LockNoLock が設定されている場合、キーを押しても無視され、効果はありません。

・対応するキーの押下が無視され、flags に XkbSA_LockNoUnlock が設定されていない場合、キーを離すと KeyRelease イベントの代わりに、XInput の DeviceButtonRelease イベントが生成され、ボタンのロックが解除されます。
対応するキーを押してボタンをロックした場合、キーを離しても無視され、効果はありません。
flags
XkbSA_LockNoLock設定されており、タイプが XkbSA_LockDeviceBtn の場合、サーバーはボタンのロックを解除するだけです。
XkbSA_LockNoUnlock設定されており、タイプが XkbSA_LockDeviceBtn の場合、サーバーはボタンのロックのみをします。
button
ボタン番号
device
XInput のデバイスID
typedef struct _XkbDeviceValuatorAction {
    unsigned char    type;
    unsigned char    device;
    unsigned char    v1_what;
    unsigned char    v1_ndx;
    unsigned char    v1_value;
    unsigned char    v2_what;
    unsigned char    v2_ndx;
    unsigned char    v2_value;
} XkbDeviceValuatorAction;
バリュエーターは、マウス軸、スライダー、ダイヤルなどのエンティティの値の範囲を操作します。
1 つまたは 2 つの XInput デバイス バリュエーターからのイベントをシミュレートするために使用されます。

device が不正な場合、または v1_ndx も v2_ndx も正当なバリュエーターを指定していない場合、このアクションは XkbSA_NoAction のように動作します。

v1_what および v2_what の下位 4bit は、必要に応じて、対応するスケール値を指定します。
v1_what および v2_what の上位 4bit は、値を設定するために実行する操作を指定します。

■ v1_what,v2_what 上位 4bit の値

XkbSA_IgnoreValアクションなし
XkbSA_SetValMinv<n>_value は、最小の正当な値に設定されます。
XkbSA_SetValCenterv<n>_value は中央値に設定されます ((max - min)/2 まで)
XkbSA_SetValMaxv<n>_value は、有効な最大値に設定されます。
XkbSA_SetValRelativev<n>_value に v<n>_value * (2 val<n>Scale) が加算されます
XkbSA_SetValAbsolutev<n>_value は (2 val<n>Scale) にセットされます

XkbSA_SetValRelative または XkbSA_SetValAbsolute の不正な値は範囲内に収められます。
相対バリュエーターの場合、XkbSA_SetValRelative のみが許可されます。

■ v1_what,v2_what 用のマスク

#define XkbSA_ValOpMask     (0x70) //上位4bit
#define XkbSA_ValScaleMask  (0x07) //下位4bit
type
XkbSA_DeviceValuator
device
XInput のデバイスID
v1_ndx,v2_ndx
実際に存在するバリュエーターを指定します。
たとえば、ほとんどのマウスには、2 つのバリュエーター (x 軸と y 軸) があるため、マウスに有効な値は 0 と 1 だけになります。
8 つのダイヤルがあるダイヤルボックスの場合は、0〜7 の範囲内の値がすべて正しいでしょう。
関数
Bool XkbKeyHasActions(XkbDescPtr xkb, KeyCode keycode);
keycode のキーコードにアクションが関連付けられている場合、True が返る。
int XkbKeyNumActions(XkbDescPtr xkb, KeyCode keycode);
指定キーコードに関連付けられているアクションの数を返す
XkbKeyActionPtr XkbKeyActionsPtr(XkbDescPtr xkb, KeyCode keycode);
指定キーコードに関連付けられているアクションへのポインタを返す。
実際にアクションが関連付けられている場合のみ使用すること。
XkbAction XkbKeyAction(XkbDescPtr xkb, KeyCode keycode, int idx);
keycode に関連付けられたアクションの配列内の、idx でインデックス付けされたキーアクションを返します。
idx は、次のようにグループとシフトレベルから計算できます。

idx = group_index * key_width + shift_level
XkbAction XkbKeyActionEntry(XkbDescPtr xkb, KeyCode keycode, int shift, int grp);
指定キーコードとシフト&グループからアクション値を返す
unsigned short XkbModActionVMods(XkbAction act);
act の vmods1 および vmods2 を、Xkb 修飾子記述の vmods 形式に変換して返します。
(XkbModAction および XkbISOAction タイプの場合のみ)
void XkbSetModActionVMods(XkbAction act, unsigned short vmods);
Xkb 修飾子記述の vmods 形式を使用して、act の vmods1 および vmods2 フィールドを設定します。
int XkbSAGroup(XkbAction act);
act の group_XXX フィールドを signed int に変換して返します。
(XkbGroupAction、XkbISOAction タイプのみ)
void XkbSASetGroup(XkbAction act, int grp);
グループインデックス grp から act の group_XXX フィールドを設定します。
int XkbPtrActionX(XkbPtrAction act);
hight_XXX,low_XXX から X 座標を取得
int XkbPtrActionY(XkbPtrAction act);
hight_YYY,low_YYY から Y 座標を取得
void XkbSetPtrActionX(XkbPtrAction act, int x);
X 座標を hight_XXX,low_XXX にセット
void XkbSetPtrActionY(XkbPtrAction act, int y);
Y 座標を hight_YYY,low_YYY にセット
int XkbSAPtrDfltValue(XkbAction act);
valueXXX を返す
void XkbSASetPtrDfltValue(XkbPtrDfltAction act, int val);
valueXXX をセットする
int XkbSAScreen(XkbSwitchScreenAction act);
screenXXX を取得
void XkbSASetScreen(XkbSwitchScreenAction act, int s);
screenXXX をセット
unsigned int XkbActionCtrls(XkbCtrlsAction act);
ctrls0..3 から値を取得
void XkbSAActionSetCtrls(XkbCtrlsAction act, unsigned int ctrls);
ctrls0..3 に値をセット
unsigned int XkbSARedirectVModsMask(XkbRedirectKeyAction act);
vmods_mask0,1 から値を取得
void XkbSARedirectSetVModsMask(XkbRedirectKeyAction act, unsigned int vm);
vmods_mask0,1 に値をセット
unsigned int XkbSARedirectVMods(XkbRedirectKeyAction act);
vmods0,1 から値を取得
void XkbSARedirectSetVMods(XkbRedirectKeyAction act, unsigned int v);
vmods0,1 に値をセット
Status XkbGetKeyActions(Display *dpy, unsigned int first, unsigned int num, XkbDescPtr xkb);
first で始まる num 個のキーのアクションを取得するリクエストをサーバーに送信します。
応答を待って、xkb の server->key_acts フィールドにアクションを返します。
xkb パラメータは、有効な Xkb キーボード記述へのポインタでなければなりません。

xkb パラメーターのサーバーマップが割り当てられていない場合、アクションを取得する前に、サーバーマップを割り当てて初期化します。
戻り値
Success で成功。
サーバーに互換性のあるバージョンの Xkb がない場合、または Xkb 拡張機能が適切に初期化されていない場合、BadAccess。
num が 1 未満、または XkbMaxKeyCount より大きい場合、BadValue。
割り当てエラーが発生した場合、BadAlloc。
XkbAction *XkbResizeKeyActions(XkbDescRec *xkb, int key, int needed);
アクションに必要なスペースを予約し、アクションを保持する新しい配列の先頭へのポインタを返します。
act 配列を再割り当てする必要がある場合は、xkb->server の act、num_acts、size_acts フィールドを変更できます。

キーの現在の keysym 数よりも大きい値が必要な場合、配列内のすべての新しいアクションを NoAction に初期化します。

XkbResizeKeyActionsは、キーの幅やグループの数を変更しないため、XkbResizeKeyActions から返されるアクションに割り当てられたスペースと必要な数の間に矛盾が生じます。
XkbResizeKeyActions が返すアクションのリストにある未使用のエントリは、マップ編集関数のいずれを後で呼び出しても保存されないため、別のアロケータ関数を呼び出す前に、キーアクションを更新(キーの幅とグループ数を更新)する必要があります。
XkbChangeTypesOfKey を呼び出すと、キーアクションが更新されます。

※キーにバインドされたアクションの数を変更すると、キーにバインドされたシンボルの数も変更される必要があります。
key
変更するキーのキーコード
needed
キーに必要な新しいアクションの数
戻り値
新しい配列の先頭のポインタ。NULL で確保エラー。
Status XkbGetKeyBehaviors(Display *dpy, unsigned int first, unsigned int num, XkbDescPtr xkb);
first から始まる num 個のキーの動作を取得するリクエストをサーバーに送信します。
応答を待って、xkb の server->behaviors に返します。
xkb パラメーターのサーバーマップが割り当てられていない場合、取得する前にサーバーマップを割り当てて初期化します。
戻り値
Success で成功。
BadAccess, BadValue, BadAlloc
Status XkbGetKeyExplicitComponents(Display *dpy, unsigned int first, unsigned int num, XkbDescPtr xkb);
first から始まる num 個のキーの explicit を取得する。
Status XkbGetVirtualMods(Display *dpy, unsigned int which, XkbDescPtr xkb);
which のマスクで指定された仮想修飾子の、vmods エントリを取得するリクエストをサーバーに送信し、応答を待ちます。
ビットセットごとに、xkb の server->vmods 配列内の対応する仮想修飾子定義を更新します。
xkb パラメータは、有効な Xkb キーボード記述へのポインタでなければなりません。
戻り値
Success で成功。
Status XkbGetKeyVirtualModMap(Display *dpy, unsigned int first, unsigned int num, XkbDescPtr xkb);
first から始まる num 個のキーの vmodmap を取得する。