我买了紧凑型键盘。 F1 = Fn + 1 且 F2 = Fn + 2 ... 但 F1-F12 键在我的 Ubuntu 16.04 上不起作用。例如F1 可以调高亮度。我检查了 F1-F12 键的键码,它们无效。因此 F1 返回 232 键码(而不是 67)。
我尝试使用以下方法修复它:xmodmap -e "keycode 232 = F1 F1 F1 F1 F1 F1 XF86Switch_VT_1"
但没有帮助。 F1仍然改变亮度。我尝试重新映射其他 F1-F12 键,但没有结果。 Xmodmap 仅适用于非功能键。
是否可以修复 F1-F12 键? (交换键码?)
Xmodmap配置正确但F1仍然改变亮度:
$ xmodmap -e "keycode 232 = F1 F1 F1 XF86Switch_VT_1" # IT DON'T HELP!!
$ xmodmap -pke # everything is OK!
keycode 67 = F1 F1 F1 F1 F1 F1 XF86Switch_VT_1 F1 F1 XF86Switch_VT_1
keycode 232 = F1 F1 F1 XF86Switch_VT_1
$xev # take a look: XKeysymToKeycode = 67... F1... everything is OK again...
KeyRelease event, serial 40, synthetic NO, window 0x5000001,
root 0xf5, subw 0x0, time 921326, (236,-87), root:(236,403),
state 0x0, keycode 232 (keysym 0xffbe, F1), same_screen YES,
XKeysymToKeycode returns keycode: 67
XLookupString gives 0 bytes:
XFilterEvent returns: False
$sudo evtest
Event: time 1497517949.369064, -------------- SYN_REPORT ------------
Event: time 1497517949.458895, type 1 (EV_KEY), code 224 (KEY_BRIGHTNESSDOWN), value 0
$ setxkbmap -print
xkb_keymap {
xkb_keycodes { include "evdev+aliases(qwerty)" };
xkb_types { include "complete" };
xkb_compat { include "complete+ledscroll(group_lock)" };
xkb_symbols { include "pc+us+inet(evdev)+capslock(swapescape)" };
xkb_geometry { include "pc(pc105)" };
};
PS F1-F12 在 Windows 上也可以正常工作。
更新:
谢谢@dirkt。请看一下详细信息:
- 我使用 Ubuntu 16.04.1 LTS统一
/dev/input/event11: RK61 Bluetooth keyboard
sudo lsof /dev/input/event11
输出:酸, Xorgevtest --grab /dev/input/eventX
结果:你是对的,因为笔记本电脑屏幕的亮度保持原样(我按下了 Fn + 1 => F1)!
试图杀人酸过程:
sudo kill 757
// 杀戮酸过程sudo lsof /dev/input/event11
输出:Xorg // OK acpid 被杀死- 按 F1 -> 亮度正在改变! // 失败
这是我的 rdesc 文件:https://pastebin.com/vxDvwMwr
这是十六进制转储:https://pastebin.com/eT9mNnGV
我也尝试通过更改键码xkbcomp
,但没有帮助。
请写下任何想法。谢谢你!
答案1
我在这里找到了解决方案:https://forums.gentoo.org/viewtopic-t-1063898-start-0.html
change behaviour on the fly
# echo 2 > /sys/module/hid_apple/parameters/fnmode
or modify it in config
[/etc/conf.d/modules]
module_hid_apple_args="fnmode=2 iso_layout=0"
答案2
部分答案:xmodmap
映射实际上工作正常。如图xev
所示,您得到keysym 0xffbe
的是F1
,正如它应该的那样。
所以问题是(1)为什么它仍然改变亮度以及(2)为什么它返回键码 232(对于KEY_BRIGHTNESSDOWN
)而不是 F1 键的键码(67)。
对于(1),我怀疑 Ubuntu 默认运行一些直接读取的内容,/dev/input
而不是处理 X 事件,无论怎么说,这都是在处理密钥xmodmap
。你没有说你运行哪个桌面环境(Gnome?)。您可以寻找lsof
一个直接读取源代码的进程/dev/input/eventX
(您从 中获得了数字 X evtest
,数字可以在不同的引导中改变)。您还可以通过运行来测试这个理论evtest --grab /dev/input/eventX
:这将使evtest
专用程序来处理事件,因此当您按 Fn+F1 时,它应该仍然显示KEY_BRIGHTNESSDOWN
,但您的 PC/笔记本电脑屏幕的亮度应该保持不变。
至于(2),谷歌搜索品牌名称显示它是蓝牙键盘。这意味着它可能是 HID 设备。您可以通过查看dmesg
识别相应的hidraw
设备文件和蓝牙标识符来进行调试。然后做
mount -t debugfs none /sys/kernel/debug
以 root 身份查看sys/kernel/debug/hid/*/rdesc
正确的设备(查看可用的子目录)。如果您无法理解它,请将其放入粘贴箱中并使用链接编辑问题。另外,使用 转储原始 HID 事件hexdump -C /dev/hidrawX
,按 Fn 和 F1、F2 等多次。这应该会让您了解为什么内核会这样翻译。
编辑
查看 hidraw 转储,键盘正确地为功能键生成 scancodes 等,如 HID 描述符中所述3a
。3b
所以问题一定出在 HID 到输入的转换层上。
您可以通过 ioctl 询问该层。据我所知,没有可用的公共工具,但完成后我可能会在 github 上发布一个工具。
我知道设置此映射的唯一方法是通过 udevhwdb
数据库,如下所述这里。
所以我猜谁安装了一些软件包,它提供了一个数据库条目来将 F1 映射到亮度控制,并且还提供了一个程序通过直接监视来对此做出反应/dev/input/event*
。尝试看看是否可以在您的系统上找到它。lsof
可能有帮助。