我在假期买了这款精美的新型 USB 键盘,带有 N 键无冲突功能。一直困扰我的一件事是我无法再使用此键盘从 X11/Xorg 访问虚拟键盘。同时插入新旧键盘后,我可以看出我仍然可以使用旧键盘切换到终端。另外,我可以使用 xev 来验证是否正在生成 XF86Switch_VT_1 键符号。 (见下文)。根据我在其他地方读到的内容,问题来自于键盘必须假装它是 USB 上的多个键盘,因为 USB 标准只允许每个键盘 6 键翻转。
是否有任何已知的解决方法可以使其发挥作用?
KeyRelease event, serial 40, synthetic NO, window 0x5000001,
root 0x29e, subw 0x0, time 5626057, (675,-26), root:(679,936),
state 0xc, keycode 67 (keysym 0x1008fe01, XF86Switch_VT_1), same_screen YES,
XLookupString gives 0 bytes:
XFilterEvent returns: False
答案1
我的 DELL 笔记本电脑也有同样的问题
尝试这个:
Ctrl + alt + [n] + F1
答案2
XKB 解决方法
由于您的F#按键在与按键不同的逻辑设备上出现Ctrl+Alt,因此更改 XKB 布局以在某些常规按键上生成这些按键符号可能是一个合理的解决方法。测试按键以evdev
确保它们位于同一输入上;下面的示例假设数字键是。需要考虑的注意事项:
xkbcomp
无法在 Wayland 和基于 GNOME 的桌面环境下工作可能会重置键盘设置,因此使用基本的窗口管理器进行测试。如果此解决方案有效,则可以将其重写为 XKB 选项或布局变体,放入系统 XKB 数据库中,并通过 DE 提供的任何方式进行配置。您可以使用
ckbcomp
这些更改来生成控制台键盘映射,或者您可能会发现控制台的Ctrl+F2功能正常,因此不需要修改。或者你可能需要与 建立友好关系loadkeys
。某些应用程序可能已经定义了热键,例如Ctrl+Alt+2;我不知道他们如何与这个布局交互。
考虑到所有这些因素,这绝对是一个丑陋的黑客。在较低层解决问题(例如,在evdev
对它们采取行动之前将两个输入合并为一个)将是更好的选择。
首先,生成一个基本的键盘映射,带有setxkbmap -print
;然后我们将编辑此文件并向其添加覆盖,最后使用以下命令加载更改后的键盘映射xkbcomp [file] $DISPLAY
:
$ setxkbmap -print > mykeymap.xkb
xkb_keymap {
xkb_keycodes { include "evdev+aliases(qwerty)" };
xkb_types { include "complete" };
xkb_compat { include "complete" };
xkb_symbols { include "pc+us(altgr-intl)+inet(evdev)" };
xkb_geometry { include "pc(pc105)" };
};
生成完整的键盘映射以xkbcomp
查找布局中的原始符号。如果您的布局中的符号略有不同,请不要太担心;只要它们是四级或更少,这就应该有效。
$ xkbcomp $DISPLAY - > origkeymap.xkb
# (from) (to)
// the # keys on a typical PC keyboard are AE01,AE02,...,AE09,AE10
// in the xkb_symbols section you'll find these:
key <AE01> {
type= "FOUR_LEVEL",
symbols[Group1]= [ 1, exclam, onesuperior, exclamdown ]
};
现在编辑mykeymap.xkb
并将我们需要的覆盖放入其中:
// Attempting to place XF86Switch_VT_N keysyms on 1-0.
//
// starting point: setxkbmap -layout us -variant altgr-intl -option '' -print
// load this file: xkbcomp mykeymap.xkb $DISPLAY
xkb_keymap {
xkb_keycodes { include "evdev+aliases(qwerty)" };
xkb_types { include "complete" };
xkb_compat { include "complete" };
xkb_symbols {
include "pc"
include "us(altgr-intl)"
include "inet(evdev)"
// redefine numeric keys
key <AE01> {
type= "CTRL+ALT",
symbols[Group1]= [ 1, exclam, onesuperior, exclamdown, XF86Switch_VT_1 ]
};
key <AE02> {
type= "CTRL+ALT",
symbols[Group1]= [ 2, at, twosuperior, dead_doubleacute, XF86Switch_VT_2 ]
};
key <AE03> {
type= "CTRL+ALT",
symbols[Group1]= [ 3, numbersign, threesuperior, dead_macron, XF86Switch_VT_3 ]
};
key <AE04> {
type= "CTRL+ALT",
symbols[Group1]= [ 4, dollar, currency, sterling, XF86Switch_VT_4 ]
};
key <AE05> {
type= "CTRL+ALT",
symbols[Group1]= [ 5, percent, EuroSign, dead_cedilla, XF86Switch_VT_5 ]
};
key <AE06> {
type= "CTRL+ALT",
symbols[Group1]= [ 6, asciicircum, dead_circumflex, onequarter, XF86Switch_VT_6 ]
};
key <AE07> {
type= "CTRL+ALT",
symbols[Group1]= [ 7, ampersand, dead_horn, onehalf, XF86Switch_VT_7 ]
};
key <AE08> {
type= "CTRL+ALT",
symbols[Group1]= [ 8, asterisk, dead_ogonek, threequarters, XF86Switch_VT_8 ]
};
key <AE09> {
type= "CTRL+ALT",
symbols[Group1]= [ 9, parenleft, leftsinglequotemark, dead_breve, XF86Switch_VT_9 ]
};
key <AE10> {
type= "CTRL+ALT",
symbols[Group1]= [ 0, parenright, rightsinglequotemark, dead_abovering, XF86Switch_VT_10 ]
};
};
xkb_geometry { include "pc(pc105)" };
};
现在您可以加载此文件并测试密钥:
# load keymap for all keyboards
$ xkbcomp mykeymap.xkb $DISPLAY
# load only on device id=# (see `xinput -list`)
$ xkbcomp -i # mykeymap.xkb $DISPLAY
这不会更改控制台键盘映射,因此切换回来可能需要其他键盘。
如果测试表明这些键可以工作,并且不会影响这些组合键的其他用途,则可以将其永久保留通过你最喜欢的XKB修改方法。