SDDM: Переключаем раскладку автоматически при блокировании экрана

Продолжаем разбираться с окном логина (sddm, gdm и прочие *dm).

В предудущей части мы научились переключать раскладку из консоли минуя кнопки и мышки.

А теперь мы научимся менять раскладку автоматически при блокировании экрана.

Зачем это нужно? Чаще всего пароль у нас на латинице. А заблокировать экран можно при любой включенной раскладке. Это приводит к тому, что на экране логина эту самую раскладку на до менать. Неудобно!

1. Определяем, когда система была заблокирована

#!/usr/bin/env bash

dbus-monitor --session "type='signal',interface='org.freedesktop.ScreenSaver'" |
  while read x; do
    case "$x" in 
      *"boolean true"*) echo SCREEN_LOCKED;;
      *"boolean false"*) echo SCREEN_UNLOCKED;;  
    esac
  done

Если запустить скрипт, заблокировать, а потом разблокировать экран, то мы увидим его работу.

SCREEN_LOCKED
SCREEN_LOCKED
SCREEN_UNLOCKED
SCREEN_UNLOCKED

Два сообщения из-за особенностей интерфейса. Можно привязываться к другому интерфейсу, но в данном случае это некритично.

2. Учимся запускать скрипт фоном через systemd

Делаем скрипт /.local/bin/set-layout-on-lock. Не забывайте поставить на него `+x .

#!/usr/bin/env bash

dbus-monitor --session "type='signal',interface='org.freedesktop.ScreenSaver'" |
  while read x; do
    case "$x" in 
      *"boolean true"*) qdbus org.kde.keyboard /Layouts org.kde.KeyboardLayouts.setLayout 0;;
      *"boolean false"*) echo SCREEN_UNLOCKED;;  
    esac
  done

Создаём каталог для сервисов systemd.

$ mkdir -p ${HOME}/.config/systemd/user

Пишем сервис в ${HOME}/.config/systemd/user/set-kbd-layout-on-lock.service.

[Unit]
Description=Set custom locale on screen lock

[Service]
Restart=always
ExecStart=%h/.local/bin/set-layout-on-lock

[Install]
WantedBy=graphical-session.target
  • %h - означает директорию текущего пользователя.
  • graphical-session.target - означает, что сервис будет запускаться только с графическим интерфейсом (не нужен он нам в консоли).

3. Включаем

$ systemctl --user enable --now set-kbd-layout-on-lock

Сервис будет включен и тут же запущен.

Посмотреть состояние можно командой status.

$ systemctl --user status set-kbd-layout-on-lock

Литература

Категории: HowTo