例如,我的笔记本电脑上有功能键XF86AudioLowerVolume
。我可以将此键与 openbox 配置文件中的某些命令相关联,并使用它来降低/增加音量。
我用命令找到了这个功能键的名称xev
:
KeyRelease event, serial 47, synthetic NO, window 0x1c00001,
root 0x196, subw 0x0, time 85289390, (524,165), root:(525,203),
state 0x10, keycode 174 (keysym 0x1008ff11, XF86AudioLowerVolume), same_screen YES,
XLookupString gives 0 bytes:
XFilterEvent returns: False
但是,对于我的其他功能键,xev
没有显示正确的键名称。例如,应该用于“降低屏幕亮度”。按下时,xev
显示NoSymbol
:
KeyPress event, serial 43, synthetic NO, window 0x1c00001,
root 0x196, subw 0x0, time 2651872, (850,161), root:(851,199),
state 0x10, keycode 101 (keysym 0x0, NoSymbol), same_screen YES,
XLookupString gives 0 bytes:
XFilterEvent returns: False
KeyRelease event, serial 43, synthetic NO, window 0x1c00001,
root 0x196, subw 0x0, time 2651872, (850,161), root:(851,199),
state 0x10, keycode 101 (keysym 0x0, NoSymbol), same_screen YES,
XLookupString gives 0 bytes:
XFilterEvent returns: False
另一个配对密钥“增加屏幕亮度”还显示NoSymbol
:
KeyPress event, serial 43, synthetic NO, window 0x1c00001,
root 0x196, subw 0x0, time 2653165, (850,161), root:(851,199),
state 0x10, keycode 212 (keysym 0x0, NoSymbol), same_screen YES,
XLookupString gives 0 bytes:
XFilterEvent returns: False
KeyRelease event, serial 43, synthetic NO, window 0x1c00001,
root 0x196, subw 0x0, time 2653165, (850,161), root:(851,199),
state 0x10, keycode 212 (keysym 0x0, NoSymbol), same_screen YES,
XLookupString gives 0 bytes:
XFilterEvent returns: False
keycode
这两个键只有不同。
这是否意味着我无法使用这些键将它们与某些命令相关联?它们显然可以用作键盘按键,为什么会xev
显示NoSymbol
?
答案1
简单NoSymbol
地说,该键没有预定义名称。这些都列在文件中keysymdefs.h
,在过去二十多年里没有明显改变(见这例如,或者这)。
该文件用于生成xev
供相关程序参考的名称列表。对于xev
,可以使用以下任一方法完成
XLookupString
, 或者XmbLookupString
。
无论哪种方式,它都依赖于 生成的表keysymdef.h
,如源代码中所述:
/* 构造 XStringToKeysym 和 XKeysymToString 的哈希表。 */
# 构建 ks_tables.h 需要 makekeys 实用程序
没有人真正想要添加到该文件,因为它是与 Unicode 相对应(但不匹配)的代码和特殊功能键(例如您询问的键)的混合体。大多数特殊键是在 20 世纪 90 年代初引入 X 键盘扩展之前定义的,并且 (Xkb) 本质上只是根据键盘上的行和列来识别键,而不是尝试命名所有键。
这一页具有指向说明 xterm 如何使用键修饰符的表格的链接。这Name
的列键映射表是 Xkb 使用的名称,您可以看到通常只是行/列,除了非常常用键,例如ESC
(for Escape)。