目标是在屏幕锁定时静音。
理想情况下,解锁后也能恢复声音。
音响系统为Pulseaudio。
答案1
启动此脚本(或在登录时设置此脚本的自动启动):
#!/bin/bash -euET
{
set -o pipefail
export DBUS_SESSION_BUS_ADDRESS="${DBUS_SESSION_BUS_ADDRESS:-unix:path=/run/user/$(id -u)/bus}"
export DISPLAY="${DISPLAY:-:0}"
xscreensaver-command -watch | while read -r line ; do
echo "handling event: $line"
if [[ $line = LOCK* ]]; then
volume=$(pamixer --get-volume)
echo "current volume is $volume"
pamixer --set-volume 0
fi
if [[ $line = UNBLANK* ]]; then
echo "setting volume to $volume"
pamixer --set-volume "$volume"
fi
done
exit
}
解释:此脚本的“守护程序”部分xscreensaver-command -watch
将挂起并等待来自 xscreensaver 的任何事件。每当“LOCK”或“UNBLANK”事件发生时,音量将分别归零和恢复。
答案2
我按照建议使用 pactl 而不是 amixer尼克格诺斯
pactl set-sink-mute @DEFAULT_SINK@ toggle
这是感兴趣的人的完整代码。它与克利夫-斯坦福的代码本质上是
打开终端窗口,将路径中的“用户”替换为您的用户名(如果适用)
nano /home/'user'/.local/share/applications/MuteLock.sh
然后将以下内容粘贴到窗口中并按 Ctrl+o(保存)和 Ctrl+x(退出)
#!/bin/bash
# Credit for code:
#https://unix.stackexchange.com/users/14353/cliff-stanford
#https://unix.stackexchange.com/users/231160/nik-gnomic
# Post on stackexchange: https://unix.stackexchange.com/questions/467456/how-to-mute-sound-when-xscreensaver-locks-screen/589614#589614
gdbus monitor -y -d org.freedesktop.login1 | grep LockedHint --line-buffered |
while read line
do
case "$line" in
*"<true>"*)
#amixer -q -D pulse sset Master off
pactl set-sink-mute @DEFAULT_SINK@ toggle
;;
*"<false>"*)
#amixer -q -D pulse sset Master on
pactl set-sink-mute @DEFAULT_SINK@ toggle
;;
esac
done
exit
使文件可执行,将路径中的“user”替换为您的用户名(如果适用)
chmod +x /home/'user'/.local/share/applications/MuteLock.sh
然后执行并执行Super+L(锁定屏幕)以检查其是否正常工作
/home/'user'/.local/share/applications/MuteLock.sh &
在 Manjaro 20.01 Gnome 3.36 版本下测试 - 在 wayland 上工作。 - 无需安装 xscreensaver 即可工作
要在 gnome 登录后台启动此应用程序,创建了一个 *.desktop 文件。我跟着马克斯施莱普齐格的帖子位于Gnome Shell:会话启动后运行 shell 脚本?*.desktop 文件代码
再次打开终端,将路径中的“user”替换为您的用户名(如果适用)
nano /home/'user'/.local/share/applications/MuteLock.desktop
并将以下内容粘贴到其中,Ctrl+o(保存)和 Ctrl+x(退出)
[Desktop Entry]
Encoding=UTF-8
Type=Application
Icon=application-x-executable
Name=MuteLock
Exec=/home/'user'/.local/share/applications/MuteLock.sh
Path=/home/'user'/.local/share
Terminal=false
Hidden=false
StartupNotify=false
X-GNOME-Autostart-enabled=true
Comment=Mute on screen-lock and un-mute on screen un-lock
Categories=Settings; System; Utility
在启动应用程序下的 Gnome 调整中添加您刚刚创建的 MuteLock.desktop 文件。
我可以确认此技巧适用于本机安装在我的 Dell Inspiron 7390 二合一笔记本电脑上的所有三个 Linux 发行版
Manjaro 20.0.1 内核 v5.6,
Ubuntu 20.04 LTS 内核 v5.4 LTS,
OpenSUSE Tumbleweed 内核 v5.6,以及
与 Gnome 3.36、GDM、Xorg 和 Wayland 一起使用
如果您安装了 libplayerctl,那么我们甚至可以将暂停和播放添加到代码中。从发行版的包管理器安装 libplayerctl (libplayerctl2)、playerctl 并修改如下
case "$line" in
*"<true>"*)
playerctl -a pause #pauses all MPRIS players
#amixer -q -D pulse sset Master off
pactl set-sink-mute @DEFAULT_SINK@ toggle
;;
*"<false>"*)
#amixer -q -D pulse sset Master on
pactl set-sink-mute @DEFAULT_SINK@ toggle
playerctl play #start playing the default player
;;
esac
答案3
在徐本图和XFCE这些解决方案对我不起作用,因为org.freedesktop.login1
似乎没有发生任何事件。 (@VasyaNovikov似乎有同样的问题。)
对我有用的是寻找org.xfce.ScreenSaver
事件。
#!/bin/bash
gdbus monitor --session --dest org.xfce.ScreenSaver | grep "ActiveChanged" --line-buffered |
while read line
do
case "$line" in
*"(true,"*)
pactl set-sink-mute @DEFAULT_SINK@ on
;;
*"(false,"*)
pactl set-sink-mute @DEFAULT_SINK@ off
;;
esac
done
exit
答案4
我发现最简单的方法是在启动时运行 shell 脚本。无论使用什么屏幕保护程序(如果有),这都应该有效。
#!/bin/bash
gdbus monitor -y -d org.freedesktop.login1 | grep LockedHint --line-buffered |
while read line
do
case "$line" in
*"<true>"*)
amixer -q -D pulse sset Master off
;;
*"<false>"*)
amixer -q -D pulse sset Master on
;;
esac
done