+++
title = "Переписал скрипт stop-screensaver и добавил на панель Polybar"
date = 2025-11-22
description = "В прошлом [посте](https://blog.zlinux.ru/articles/disable-screensaver-fullscreen/) выкладывал скрипт, который отключал скринсейвер при просмотре видео в браузере. Позже понял, что держать его запущенным постоянно - не лучшая идея."

[taxonomies]
tags = ["xscreensaver", "polybar", "playerctl"]

[extra]
quick_navigation_buttons = true
toc = false
mermaid = false
social_media_card = "social_cards/polybar-stop-screensaver.png"
+++

В прошлом [посте](https://blog.zlinux.ru/articles/disable-screensaver-fullscreen/) выкладывал скрипт, который отключал скринсейвер при просмотре видео в браузере. Позже понял, что держать его запущенным постоянно - не лучшая идея.

## Новый скрипт

Переписал скрипт `/usr/local/bin/stop-screensaver.sh` и максимально упростил:

```bash
#!/bin/bash
while true; do
  status=$(playerctl --player=vivaldi status 2>/dev/null)
  if [[ "$status" == "Playing" ]]; then
    xscreensaver-command -deactivate >/dev/null
  fi
  sleep 30
done
```

Для удобства написал полноценный модуль для `Polybar`, который позволяет включать и выключать эту функцию по клику. Для работы понадобится всего два небольших скрипта.


## Статусный скрипт

Показывает иконку "ICON_ON" когда демон запущен, и "ICON_OFF" - когда нет) `/home/$USER/.config/polybar/scripts/stop_screensaver_status.sh`

```bash
#!/usr/bin/env bash
STATEFILE="/tmp/stop-screensaver.state"
ICON_ON=""
ICON_OFF=""

if [ -f "$STATEFILE" ]; then
  state=$(cat "$STATEFILE")
else
  state=""
fi

# fallback проверка процесса, если statefile отсутствует/неактуален
if pgrep -f "/usr/local/bin/stop-screensaver.sh" >/dev/null; then
  state="running"
fi

if [ "$state" = "running" ]; then
  echo " $ICON_ON "
else
  echo " $ICON_OFF "
fi
```


## Кликабельный скрипт

Скрипт для запуска/остановки демона. `/home/$USER/.config/polybar/scripts/stop_screensaver_toggle.sh`

```bash
#!/usr/bin/env bash
SCRIPT="/usr/local/bin/stop-screensaver.sh"
STATEFILE="/tmp/stop-screensaver.state"

if pgrep -f "$SCRIPT" >/dev/null; then
  pkill -f "$SCRIPT"
else
  nohup "$SCRIPT" >/dev/null 2>&1 &
fi

# записать текущее состояние
if pgrep -f "$SCRIPT" >/dev/null; then
  echo "running" >"$STATEFILE"
else
  echo "stopped" >"$STATEFILE"
fi
```

Делаем файлы исполняемыми

```bash
chmod +x ~/.config/polybar/scripts/stop_screensaver_*.sh
```


## Добавляем в polybar

В конфиге `/home/$USER/.config/polybar/config.ini` прописываем:

```ini
[module/stop_screensaver]
type = custom/script
exec = ~/.config/polybar/scripts/stop_screensaver_status.sh
interval = 2
click-left = ~/.config/polybar/scripts/stop_screensaver_toggle.sh
label-background = ${gruvbox.green-alt}
label-foreground = ${gruvbox.black}
```

и добавляем расположение модуля `stop_screensaver` в modules-left/modules-center/modules-right


<div class="gallery">
    <a href="stop-screensaver-off.png" data-caption="Значок на панеле Polybar">
        <img src="stop-screensaver-off.png" alt="stop_screensaver выключен">
    </a>
    <a href="stop-screensaver-on.png">
        <img src="stop-screensaver-on.png" alt="stop_screensaver включен">
    </a>
    ...
</div>








