воскресенье, 8 апреля 2012 г.

Решение проблем с настройками клавиатуры при использовании suspend2disk

В прошлом посте я упомянул о проблемах со сбрасывающимися настройками клавиатуры после выхода компьютера из спящего режима. Это происходит из-за того, что в процессе подготовки к спящему режиму выгружаются модули USB. После загрузки устройства вновь подключаются при загрузке USB модулей, а вот настройки к ним уже не применяются.

Временным решением стал ярлык на рабочих столах, но это неудобно. Одним из последующих решений стало выполнение setxkbmap при выходе компа из спящего режима. Чтобы отловить события в системе до и после засыпания на диск, я запустил dbus-monitor и выполнил цикл засыпания/пробуждения.

$ dbus-monitor --system | tee ~/tmp/dbus-system.log

В процессе изучения полученного лога нашлись записи от UPower (подсистема управления питанием).

$ grep UPower ~/tmp/dbus-monitor.log
signal sender=:1.15 -> dest=(null destination) serial=80 path=/org/freedesktop/UPower; interface=org.freedesktop.UPower; member=Sleeping
signal sender=:1.15 -> dest=(null destination) serial=81 path=/org/freedesktop/UPower; interface=org.freedesktop.UPower; member=Resuming

Чтобы восстановить настройки клавиатуры, достаточно отловить событие 'Resuming' от UPower и выполнить команду setxkbmap $(cat ~/.Xkbmap). Готовый скрипт можно взять тут.

Позже всплыл баг, когда при одновременной работе двух пользователей настройки восстанавливаются только у пользователя, у которого активна сессия на момент пробуждения. В виде хака добавил прослушивание событий и от ConsoleKit.

Есть еще много мест которые можно улучшить, но это уже буду делать по-мере появления свободного времени. А возможно просто забъю на per-user настройки клавиатуры и просто сделаю на уровне системных настроек. По-идее с ними проблем быть не должно.

Комментариев нет:

Отправить комментарий