如何在使用 xcape 时获取有效的 xmodmap

如何在使用 xcape 时获取有效的 xmodmap

我承认一开始 X 的按键映射对我来说有点神秘,主要涉及从 SO 和 SU 等地方复制和粘贴示例,然后查看它是否有效。但是在这种情况下,我需要更好地了解发生了什么,才能让 xcape 和 i3lock 很好地协同工作。

我正在使用 xcape 实用程序来处理长按时将返回键映射到替代控件,并且在按下和释放时仍表现为正常按键。此设置如下所示:

if [ -e ${XCAPE} ]; then
    killall xcape 2> /dev/null
    ${XMODMAP} -e 'keycode 36 = 0x1234'
    ${XMODMAP} -e 'add control = 0x1234'
    ${XMODMAP} -e 'keycode any = Return'
    ${XCAPE} -e '0x1234=Return'
    KEYMAPS="${KEYMAPS} StRet->Ctrl"
fi

据我了解,它将返回键 (36) 重新映射到一个假键 (0x1234)。然后它修改映射,以便控制也映射到 (0x1234)。然后 xcape 执行“魔术”以确保根据长按发送正确的键代码。

这一切都运行正常,但它破坏了我的屏幕锁定程序 (i3lock),该程序在启动之前对 X 键盘映射进行了一些操作。它失败并显示以下消息:

Error:    (unknown file):1092:13: syntax error
Error:    Failed to parse input xkb file
[i3lock] xkb_keymap_new_from_file failed
i3lock: Could not load keymap

添加一些调试来转储键盘映射,我推测是下面这一行引起了混乱。

xkb_symbols "pc_gb_inet(evdev)_ctrl(nocaps)" {

    name[group1]="English (UK)";
    key     <> {         [          Return ] };
    key  <ESC> {         [          Escape ] };
    key <AE01> {
    ...

那么到底发生了什么事情导致问题出现?这两者从根本上来说不兼容吗?在运行 i3lock 之前,我需要部分恢复键盘映射吗?

答案1

因此,经过大量挖掘,结果发现第一个“keycode any = Return”设置了 keycode 8,这会使 i3lock 键映射处理混乱。此外,您需要确保 keycode 36 确实生成了返回,以便您可以输入密码。

我将对 i3lock 的调用包装在脚本中,因此在我的 i3 配置中:

# background, screensaver and locking
exec xautolock -time 10 -locker '/home/alex/.config/i3/lock_screen.sh'
bindsym $mod+l exec /home/alex/.config/i3/lock_screen.sh

锁屏脚本很简单:

# The initial key-sequence chosen by xcape does confuse i3lock so we reset it
xmodmap -e "keycode 8 = "
# Ensure the return key does work as intended
xmodmap -e 'keycode 36 = Return'
i3lock -c 334433

相关内容