Keyboard Xkb:如何增加XkbDescRec键盘描述的客户端映射中的键符号数?

Keyboard Xkb:如何增加XkbDescRec键盘描述的客户端映射中的键符号数?,keyboard,x11,keycode,Keyboard,X11,Keycode,我试图以编程方式修改X11中xkb键盘映射的一些属性。在XkbDescRec结构的XkbClientMapRecstructmap成员中,我们有以下成员: typedef struct { /* Client Map */ unsigned char size_types; /* # occupied entries in types */ unsigned char num_types; /* # ent

我试图以编程方式修改X11中xkb键盘映射的一些属性。在
XkbDescRec
结构的
XkbClientMapRec
struct
map
成员中,我们有以下成员:

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;
XkbClientMapRec
数组中的
KeySym*syms
数组当然只是
KeySym
s的数组(实际上是二维数组的数组),如
keysymdefs.h
中所定义

无论如何,我想知道的是如何在
syms
数组中添加全新的
KeySym
s。基本上,我想完全更改键盘上某个键代码的映射,我想与之等同的KeySym通常不在
KeySym
s数组中。将一个keycode重新分配给一组现有的已定义的
KeySym
s是很容易的-例如,如果我想让keycode 45做与keycode 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 );
这行得通,但不是我想要的。我想在
client\u map->sym
中创建全新的
KeySym
条目,并将
client\u map->key\u sym\u map[45]->kt\u index[0..n]
分配给这些新条目。不幸的是,这似乎不可能?XbkMapChangesRec结构没有任何方式规定
KeySym*syms
数组已被重新分配到更大的位置。它最好的功能是
XkbKeySymsMask
,它只用于更改
key\u sym\u map

有什么想法吗