我最近购买了一个背光键盘,其设计是使用滚动锁定键来切换背光。我很快发现按下 Scroll Lock 键时 Cinnamon 无法正确响应。最初,我认为键盘背光是 DOA,因为其他一切都是开箱即用的。重新启动后,我发现在启动 Xorg 之前我能够使用 Scroll Lock 键成功切换背光。然后,在启动 Xorg(以及随后的 cinnamon_session)后,此功能再次停止工作。
为了在启动 Xorg 后让背光正常工作,我被迫发出 a:xset led named "Scroll Lock"
来启用和禁用此功能。
经过一番研究后,我发现了一个名为 的程序,xev
该程序在启动后将关键事件信息转储到终端。按下 Scroll Lock 键后,终端将填充以下信息:
KeyPress事件,序列34,合成NO,窗口0x2c00001,根0x2df,子w 0x0,时间2609824,(410,0),根:(1724,142),状态0x0,键码78(keysym 0xff14,Scroll_Lock),same_screen YES, XLookupString 给出 0 个字节: XmbLookupString 给出 0 个字节: XFilterEvent 返回: False
KeyRelease事件,序列号37,合成NO,窗口0x2c00001,根0x2df,subw 0x0,时间2609912,(410,0),根:(1724,142),状态0x0,键码78(keysym 0xff14,Scroll_Lock),same_screen YES, XLookupString 给出 0 个字节:
所以我知道关键事件正在发送到内核。
另外,有趣的是,我在终端中(仍在启动 Xorg 或 Cinnamon 之前)并使用 Scroll Lock 时观察到了奇怪的行为。也就是说,此时我的背光按预期切换,但是当启用滚动锁定时,我输入的任何内容都不会写入屏幕。禁用 Scroll Lock 后,我编写的所有内容都会立即转储到终端,就像之前被缓冲一样。
太长了;博士Scroll Lock 和 Xorg 有什么关系?
答案1
我不熟悉 Cinnamon,但应该可以启用 Scroll Lock 键。
首先,我们需要查看您是否有空闲的键盘调节器插槽。跑步:
xmodmap -pm
这将打印当前修改器设置的列表。希望其中一行不会列出任何键;一般情况下是这样的mod3
。假设是这种情况,您可以使用以下命令启用 Scroll Lock:
xmodmap -e "add mod3 = Scroll_Lock"
您的 Scroll Lock LED 现在应该响应 Scroll Lock 按键。
如果可行,您可能希望 X 在启动时自动执行此操作。有多种方法可以做到这一点:它可以在每个用户的基础上完成,但对于这样的事情,我认为将其设置为全局是有意义的。
但我以前从未这样做过,所以我最好在提供进一步的细节之前进行测试。 :)
好的。我尝试全局激活 modmap 的方法在 KDE 上不起作用。 :( 但在我的主目录中激活它似乎工作正常。
.Xmodmap
在您的主目录中创建一个包含以下行的文件:
add mod3 = Scroll_Lock
最简单的方法是:
cd ~
echo >.Xmodmap "add mod3 = Scroll_Lock"
现在重新启动 X(注销并再次登录)。希望您的 Scroll Lock 键能够正常工作。如果没有,请告诉我。
答案2
找到了永久的方法经过一个漫长的夜晚,吃了很多半生不熟的解决方案。
# backup your symbols file
sudo cp /usr/share/X11/xkb/symbols/us{,.distribution}
在该部分中添加以下行xkb_symbols "basic" {
。如果第二行不存在,请不要担心,它仅适用于某些语言,而在我的系统上不存在。
...
modifier_map Mod3 { Scroll_Lock }; <==<< Add this line
include "level3(ralt_switch)" <==<< before this line
};
如果您在语言之间切换,您可能必须在其他布局中执行相同的操作
此外,还有一个 xkb 布局所在的缓存。您应该在重新启动 X 服务器之前清除它以检查新的键盘符号文件。
sudo rm -f /var/lib/xkb/*
答案3
由于Scroll Lock激活时可能会干扰您的键盘快捷键(名为F12, Ctrl+Space不会按预期工作),我决定将Scroll Lock按键与手动启动相匹配xset
,根据之前的状态切换 LED 状态。
我创建了一个名为的可执行脚本toggle_keyb_led.sh
:
xset q | awk '/LED/{ if ($10 ~ "00000000") print "led"; else print "-led" }' | xargs xset
这会解析 的输出xset q
,并将该行与 相匹配LED mask
。
注1:如果不适合您,请验证xset -led; xset q | grep 'LED'
当前掩码值是多少。
笔记2:部分用户需要跑步xset led 3
才能亮灯。在这种情况下,请重写上面的脚本。
然后,您可以使用桌面环境作为自定义快捷方式启动此脚本,例如(这里使用的是肉桂):