xscreensaver锁屏时如何静音

xscreensaver锁屏时如何静音

目标是在屏幕锁定时静音。

理想情况下,解锁后也能恢复声音。

音响系统为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

相关内容