В первую очередь хочу выразить благодарность некоторым личностям с форума, которые натолкнули на мысль включать раскладки левым и правым шифтом и участвовали в обсуждении реализации. Особое спасибо webhamster, debugger и dikiy.
Решение от хомяка (Lolo-switcher) мне по многим причинам не понравилось, поэтому я решил изобрести свой велосипед. Наверно тоже костыльно вышло, и может быть избыточно, но работает исправно.
Итак, принцип включения раскладок: демон + скрипт контролируют скорость нажатия/отпускания клавиши, и если клавиша была нажата/отжата «ударно» (очень быстро), включается нужная раскладка. Я провёл эксперименты и выяснил, что лично для меня и моей клавиатуры быстрое нажатие Shift занимает в среднем 0,08 сек., тогда как то же с использованием шифта как модификатора не менее 0,11. Вот это различие я и решил использовать.
Кстати, мой способ решает проблему, высказанную Диким в обсуждении шифт-шифтов о том, что можно передумать. За десятую долю секунды мало кто успеет передумать :)
Решение кратко: ставим демон слежения за событиями (triggerhappy) в автозагрузку, настраиваем его на левый и правый шифты, настраиваем udev на доступ к устройствам input от пользователя, пишем баш-скриптик для включения раскладок демоном по событию.
Решение детальнее ниже.
В /etc/udev/rules.d/ создал файлик с таким содержанием:
DEVPATH=="*input*", GROUP="devevents"
Установил triggerhappy и в его конфиге прописал следующие правила:
# Переключение раскладок
KEY_LEFTSHIFT 1 /bin/date +%s.%N > /tmp/l_shift_press
KEY_RIGHTSHIFT 1 /bin/date +%s.%N > /tmp/r_shift_press
KEY_LEFTSHIFT 0 /bin/sh /home/uns/make/sh/shift_shift_switcher.sh l
KEY_RIGHTSHIFT 0 /bin/sh /home/uns/make/sh/shift_shift_switcher.sh r
Содержимое shift_shift_switcher.sh (покритикуйте, знаю что неоптимально скорей всего):
#!/bin/sh
Now=$(date +%s.%N)
Press=$(cat /tmp/"$1"_shift_press)
Duration=$(echo "$Now - $Press < 0.1" | bc)
if [ "$1" = l ]
then
Layout='us,ru'
else
Layout='ru,us'
fi
#echo "$Duration $Layout" > /tmp/test
if [ $Duration -eq 1 ]
then
setxkbmap -model evdev -layout $Layout -option -option 'grp:switch'
fi
Как засовывать счастливого демона в автозагрузку писать не буду, это дистроспецифичные вещи.
В общем, посмотрим, я себе сделал так, если вдруг всплывут какие-то глюки, отпишусь. Пока вроде всё неплохо, хотя и тянется палец иногда по старой привычке на другие включалки (капс и правый контрол были раньше). Кстати, на капс теперь хочу повесить escape, и тогда работа в Виме станет ещё удобней.
П.С. Кратко о triggerhappy - очень клёвая штука, удобнейшая. Есть в репах у Debian. В отличие от xbindkeys работает на более низком уровне и поэтому работает «прозрачно» - пропускает нажатия дальше в иксы. В отличие от actkbd может запускаться от пользователя. И в отличие от обоих имеет более простой удобный конфиг. Рекомендую.
П.П.С. Как же ужасно странно и непривычно в баше! 1 - ложь, 0 - истина. Бррр. Ну не должно быть так.