evtest 和 dbus

evtest 和 dbus

我正在尝试将无用的 Caps Lock 键重新用于 16.04 MATE 上的一些有用功能。我遇到了

setxkbmap -option ctrl:nocaps

禁用它,但是可以重新映射它以播放/暂停 VLC 吗?谢谢您的回答!

答案1

evtest 和 dbus

这是一个涉及在后台运行的小脚本的版本。需要采取几个简单的步骤:

  • 安装事件测试程序:sudo apt install evtest。该程序能够解码并打印来自/dev/input/设备层次结构的原始事件。

  • 将您的用户帐户添加到组input。注销并再次登录。(这是必要的,因为我们要从下的某个设备读取数据/dev/input/,这通常只能由 root 或组中的用户完成input。我们可以以 root 身份运行脚本,但随后我们必须找到一种方法来告诉它需要与哪个用户 dbus 实例通信。)

  • 像您一样禁用 capslock 键或使用相应的 Mate 偏好设置。如果您像许多人一样将 capslock 键映射到 ctrl,它也会起作用。

  • 将以下脚本存储在某处,例如$HOME/bin/capshack并使其可执行:

    #!/bin/bash
    
    KEYBOARD=/dev/input/by-path/platform-i8042-serio-0-event-kbd
    EVENT="type 1 (EV_KEY), code 58 (KEY_CAPSLOCK), value 1"
    
    toggleVLC () {
            dbus-send \
                --type=method_call \
                --dest=org.mpris.MediaPlayer2.vlc \
                /org/mpris/MediaPlayer2 \
                org.mpris.MediaPlayer2.Player.PlayPause
    }
    
    evtest "$KEYBOARD" | \
    while read line
    do
        if [[ "$line" == *"$EVENT" ]]
        then
            toggleVLC
        fi
    done
    

上述脚本将监听您的键盘事件并在按下 capslock 键时执行命令。运行的命令是使用 dbus 将播放/暂停事件发送到正在运行的 VLC 实例。您可能需要调整变量KEYBOARD以指向您的实际键盘,但上述值可能会起作用。

如果你希望在以下情况下调用 toggleVLC() 函数:发布capslock 键,您可以更改EVENT脚本中的变量,使其以value 0而不是结尾value 1

此外,对于您来说,capslock 键的键码可能与 58 不同。您可以通过运行 来检查这一点evtest,查看按下 capslock 时的输出,并相应地调整 EVENT 变量。您甚至不必通过键码进行匹配,只需将 EVENT 设置为 即可(KEY_CAPSLOCK), value 1

除了使用 evtest 和上面的脚本之外,您还可以使用触发快乐包(类似的东西thd --dump /dev/input/*会给出类似的输出)但我发现这没什么教育意义。

现在我们创建一个用户 systemd 单元来在后台自动启动该脚本:

  • 创建用户 systemd 层次结构:mkdir -p $HOME/.config/systemd/user

  • 将以下文本添加到文件$HOME/.config/systemd/user/capshack.service

    [Unit]
    Description=Abuse capslock key
    
    [Service]
    ExecStart=%h/bin/capshack
    
    [Install]
    WantedBy=default.target
    
  • 启用刚刚创建的服务单元:systemctl --user enable capshack

  • 启动服务:systemctl --user start capshack

从现在起,您应该能够使用 Capslock 键在 VLC 中切换播放/暂停。登录时,后台脚本应该会自动启动。

好战

正如前面提到的,您也可以使用 triggerhappy 包来执行此操作。对于那些不想摆弄系统而更喜欢更可靠的解决方案的人来说,这是首选方法。

  • input像上面一样将用户添加到组中

  • 安装软件包:sudo apt install triggerhappy

  • 为 triggerhappy 添加配置~/.config/thd/capslock.conf

    KEY_CAPSLOCK    1   dbus-send --type=method_call --dest=org.mpris.MediaPlayer2.vlc /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.PlayPause
    
  • 像这样运行 thd:thd --triggers ~/.config/thd/capslock.conf /dev/input/event*

  • 让 thd 以类似于 capshack 描述的方式为您的用户运行。

  • 确保您只运行上述方法之一(capshack 或 thd),以免每次按下键时都进行双重切换。

我在 18.04 标准会话和 16.04 mate 上测试了所有这些。但理论上它也应该在 wayland 或其他桌面环境下工作。

答案2

在 Ubuntu 16.04 中,经过数小时的谷歌搜索和摆弄后dconf-editorxbindkeys我发现了一个非常简单的解决方案:

  • 2 分钟内即可快速完成设置
  • 只需要安装 xdotool
  • 无需脚本
  • 大写锁定仍能识别,但无法切换字母大小写
  • 适用于标准 Ubuntu 键盘自定义快捷键设置

如果你需要 GnomeXF86AudioPlay支持,你需要xdotool(不需要甚高频液晶正如 OP 所规定的那样):

sudo apt install xdotool

现在到了棘手的部分。每次按下Caps LocK按键在播放和暂停之间切换音乐时,大写字母也会切换为关闭和打开。

使用此方法关闭 Caps Lock 切换,同时仍保持按键处于活动状态:

setxkbmap -option caps:none

遵循 Gnome 的音乐播放器

然后在 Ubuntu 16.04 中进入设置>>键盘>>快捷键>>自定义快捷键

音频暂停播放快捷键.png

  • 设置姓名Audio Play
  • 设置命令xdotool key XF86AudioPlay
  • 然后点击Apply按钮

添加新选项后,分配的快捷键将显示已禁用。 点击已禁用当提示分配键时按下该Caps LocK键。


像 VLC 这样的音乐播放器

按照上一节中针对 Gnome 的步骤操作,但对于命令改用这个:

qdbus org.mpris.MediaPlayer2.vlc /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.PlayPause

甚高频液晶无法识别媒体键:如何使键盘媒体键全局与 VLC 配合使用?即使内置于键盘中。因此自定义键盘快捷键 XF86AudioPlay 对 毫无用处xdotool


从命令行设置自定义键盘快捷键

此问答讨论了如何从命令行设置自定义键盘快捷键:如何从终端设置自定义键盘快捷键?


永久停用大写锁定

下一步是让它setxkbmap -option caps:none在重启后仍然有效。谷歌搜索后,Terdon 给出了以下答案:保存 setxkbdmap 设置

一个简单的方法是将命令添加到您的$HOME/.profile文件中(如果不存在,您可以创建它):

setxkbmap -option caps:none

这样它就会在您每次登录时运行。

笔记您应该使用$HOME/.profile而不是$HOME/.bash_profile$HOME/.bashrc其他类似文件。这是因为您的登录管理器应该读取此设置。

答案3

此答案已在虚拟机中的 Ubuntu MATE 16.04.4 LTS 上进行了测试(但键盘是直通的 USB 键盘,因此应该没有区别)。它也不需要额外的软件,并且可以在 vanilla 安装中完成,而无需安装任何软件包,并且它在靴子之间是持久的。

重新映射 Caps Lock

  1. 以 root 身份编辑文件/usr/share/X11/xkb/symbols/pc。注意不要在这里犯错误(例如忘记逗号),因为如果这样做,您可能无法再使用键盘。(猜猜我学到了什么?;)

  2. 注释掉以下行

        key <CAPS> {    [ Caps_Lock     ]   };
    

    //在其开头 放置两个正斜杠 ( )。

  3. 在其下方添加以下行:

        key <CAPS> {    [ XF86AudioPlay, XF86AudioPause ]   };
    
  4. 注释掉以下行

        modifier_map Lock   { Caps_Lock };
    

    与上述方法相同。

  5. 重启。

注:(鸣谢丹泽尔(感谢您指出这一点)对软件包的更新xkb-data可能会覆盖此文件。防止这种情况发生的一个相当安全的方法是使用 转移路径dpkg-divert。(我说“相当安全”是因为该文件的上游源代码三年来没有被修改过。)

替代方法

在键盘布局设置中手动禁用 Caps Lock 键,然后使用这个答案添加您自己的键重新映射。

问题?

您的大写锁定键不再锁定大写,此时它已重新映射到播放/暂停。您现在应该能够在 VLC 中播放和暂停音乐。如果此时可以正常工作,您可以跳过这些说明的其余部分。

但是,当我尝试时,VLC 没有响应播放/暂停键。

确保键盘快捷键设置正确

  1. 打开键盘快捷键(系统 → 偏好设置 → 硬件 → 键盘快捷键)

  2. 确保“播放(或播放/暂停)”设置为“XF86AudioPlay”

  3. 如果不是,请单击“快捷方式”部分,然后按新的播放/暂停键来设置快捷方式。 有用的屏幕截图

  4. 如果还是不起作用,请重新启动几次以防万一。(这实际上解决了我的问题。)

答案4

将 CapsLock 键设为播放/暂停键

此解决方案将把 Capslock 键的扫描码重新映射到内核输入驱动程序中的其他键码,在本例中为播放/暂停。

优点

  • 无需修改现有系统文件(只需创建一个新文件)
  • 应用程序不知道这实际上是一个大写锁定键,但认为按下了真正的播放/暂停键
  • 无需禁用大写锁定,不会弄乱xkb配置

缺点

  • 必须针对每个键盘单独进行(根据具体情况,这也可能是一个优势)

先决条件

  • 事件测试(可以通过 安装sudo apt-get install evtest

程序

在终端中,运行sudo evtest并选择您的键盘。如果按下某个键时没有输出,请按Ctrl+C并尝试其他设备。记住您选择的设备事件编号,我们稍后会需要它。按 capslock 键。将出现以下几行:

Event: time 1529406021.187148, -------------- SYN_REPORT ------------
Event: time 1529406021.218427, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70039
Event: time 1529406021.218427, type 1 (EV_KEY), code 58 (KEY_CAPSLOCK), value 0

MSC_SCAN我们需要该行前一行的值KEY_CAPSLOCK。在上面的例子中,该值是 70039,但键盘上的扫描码可能不同。

现在运行以下命令,但将 X 替换为您用于该evtest命令的设备事件编号:

grep "" /sys/class/input/eventX/device/id/*

...这将输出键盘的、bustypeproductvendorversion

65-keyboard-custom.hwdb创建一个名为的文件/etc/udev/hwdb.d/(需要root权限),内容如下:

evdev:input:b[bustype]v[vendor]p[product]e[version]*
 KEYBOARD_KEY_[scancode]=playpause

...在哪里

  • [bus]、[vendor]、[product] 和 [version] 恰好有 4 个字符,并且字母需要大写
  • [scancode] 必须是小写
  • evdev:...生产线没有前导空格
  • KEYBOARD_KEY...生产线恰好一个前导空格

例如:

evdev:input:b0003v046DpC228e0110*
 KEYBOARD_KEY_70039=playpause

最后,将新的配置编译到硬件数据库中:

sudo systemd-hwdb update

如果要立即应用更改,请通知 udev:

sudo udevadm trigger

如果您想恢复更改,只需删除您创建的文件并重新启动。

您可以在我的网站找到更多详细信息原始答案关于这个话题。

相关内容