X11 で xkb キーボード マッピングのプロパティの一部をプログラムで変更しようとしています。XkbClientMapRec
構造体の構造体map
メンバーにXkbDescRec
は、次のメンバーがあります。
typedef struct { /* Client Map */
unsigned char size_types; /* # occupied entries in types */
unsigned char num_types; /* # entries in types */
XkbKeyTypePtr types; /* vector of key types used by this keymap */
unsigned short size_syms; /* length of the syms array */
unsigned short num_syms; /* # entries in syms */
KeySym * syms; /* linear 2d tables of keysyms, 1 per key */
XkbSymMapPtr key_sym_map; /* 1 per keycode, maps keycode to syms */
unsigned char * modmap; /* 1 per keycode, real mods bound to key */
} XkbClientMapRec, *XkbClientMapPtr;
次に、XkbSymMapRec 構造体を次に示します。
#define XkbNumKbdGroups 4
#define XkbMaxKbdGroup (XkbNumKbdGroups-1)
typedef struct { /* map to keysyms for a single keycode */
unsigned char kt_index[XkbNumKbdGroups]; /* key type index for each group */
unsigned char group_info; /* # of groups and out of range group handling */
unsigned char width; /* max # of shift levels for key */
unsigned short offset; /* index to keysym table in syms array */
} XkbSymMapRec, *XkbSymMapPtr;
もちろんKeySym * syms
、配列内の配列は、で定義されている s の配列 (実際には 2D 配列の配列)です。XkbClientMapRec
KeySym
keysymdefs.h
とにかく、ここで疑問に思っているのは、その配列に完全に新しいKeySym
s を追加する方法です。syms
基本的に、キーボードのキー コードの 1 つのマッピングを完全に変更したいのですが、同一視したい KeySym は通常、KeySym
s 配列にはありません。キーコードを既存の定義済みのセットに再割り当てするKeySym
のは簡単です。たとえば、キーコード 45 にキーコード 63 と同じことをさせたい場合は、次のようにします。
XkbDescPtr desc = XkbGetKeyboard( curr_display, XkbAllComponentsMask, XkbUseCoreKbd );
XkbSymMapRec * client_map = desc->map;
client_map->key_sym_map[ 45 ] = client_map->key_sym_map[ 23 ];
XkbMapChangesRec changes;
changes.changed = XkbKeySymsMask;
changes.first_key_sym = 45;
changes.num_key_syms = 1;
XkbChangeMap( curr_display, desc, &changes );
これは機能しますが、私が望むものではありません。KeySym
でまったく新しいエントリを作成し、それらの新しいエントリclient_map->sym
に割り当てたいと考えてclient_map->key_sym_map[ 45 ]->kt_index[ 0..n ]
います。残念ながら、これは可能ではないようですか?KeySym * syms
XbkMapChangesRec 構造体には、配列がより大きなものに再割り当てされたことを規定する方法がありません。それが持っている最高のものはXkbKeySymsMask
、への変更のみですkey_sym_map
。
何か案は?