В решении есть три компонента, которые позволят вам менять раскладку клавиатуры:
- Определите, когда клавиатура подключена
- Определить раскладку на клавиатуре
- Установите макет вашей системы в соответствии с раскладкой клавиатуры.
1. Определите, когда клавиатура подключена
Все аппаратные изменения отправляются демону шины сообщений D-Bus.
D-Bus - это система шин сообщений, простой способ для приложений общаться друг с другом. В дополнение к межпроцессному взаимодействию, D-Bus помогает координировать жизненный цикл процесса; это делает его простым и надежным для кодирования приложения или демона "одного экземпляра", а также для запуска приложений и демонов по требованию, когда требуются их сервисы.
D-Bus предоставляет как системный демон (для таких событий, как "добавлено новое аппаратное устройство" или "очередь принтера изменена"), так и демон для сеанса входа в систему для пользователя (для общих потребностей IPC среди пользовательских приложений).
Вы можете отслеживать события, отправленные по шине D-Bus, с помощью команды dbus-monitor :
dbus-monitor --system #show all events
dbus-monitor --system --profile 'interface=org.freedesktop.Hal.Manager' # filter: only events sent by Hal
dbus-monitor --system --profile 'interface=org.freedesktop.Hal.Manager, member=DeviceAdded' # filter: only DeviceAdded events sent by Hal
Подключите клавиатуру и следите за сообщениями. Это должно дать вам представление о фильтре, который вам необходим для обнаружения подключенной или отключенной клавиатуры. Вам также необходимо более подробно ознакомиться с использованием dbus-монитора .
2. Определить раскладку клавиатуры
Как только клавиатура подключена к системе, HAL (Уровень аппаратной абстракции) настраивает ее. Вы можете получить эту информацию, используя команду hal-get-property, как только вы определили ключ, который вам нужен. Например, в моей системе:
$ hal-get-property --udi /org/freedesktop/Hal/devices/platform_i8042_i8042_KBD_port_logicaldev_input --key "input.xkb.layout"
gb
$ hal-get-property --udi /org/freedesktop/Hal/devices/platform_i8042_i8042_KBD_port_logicaldev_input --key "input.xkb.model"
pc105
Посмотрите на этот ответ для подробного объяснения того, как получить значения из HAL: настройка профилей процессов в Ubuntu. Я думаю, что сообщение D-Bus может дать вам настроенный узел HAL для подключенного устройства, но я не уверен. Если нет, вы знаете, что он будет в любом из двух мест - в соответствии с одной из двух клавиатур.
3. Выберите раскладку вашей системы в соответствии с раскладкой клавиатуры
Джо уже указал, как вы можете сделать это с помощью xmodmap.