修饰符的键码是否与键盘布局和键盘型号无关?

修饰符的键码是否与键盘布局和键盘型号无关?

例如,左控制的键码总是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

相关内容