我刚刚在 ThinkPad T450s 上安装了 Ubuntu 16.04,出于某种原因,音量和屏幕亮度的媒体键没有提供任何键码或键符(即 XF86AudioRaiseVolume)。但所有其他媒体键都给出了正确的值。
奇怪的是,媒体键在 unity 和 gnome 中仍然可以正常工作,但当我使用 i3 时会出现问题,因为我无法映射音量键来更改音量。
这是xev
音量降低、音量增加和音量静音键的返回值:
音量减小:
FocusOut event, serial 33, synthetic NO, window 0x1a00001,
mode NotifyUngrab, detail NotifyPointer
FocusIn event, serial 33, synthetic NO, window 0x1a00001,
mode NotifyUngrab, detail NotifyAncestor
KeymapNotify event, serial 33, synthetic NO, window 0x0,
keys: 2 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
提高音量:
FocusOut event, serial 33, synthetic NO, window 0x1a00001,
mode NotifyGrab, detail NotifyAncestor
FocusIn event, serial 33, synthetic NO, window 0x1a00001,
mode NotifyUngrab, detail NotifyAncestor
KeymapNotify event, serial 33, synthetic NO, window 0x0,
keys: 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 0
静音:
FocusOut event, serial 33, synthetic NO, window 0x1a00001,
mode NotifyUngrab, detail NotifyPointer
FocusIn event, serial 33, synthetic NO, window 0x1a00001,
mode NotifyUngrab, detail NotifyAncestor
KeymapNotify event, serial 33, synthetic NO, window 0x0,
keys: 2 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
如您所见,它们都是一样的。所以我不知道 unity 或 gnome 如何区分它们。仅供参考,我将展示来自的 mic off 和 wifi off 媒体键的输出xev
:
KeyRelease event, serial 33, synthetic NO, window 0x1a00001,
root 0xf6, subw 0x0, time 3107820, (-19,759), root:(625,798),
state 0x0, keycode 198 (keysym 0x1008ffb2, XF86AudioMicMute), same_screen YES,
XLookupString gives 0 bytes:
XFilterEvent returns: False
KeyPress event, serial 34, synthetic NO, window 0x1a00001,
root 0xf6, subw 0x0, time 3112189, (-19,759), root:(625,798),
state 0x0, keycode 246 (keysym 0x1008ff95, XF86WLAN), same_screen YES,
XLookupString gives 0 bytes:
XmbLookupString gives 0 bytes:
XFilterEvent returns: False
在安装 ubuntu 之前,我也曾经得到过类似的音量键结果(我使用的是 Arch)。
亮度键也不起作用,它们是否在某个低级别被覆盖了?有没有办法修复它,让它们返回正确的值,或者有没有其他方法可以让媒体键在 ubuntu 上工作?
更新xev
:当我运行 Unity 时,这就是音量增大和减小键的作用。
FocusOut event, serial 47, synthetic NO, window 0x4800001,
mode NotifyGrab, detail NotifyAncestor
FocusIn event, serial 47, synthetic NO, window 0x4800001,
mode NotifyUngrab, detail NotifyAncestor
KeymapNotify event, serial 47, synthetic NO, window 0x0,
keys: 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
KeyRelease event, serial 47, synthetic NO, window 0x4800001,
root 0xf7, subw 0x0, time 2182026, (-1217,972), root:(525,2104),
state 0x0, keycode 122 (keysym 0x1008ff11, XF86AudioLowerVolume), same_screen YES,
XLookupString gives 0 bytes:
XFilterEvent returns: False
FocusOut event, serial 47, synthetic NO, window 0x4800001,
mode NotifyGrab, detail NotifyAncestor
FocusIn event, serial 47, synthetic NO, window 0x4800001,
mode NotifyUngrab, detail NotifyAncestor
KeymapNotify event, serial 47, synthetic NO, window 0x0,
keys: 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
KeyRelease event, serial 47, synthetic NO, window 0x4800001,
root 0xf7, subw 0x0, time 2185429, (-1217,972), root:(525,2104),
state 0x0, keycode 123 (keysym 0x1008ff13, XF86AudioRaiseVolume), same_screen YES,
XLookupString gives 0 bytes:
XFilterEvent returns: False
运行 unity 时,我也有unity-settings-daemon
、unity-panel-service
和unity-fallback-mount-helper
。其中一个可以捕获事件并添加XF86
键盘符号吗?这些都没有在 i3 中运行。
回应@Adaephon 我的 i3 配置中有这个:
# volume controls
bindsym XF86AudioRaiseVolume exec amixer -q set Master playback 2%+ unmute
bindsym XF86AudioLowerVolume exec amixer -q set Master playback 2%- unmute
bindsym XF86AudioMute exec amixer -q set Master mute
答案1
看起来有问题的键已经被其他应用程序全局抓取。您获得的三段输出xev
仅与 xev 窗口失去并重新获得焦点有关,而键在其他情况下已被抓取(请参阅我的帖子在旧i3 常见问题解答)。
有两个可能的原因,为什么xev
会显示这样的输出并且键绑定不起作用:
首先,我将检查有问题的键 - XF86AudioLowerVolume(keycode
122
),XF86AudioRaiseVolume(keycode123
)和XF86AudioMute(keycode ) - 是否已经与您的(或)121
绑定bindsym
bindcode
i3配置。也许只是绑定的命令不起作用。(更新)从你的片段中i3配置似乎就是这样。我认为 16.04 默认使用 PulseAudio,因此
amixer
可能甚至没有安装。您可以使用它pactl
来更改 PulseAudio 上的音量。要模拟您之前的amixer
设置,请尝试以下操作:bindsym XF86AudioRaiseVolume exec pactl set-sink-volume @DEFAULT_SINK@ +2%; exec pactl set-sink-mute @DEFAULT_SINK@ 0 bindsym XF86AudioLowerVolume exec pactl set-sink-volume @DEFAULT_SINK@ -2%; exec pactl set-sink-mute @DEFAULT_SINK@ 0 bindsym XF86AudioMute exec pactl set-sink-mute @DEFAULT_SINK@ toggle
如果您只想使用和键取消静音,也可以使用
1
而不是toggle
。set-sink-mute
XF86AudioLowerVolumeXF86AudioRaiseVolume如果不是这种情况,则可能是其他工具正在获取这些键。一个可能的候选者是
gnome-settings-daemon
,unity-settings-daemon
也可能是另一个。此外,一些媒体播放器可能会尝试全局绑定这些键。我建议ps aux
在新的i3会话以查看自动启动的内容。找到罪魁祸首后,您基本上有三个选择:- 在大多数情况下,应该可以取消配置按键绑定。如果您想继续使用抓取按键的任何东西,这可能是最简单的解决方案。
- 使其正常工作。抓取密钥的程序可能实际上应该执行您想要执行的操作(例如音量控制),但由于某种原因它无法执行。例如:程序尝试使用 PulseAudio 更改音量,而您实际上并未使用 PulseAudio。
- 阻止它启动。如果你自己将它放入自动启动中(例如
exec
在你的i3配置),您可以直接删除它。如果它由于某些 Ubuntu 预设而自动启动,则可能需要更多工作。
您gnome-settings-daemon
可以使用以下说明我的其他帖子i3 常见问题解答:
您应该能够使用以下命令获取绑定键的列表:
gsettings list-recursively org.gnome.settings-daemon.plugins.media-keys
然后你可以通过分配一个空字符串来取消设置它们
gsettings set org.gnome.settings-daemon.plugins.media-keys volume-mute ''
gsettings set org.gnome.settings-daemon.plugins.media-keys volume-down ''
gesttings set org.gnome.settings-daemon.plugins.media-keys volume-up ''
或者,您也可以使用dconf
:
dconf write /org/gnome/settings-daemon/plugins/media-keys/volume-mute "''"
dconf write /org/gnome/settings-daemon/plugins/media-keys/volume-down "''"
dconf write /org/gnome/settings-daemon/plugins/media-keys/volume-up "''"