Укрощение раскладок с помощью xxkb в awesome (openSUSE 11.2)

приручение xxkb в awesome (openSUSE 11.2)Думаю, никто не будет со мной спорить, что лучшее -- враг хорошего, а к хорошему привыкаешь быстро. Поэтому, перейдя на оконный менеджер awesome, я долгое время испытывал неудобства от отсутствия запоминания клавиатурных раскладок для каждого окна (как это делается, к примеру, в KDE).

Отношения мои с клавиатурой вообще достойны отдельного повествования:

  • сначала я перенёс переключатель раскладок языка на клавишу CapsLock. Это оказалось очень удобно: можно переключить раскладки лёгким движением мизинца, не снимая рук с клавиатуры при слепом наборе
  • потом, для ускорения работы я сделал несколько удобных клавиатурно-мышиных шоткатов с помощью xbindkeys и xvkbd
  • ну и сам переход из KDE в awesome предполагает, что практически всё (манипуляции окнами, рабочими столами и фокусом можно делать без мыши). Практически, мышь используется только в броузере
  • поначалу я использовал xneur, который помимо автоисправления текста делал и автозапоминание тоже. Но глюки xneur в конце концов стали доставать, и я вначале выключил в нём автоисправление, а потом вообще отказался от его использования. Сейчас я уже и не вспомню, но он что-то с клавиатурой делал (уже не помню что :-) , но когда я его выключил, сразу все глюки прекратились)
  • HP Compaq dc5800 Small Form Factorну и наконец, задумался о запоминании раскладки для каждого окна. Надо сказать, что попыток приручить xxkb я предпринял довольно много. Последней каплей оказался переезд на новую рабочую станцию HP Compaq dc5800 Small Form Factor (Core(TM)2 Quad CPU Q9400 @ 2.66GHz, 4ГБ). После того, как я установил на неё openSUSE 11.2 и перенёс все конфиги со старой машины, захотелось ещё "подвигов". Тем более, что все программы на новой машине стали работать гораздо быстрее и безглючнее, чем на старой.
  • Судя по источникам, близким к интернету, организовать запоминание раскладок можно организовать с помощью программы xxkb. Взять её последнюю версию xxkb-1.10 можно здесь (русский автор, однако!). Правда, собрать под мой xorg-7.4 (OpenSUSE 11.2) у меня не получилось:

flycat@dt-0698:~/downloads/x/xxkb-1.10> make
gcc -O2      -I/usr/include    -Dlinux -D_POSIX_C_SOURCE=199309L                                -D_POSIX_SOURCE -D_XOPEN_SOURCE                             -D_BSD_SOURCE -D_SVID_SOURCE                                 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64                                                        -DFUNCPROTO=15 -DNARROWPROTO   -DAPPDEFDIR=\"/usr/share/X11/app-defaults\"     -DPIXMAPDIR=\"/usr/share/xxkb\"    -c -o resource.o resource.c
resource.c:1:22: error: X11/Xlib.h: Нет такого файла или каталога
resource.c:2:27: error: X11/Xresource.h: Нет такого файла или каталога
resource.c:3:23: error: X11/Xutil.h: Нет такого файла или каталога
In file included from resource.c:8:
wlist.h:10: error: expected specifier-qualifier-list before ‘Window’
wlist.h:18: error: expected ‘)’ before ‘w’
wlist.h:19: error: expected ‘)’ before ‘button’
wlist.h:20: error: expected ‘)’ before ‘w’
wlist.h:21: error: expected ‘)’ before ‘w’
... поскипано много-много сообщений об ошибках ....
/usr/include/string.h:127: note: expected ‘const char * __restrict__’ but argument is of type ‘struct <anonymous> *’
resource.c:470: error: request for member ‘addr’ in something not a structure or union
resource.c:470: warning: passing argument 1 of ‘strlen’ from incompatible pointer type
/usr/include/string.h:397: note: expected ‘const char *’ but argument is of type ‘struct <anonymous> *’
make: *** [resource.o] Ошибка 1

Тогда я подумал-подумал и по запросу в Google "xxkb x86_64 rpm" нашёл xxkb-1.11-6.1.x86_64.rpm! Притом, что у разработчика последняя версия -- 1.10! Чудеса, да и только! Тем не менее, программа установилась и после некоторой правки /usr/share/X11/app-defaults/XXkb запустилась. Нужно было отключить вывод индикатора статуса. Но работать всё равно не стала. То есть, в памяти xxkb тихо и незаметно присутствовал, но требуемых действий (сохранение раскладок клавиатуры для каждого окна) не делал.

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

XXkb.controls.add_when_change: yes
XXkb.controls.focusout: yes

И всё заработало! Правда, Firefox и Thunderbird почему-то всё равно сбрасывали раскладку, но главное -- при переключении из консоли (где практически всегда нужна латиница) в kopete (где нужна кириллица) и обратно раскладка оставалась соответствующая: в консоли -- английская, в kopete -- русская, что и требовалось. Привожу конфиг /usr/share/X11/app-defaults/XXkb, работающий у меня в Awesome:

XXkb.image.path: /usr/share/xxkb

XXkb.group.base: 1
XXkb.group.alt: 2

XXkb.mainwindow.enable: no
XXkb.mainwindow.geometry: 48x48
XXkb.mainwindow.image.1: en48.xpm
XXkb.mainwindow.image.2: ru48.xpm
XXkb.mainwindow.image.3: su48.xpm
XXkb.mainwindow.image.4:
XXkb.mainwindow.label.font: -misc-*-r-*-20-*

XXkb.*.border.color: black
XXkb.*.border.width: 0

XXkb.*.label.foreground: white
XXkb.*.label.background: blue4
XXkb.*.label.enable: no

XXkb.button.enable: no

XXkb.button.geometry: 15x15-60+7
XXkb.button.image.1: en15.xpm
XXkb.button.image.2: ru15.xpm
XXkb.button.image.3: su15.xpm
XXkb.button.image.4:
XXkb.button.label.font: -misc-*-r-*-13-*

XXkb.controls.add_when_start: yes
XXkb.controls.add_when_create: yes
XXkb.controls.add_when_change: yes
XXkb.controls.focusout: yes
XXkb.controls.two_state: yes
XXkb.controls.button_delete: yes
XXkb.controls.button_delete_and_forget: yes
XXkb.controls.mainwindow_delete: yes

XXkb.mousebutton.1.reverse: no
XXkb.mousebutton.3.reverse: no

XXkb.bell.enable: no

XXkb.ignore.reverse: no