F1-F12 键不起作用

F1-F12 键不起作用

我买了紧凑型键盘。 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。请看一下详细信息:

  1. 我使用 Ubuntu 16.04.1 LTS统一
  2. /dev/input/event11: RK61 Bluetooth keyboard
  3. sudo lsof /dev/input/event11输出:, Xorg
  4. evtest --grab /dev/input/eventX结果:你是对的,因为笔记本电脑屏幕的亮度保持原样(我按下了 Fn + 1 => F1)!

试图杀人过程:

  1. sudo kill 757// 杀戮过程
  2. sudo lsof /dev/input/event11输出:Xorg // OK acpid 被杀死
  3. 按 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 描述符中所述3a3b

所以问题一定出在 HID 到输入的转换层上。

您可以通过 ioctl 询问该层。据我所知,没有可用的公共工具,但完成后我可能会在 github 上发布一个工具。

我知道设置此映射的唯一方法是通过 udevhwdb数据库,如下所述这里

所以我猜谁安装了一些软件包,它提供了一个数据库条目来将 F1 映射到亮度控制,并且还提供了一个程序通过直接监视来对此做出反应/dev/input/event*。尝试看看是否可以在您的系统上找到它。lsof可能有帮助。

相关内容