05.11.2012, 13:44
|
#1 (ссылка на пост)
|
Инквизитор
Регистрация: 29.01.2008
Адрес: Омск
Сообщений: 2,304
|
BASH - Переключение раскладки клавиатуры
Бывают случаи, когда необходимо, чтобы при запуске той или иной программы в системе стояла определённая раскладка клавиатуры. Например это актуально для xfreerdp, где бывает путаница с раскладками (в системе русская, а сессия использует английскую раскладку клавиатуры). Чтобы этого избежать, написал небольшой скрипт без применения сторонних утилит и perl-скриптов. Скрипт был проверен на Ubuntu/Kubuntu 12.04 и 12.10
Код:
|
kbd=`xset -q | grep LED | awk '{print $10}' | cut -c 5`
while [ $kbd -ne 0 ]
do
echo $kbd
setxkbmap -layout 'us' && setxkbmap -layout 'us,ru' -option 'grp:ctrl_shift_toggle' >/dev/null 2>&1 &
sleep 2
kbd=`xset -q | grep LED | awk '{print $10}' | cut -c 5`
done
echo "EN" |
Описание
Скрипт возвращает в переменную kbd "0" (если выбрана дефолтная раскладка - у меня EN) или "1" (если выбрана вторая раскладка RU). Затем проверяется условие, у меня проверяется выбрана ли дефолтная раскладка (EN), если раскладка соответствует - скрипт возвращает эхо "EN" и уходит в стоп. Если же условие не выполняется то переменная передаётся в тело цикла и происходит переопределение раскладок клавиатуры и комбинация смены раскладок, в результате чего раскладка становится английской. Цикл создан из- за того, что не всегда успевает отработать переопределение (таймауты). Цикл позволяет дождаться смены раскладки и уйти в стоп. Залипания цикла не произойдёт.
Расписал для того, чтобы новичкам было проще подстроить скрипт под себя и свои нужды (у кого-то дефолтная раскладка RU, у кого-то более двух раскладок, у кого-то раскладка меняется не по Ctrl+Shift и т.д.)
|
|
|
|
12.11.2012, 13:44
|
#2 (ссылка на пост)
|
Ламер
Регистрация: 12.11.2012
Сообщений: 4
Информация
|
Поблагодарил: 1
Поблагодарили 0 раз в 0 сообщениях
|
|
То что было нужно, но не работает При русской раскладке уходит в бесконечный цикл (если запустить скриптом в терминале - сыпятся 1), при английской - работает
Ubuntu 12.04 (64-bit).
|
|
|
|
12.11.2012, 18:02
ТС
|
#3 (ссылка на пост)
|
Инквизитор
Регистрация: 29.01.2008
Адрес: Омск
Сообщений: 2,304
|
Сообщение от Airvikar
|
То что было нужно, но не работает При русской раскладке уходит в бесконечный цикл (если запустить скриптом в терминале - сыпятся 1), при английской - работает
Ubuntu 12.04 (64-bit).
|
Хм, у меня такое было (скрипт отрабатывал только в en-раскладке), когда я пытался реализовать вот так:
Код:
|
kbd=`xset -q | grep LED | awk '{print $10}' | cut -c 5`
echo $kbd
if [ $kbd = 0 ]; then
setxkbmap -layout 'us' && setxkbmap -layout 'us,ru' -option 'grp:ctrl_shift_toggle' >/dev/null 2>&1 &
echo "EN"
else
setxkbmap -layout 'us' && setxkbmap -layout 'us,ru' -option 'grp:ctrl_shift_toggle' >/dev/null 2>&1 &
sleep 5
xdotool key 'ctrl+shift'
echo "RU->EN"
fi |
Попробуй так, может тебе поможет... Тут тупо происходит переопределение лэйоутов и эмуляция нажатия контр+шифт.
|
|
|
Этот пользователь сказал Спасибо MiraMaX166 за это полезное сообщение:
|
|
|
12.11.2012, 19:09
|
#4 (ссылка на пост)
|
Ламер
Регистрация: 12.11.2012
Сообщений: 4
Информация
|
Поблагодарил: 1
Поблагодарили 0 раз в 0 сообщениях
|
|
Сообщение от MiraMaX166
|
Попробуй так, может тебе поможет... Тут тупо происходит переопределение лэйоутов и эмуляция нажатия контр+шифт.
|
Да, скрипт сработал, только застопорился на 10 строке (xdotool key 'ctrl+shift'), ну это у меня xdotool не установлен.
Спасибо!
|
|
|
|
12.11.2012, 20:13
ТС
|
#5 (ссылка на пост)
|
Инквизитор
Регистрация: 29.01.2008
Адрес: Омск
Сообщений: 2,304
|
Рад был помочь
|
|
|
|
03.12.2012, 19:37
ТС
|
#6 (ссылка на пост)
|
Инквизитор
Регистрация: 29.01.2008
Адрес: Омск
Сообщений: 2,304
|
Последняя версия скрипта:
Код:
|
kbd=`xset -q | grep LED | awk '{print $10}' | cut -c 5`
echo $kbd
if [ $kbd = 0 ]; then
echo "EN"
else
sleep 5
xdotool key 'ctrl+shift'
echo "RU->EN"
fi |
Если раскладка меняется не по нажатию Ctrl+Shift - замените 'ctrl+shift' в строке "xdotool key 'ctrl+shift'" на соответствующее значение.
В данной версии скрипта убрано взаимодействие с лэйоутами, переключение осуществляется эмуляцией нажатия клавиш смены раскладки. Думаю, так будет правильней.
|
|
|
|
13.12.2012, 20:15
ТС
|
#7 (ссылка на пост)
|
Инквизитор
Регистрация: 29.01.2008
Адрес: Омск
Сообщений: 2,304
|
Привожу последний пример переключения раскладки клавиатуры. Работа с лэйоутами отсутствует, пожалуй, это самый функциональный и безгеморный способ...
Код:
|
kbd=`xset -q | grep LED | awk '{print $10}' | cut -c 5`
echo $kbd
if [ $kbd = 0 ]; then
echo "EN"
else
xdotool key ISO_Next_Group
echo "RU->EN"
fi |
Единственный недостаток - работает безотказно с двумя раскладками клавиатуры, для решения с неколькими раскладками нужно поиграться со строкой "xdotool key ISO_Next_Group", меняем ISO_Next_Group на ISO_Prev_Group, ISO_First_Group или ISO_Last_Group в зависимости от необходимого результата...
Тему закрывать не буду - вдруг понадобится помощь, а по сабжу всё разжёвано и в нескольких вариантах...
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Текущее время: 23:30. Часовой пояс GMT +6.
|
|