XKB: クライアントマップ

定義
マスクマスク
struct XkbClientMapRecクライアントマップ構造体
struct XkbKeyTypeRecキータイプ構造体
struct XkbSymMapRecシンボルマップ構造体
struct XkbMapChangesRecキーマッピングの変更データ
マップデータ関数
XkbGetMap新しい XkbDescRec にキーマッピングを取得
XkbGetUpdatedMap既存の XkbDescRec にキーマッピングを取得
XkbSetMapキーマッピングをセット
XkbChangeMapキーマッピングの変更をサーバーにセット
XkbAllocClientMap空のクライアントマップを割り当て
XkbFreeClientMapクライアントマップを解放
XkbAllocServerMap空のサーバーマップを割り当て
XkbFreeServerMapサーバーマップを解放
ほか関数
XkbInitCanonicalKeyTypesクライアントマップ内の標準キータイプの定義をデフォルト値にする
XkbGetKeyTypesサーバーからキータイプ定義を取得
XkbResizeKeyTypeキータイプの各配列をリサイズ
XkbCopyKeyTypeキータイプ定義のコピー
XkbCopyKeyTypesキータイプ定義を指定数コピー
XkbKeyTypeIndexキーコードとグループから、クライアントマップの types 配列のインデックスを取得
XkbKeyTypeキーコードとグループから、クライアントマップの types 内のポインタを取得
XkbKeyNumGroupsキーコードからグループ数を取得
XkbKeyGroupInfoキーコードから group_info の値を取得
XkbOutOfRangeGroupInfogroup_info からフラグのみ取得
XkbOutOfRangeGroupNumbergroup_info から、グループインデックスを取得
XkbKeyGroupsWidthキーコードから、最大グループ幅を取得
XkbKeyGroupWidthキーコードから、指定グループに関連付けられたタイプの幅を取得
XkbKeySymsOffsetキーコードから、KeySym 配列へのオフセットを取得
XkbKeyNumSymsキーコードから、KeySym 数を取得
XkbKeySymsPtrキーコードから、先頭の KeySym ポインタを取得
XkbKeySymEntryキーコードとシフトレベル・グループから、KeySym を取得
XkbGetKeySymsサーバーから KeySym のセットを取得
XkbChangeTypesOfKeyキーにバインドされているグループとタイプの数を変更
XkbResizeKeySymsキーにバインドされている KeySym の配列のサイズを変更
XkbGetKeyModifierMapサーバーから modmap を取得
定義
XkbKeyTypesMask   (1<<0)
XkbKeySymsMask    (1<<1)
XkbModifierMapMask  (1<<2)
XkbExplicitComponentsMask  (1<<3)
XkbKeyActionsMask   (1<<4)
XkbKeyBehaviorsMask (1<<5)
XkbVirtualModsMask  (1<<6)
XkbVirtualModMapMask (1<<7)

#define XkbResizableInfoMask   (XkbKeyTypesMask)
#define XkbAllClientInfoMask   (XkbKeyTypesMask | XkbKeySymsMask | XkbModifierMapMask)
#define XkbAllServerInfoMask   (XkbExplicitComponentsMask |
    XkbKeyActionsMask| XkbKeyBehaviorsMask |
    XkbVirtualModsMask | XkbVirtualModMapMask)
#define XkbAllMapComponentsMask (XkbAllClientInfoMask|XkbAllServerInfoMask)
マスク
typedef struct {
    unsigned char   size_types;
    unsigned char   num_types;
    XkbKeyTypePtr   types;
    unsigned short  size_syms;
    unsigned short  num_syms;
    KeySym *        syms;
    XkbSymMapPtr    key_sym_map;
    unsigned char * modmap;
} XkbClientMapRec, *XkbClientMapPtr;
クライアントマップ構造体
size_types
types の配列全体の数
num_types
types の有効なエントリの個数
types
キータイプの配列。
最大 XkbMaxKeyTypes (255) 個のキータイプを定義できる。
ただし、先頭の XkbNumRequiredTypes (4) 個には、事前定義された標準キータイプが必要。以下はそのインデックス。

XkbOneLevelIndex
XkbTwoLevelIndex
XkbAlphabeticIndex
XkbKeypadIndex
size_syms
syms の確保個数
num_syms
syms の実際に有効な個数
syms
キーコードからの変換に使用される KeySym の一次配列。
キーコードごとに、グループ数 x シフトレベル数分の KeySym が並んでおり、key_sym_map の情報やシフトレベル数を元に、syms[offset + group_index * width + shift_level] で取得する。
key_sym_map
各キーコードに対応する、シンボルの情報
modmap
各キーコードに対応する、実際の修飾子。
修飾子が指定されている場合、指定されたキーを押すと、修飾子の状態が変わる。
typedef struct {
    XkbModsRec        mods;
    unsigned char     num_levels;
    unsigned char     map_count;
    XkbKTMapEntryPtr  map;
    XkbModsPtr        preserve;
    Atom              name;
    Atom *            level_names;
} XkbKeyTypeRec, *XkbKeyTypePtr;

typedef struct {
    Bool              active;
    unsigned char     level;
    XkbModsRec        mods;
} XkbKTMapEntryRec, *XkbKTMapEntryPtr;
キータイプ構造体
mods
シフトレベルを計算するときに、キータイプが使用する修飾子を指定するための、コア修飾子と仮想修飾子の両方で構成されている。
キータイプに関連付けられた修飾子を設定するには、それに応じて mods の real_mods フィールドと vmods フィールドを変更します。
XkbModsRec の mask フィールドは、Xkb が使用するために予約されており、real_mods フィールドと vmods フィールドから計算されます。
num_levels
キータイプのシフトレベルの合計数。
Xkb は num_levels を使用して、キーにバインドされたシンボルの配列が十分な大きさであることを確認します。
キータイプのレベルをシフトする場合は、num_levels を直接変更して数値を変更せず、代わりに、XkbResizeKeyType を使用してください。
map_count
map 配列の個数
map
考えられるシフトレベルごとに修飾子の組み合わせを指定する、XkbKTMapEntryRec 構造体の配列。

active フィールドは、シフトレベルを決定するときに、mods フィールドにリストされている修飾子の組み合わせを考慮するかどうかを決定します。
active が False の場合、この map エントリは無視されます。
active が True の場合、map エントリの level フィールドは、現在の修飾子の組み合わせが、map エントリの mods フィールドで指定された組み合わせと完全に一致する場合 (AND ではなく = ) に使用するシフトレベルを指定します。

map 内のどれにも一致しない修飾子の組み合わせは、シフトレベル 1 (level = 0) を生成します。
さらに、バインドされていない仮想修飾子を指定するマップエントリは考慮されません。

mods で指定された修飾子は通常、XkbTranslateKeyCode によって消費されます。
まれに、シンボルの検索に使用されたにもかかわらず、修飾子を考慮する必要があります。
preserve
オプション。
NULL でない場合、各 map に対応する修飾子の配列。
各エントリには、一致するマップエントリを使用してシフトレベルを決定する場合に、消費すべきではない修飾子がリストされます。
name
キータイプの名前
level_names
各シフトレベルの名前。num_levels 個の配列。
#define XkbNumKbdGroups  4
#define XkbMaxKbdGroup   (XkbNumKbdGroups-1)

typedef struct {
    unsigned char   kt_index[XkbNumKbdGroups];
    unsigned char   group_info;
    unsigned char   width;
    unsigned short  offset;
} XkbSymMapRec, *XkbSymMapPtr;
シンボルマップ構造体
kt_index
キーに関連付けられた各グループの、キータイプのインデックス
group_info
キーごとのグループ数 (下位 4bit) と、範囲外のグループに関する処理方法のフラグ。
キーボードコントロールの groups_wrap と同じ。

XkbRedirectIntoRange (0x80)すべての無効なグループ番号は、(XkbDescRec) ctrls->groups_wrap の下位 4bit をグループインデックスとして使用します。
それでも範囲外の場合は、グループ 1 が使用されます。
XkbClampIntoRange (0x40)すべての無効なグループ番号は、最も近い有効なグループ番号に変換されます。
1 未満なら 1、最大値より大きい場合は、有効な最大値。
上記のどれでもないすべての無効なグループ番号は、グループ数で割った余りで、有効なグループ番号に変換されます。
width
このキーの最も大きなシフトレベル数。
明示的に変更できず、自動で更新される。
offset
クライアントマップの syms 配列内の先頭インデックス。
syms 配列から対応する KeySym を取得する場合、syms[offset + group_index * width + shift_level] となる。
typedef struct _XkbMapChanges {
    unsigned short    changed;
    KeyCode           min_key_code;
    KeyCode           max_key_code;
    unsigned char     first_type;
    unsigned char     num_types;
    KeyCode           first_key_sym;
    unsigned char     num_key_syms;
    KeyCode           first_key_act;
    unsigned char     num_key_acts;
    KeyCode           first_key_behavior;
    unsigned char     num_key_behaviors;
    KeyCode           first_key_explicit;
    unsigned char     num_key_explicit;
    KeyCode           first_modmap_key;
    unsigned char     num_modmap_keys;
    KeyCode           first_vmodmap_key;
    unsigned char     num_vmodmap_keys;
    unsigned char     pad1;
    unsigned short    vmods;
} XkbMapChangesRec, *XkbMapChangesPtr;
キーマッピングの変更データ
changed
XkbKeyTypesMask, XkbKeySymsMask, XkbModifierMapMask, XkbExplicitComponentsMask, XkbKeyActionsMask, XkbKeyBehaviorsMask, XkbVirtualModsMask, XkbVirtualModMapMask
マップデータ関数
XkbDescPtr XkbGetMap(Display *display, unsigned int which, unsigned int device_spec);
XkbDescRec を新しく作成し、which で指定されたサーバーマップとクライアントマップを設定する。
さらに、device_spec、min_key_code、max_key_code フィールドも設定します。

XkbGetMap はサーバーに必要な情報を問い合わせ、応答を待ってから戻ります。
返されたデータを解放するには、XkbFreeClientMap を使用します。

失敗すると、次のいずれかのプロトコル エラーも生成されます:
BadAlloc (XkbDescRec 構造体を割り当てることができません)、BadValue (一部のマスク ビットが未定義)、BadImplementation (互換性のあるバージョンの Xkb 拡張機能がサーバーで使用できません)。
戻り値
失敗時 NULL
Status XkbGetUpdatedMap(Display *display, unsigned int which, XkbDescPtr xkb);
既存の XkbDescRec にキーマッピングを取得する。
xkb 構造の必要なコンポーネントがまだ割り当てられていない場合は、それらを割り当てます。
戻り値
成功すると、Success。
失敗した場合、次のいずれかを返します:
BadAlloc (XkbDescRec 構造体にコンポーネントを割り当てることができません)
BadValue (一部のマスク ビットが未定義)
BadImplementation (互換性のあるバージョンの Xkb 拡張機能がサーバーで利用できない、または サーバーからの応答は無効)
Bool XkbSetMap(Display *dpy, unsigned int which, XkbDescPtr xkb);
コンポーネント全体 (すべてのシンボル、すべてのアクションなど) の完全な新しい値セットをサーバーに送信します。
which パラメータに設定された各ビットについて、xkb パラメータから対応する構造体の値を取得し、それを dpy で指定されたサーバーに送信します。

which で指定されたコンポーネントが xkb パラメーターに存在しない場合、False を返します。
それ以外の場合は、更新リクエストをサーバーに送信し、True を返します。
BadAlloc、BadLength、BadValue プロトコル エラーを生成する可能性があります。

キーのタイプ、シンボル マップ、およびアクションはすべて相互に関連しています。
一方を変更すると、他方も変更する必要があります。
Bool XkbChangeMap(Display *dpy, XkbDescPtr xkb, XkbMapChangesPtr changes);
キーボード記述 xkb 内の、changes によって指定されたコンポーネントを、dpy によって指定された X サーバーにコピーします。

指定されたコンポーネントが xkb パラメーターに存在しない場合、XkbChangeMap は False を返します。
それ以外の場合は、サーバーにリクエストを送信し、True を返します。

BadAlloc、BadLength、BadValue プロトコルエラーを生成する可能性があります。
Status XkbAllocClientMap(XkbDescPtr xkb, unsigned int which, unsigned int type_count);
xkb で指定されたキーボード記述の map フィールドに空のクライアントマップを割り当てて初期化します。

キーボード説明のクライアントマップが NULL ではなく、クライアントマップにフィールドがすでに割り当てられている場合、XkbAllocClientMap は既存の値を上書きしません。
リクエストのその部分は単に無視されます。
唯一の例外は、types 配列です。
type_count がクライアントマップの現在の num_types フィールドより大きい場合、XkbAllocClientMap はタイプ配列のサイズを変更し、それに応じて num_types フィールドをリセットします。
which
XkbKeyTypesMasktype_count フィールドは、クライアントマップの type フィールドに事前に割り当てるエントリの数を指定します。
type_count フィールドが XkbNumRequiredTypes より小さい場合、BadValue を返します。
XkbKeySymsMaskxkb パラメーターの min_key_code フィールドと max_key_code フィールドは、クライアントマップの syms フィールドと key_sym_map フィールドを割り当てるために使用されます。
フィールドは、max_key_code − min_key_code + 1 キーに必要な最大エントリ数を含むように割り当てられます。
XkbModifierMapMaskxkb パラメータの min_key_code フィールドと max_key_code フィールドは、クライアントマップの modmap フィールドを割り当てるために使用されます。
このフィールドは、max_key_code − min_key_code + 1 キーに必要な最大エントリ数を含むように割り当てられます。
type_count
割り当てられるマップ内の num_types フィールドの値
戻り値
成功すると、Success が返る。それ以外の場合は、BadMatch、BadAlloc、BadValue エラーが返される可能性があります。
void XkbFreeClientMap(XkbDescPtr xkb, unsigned int which, Bool free_all);
xkb パラメータで指定された XkbDescRec 構造体で指定されたクライアントマップのコンポーネントを解放し、対応する構造体のコンポーネント値を NULL に設定します。
free_all
True の場合、クライアントマップ内のすべての非 NULL 構造体コンポーネントを解放し、xkb パラメーターの map メンバーによって参照される XkbClientMapRec 構造体を解放し、map メンバーを NULL に設定します。
Status XkbAllocServerMap(XkbDescPtr xkb, unsigned int which, unsigned int count_acts);
xkb で指定されたキーボード記述の server フィールドに、空のサーバーマップを割り当てて初期化します。

キーボード説明のサーバーマップが NULL でなく、サーバーマップにフィールドがすでに割り当てられている場合、XkbAllocServerMap は既存の値を上書きしません。
唯一の例外は、act 配列です。
count_acts パラメータがサーバーマップの現在の num_acts フィールドより大きい場合、XkbAllocServerMap は act 配列のサイズを変更し、それに応じて num_acts フィールドをリセットします。
which
XkbExplicitComponentsMaskxkb パラメーターの min_key_code フィールドと max_key_code フィールドは、サーバーマップの explicit フィールドを割り当てるために使用されます。
XkbKeyActionsMaskxkb パラメーターの min_key_code フィールドと max_key_code フィールドは、サーバーマップの key_acts フィールドを割り当てるために使用されます。
count_acts パラメータは、サーバーマップの act フィールドを割り当てるために使用されます。
XkbKeyBehaviorsMaskxkb パラメーターの min_key_code フィールドと max_key_code フィールドは、サーバーマップの behaviors フィールドを割り当てるために使用されます。
XkbVirtualModMapMaskxkb パラメーターの min_key_code フィールドと max_key_code フィールドは、サーバーマップの vmodmap フィールドを割り当てるために使用されます。
count_acts
割り当てられるマップ内の num_acts フィールドの値
戻り値
成功すると、Success が返されます。それ以外の場合は、BadMatch エラーまたは BadAlloc エラーが返される可能性があります。
void XkbFreeServerMap(XkbDescPtr xkb, unsigned int which, Bool free_all);
xkb パラメーターで指定された XkbDescRec 構造内のサーバーマップの指定されたコンポーネントを解放し、対応する構造コンポーネントの値を NULL に設定します。
free_all
True の場合、サーバーマップ内のすべての非 NULL 構造体コンポーネントを解放し、xkb パラメーターの server メンバーによって参照される XkbServerMapRec 構造体を解放し、server メンバーを NULL に設定します。
ほか関数
Status XkbInitCanonicalKeyTypes(XkbDescPtr xkb, unsigned int which, int keypadVMod);
xkb パラメーターで指定されたキーボードの、最初の XkbNumRequiredTypes 個のキータイプをデフォルト値に初期化します。
which
デフォルト値にする対象のマスク。
XkbOneLevelMask、XkbTwoLevelMask、XkbAlphabeticMask、XkbKeypadMask
keypadVMod
NumLock 仮想修飾子のインデックス。
which に XkbKeypadMask が設定されている場合に使用される。
NumLock 仮想修飾子が存在しない場合は、XkbInitCanonicalKeyTypes によって作成されます。
戻り値
通常、Success を返します。
Xkb 拡張機能が適切に初期化されていない場合は BadAccess を返し、xkb パラメータが無効な場合は BadAccess を返します。
Status XkbGetKeyTypes(Display *dpy, unsigned int first, unsigned int num, XkbDescPtr xkb);
サーバーからキータイプ定義を取得する。
サーバーに目的のタイプをクエリし、応答を待ち、xkb->map->types で目的のタイプを返します。

個々のキーにバインドされているキータイプではなく、キータイプ自体の説明を取得するために使用されます。
個々のキーにバインドされたキータイプを取得するには、クライアントマップの key_sym_map フィールドを参照してください。
first
最初に取得するタイプのインデックス (0〜)
num
取得するタイプの数
戻り値
Success で成功。Xkb 拡張機能が適切に初期化されていない場合は BadAccess を返し、first と num の組み合わせが有効範囲外の数値になる場合は BadValue を返します。
Status XkbResizeKeyType(XkbDescPtr xkb, int type_ndx, int map_count, Bool want_preserve, int new_num_lvls);
xkb->map->types[type_ndx] で指定されたタイプを変更し、必要に応じて、そのタイプを使用するすべてのキーにバインドされているシンボルとアクションを再割り当てします。
xkb 内のローカルコピーのみを更新します。
物理デバイスのサーバーのコピーを更新するには、XkbResizeKeyType を呼び出した後に、XkbSetMap または XkbChangeMap を使用します。
type_ndx
変更するキータイプのインデックス
map_count
そのタイプに必要な map 配列の総数を指定 (0 以上)。
0 の場合、既存の map と preserve を解放し、NULL に設定します。
want_preserve
preserve リストを作成するか。
True の場合、map_count 個の preserve リストが割り当てられるか、すでに存在する場合は再割り当てされます。
False の場合、preserve は必要に応じて解放され、NULL に設定されます。
new_num_lvls
指定されたタイプのシフトレベルの新しい最大数を指定し、そのタイプを使用するすべてのキーにバインドされているシンボルとアクションの計算とサイズ変更に使用されます。
戻り値
Success で成功。
type_ndx が有効なタイプを指定していない、または、new_num_lvls が 1 未満、map_count が 0 未満の場合、BadValue を返します。
割り当てに関して問題が発生した場合、BadAlloc を返します。
Status XkbCopyKeyType(XkbKeyTypePtr from, XkbKeyTypePtr into);
from で指定されたキータイプを、into で指定されたキータイプにコピーします。
どちらも正当な XkbKeyTypeRec 構造体を指している必要があります。
Xkb は、from と into が異なる場所を指すと想定します。その結果、重複が致命的になる可能性があります。
コピーする前に、既存の map、preserve、level_names を解放します。
戻り値
コピー中に割り当てエラーが発生した場合、BadAlloc を返します。それ以外の場合、Success を返します。
Status XkbCopyKeyTypes(XkbKeyTypePtr from, XkbKeyTypePtr into, int num_types);
from で指定された配列から、num_types 個の XkbKeyTypeRec 構造体を、into で指定された配列にコピーします。
これは、キーボードの説明内ではなく、キーボードの説明間でコピーすることを目的としているため、重複はチェックされません。
from パラメーターと into パラメーターに適用されるのと同じルールが、XkbCopyKeyType の from 配列と into 配列の各エントリに適用されます。
int XkbKeyTypeIndex(XkbDescPtr xkb, KeyCode keycode, int group);
キーコードとグループから、クライアントマップの types 配列のインデックスを取得
XkbKeyTypePtr XkbKeyType(XkbDescPtr xkb, KeyCode keycode, int group);
キーコードとグループから、クライアントマップの types 内のポインタを取得
int XkbKeyNumGroups(XkbDescPtr xkb, KeyCode keycode);
キーコードに対応するキーにバインドされたシンボルのグループの数を返します。
unsigned char XkbKeyGroupInfo(XkbDescPtr xkb, KeyCode keycode);
キーコードから group_info の値を取得
unsigned char XkbOutOfRangeGroupInfo(unsigned char grp_inf);
XkbSymMapRec 構造体の group_info フィールドから、範囲外のフラグのみを返します。
unsigned char XkbOutOfRangeGroupNumber(unsigned char grp_inf);
XkbSymMapRec 構造体の group_info フィールドから、グループインデックスとして表される範囲外のグループ番号を返します。
int XkbKeyGroupsWidth(XkbDescPtr xkb, KeyCode keycode);
キーコードから、最大グループ幅を取得
int XkbKeyGroupWidth(XkbDescPtr xkb, KeyCode keycode, int grp);
キーコードから、指定グループに関連付けられたタイプの幅を取得
int XkbKeySymsOffset(XkbDescPtr xkb, KeyCode keycode);
キーコードから、KeySym 配列へのオフセットを取得
int XkbKeyNumSyms(XkbDescPtr xkb, KeyCode keycode);
キーコードから、KeySym 数を取得
KeySym *XkbKeySymsPtr(XkbDescPtr xkb, KeyCode keycode);
キーコードから、先頭の KeySym ポインタを取得
KeySym XkbKeySymEntry(XkbDescPtr xkb, KeyCode keycode, int shift, int grp);
キーコードに対応するキーの keysym の 2 次元配列から、シフトレベル shift とグループ grp に対応する KeySym を返します。
Status XkbGetKeySyms(Display *dpy, unsigned int first, unsigned int num, XkbDescPtr xkb);
キーコードが first から始まって num 個のキーにバインドされた keysym のセットを取得するリクエストをサーバーに送信します。
応答を待って、xkb の map.syms フィールドに keysym を返します。
xkb パラメータは、有効な Xkb キーボード記述へのポインタでなければなりません。
xkb パラメーターのクライアントマップが割り当てられていない場合、シンボルを取得する前に割り当てて初期化します。
戻り値
Success で成功。
互換性のあるバージョンの Xkb がサーバーで利用できない場合、または Xkb 拡張機能が適切に初期化されていない場合、BadAccess を返します。
num が 1 未満、または XkbMaxKeyCount より大きい場合、BadValue を返します。
割り当てエラーが発生した場合、BadAlloc を返します。
Status XkbChangeTypesOfKey(XkbDescPtr xkb, int key, int n_groups, unsigned int groups, int *new_types_in, XkbMapChangesPtr p_changes);
必要に応じて、キーにバインドされているシンボルとアクションを再割り当てし、新しいシンボルまたはアクションを、必要に応じて NoSymbol または NoAction に初期化します。
key
変更するキーのキーコード
n_groups
キーの新しいグループ数
groups
新しいタイプが提供されるグループを指定するマスク。
XkbGroup1Mask、XkbGroup2Mask、XkbGroup3Mask、XkbGroup4Mask
new_types_in
n_groups 個の整数配列。
各エントリは、関連付けられたグループに使用するタイプを表す、xkb->map->types へのインデックス。
p_changes
NULL でない場合、XkbKeySymsMask を p_changes の changes フィールドに追加し、変更されたキーを含めるように、p_changes の first_key_sym および num_key_syms フィールドを変更します。
戻り値
Success で成功。
Xkb 拡張機能が適切に初期化されていない場合、BadAccess を返します。
xkb パラメーターが無効な場合 (つまり、NULL であるか、有効なクライアントマップが含まれていない場合)、BadMatch を返します。
キーが有効なキーコードではない場合、n_groups が XkbNumKbdGroups より大きい場合、またはグループマスクに有効なグループマスクビットが含まれていない場合、BadValue を返します。
キーシンボルまたはキーアクション配列のサイズを変更する必要があり、割り当てエラーが発生した場合、BadAlloc を返します。
KeySym *XkbResizeKeySyms(XkbDescRec *xkb, int key, int needed);
必要な keysym に必要なスペースを予約し、keysym を保持する新しい配列の先頭へのポインタを返します。
必要に応じて、キーの key_sym_map エントリの offset フィールドを調整し、syms 配列を再割り当てする必要がある場合は、xkb->map の syms、num_syms、および size_syms フィールドを変更することもできます。
キーに関連付けられたグループの幅や数を変更しません。

キーの現在の keysym 数より大きい必要がある場合、配列内のすべての新しい keysym を NoSymbol に初期化します。

キーに必要なシンボルの数は通常、幅 * グループ数として計算され、XkbResizeKeySyms はキーの幅もグループ数も変更しないため、関数からの戻り時に、keysym に割り当てられたスペースと keysym に割り当てられたスペースの間に不一致が存在します。
XkbResizeKeySyms によって返されるシンボルのリスト内の未使用のエントリは、今後マップ編集関数を呼び出しても保持されないため、別のアロケーターを呼び出す前にキーシンボルマッピング (キーの幅とグループ数を更新する) を更新する必要があります。
XkbChangeTypesOfKey を呼び出すと、マッピングが更新されます。

キーにバインドされているシンボルの数を変更すると、キーにバインドされているアクションの数も変更される必要があります。
戻り値
新しい配列の先頭のポインタが返る。
割り当てエラーが発生した場合、NULL を返します。
Status XkbGetKeyModifierMap(Display *dpy, unsigned int first, unsigned int num, XkbDescPtr xkb);
キーコードが first から始まる num 個の修飾子マッピングのリクエストをサーバーに送信します。
応答を待ち、結果を xkb->map->modmap 配列に配置します。
xkb パラメータの map コンポーネントが割り当てられていない場合は、割り当てて初期化します。
戻り値
Success で成功。
互換性のあるバージョンの Xkb がサーバーで利用できない場合、または Xkb 拡張機能が適切に初期化されていない場合、BadAccess を返します。
修飾子マップの取得中に割り当てエラーが発生した場合、BadAlloc を返します。