2

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 配列の配列)です。XkbClientMapRecKeySymkeysymdefs.h

とにかく、ここで疑問に思っているのは、その配列に完全に新しいKeySyms を追加する方法です。syms基本的に、キーボードのキー コードの 1 つのマッピングを完全に変更したいのですが、同一視したい KeySym は通常、KeySyms 配列にはありません。キーコードを既存の定義済みのセットに再割り当てする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 * symsXbkMapChangesRec 構造体には、配列がより大きなものに再割り当てされたことを規定する方法がありません。それが持っている最高のものはXkbKeySymsMask、への変更のみですkey_sym_map

何か案は?

4

0 に答える 0