LINUX.ORG.RU
ФорумTalks

wallpaper_setter.sh — демон для установки и настройки обоев

 , , ,


6

1

Здравствуйте, мои дорогие любители громадных скриптов на баше!

Сегодня вашему вниманию предоставляется клиент-серверная моструозина (24KiB), которая предназначена для того, чтобы управлять обоями на рабочем столе.

Предыстория

Где-то за пару недель до нового года мне уже набила оскомину серая обоина, стоявшая у меня с незапамятных времён, её даже можно найти в галерее, и я затосковал по тем пяти гигабайтам отснятых скриншотов, что лежат у меня диске и постепенно истираются из памяти. И тут ко мне пришла она — белоидея! Написать скрипт, который бы ставил рандомные изображения из папки со скриншотами и менял их каждые, скажем, 10 минут. Первые наброски появились за пару дней, скрипт умел определять aspect ratio и подбирать соответствующий режим заполнения экрана.

Но мне этого показалось мало, и, посмотрев, что умеет hsetroot, я понял, что всегда хотел иметь возможность выставить яркость обоине, ибо через затемнённые и относительно прозрачные окна терминалов некоторые не подходили просто из-за того, что были слишком светлыми. В общем, после Рождества скрипт уже позволял

  • настраивать яркость текущей обоине и выставлять начальную яркость, с которой ставилась любая новая обоина;
  • подбирать режим заполнения в рантайме;
  • хранить историю предыдущих обоин, запоминать их яркость и режим заполнения;
  • оставлять текущую обоину и не менять её до специально отправленной команды;
  • восстанавливать прежнее состояние после перезагрузки;
  • выбирать каталог с обоями в рантайме через гуи (zenity) или отправлять каталог через командую строку для автоматизации переключения (например, по крону).

Ну и ещё по мелочи, так что одну половину января я всё это писал, а другую — отлавливал баги и правил документацию.

Запускается он просто. Cначала демон:

~/path/to/wallpaper_setter.sh -d /home/picts/wallpapers &

Хотя, чтобы видеть ошибки, лучше указать также программу, которая будет выводить сообщения, например, i3-nagbar

~/path/to/wallpaper_setter.sh \
    -e "i3-nagbar -m \"%m\" -b 'Restart' \"%a\"" \
    -d /home/picts/wallpapers &

или zenity

~/path/to/wallpaper_setter.sh \
    -e "zenity --error --text=\"%m\"" \
    -d /home/picts/wallpapers &

i3-nagbar позволяет также указать действие для одной кнопки, чтобы рестартануть скрипт. Не все ошибки критические, но после некоторых скрипт обязан выйти.

Теперь, когда демон запущен, поставить новую обоину можно с помощью

~/path/to/wallpaper_setter.sh -n

А автосмену занести в крон, открыть сrontab -e и написать туда

# Менять обоину раз в 10 минут
*/10 * * * * ~/path/to/wallpaper_setter.sh -qn

-q нужен, чтобы запретить выхлоп и сообщения (при корректно настроенном кроне любой выхлоп будет отправлен на имейл же). Это станет актуально, когда захочется подержать понравившуюся обоину на рабочем столе подольше и запретить её менять

~/path/to/wallpaper_setter.sh -k

А чтобы поставить новую и разрешить делать это крону, досатотчно добавить ключ -f

~/path/to/wallpaper_setter.sh -fn

Чтобы уменьшить яркость текущей обоины на 20%, можно отправить такую команду

~/path/to/wallpaper_setter.sh -b -0.2

Соответственно, чтобы увеличить — -b +0.2. Тут надо заметить, что если передать тому же hsetroot -brightness -0.2, то он поставит эту яркость. Скрипт же её отнимет от текущей яркости, так что повесив -b -0.1 и -b +0.1 на горячие клавиши, яркость можно менять очень легко.

«Зачем менять её руками, если можно просто каждое новое изображение ставить на обои с заданной яркостью?» — спросите вы? Правильно, задать начальную яркость можно при запуске демона через ключ -B

~/path/to/wallpaper_setter.sh -B -0.3 \
    -e "i3-nagbar -m \"%m\" -b 'Restart' \"%a\"" \
    -d /home/picts/wallpapers &

Полная документация и сам скрипт на гитхабе.

──────────

Пользуясь случаем хочу попросить прощения за задержки с watch.sh, следующее свободное время для скриптования будет отведено переходу на getopt, взаимодействию с MyAnimeList и (возможно) переходу на подобную клиент-серверную хреновину, она мне понравилась. Тогда можно будет держать в демоне что-то наподобие сессии на каждое аниме, а не держать терминал открытым всё время (хотя с tmux сейчас я не вижу проблем).

Deleted

Производительность упала на 140%!! Отвечаю, я теперь от коллекции обоев с Цукихи глаз оторвать не могу!

Deleted ()

Понимаешь, тут такое дело... Я фон рабочего стола уж точно не раз в десять минут вижу. И даже не раз в десять часов.

Lighting ★★★★★ ()

Есть же 100500 готовых демонов, меняющих обои. В чём смысл писать ещё один, да ещё и на баше?

Axon ★★★★★ ()
Ответ на: комментарий от Stahl

и поэтому скрипт ТСа мало кого заинтересует - кому нужен велик, сами напишут, как им надо

batekman ★★★ ()
Ответ на: комментарий от Lighting

Я тоже, но тут такое дело… В общем, я настроил кошерные цвета в емаксе и теперь сижу одним глазом в терминале, а другим поглядывая на обои.

Deleted ()

Всегда стеснялся задать этот онтологический вопрос. Почему так часто обсуждают обои рабочего стола? Зачем и когда вы вобще на них смотрите?

generator ★★★ ()
Ответ на: комментарий от Axon

Да? Покажи мне демона, который умеет хотя бы половину (яркость, fillmode, вперёд-назад) и при этом управляется ещё проще.

Deleted ()
Ответ на: комментарий от Deleted

Покажи мне демона, который умеет хотя бы половину (яркость, fillmode, вперёд-назад) и при этом управляется ещё проще.

Вы покажите мне, лучше, ещё одного пользователя, которому это надо. :-) А так, можно было запилить эти фичи в что-нибудь из имеющего. Опенсорц же, типа, все дела, не?

Axon ★★★★★ ()

Спасибо, схоронил себе на всякий случай.

DrF ()
Ответ на: комментарий от generator

Почему так часто обсуждают обои рабочего стола?

Я думаю, это стало такой же вечной и насущной проблемой для русской души, как и то, почему в декабре на градуснике плюс.

Зачем и когда вы вобще на них смотрите?

«Во дни сомнений, во дни тягостных раздумий о судьбах моей родины…» я хочу посмотреть на Цукихи в красочной юкате и начать думать о смене ПМЖ.

Deleted ()
Ответ на: комментарий от Lighting

Понимаешь, тут такое дело... Я фон рабочего стола уж точно не раз в десять минут вижу. И даже не раз в десять часов.

типа также.

darkenshvein ★★★★★ ()

Смари как настоящие пацаны это делают:

Это просто ставит обоину:

[alexv@micrayon user]$ cat wallpaper.service 
[Unit]
Description=Sets the wallpaper

[Service]
EnvironmentFile=%h/.config/wallpaper
Type=oneshot
ExecStart=/usr/bin/feh --bg-fill "${WALLPAPER}"

[Install]
WantedBy=default.target

Это мониторит конфиг-файл и передергивает вышеописаный сервис когда конфиг изменяется на диске:

[alexv@micrayon user]$ cat wallpaper.path 
[Unit]
Description=Update wallpaper

[Path]
PathModified=%h/.config/wallpaper

[Install]
WantedBy=default.target

Этот сервис проставляет рандомный валлпапер в вышеописаном конфиге при помощи скриптика:

[alexv@micrayon user]$ cat rotate-wallpaper.service 
[Unit]
Description=Sets a random wallpaper

[Service]
Type=oneshot
ExecStart=/home/alexv/bin/rotate-wallpaper

[Install]

Это - таймер, чтобы дергать скриптик раз в 10 минут:

[alexv@micrayon user]$ cat rotate-wallpaper.timer 
[Unit]
Description=Rotates wallpaper every 10 min

[Timer]
OnBootSec=1min
OnUnitActiveSec=10min

[Install]
WantedBy=default.target

Ну а это - скриптик, который запускается из rotate-wallpaper.service:

[alexv@micrayon user]$ cat ~/bin/rotate-wallpaper 
#!/bin/bash

echo "WALLPAPER=\"$(/usr/bin/find ${HOME}/desktop-candies/wallpapers/ -type f -print | /usr/bin/sort -R | /usr/bin/head -1)\"" > ${HOME}/.config/wallpaper

alex_the_v ★★★ ()
Ответ на: комментарий от generator

Unity кстате меняет цвет в зависимости от обоев

fornlr ★★★★★ ()
Ответ на: комментарий от ErasimHolmogorin

Точно, оригинал полуанфаса с обложки манги.

d_a ★★★★★ ()

Непременно надо портировать на Цэ и запилить в systemd! Иначе systemd не торт.

Shadow ★★★★★ ()
Ответ на: комментарий от alex_the_v

Забавненько, забавненько.

Я так понимаю, у вас вся юзер-сессия рулится systemd?
И как оно?
Много гемороя?
Есть методы посмотреть связи между юнитами (желательно в виде графов, через тот же graphviz, например)?
А что-нибудь на замены at и cron (именно утилит, чтоб не писать юниты ручками)?
Какие еще печеньки на темной стороне?

Belkrr ()
Ответ на: комментарий от alex_the_v

$(/usr/bin/find ${HOME}/desktop-candies/wallpapers/ -type f -print

Это оно каждые десять минут будет всю мою шестигигабайтную папку с обоями перетряхивать? Это ж тихая смерть для жёсткого диска.
Ну а яркость? Фех умеет её ставить? А её ещё помнить надо.

| /usr/bin/sort -R | /usr/bin/head -1)

Вместо того, чтобы один раз запросить список файлов, загнать его в массив и после дёргать только рандомный индекс.

> ${HOME}/.config/wallpaper
эхоит имя файла в файл

Это вау. Однострочник был самоцелью?
А ещё — это сколько файлов нужно отредактировать? Пять?

Deleted ()
Ответ на: комментарий от Deleted

Это оно каждые десять минут будет всю мою шестигигабайтную папку с обоями перетряхивать?

[alexv@micrayon ~]$ /usr/bin/find ${HOME}/desktop-candies/wallpapers/ -type f | wc -l
3157
[alexv@micrayon ~]$ du -sh ${HOME}/desktop-candies/wallpapers/
2.8G	/home/alexv/desktop-candies/wallpapers/
[alexv@micrayon ~]$ time /usr/bin/find ${HOME}/desktop-candies/wallpapers/ -type f -print | /usr/bin/sort -R | /usr/bin/head -1
/home/alexv/desktop-candies/wallpapers/Обои/lkqT9V6.jpg

real	0m0.182s
user	0m0.175s
sys	0m0.008s

Меня все устраивает. В любом случае, это не повод городить демона (!) в 700 строк (!) на баше (!) чтобы менять обои. Яркостью не заморачиваюсь.

Вместо того, чтобы один раз запросить список файлов, загнать его в массив и после дёргать только рандомный индекс.

Давай тогда сразу Оракл приспособим. Как раз вместе с демоном на баше они отожрут нормально ресурсов. Такие как ты придумали Аконади, который хочет мои полтора контакта хранить непременно в MySQL.

Это вау. Однострочник был самоцелью?

Скриптец, конечно, лишний, просто с него все начиналось.

А ещё — это сколько файлов нужно отредактировать? Пять?

Читай внимательно, первые два юнита просто выставляют обоину. Вторые два - обеспечивают смену раз в 10 минут. Модульность.

В общем, тебе явно не до чего было докопаться =)

alex_the_v ★★★ ()
Последнее исправление: alex_the_v (всего исправлений: 1)
Ответ на: комментарий от Belkrr

Рулилась какое-то время, пока Леня не сломал юзерские сессии, будь он неладен. После этого я снес все нафиг и поставил XFCE без всяких заморочек.

Гемора было немного, в systemd все более-менее логично, надо только доку почитать. Зависимости между юнитами показывает systemd-analyze dot. Когда я этим заморачивался, at не было, но говорят, что Леня прикрутил какие-то ad-hoc юниты. Надо бы почитать.

alex_the_v ★★★ ()
Последнее исправление: alex_the_v (всего исправлений: 1)
Ответ на: комментарий от alex_the_v

/usr/bin/find ${HOME}/desktop-candies/wallpapers/ -type f | wc -l

Спроси как-нибудь своих этих «настоящих пацанов», как правильно считать файлы.

time

Прочитанные результаты будут какое-то время доступны в кеше ФС в памяти. Но это ещё не повод лабать говнокод, не думая, как оно работает >_>

Меня все устраивает.

Поздравляю — тебя устраивает говнокод. >_>

В любом случае, это не повод городить демона (!) в 700 строк (!)

Что не повод, прости?

Давай тогда сразу Оракл приспособим.

А, то есть, скидывать сраное имя файла каждой обоины в темпарь на диске каждые десять минут — это нормально, а держать его в памяти — нет?

Такие как ты придумали Аконади, который хочет мои полтора контакта хранить непременно в MySQL.

Юноша, огнетушитель там →
← Новые стулья — в Икее.
А этот скрипт к базам данных не имеет никакого отношения.

первые два юнита просто выставляют обоину
вторые два - обеспечивают смену раз в 10 минут

Это вау. Я добавлю в избранное.

Модульность.

Зачем она здесь? Зачем пять файлов, по которым размазано меньше полусотни строк кода?

Deleted ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.