Установка английской раскладки на экране ввода пароля

Я работаю в ArchLinux + plasma.

Частая беда при работе с более чем одной языковой раскладкой - ввод пароля не на том языке. Больше всего это парит на экране блокировки (lock screen). В этом случае, когда вводишь неправильно, приходится ждать еще некоторое время ждать, прежде чем можно ввести пароль заново. Такое поведение предотвращает подбор пароля.

Сегодня окончательно решил избавиться от этого неудобства

Хочу отметить, что на самом деле в моем случае етсь два экрана ввода пароля. Первый на входе в систему, его показывает SDDM, это login screen. второй - lock screen, и это отдельная песня.

SDDM / login screen

Настройка SDDM весьма проста. Пишем в /usr/share/sddm/scripts/Xsetup

#!/bin/sh
# Xsetup - run as root before the login dialog appears
setxkbmap "us"

Lock screen

Тут, признаюсь, я не смог найти более элегантного решения, чем реагировать на состояния экрана запущен/отключен. Хотя, хотелось бы какой-то конфиг.

База решения описана тут

Кратко, реагируем на событие из шины dbus, и исполняем произвольный код, в данном случае установка раскладки

Получается такой скрипт:

#!/bin/bash

#prints out, among other things;
#      string "org.kde.screensaver"
#transform it to 'org.kde.screensaver'
service=$(\
    dbus-send \
        --session \
        --dest=org.freedesktop.DBus \
        --type=method_call \
        --print-reply \
        /org/freedesktop/DBus org.freedesktop.DBus.ListNames \
    | grep -o '[^"]*.screensaver'
)

#prints out, among other things;
#method bool org.freedesktop.ScreenSaver.SetActive(bool e)
#transform it to 'org.freedesktop.ScreenSaver'
interface=$(
    qdbus \
        $service /ScreenSaver \
    | grep -oP '[^ ]*(?=.SetActive)'
)

path='/ScreenSaver'

#monitor it with a while loop
dbus-monitor "type='signal',interface='$interface',member='ActiveChanged',path='$path'" \
| while read -r line; do
    #ignore the metadata and pull the 'boolean <true/false>' line
    read line

    #check if it is set to true
    if echo $line | grep -q 'true'; then
        # echo "Locked at $(date)"
        setxkbmap -layout "us"
    else
        setxkbmap -layout "us,ru"
        # echo "Unlocked at $(date)"
    fi
done

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

Скрипт нужно запустить на старте системы или сессии пользователя

Comments