introduction
Le script ci-dessous définit la langue de chaque programme défini par l'utilisateur, en fonction de la position de cette langue dans le menu des langues. Par exemple, si ma commande est: anglais (1), chinois (2) et russe (3), je peux configurer Firefox pour avoir la langue 2, le terminal pour avoir la langue 1 et LibreOffice pour avoir la langue 3.
Le script est divisé en deux parties: la première partie est le script réel qui fait le travail, le deuxième script sert d'élément de contrôle. L'idée est d'exécuter le script de paramétrage de la langue en tant qu'application de démarrage et chaque fois que vous devez modifier manuellement la langue - double-cliquez sur le raccourci vers le script du contrôleur.
Conditions préalables
- Installez le
wmctrl
programme avec sudo apt-get install wmctrl
.
Scénario
#!/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
Script du contrôleur
#!/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
Fichier de lancement (.desktop) pour le script 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
Fichier de lancement (.desktop) pour 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
Faire fonctionner le script
- Créez un dossier dans votre répertoire personnel appelé
bin
. Vous pouvez le faire dans le gestionnaire de fichiers ou utiliser la commande mkdir $HOME/bin
dans le terminal
- Dans le
bin
dossier, créez deux fichiers: set-lang.sh
et set-lang-control.sh
. Enregistrer le script dans set-lang.sh
et le script du contrôleur dans set-lang-control.sh
. Rendez les deux scripts exécutables avecsudo chmod +x $HOME/bin/set-lang-control.sh $HOME/bin/set-lang.sh
- Créez deux
.desktop
fichiers. L'un est set-lang.desktop
. Doit être placé dans le .config/autostart
répertoire caché . Le second est set-lang-controller.desktop
, peut être placé dans votre bin
dossier. Faites ensuite glisser et épingler au lanceur le set-lang-controller.desktop
fichier. Cela deviendra le raccourci pour arrêter et reprendre temporairement l'exécution du script.
REMARQUE : la ligne Exec=
doit être modifiée pour avoir votre nom d'utilisateur réel dans le chemin d'accès au script (car il s'agit de votre répertoire personnel). Par exemple, le mien seraitExec=/home/serg/bin/set-lang.sh
Explication et personnalisation:
Le script lui-même s'exécute dans une boucle while infinie et vérifie la fenêtre active actuelle. Si la fenêtre active actuelle correspond à l'une des options de la structure de cas, nous basculons vers la langue appropriée. Pour éviter un réglage constant, chaque partie de la structure de cas possède une instruction if qui vérifie si la langue a déjà été définie sur la valeur souhaitée.
Le double-clic sur le lanceur pour set-lang-controller.sh
vérifiera l'état du set-lang.sh
script; si le script est en cours d'exécution - il sera suspendu, et si le script est suspendu, il sera repris. Une notification sera affichée avec le message approprié.
Afin de personnaliser le script, vous pouvez ouvrir les applications souhaitées, exécuter wmctrl -lx
et noter la troisième colonne - la classe de fenêtre. Exemple de sortie:
$ 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
Sélectionnez les classes de fenêtres appropriées pour chaque programme. Ensuite, accédez à la partie du script qui permet la personnalisation et ajoutez deux entrées pour PROG_CLASS et LANG. Ajoutez ensuite l'entrée appropriée dans la structure de cas.
Par exemple, si je veux ajouter, LibreOffice's Writer, j'ouvre la fenêtre de LibreOffice Writer, vais dans le terminal et je lance wmctrl -lx
. Il me dira que la fenêtre Writer a une classe libreoffice.libreoffice-writer
. Ensuite, je vais aller au script, ajouter PROG_CLASS_4=libreoffice.libreoffice-writer
et LANG4=3
dans la zone appropriée. Remarquez le numéro 4 correspondant. Ensuite, accédez à la structure de cas et ajoutez l'entrée suivante entre le dernier ;;
et le esac
:
$PROG_CLASS_4)
if [ $CURRENT -ne $LANG4 ];then
gsettings set org.gnome.desktop.input-sources current $LANG4
fi
;;
Encore une fois, notez le signe $ et le numéro correspondant 4.
De plus, si le script s'exécute en tant qu'élément de démarrage automatique et que vous souhaitez l'arrêter temporairement pour le personnaliser, utilisez pkill set-lang.sh
et reprenez avecnohup set-lang.sh > /dev/null 2&>1 &
Petite note: une autre façon de découvrir la classe de fenêtre pour un programme (ce truc qui va avant le crochet rond unique dans la structure du boîtier) est d'utiliser ceci xprop
et awk
oneliner:xprop | awk '/WM_CLASS/ {gsub(/"/," "); print $3"."$5}