Блокировка экрана в этих ваших иксах под OpenBSD
Как коварно и изощренно я подчас сам себя наказываю.
Опубликовано: 2024-02-20
Категория: OpenBSD
Теги: xidle хауту openbsd x11 i3 i3lock
... как я настроил блокировку экрана
Собственно, штука, которую я хотел сделать, проста и незатейлива: нужно мне, чтобы по прошествии некоего настраиваемого промежутка времени экран моего ноутбука блокировался, а еще спустя пару минут и вовсе гасился экономии электричества для (я за экологию, зелёная повесточка и вот это вот всё). Кроме того, нужно мне иметь возможность заблокировать экран вручную: можно хоткеем, но лучше привычным мне издревле способом - поместив указатель мыши в правый верхний угол экрана и оставив его там на несколько секунд (во избежание случайных срабатываний), в иных операционных системах и рабочих окружениях это носит название "hot corners". Ну и хотелось бы мне также видеть экран заблокированным при выходе ноутбука из суспенда/гибернейта, ибо мы же за безопасность и всё такое.
В качестве вишенки на тортике (пресно мне без вишенки) при блокировке экрана хотелось бы видеть симпатичную картинку, а при вводе пароля - внятно иллюстрированный индикатор с результатом этого ввода, если вдруг опечатался (отсюда еще одно важное требование: при блокировке экрана раскладку клавиатуры переключать на дефолтную). Вот и все простые незамысловатые требования, реализуемые в большинстве своем популярными DE прямо-таки из коробки с минимальными и простыми настройками (ну, кроме, разве, переключения раскладки на дефолт, для чего в том же GNOME энтузиасты написали специальное расширение).
Штука лишь в том, что я не использую DE, предпочитая собирать окружение из простых атомарных компонентов, удобных и привычных мне. И компонентов этих есть у меня: `xidle` обеспечивает возможность запуска программы или скрипта и по бездействию, и по помещению курсора в нужный угол на нужное количество секунд, а `xlock` ... позволит насладиться месяцами настроек в попытках получить что-то не вырвиглазное, а потом плюнуть и поставить что-нибудь более вменяемое, например, `i3lock` - он умеет и картинку показать, и ввод пароля красиво анимировать.
Настроить `xidle` можно через `~.Xresources` как-нибудь так:
! ===== xidle ! drag pointer to lower left corner to lock screen XIdle*position : ne ! and leave it there for 5 second. XIdle*delay : 5 ! lock screen after 10 minutes idle XIdle*timeout : 600 ! then start the locker XIdle*program : /usr/X11R6/bin/xlock
Но есть тут жирный и печальный нюанс: я почему-то категорически не смог в качестве `XIdle*program` заставить запускаться скрипт (а мне нужен был именно скрипт!). Пробовал и кавычками экранировать всяко, и `/bin/sh -c ...`, и сам скрипт сделать исполняемым - ну вот не работает! А вот если куда-нибудь в `~/.xsession` добавить запуск с параметрами - то работает:
xidle -delay 5 -ne -program '/home/alexd/scripts/screenlock.sh' -timeout 600 &
Собственно, о самом скрипте (на тему переключения раскладки напишу отдельную статью, тут лишь отмечу, что нужно поставить пакет xvkbd), там всё достаточно очевидно - поменять раскладку, блокировать экран с установкой красивой картинки и через 120 секунд гасить монитор:
#!/bin/ksh
# переключим раскладку на латиницу
xvkbd -text '\[ISO_First_Group]'
# Взято из man i3lock
revert() {
xset dpms 0 0 0
}
trap revert HUP INT TERM
xset +dpms dpms 120 120 120
/usr/local/bin/i3lock -n -i /home/alexd/Pictures/Wallpaper1.png -e
revert
Ну и чтобы это счастье работало при suspend\hibernate, добавим в `/etc/apm/suspend` и `/etc/apm/hibernate` соответственно:
/usr/bin/pkill -USR1 xidle
Вуаля. Отдельно отмечу приятную мелочь: при просмотре видео с youtube.com в firefox, тот каким-то образом обманывает xidle и экран не фризится до остановки видео. Слышал, что еще mplayer умеет делать подобный heatrbeat, но не проверял.
... и как я коварно перехитрил сам себя
Собственно, проделав вышеописанные манипуляции я столкнулся с тем, что блокировка экрана по таймауту работает только сразу же после запуска xidle и категорически перестает работать при невыясненных до конца обстоятельствах: то ли после возвращения из суспенда, то ли нет... Долго, долго я бился над разгадкой, половину интернетов перекопал, и...
Оказывается, я в `~/.xsession` добавил когда-то еще при первоначальной установке ну чисто автоматически строчку `xset s off`, для отключения, значит, иксового хранителя экрана. Вот эта мелочи и мешала нормальной работе блокировки по неактивности. А как закомментил - стало мне счастье.