Устранение проблем с хот-кеями при активной не латинской раскладке в Ubuntu (Unity)

Всем нам хорошо известно, что ребята из 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


Добавить комментарий