Всем нам хорошо известно, что ребята из Canonical и Gnome просто страсть как любят ломать переключение раскладок или еще что-либо, связанное с хот-кеями, и периодически новые баги всплывают в той или иной версии.
Баг, который существует с хот-кеями где-то с версии бубунты 13.10 не раз заставлял меня искать альтернативы. Но что-то нигде не мог прижиться. Не смотря на то, что многие считают Unity отвратным DE, лично для себя более удобного окружения не нашел.
И вот, в очередной раз возвращаясь на 14.04.3 очень надеялся, что баг таки устранили, но не тут то было. :(
Пришлось немного погуглить и вот что нашел.
Оказывается, ребята из ROSA давно поправили этот баг в своем дистрибутиве, но я нигде не мог найти патч. Но случайно нашел его в ALT Linux.
Что ж, попробуем накатить его нам :)
И так, как я понял, все беды от unity-settings-daemon. Качаем его исходники:
apt-get source unity-settings-daemon
После того, как скачали, в терминале делаем cd в папку с исходниками (пригодится на будущее).
Затем, открываем файл ./plugins/keyboard/gsd-keyboard-manager.c, ищем код (~159 строка)
static gpointer manager_object = NULL;
и добавляем после него такое:
static guint group_position = 0;
Далее, ищем строку (в начале 700-ых строк, в функции upload_xkb_description):
XkbLockGroup (display, XkbUseCoreKbd, 0);
и меняем ее на:
XkbLockGroup (display, XkbUseCoreKbd, group_position);
Далее, строка (~750, функция build_xkb_group_string):
if (latin) length += strlen (latin); else commas -= 1;
и меняем на такое:
if (latin) { length += strlen (latin); group_position = 1; } else { commas -= 1; group_position = 0; }
Чуть ниже, в этой же функции
if (locale && latin) sprintf (string, "%s,%s,%s", user, locale, latin); else if (locale) sprintf (string, "%s,%s", user, locale); else if (latin) sprintf (string, "%s,%s", user, latin);
меняем на
if (locale && latin) sprintf (string, "%s,%s,%s", latin, user, locale); else if (locale) sprintf (string, "%s,%s", user, locale); else if (latin) sprintf (string, "%s,%s", latin, user);
Все. Сохраняем, возвращаемся обратно в терминал:
sudo apt-get build-dep unity-settings-daemon
Эта команда установит уйму библиотек для компиляции исходников unity-settings-daemon и сборки пакета.
После того, как все зависимости для этого будут скачаны, собираем пакетик:
dpkg-buildpackage -rfakeroot -uc -b
Если все для сборки есть, все должно завершиться успехом, и в папке, на один уровень выше текущей, должен появиться файл с пакетом. Поставим его через dpkg. Пример команды (в зависимости от версии, пакет с которой собирали, команда может отличаться. Набираем unity и используем TAB для автодополнения):
sudo dpkg -i ../unity-settings-daemon_14.04.0+14.04.20140606-0ubuntu3_amd64.deb
Вот и все. Осталось только перезагрузиться! Или перезапустить LightDM:
sudo restart lightdm
Если все сделали правильно, то на любой раскладке (в том числе и отличной от английской) все хоткеи должны работать. Проверено в WPS Office, Intellij Idea (без LinuxJavaFixes есесно) - все ок.
Возможно, можно как-то автоматизировать процесс, а еще лучше - собрать пакеты и залить в PPA, но я не умею)
Если по какой-то причине что-то пошло не так, можно вернуть пакет из репозитария:
sudo apt-get install --reinstall ubuntu-settings-daemon
Статья написана для заметок, для себя (но с надеждой помочь кому-нибудь еще) и не гарантирует успех (хотя, у автора получилось :) ), используйте приведенное руководство на свой страх и риск)) За сломанную систему ответственности не несу)
UPD:
Эх, гулять - так гулять :D Сделал PPA для 14.04 Trusty:
sudo apt-add-repository ppa:zoltor/unity-settings-daemon sudo apt-get update sudo apt-get dist-upgrade
Для отката изменений:
sudo apt-get install ppa-purge sudo ppa-purge ppa:zoltor/unity-settings-daemon