Using gsettings
It works well with Gnome/Unity Indicator/Layout switch on Ubuntu 13.10 or later.
Run gsettings list-recursively org.gnome.desktop.input-sources
to check your active layouts and input systems.
Problems:
In lock dialog case, it is unable to restore last used keyboard. So after unlock always en
For sudo (Alias)
nano ~/.bashrc
Append this line
alias sudo="sudo_success='' ; last_kbd=`gsettings get org.gnome.desktop.input-sources current | awk '{print $2}'` ; gsettings set org.gnome.desktop.input-sources current 0 ; sudo echo -n && sudo_success='1' ; gsettings set org.gnome.desktop.input-sources current $last_kbd ; test $sudo_success && sudo"
For lock dialog (Proxy)
cd /usr/lib/gnome-screensaver/
sudo mv gnome-screensaver-dialog gnome-screensaver-dialog_orig
sudo nano gnome-screensaver-dialog_proxy
Put this in:
#!/usr/bin/env bash
last_kbd=`gsettings get org.gnome.desktop.input-sources current | awk '{print $2}'`
gsettings set org.gnome.desktop.input-sources current 0
/usr/lib/gnome-screensaver/gnome-screensaver-dialog_orig $@
gsettings set org.gnome.desktop.input-sources current $last_kbd
Fix a link:
sudo chown root:root gnome-screensaver-dialog_proxy
sudo chmod +x root:root gnome-screensaver-dialog_proxy
sudo ln -s gnome-screensaver-dialog_proxy gnome-screensaver-dialog
Old answer using setxkbmap
Use it, only if your layouts is set with setxkbmap
command.
Complete steps are mentioned above. I kept only different steps.
I am using us,ara (English, Arabic), run setxkbmap -query
to check yours.
Problems:
setxkbmap change layout at X level, which does override effective Unity/Gnome layout. Indicator keep showing last layout. Also it breaks some layout switching keyboard shortcuts. To avoid that add your shortcuts options to setxkbmap
command. Example: setxkbmap us,ara -option grp:rshift_toggle -option grp:rctrl_switch
.
In lock dialog case, it is unable to restore last used keyboard.
For sudo
nano ~/.bashrc
Append this line
alias sudo="sudo_success='' ; last_kbd=$(setxkbmap -query | awk 'FNR == 3 {print $2}') ; setxkbmap us,ara ; sudo echo -n && sudo_success='1' ; setxkbmap $last_kbd ; test $sudo_success && sudo"
For lock dialog
nano gnome-screensaver-dialog_proxy
Put this in:
#!/usr/bin/env bash
last_kbd=$(setxkbmap -query | awk 'FNR == 3 {print $2}')
setxkbmap us,ara
/usr/lib/gnome-screensaver/gnome-screensaver-dialog_orig $@
setxkbmap $last_kbd