Вступ
Нижче сценарій встановлює мову для кожної визначеної користувачем програми відповідно до положення цієї мови в мовному меню. Наприклад, якщо моє замовлення: англійська (1), китайська (2) та російська (3), я можу встановити Firefox на мові 2, терміналі на мові 1 та LibreOffice на мові 3.
Сценарій складається з двох частин: перша частина - це власне сценарій, який виконує завдання, другий сценарій виконує функції керуючого елемента. Ідея полягає у тому, щоб запустити сценарій налаштування мови як додаток для запуску, і коли вам потрібно вручну змінити мову - двічі клацніть ярлик до сценарію контролера.
Попередні реквізити
- Встановити
wmctrl
програму за допомогою sudo apt-get install wmctrl
.
Сценарій
#!/bin/sh
# Author: Serg Kolo
# Date: August 4, 2015
# Description: This script forces assigned input languages
# for specific windows
# Version:2
# Use this part to set programs and their respective languages
# PROG_CLASS or a running window can be found with the
# wmctrl -lx command
# If you want to add another program to the list,
# follow the template PROG_CLASS_num=window.Class
# and bellow that $LANGnum=num
PROG_CLASS_1=gedit.Gedit
LANG1=2
PROG_CLASS_2=gnome-terminal-server.Gnome-terminal
LANG2=0
PROG_CLASS_3=Navigator.Firefox
LANG3=1
# While loop below gets the job done.
# If you need to send languages for more programs - copy
# the first entry and replace $PROG_CLASS_1 with $PROG_CLASS_num
# where num is respective number of a program
# Replace $LANGnum with the respective language number. After the "="
# post positional number of the language you want to use.
# Remember the count starts from 0
while [ 1 ];do
WM_CLASS=$(wmctrl -lx | awk -v search=$(printf %x $(xdotool getactivewindow)) '{ if($1~search) print $3 }' )
CURRENT=$(gsettings get org.gnome.desktop.input-sources current| awk '{print $2}')
case $WM_CLASS in
$PROG_CLASS_1)
if [ $CURRENT -ne $LANG1 ];then
gsettings set org.gnome.desktop.input-sources current $LANG1
fi
;;
$PROG_CLASS_2)
if [ $CURRENT -ne $LANG2 ];then
gsettings set org.gnome.desktop.input-sources current $LANG2
fi
;;
$PROG_CLASS_3)
if [ $CURRENT -ne $LANG3 ];then
gsettings set org.gnome.desktop.input-sources current $LANG3
fi
;;
esac
sleep 0.250
done
Сценарій контролера
#!/bin/sh
# set -x
# Author: Serg Kolo
# Date: August 8, 2015
# Description: Controller script for set-lang.sh script
# Allows pausing and resuming execution of set-lang.sh
STATUS=$(ps -o stat -p $(pgrep -o set-lang.sh) | awk '{getline;print }')
case $STATUS in
T) kill -CONT $(pgrep set-lang.sh)
notify-send 'RESUMED'
;;
S) kill -STOP $(pgrep set-lang.sh)
notify-send 'STOPED'
;;
*) exit ;;
esac
Файл запуску (.desktop) для сценарію set-lang.sh
[Desktop Entry]
Name=set-lang.sh
Comment=Script to set languages
Exec=/home/yourusername/bin/set-lang.sh
Type=Application
StartupNotify=true
Terminal=false
Файл запуску (.desktop) для set-lang-controller.sh
[Desktop Entry]
Name=lang-control
Comment=Shortcut to controlling script
Exec=/home/yourusername/bin/set-lang-control.sh
Type=Application
StartupNotify=true
Terminal=false
Здійснення роботи сценарію
- Створіть папку в домашньому каталозі під назвою
bin
. Ви можете це зробити в файловому менеджері або використовувати команду mkdir $HOME/bin
в терміналі
- У
bin
папці створіть два файли: set-lang.sh
і set-lang-control.sh
. Збережіть скрипт set-lang.sh
і сценарій контролера в set-lang-control.sh
. Зробіть обидва сценарії виконуваними за допомогоюsudo chmod +x $HOME/bin/set-lang-control.sh $HOME/bin/set-lang.sh
- Створіть два
.desktop
файли. Один є set-lang.desktop
. Потрібно розмістити в прихованому .config/autostart
каталозі. Другий - set-lang-controller.desktop
може бути розміщений у вашій bin
папці. Далі перетягніть і зафіксуйте set-lang-controller.desktop
файл запуску . Це стане ярликом для тимчасової зупинки та відновлення виконання сценарію.
Зверніть увагу, що рядок Exec=
повинен бути змінений, щоб у вашому фактичному імені користувача було вказано шлях до сценарію (адже це ваш фактичний домашній каталог). Наприклад, моя була бExec=/home/serg/bin/set-lang.sh
Пояснення та налаштування:
Сам скрипт працює в нескінченному циклі і перевіряє поточне активне вікно. Якщо поточне активне вікно відповідає одному з варіантів структури справи, ми переходимо на відповідну мову. Щоб уникнути постійного налаштування, у кожній частині структури корпусу є оператор if, який перевіряє, чи для мови вже встановлено потрібне значення.
Подвійне клацання на панелі запуску set-lang-controller.sh
перевірить стан set-lang.sh
сценарію; якщо сценарій запущений - він буде призупинено, а якщо сценарій призупинено, він буде відновлений. Повідомлення буде показано з відповідним повідомленням.
Для того, щоб налаштувати сценарій, ви можете відкрити потрібні програми (програми), запустити wmctrl -lx
та помітити третій стовпець - клас вікна. Вибірка зразка:
$ wmctrl -lx | awk '$4="***" {print}'
0x02c00007 0 gnome-terminal-server.Gnome-terminal *** Terminal
0x03a0000a 0 desktop_window.Nautilus *** Desktop
0x04a00002 0 N/A *** XdndCollectionWindowImp
0x04a00005 0 N/A *** unity-launcher
0x04a00008 0 N/A *** unity-panel
0x04a0000b 0 N/A *** unity-dash
0x04a0000c 0 N/A *** Hud
0x012000a6 0 Navigator.Firefox *** unity - Assign default keyboard language per-application - Ask Ubuntu - Mozilla Firefox
Виберіть відповідні класи вікон для кожної програми. Далі перейдіть до тієї частини сценарію, яка дозволяє налаштувати, та додайте два записи для PROG_CLASS та LANG. Далі додайте відповідний запис у структуру регістру.
Наприклад, якщо я хочу додати, LibreOffice's Writer, я відкриваю вікно LibreOffice Writer, переходжу до терміналу і запускаю wmctrl -lx
. Він скаже мені, що у вікні Writer є клас libreoffice.libreoffice-writer
. Далі я перейду до сценарію, додаю PROG_CLASS_4=libreoffice.libreoffice-writer
і LANG4=3
у відповідній області. Помітьте відповідне число 4. Далі перейдіть до структури справ та додайте наступний запис між останнім ;;
та esac
:
$PROG_CLASS_4)
if [ $CURRENT -ne $LANG4 ];then
gsettings set org.gnome.desktop.input-sources current $LANG4
fi
;;
Знову помітьте знак $ та відповідне число 4.
Крім того, якщо сценарій працює як елемент автозапуску, і ви хочете тимчасово зупинити його, щоб налаштувати його, використовуйте pkill set-lang.sh
та відновіть ізnohup set-lang.sh > /dev/null 2&>1 &
Невелика примітка: ще один спосіб дізнатися клас вікна для програми (той матеріал, який знаходиться перед однією круглою дужкою у структурі випадку) - використовувати цей xprop
та awk
oneliner:xprop | awk '/WM_CLASS/ {gsub(/"/," "); print $3"."$5}