i3:如何使用显示在单独输入设备上的媒体键?

i3:如何使用显示在单独输入设备上的媒体键?

我在 Ubuntu-GNOME 16.04 上安装了 i3 窗口管理器和 GNOME 桌面。我无法使用 Logitech G610 键盘来操作媒体键。

我的文件中有以下内容~/.config/i3/config

bindsym XF86AudioRaiseVolume exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ +5%
bindsym XF86AudioLowerVolume exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ -5%
bindsym XF86AudioMute exec --no-startup-id pactl set-sink-mute 0 toggle

并确认这些命令在终端中有效。我看到的问题是XF86AudioRaiseVolume未注册等按键事件。

如果我尝试xev -event keyboard查看键码,当我按下多媒体键时,我得到的只是以下内容:

MappingNotify event, serial 30, synthetic NO, window 0x0,
    request MappingKeyboard, first_keycode 8, count 248

KeymapNotify event, serial 31, synthetic NO, window 0x0,
    keys:  1   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   
           0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0

并且没有像其他键一样报告键码。但是,使用sudo showkey -k,我得到了以下预期值:

keycode 113 press
keycode 113 release
keycode 115 press
keycode 115 release
keycode 114 press
keycode 114 release

运行时xinput,我看到以下内容

⎡ Virtual core pointer                      id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ Logitech MX Master                        id=12   [slave  pointer  (2)]
⎜   ↳ AlpsPS/2 ALPS DualPoint TouchPad          id=15   [slave  pointer  (2)]
⎜   ↳ AlpsPS/2 ALPS DualPoint Stick             id=16   [slave  pointer  (2)]
⎣ Virtual core keyboard                     id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]
    ↳ Power Button                              id=6    [slave  keyboard (3)]
    ↳ Video Bus                                 id=7    [slave  keyboard (3)]
    ↳ Power Button                              id=8    [slave  keyboard (3)]
    ↳ Sleep Button                              id=9    [slave  keyboard (3)]
    ↳ Logitech Gaming Keyboard G610             id=10   [slave  keyboard (3)]
    ↳ Logitech Gaming Keyboard G610             id=11   [slave  keyboard (3)]
    ↳ Dell WMI hotkeys                          id=13   [slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard              id=14   [slave  keyboard (3)]
    ↳ DELL Wireless hotkeys                     id=17   [slave  keyboard (3)]

其中 Logitech 键盘显示为两个设备。运行后xinput list-props 10xinput list-props 11我看到第一个列表映射到/dev/input/event8,而第二个列表映射到/dev/input/event9

如果我运行,xinput test 10我会看到我的键盘的第一个列表响应所有普通键盘键但不响应媒体键,而xinput test 11仅响应媒体键:

key press   121 
key release 121 
key press   123 
key release 123 
key press   122 
key release 122

(这些值与输出相差 8 showkey,但显然这是预料之中的。此外,这些值与 的映射输出相匹配xmodmap -pke,即keycode 121 = XF86AudioMute NoSymbol XF86AudioMute)。运行sudo evtest /dev/input/event8sudo evtest /dev/input/event9产生类似的结果。

因此,我对按键和处理之间的过程的理解相当模糊,但似乎可能是因为普通键和媒体键位于不同的输入设备上,导致媒体按键事件无法进入 X 会话(如未显示 ? 所示xev),因此无法进入 i3?这在 GNOME 桌面上运行良好,那么我需要配置什么才能让它们在 i3 上运行?我不知道该如何继续,任何帮助都将不胜感激。

编辑

我最初在文件中的命令周围加了引号~/.config/i3/config,但这样不起作用。我已对上述内容进行了编辑以使其正确,但这不是问题的根源。

答案1

根据上一个答案,我运行ps后发现,gnome-session尽管我自启动以来没有登录过 GNOME 桌面,只登录过 i3,但它仍在运行。我怀疑 gnome 会话正在窃取事件,但在 gnome 设置中取消映射这些键盘快捷键似乎没有改变任何东西。

我的解决方案是按照说明直接启动到 tty 会话这里,所以gnome-session无法启动。我创建了~/.xinitrc包含一行的文件exec i3,然后在启动后登录到 tty 终端并运行startx以启动 i3。使用此方法,gnome 不会运行,我的媒体键现在可以工作了。

答案2

部分答案:

键盘显示为两个设备不是问题。两个设备都分配给了虚拟核心键盘,因此两个设备都应该产生正确的按键核心事件。

MappingNotify事件可能表明某个应用程序正在对媒体键做出反应。具体来说,如果您收到FocusOutFocusIn向我们显示的事件,则肯定有其他应用程序正在对这些事件做出反应。

现在这可能是具有您配置的键的 i3 窗口管理器,也可能是其他东西。因此,首先要测试的是删除或注释掉您的 i3 绑定,然后再次测试,看看您是否仍会收到 Mapping/Focus 事件。

如果是,下一步是找出哪个应用程序正在窃取数据。使用psxlsclients来缩小范围。一种方法是终止/禁用应用程序,直到它们不再被窃取。

相关内容