例如,左控制的键码总是37吗?在哪里可以找到此类键码的列表?
答案1
否 - 这取决于键盘配置(最终取决于硬件)。如果您一直使用相同的硬件,这不是问题。
xterm 在中使用键码modifyOtherKeys
特征。一些背景(以及几种键盘类型的示例)在XTerm – “其他”修改键页。
该页面上的表格是由生成的修改密钥.pl,一个针对给定 X 键盘配置模仿 xterm 行为的脚本。它从以下位置获取一些信息“本地化状态”,还有一些来自设置kbmap(以或多或少可读的形式)。最终,这些数据来自从其他来源编译的表格,但这些实用程序是从 X 键盘配置获取可用信息的最简单方法。
检查我的记忆,我编写了一个脚本来显示这些表中变化的详细信息:
#!/bin/sh
for kbd in apple altgr-intl pc105
do
for lang in us gb fr
do
setxkbmap -model $kbd -layout $lang -print | \
xkbcomp - -C -o - >/tmp/$kbd-$lang.log 2>/dev/null
done
done
X关键代码symCache
恰好是这些源文件中定义的数组的索引,例如,在这里:
#define NUM_SYMBOLS 358
static KeySym symCache[NUM_SYMBOLS]= {
但表的大小会随着不同的配置而变化:
altgr-intl-fr.log:#define NUM_SYMBOLS 347
altgr-intl-gb.log:#define NUM_SYMBOLS 348
altgr-intl-us.log:#define NUM_SYMBOLS 254
apple-fr.log:#define NUM_SYMBOLS 358
apple-gb.log:#define NUM_SYMBOLS 359
apple-us.log:#define NUM_SYMBOLS 265
pc105-fr.log:#define NUM_SYMBOLS 375
pc105-gb.log:#define NUM_SYMBOLS 376
pc105-us.log:#define NUM_SYMBOLS 282
并且左/右控制符号在某些表中出现在不同的偏移处:
altgr-intl-fr.log: XK_Control_L, XK_Super_L, XK_Shift_R, XK_Control_R,
altgr-intl-gb.log: XK_Control_L, XK_Super_L, XK_Shift_R, XK_Control_R,
altgr-intl-us.log: XK_Num_Lock, XK_Shift_L, XK_Control_L, XK_Super_L,
apple-fr.log: XK_Control_L, XK_Super_L, XK_Shift_R, XK_Control_R,
apple-gb.log: XK_Control_L, XK_Super_L, XK_Shift_R, XK_Control_R,
apple-us.log: XK_Num_Lock, XK_Shift_L, XK_Control_L, XK_Super_L,
pc105-fr.log: XK_Control_L, XK_q, XK_Q, XK_at,
pc105-gb.log: XK_Control_L, XK_a, XK_A, XK_ae,
pc105-us.log: XK_Num_Lock, XK_Shift_L, XK_Control_L, XK_Super_L,
所以我不希望这些键码总是所有键盘配置的值都相同。
有关的评论xev
提到了一种查看当前配置的键码的方法。在我的上,左侧控件是67(不是37):
KeyRelease event, serial 34, synthetic NO, window 0xa00001,
root 0x111, subw 0xa00002, time 51155669, (23,30), root:(43,73),
state 0x4, keycode 67 (keysym 0xffe3, Control_L), same_screen YES,
XLookupString gives 0 bytes:
XFilterEvent returns: False
KeyPress event, serial 34, synthetic NO, window 0xa00001,
root 0x111, subw 0xa00002, time 51156901, (23,30), root:(43,73),
state 0x0, keycode 70 (keysym 0xffe4, Control_R), same_screen YES,
XLookupString gives 0 bytes:
XmbLookupString gives 0 bytes:
XFilterEvent returns: False