Настройка средств ввода или "Как в каменном веке 2" | автор: gentoo user | 20 августа 2010
Категория: GNU/Linux
На дворе шёл 2010 год. Линукс стремительно захватывал десктопы, неумолимо приближая священный "вендекапец" — представители красноглазой секты вот уже 7 лет празднуют год Линукса на десктопе [1]. Современная архитектура, идеальная поддержка оборудования и простота настройки под свои нужды сделали своё дело: доля линукса на компьютерах всё же хоть и меньше, чем 1% [2], но лет через 100-150 обязательно пронзит небеса!
То все была присказка, сказка будет впереди. Довелось мне, в общем, как-то купить шикарнейшую клавиатуру…
И не абы какую, а Microsoft Natural Ergonomic Keyboard 4000. Всем известно, что MS делает потрясающие мыши и клавиатуры, так вот и эта не исключение: руки лежат в родном для них положении, имеется удобная подставка под запястья, клавиши большие, в общем, всё просто супер. Для поддержки этой клавиатуры оказывается достаточным прописать в конфиге /etc/X11/xorg.conf
Ну что же, будем решать. Решение оказывается изумительно простым и изящным: скачиваем исходники ядра, настраиваем его под себя (это занимает минут 40, не больше), после чего необходимо пропатчить, то есть изменить подправить один заголовочный файл. Открываем в любом текстовом редакторе /usr/src/linux-<версия>/include/linux/input.h и меняем следующие строки (знаком минус отмечено что удалить, знаком плюс что вставить, остальные нужны для лучшей ориентации):
После перезагрузки (если, конечно, правильно настроили ядро), с помощью утилиты xev можем убедиться, что данные клавиши, наконец, заработали. Обидно, правда, что хоть этот баг и датирован 2007 годом, он до сих пор в состоянии "New", что означает, что никто толком так за него и не брался. Ну ладно, может какой-нибудь Red Hat надавит на разработчиков и через пару лет всё исправят. Будем надеяться, по крайней мере.
Раз уж начали ковыряться в системе, то почему бы сразу не настроить переключалку раскладки? Вообще, лично я считаю, что переключаться двумя клавишами крайне неудобно, именно поэтому всё время использовал Caps Lock для этих целей. Xorg, конечно, предоставляет такую возможность, но только если им поддерживаются наши раскладки. Ох, беда, мне, как на зло, нужна японская, которая поддерживается только сторонними программами, называемыми Input Framework. Работает это следующим образом: при переключении на яп. раскладку набираем по-английски "konnichiha" (яп. "здравствуйте"), на экране видим こんにちは, записанное слоговой азбукой, для того чтобы конвертировать написанное в иероглифы нужно нажать пробел: 今日は. Вот такая нехитрая письменность. Помимо этой проблемы, существует ещё одна: текстовый редактор Emacs, написанный бессменным лидером движения Open Source, Ричардом Столлманом, почему-то имеет свою независимую переключалку, которую никак не повесишь на капс. Что же делать?
На ум приходит одно довольно хитрое решение: встроенную иксовую переключалку полностью выключить, переключать только средствами ibus (тот самый Input Framework), настроив в нём английский, русский и японский языки. Причём, если хотим переключать по капсу, то нужно применить довольно грязный трюк: поменяем местами Caps Lock и какую-нибудь уже имеющуюся клавишу. Например, у нас в системе зарегистрирована некая F13, которой, очевидно, нет на клавиатуре. Раньше для этого применялась маленькая утилита xmodmap, но в последних версия иксового сервера всё, как обычно, поломали и она ни черта не работает! После где-то часа поисков (инфы на русском практически нет, зато можно на халяву подтянуть знание английского), я узнаю что славная xmodmap объявлена deprecated (устаревшей), нужно использовать xkbcomp. Примеров использования, к несчастью, на тот момент не было, нужно было ковырять те готовые шаблоны, что идут с ним в комплекте. После изучения и мучительной пробы, наконец, получилось заставить всё это работать! Итак, в домашнем каталоге создаём директорию ".xkb", в ней две "keymaps" и "symbols", в обе кладём текстовый файл "xkbext" со следующим содержанием:
файл ~/.xkb/keymaps/xkbext
На дворе шёл 2010 год, вендекапец был близок как никогда.
[1] http://alexmak.net/blog/2009/11/27/market-rejected-desktop-linux/
[2] http://www.netmarketshare.com/operating-system-market-share.aspx?qprid=11&qpcustom=linux&qpcal=1&qpcal=1&qpcal=1&qpcal=1&qptimeframe=M&qpsp=127&qpnp=13
[3] https://bugs.freedesktop.org/show_bug.cgi?id=11227
Внимание, читатель! У автора 3 года опыта работы под Gentoo linux, он ещё не с тем сталкивался. Поэтому не пытайтесь повторить вышеизложенное дома — в результате Ваших действий, Ваша система может выйти из строя. Вы были предупреждены!
Прочитано 19946 раз и оставлено 620 комментариев.
На дворе шёл 2010 год. Линукс стремительно захватывал десктопы, неумолимо приближая священный "вендекапец" — представители красноглазой секты вот уже 7 лет празднуют год Линукса на десктопе [1]. Современная архитектура, идеальная поддержка оборудования и простота настройки под свои нужды сделали своё дело: доля линукса на компьютерах всё же хоть и меньше, чем 1% [2], но лет через 100-150 обязательно пронзит небеса!
То все была присказка, сказка будет впереди. Довелось мне, в общем, как-то купить шикарнейшую клавиатуру…
И не абы какую, а Microsoft Natural Ergonomic Keyboard 4000. Всем известно, что MS делает потрясающие мыши и клавиатуры, так вот и эта не исключение: руки лежат в родном для них положении, имеется удобная подставка под запястья, клавиши большие, в общем, всё просто супер. Для поддержки этой клавиатуры оказывается достаточным прописать в конфиге /etc/X11/xorg.conf
Section "InputDevice"Почему 7000, спросите Вы? Да какая Вам разница, работает же, это главное. После этого клавиатура начинает нормально работать, одна только проблема: не работают некоторые функциональные клавиши, да и слайдер в середине, что весьма и весьма огорчает. Пытаемся разобраться почему. После не очень продолжительного поиска выясняется, что многие современные клавиатуры при нажатии клавиши посылают числовой код, больший 255, а современный X-сервер такого не понимает [3].
Identifier "Keyboard0"
Driver "kbd"
Option "CoreKeyboard"
Option "XkbRules" "xorg"
Option "XkbModel" "microsoft7000"
EndSection
Ну что же, будем решать. Решение оказывается изумительно простым и изящным: скачиваем исходники ядра, настраиваем его под себя (это занимает минут 40, не больше), после чего необходимо пропатчить, то есть изменить подправить один заголовочный файл. Открываем в любом текстовом редакторе /usr/src/linux-<версия>/include/linux/input.h и меняем следующие строки (знаком минус отмечено что удалить, знаком плюс что вставить, остальные нужны для лучшей ориентации):
Примерно на 520 строке:После как обычно собираем и устанавливаем ядро (компиляция будет минут 20-30, не больше). Слава богу, у меня стоит Gentoo, где его очень просто установить (двумя командами), в какой-нибудь убунте для этого необходимо генерировать пакет, интегрировать его в систему, причём предварительно стоит позаботиться о свежесгенерированном initrd… В общем, мне повезло, сэкономил минут 20.
#define KEY_TWEN 0x19f
#define KEY_VIDEOPHONE 0x1a0 /* Media Select Video Phone */
#define KEY_GAMES 0x1a1 /* Media Select Games */
-#define KEY_ZOOMIN 0x1a2 /* AC Zoom In */
-#define KEY_ZOOMOUT 0x1a3 /* AC Zoom Out */
+#define KEY_ZOOMIN 0x0f6 /* AC Zoom In == 246 */
+#define KEY_ZOOMOUT 0x0f7 /* AC Zoom Out == 247 */
#define KEY_ZOOMRESET 0x1a4 /* AC Zoom */
#define KEY_WORDPROCESSOR 0x1a5 /* AL Word Processor */
#define KEY_EDITOR 0x1a6 /* AL Text Editor */
Примерно на 534 строке:
#define KEY_ADDRESSBOOK 0x1ad /* AL Contacts/Address Book */
#define KEY_MESSENGER 0x1ae /* AL Instant Messaging */
#define KEY_DISPLAYTOGGLE 0x1af /* Turn display (LCD) on and off */
-#define KEY_SPELLCHECK 0x1b0 /* AL Spell Check */
+#define KEY_SPELLCHECK 0x0eb /* AL Spell Check == 235 */
#define KEY_LOGOFF 0x1b1 /* AL Logoff */
После перезагрузки (если, конечно, правильно настроили ядро), с помощью утилиты xev можем убедиться, что данные клавиши, наконец, заработали. Обидно, правда, что хоть этот баг и датирован 2007 годом, он до сих пор в состоянии "New", что означает, что никто толком так за него и не брался. Ну ладно, может какой-нибудь Red Hat надавит на разработчиков и через пару лет всё исправят. Будем надеяться, по крайней мере.
Раз уж начали ковыряться в системе, то почему бы сразу не настроить переключалку раскладки? Вообще, лично я считаю, что переключаться двумя клавишами крайне неудобно, именно поэтому всё время использовал Caps Lock для этих целей. Xorg, конечно, предоставляет такую возможность, но только если им поддерживаются наши раскладки. Ох, беда, мне, как на зло, нужна японская, которая поддерживается только сторонними программами, называемыми Input Framework. Работает это следующим образом: при переключении на яп. раскладку набираем по-английски "konnichiha" (яп. "здравствуйте"), на экране видим こんにちは, записанное слоговой азбукой, для того чтобы конвертировать написанное в иероглифы нужно нажать пробел: 今日は. Вот такая нехитрая письменность. Помимо этой проблемы, существует ещё одна: текстовый редактор Emacs, написанный бессменным лидером движения Open Source, Ричардом Столлманом, почему-то имеет свою независимую переключалку, которую никак не повесишь на капс. Что же делать?
На ум приходит одно довольно хитрое решение: встроенную иксовую переключалку полностью выключить, переключать только средствами ibus (тот самый Input Framework), настроив в нём английский, русский и японский языки. Причём, если хотим переключать по капсу, то нужно применить довольно грязный трюк: поменяем местами Caps Lock и какую-нибудь уже имеющуюся клавишу. Например, у нас в системе зарегистрирована некая F13, которой, очевидно, нет на клавиатуре. Раньше для этого применялась маленькая утилита xmodmap, но в последних версия иксового сервера всё, как обычно, поломали и она ни черта не работает! После где-то часа поисков (инфы на русском практически нет, зато можно на халяву подтянуть знание английского), я узнаю что славная xmodmap объявлена deprecated (устаревшей), нужно использовать xkbcomp. Примеров использования, к несчастью, на тот момент не было, нужно было ковырять те готовые шаблоны, что идут с ним в комплекте. После изучения и мучительной пробы, наконец, получилось заставить всё это работать! Итак, в домашнем каталоге создаём директорию ".xkb", в ней две "keymaps" и "symbols", в обе кладём текстовый файл "xkbext" со следующим содержанием:
файл ~/.xkb/keymaps/xkbext
xkb_keymap {файл ~/.xkb/symbols/xkbext
xkb_keycodes { include "xfree86+aliases(qwerty)" };
xkb_types { include "complete" };
xkb_compat { include "complete" };
xkb_symbols { include "pc+us+inet(microsoft7000)+xkbext(emacs)" };
xkb_geometry { include "microsoft(natural)" };
};
partial modifier_keysКак можно заметить, помимо привязки Caps Lock, ещё выполнен ряд переназначений модификаторов — с ними становится гораздо проще работать в Emacs. Для автоматической подгрузки всего этого безобразия, в ~/.xinitrc прописываем:
xkb_symbols "emacs" {
key <RALT> { [ Hyper_R, Hyper_R ] };
key <MENU> { [ Super_R, Super_R ] };
key <CAPS> { [ F13 ] };
modifier_map Mod3 { Hyper_L, Hyper_R };
};
export XMODIFIERS="@im=ibus"Первые строчки нужны для нормальный работы ibus, последняя для применения нашей модифицированной раскладки. Настраиваем вышеупомянутый ibus на F13 (переключение англ. <-> дополнительная через F13, переключение дополнительной рус. <-> яп. по Alt+F13) и вспоминаем про emacs с его обособленной переключалкой: ох, блин! Можно, конечно, оставить всё как есть, но тогда при наборе на русской или японской раскладке, ни один hotkey работать не будет (а всё управление редактором именно с помощью них). Решение находится довольно быстро: в файл ~/.Xdefaults добавляется строка "emacs*useXIM: false", в конфиг Emacs, расположенный в ~/.emacs.d/init.el, следующее:
export GTK_IM_MODULE="ibus"
export QT_IM_MODULE="ibus"
ibus-daemon -d -x
xkbcomp -I$HOME/.xkb $HOME/.xkb/keymaps/xkbext $DISPLAY 2>/dev/null
(global-set-key (kbd "<f13>")Ну слава богу! Теперь раскладка в любой программе переключается по Caps Lock и есть поддержка японского ввода! Жаль, половину дня, правда, потерял… Но вот единственное за что действительно боюсь, так это то, что при следующем обновлении всё с довольно высокой вероятностью может запросто слететь, придётся настраивать всё вновь.
(lambda ()
(interactive)
(if (equal current-input-method 'nil)
(set-input-method "russian-computer")
(inactivate-input-method))))
(global-set-key (kbd "M-<f13>")
(lambda ()
(interactive)
(set-input-method "japanese-anthy")))
(add-hook 'isearch-mode-hook
(lambda ()
(define-key isearch-mode-map (kbd "<f13>") 'isearch-toggle-layout)))
(defun toggle-specified-isearch-input-method (new-input-method)
(interactive)
(let ((overriding-terminal-local-map nil)))
(if (eq new-input-method 'nil)
(inactivate-input-method)
(set-input-method new-input-method))
(setq isearch-input-method-function input-method-function
isearch-input-method-local-p t)
(setq input-method-function nil)
(isearch-update))
(defun isearch-toggle-layout ()
(interactive)
(if (equal current-input-method 'nil)
(toggle-specified-isearch-input-method "russian-computer")
(toggle-specified-isearch-input-method nil)))
На дворе шёл 2010 год, вендекапец был близок как никогда.
[1] http://alexmak.net/blog/2009/11/27/market-rejected-desktop-linux/
[2] http://www.netmarketshare.com/operating-system-market-share.aspx?qprid=11&qpcustom=linux&qpcal=1&qpcal=1&qpcal=1&qpcal=1&qptimeframe=M&qpsp=127&qpnp=13
[3] https://bugs.freedesktop.org/show_bug.cgi?id=11227
Внимание, читатель! У автора 3 года опыта работы под Gentoo linux, он ещё не с тем сталкивался. Поэтому не пытайтесь повторить вышеизложенное дома — в результате Ваших действий, Ваша система может выйти из строя. Вы были предупреждены!
ВНИМАНИЕ !
Возможно что-то уже неактуально. Обращайте внимание на даты !
Эта статья опубликована 20 августа 2010-го года !
Прочитано 19946 раз и оставлено 620 комментариев.
#1.Бродяга