Блокировка экрана в этих ваших иксах под OpenBSD

Опубликовано 20.02.2024 в OpenBSD

... как я настроил блокировку экрана

Собственно, штука, которую я хотел сделать, проста и незатейлива: нужно мне, чтобы по прошествии некоего настраиваемого промежутка времени экран моего ноутбука блокировался, а еще спустя пару минут и вовсе гасился экономии электричества для (я за экологию, зелёная повесточка и вот это вот всё). Кроме того, нужно мне иметь возможность заблокировать экран вручную: можно хоткеем, но лучше привычным мне издревле способом - поместив указатель мыши в правый верхний угол экрана и оставив его там на несколько секунд (во избежание случайных срабатываний), в иных операционных системах и рабочих окружениях это носит название "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, для отключения, значит, иксового хранителя экрана. Вот эта мелочи и мешала нормальной работе блокировки по неактивности. А как закомментил - стало мне счастье.