У всех людей свой опыт использования Linux десктопа, но лично для меня очень важным является тандем linux desktop + rdesktop в виртуальные машины. Причины тому — определенный софт, который зачастую работает только под Windows, или работает под Windows лучше, а также необходимость тестировать всякие виндовые штуки.
Такая конфигурация рабочего стола ставит назойливую проблему — в Windows свои языки и их переключение, в Linux — свои, соответственно постоянно попадаешь в необходимость 3-4 раза переключиться, пока не получится. Тем более, если в Xorg язык выбирается не пооконно, а глобально.
Я решил исследовать эту проблему и решить ее как-то нативно для всех режимов, чтобы русские буквы набирались в окне rdesktop ровно также, как они набираются в окнах Xorg. Постараюсь кратко описать суть и технологию такого решения.
Суть проблемы заключается в том, что технология RDP предполагает передачу сканкодов, а не каких-то конкретных символов. Соответственно в rdesktop есть штатные keymap'ы, которые автоматически выбираются исходя из текущей локали.
Таким образом необходимо:
1. Создать специальную раскладку для Windows, в которой одновременно будут присутствовать как английские, так и русские символы, выбираемые каким-то модификатором.
2. Сделать keymap, который будет передавать русские буквы как сканкод с модификатором. Штатный keymap «ru» сделан так, что он отправляет русские символы как AltGr+сканкод. В нем не хватает только символа "№".
Такие раскладки существуют (например Cyrilock), но ни одной нормально работающей я не нашел, поэтому используя Microsoft Keyboard Layout Creator v1.4 я сделал свою. MKLC собирает dll раскладки и делает ей инсталлятор. На кнопках в ней определены английские символы, русские символы определены как AltGr+кнопка (из цифр определить нужно только 3 — №, остальные передаются корректно).
Для работы нужно два файла:
1. Скачать установщик раскладки, установить ее на Windows и оставить единственной. Если вы будете подключаться не через rdesktop, а через консоль — английский язык работать будет, русские буквы можно набирать через Ctrl-Alt.
В линуксе необходимо положить keymap в глобальный (/usr/share/rdesktop/keymaps) или пользовательский (~/.rdesktop/keymaps) каталог.
Несколько нюансов:
1. В keymap добавлено значение ISO_Next_Group 0x0, чтобы нажатие кнопок переключения языка не передавалось на ту сторону и упомянутый выше знак №.
2. Для справки — у меня переключение осуществляется через Caps Lock, индикатором и пооконным контроллером переключения занимается gxkb.
3. Если вы исправляете раскладку и собираете ее через MKLC — всегда называйте ее по разному и перезагружайте машину, он постоянно цепляет старые версии библиотеки раскладки. Перед перезагрузкой ее лучше всего деинсталлировать.
4. В Windows реальное положение раскладок не всегда соответствует настройкам клавиатуры, иногда там появляются лишние. Верное состояние показывает только панель переключения языка.
5. MKLC зачастую не в состоянии исправить название раскладки, для этого ее надо загрузить из установленных в системе и пересохранить исходный файл.
Ссылки:
1. Инсталлятор готовой раскладки.
2. Keymap rdesktop.
3. Исходник раскладки для MKLC v1.4.
Автор: kab01m