诊断 xmodmap 错误

诊断 xmodmap 错误

xmodmap尝试使用摆脱大写锁定时出现此错误:

$ xmodmap -e 'clear Lock'
X Error of failed request:  BadValue (integer parameter out of range for operation)
  Major opcode of failed request:  118 (X_SetModifierMapping)
  Value in failed request:  0x17
  Serial number of failed request:  8
  Current serial number in output stream:  8

我正在运行xfce。在我将键盘布局小程序添加到面板之前,不会出现此问题;在此之前,我可以运行 xmodmap 脚本来交换 Esc 和 CapsLock:

!Remap Caps_Lock as Escape
remove Lock = Caps_Lock
keysym Caps_Lock = Escape

我在“键盘布局”首选项中选择了 alt-capslock 作为键盘开关组合,这可能是相关的。

我以前也遇到过类似的问题,在另一台机器上运行 openbox。在那台机器上,当我升级到 Lucid 时,这个问题就开始出现。我举报了一个漏洞在 xorg.然而,目前还不清楚这是否真的是 xorg 的问题,或者只是我的配置出了问题。

其他人有遇到过这个问题吗?有人可以解释一下这里发生的事情吗?似乎涉及很多层,而且我对其中任何一层都不是特别了解,所以任何信息都会有帮助。

更新

我发现该问题是通过添加加拿大布局变体“多语言”(ca-multix)专门触发的。如果我改为添加变体“多语言(第一部分)”(ca-multi),则不会出现问题。我认为这可能最终成为一个可用的解决方法,但我还不知道这些变体之间有什么区别。

我已经提交了一份自由桌面问题,并正在评论相关ubuntu问题

答案1

现代 Xorg 使用 XKB 扩展来支持键盘布局。 Xmodmap 是通过兼容层模拟的,但它有一些怪癖。您可以完全禁用 XKB,Xorg 将恢复使用旧的 Xmodmap 键盘映射。我认为它在 xorg.conf 中将选项 XkbDisable 设置为 true,但您可能希望使用 XKB 方法来执行此操作。 /usr/share/X11/xkb/rules/xorg.xml 中有许多可配置选项,我认为您需要 caps:swapescape 来交换 Caps Lock 和 Escape。尝试 setxkbmap -option caps:swapescape

答案2

当您尝试将键符号添加到已添加到另一个修饰键的修饰符时,就会出现问题。重要的是要知道,如果您将一个键符号添加到修饰符,则与该键符号一起使用的所有其他键符号也会添加到该修饰符。

例如:

clear mod5
add mod5    = ISO_Level3_Shift Mode_switch

可以导致

mod5        backslash (0x33),  Caps_Lock (0x42),  ISO_Level3_Shift (0x5c),  Mode_switch (0xcb)

因为你有类似的东西

keycode  66 = Caps_Lock NoSymbol ISO_Level3_Shift

在您的 ~/.Xmodmap (或 .xmodmap,...您可以通过“查看当前键码到键符号映射”xmodmap-pke”)

当您还尝试执行类似操作时,这会产生有问题的 BadValue 错误

add lock    = Caps_Lock

因为 Caps_Lock 已经添加到 mod5 修饰符中。

答案3

setxkbmap -option caps:escape # use caps as esc

或者

setxkbmap -option caps:swapescape # to swap caps with esc

相关内容