Como a comutação de idioma é implementada no Ubuntu
Por padrão, a fonte de entrada do Ubuntu é definida em um banco de dados chamado gsettings
. Cada configuração tem um esquema específico associado a ela. Em particular, a alternância de idiomas está associada ao org.gnome.desktop.input-sources
schema. Esse é o que estamos interessados em todas as versões modernas do Ubuntu.
Mais especificamente, estamos interessados em sua chave current
. Quando você altera o idioma via GUI, essa chave é modificada. Há muitas coisas que você pode fazer com isso, de alternando o idioma de entrada na linha de comando para definindo atalhos para cada método de entrada , mesmo definindo o método de entrada para cada indivíduo app pode ser feito. Uma maneira de fazer isso é através do comando gsettings
ou dconf
. Estes são programas externos que vivem na sua pasta /usr/bin/
(este é o mesmo método que a resposta de Jacob usa). Outra maneira é através de um conjunto específico de utilitários (API, na verdade) para a linguagem de programação Python. Este é o método que mostrarei na minha resposta.
Deve-se notar que gsettings
nem sempre funciona. Se você estiver usando um método de entrada não padrão, como fcitx
, por exemplo, isso pode não ser verdade. De fato, o sogou-pinyin (método de entrada chinês) usa algo mais conhecido como dbus
, então a abordagem com gsettings
won não funciona. Mas para casos simples em que você tem o Ubuntu padrão, gsettings
database é suficiente.
Detectando alteração do método de entrada
A maneira como Jacob faz isso é através de uma execução única do comando gsettings
externo e modificando atalhos, de tal forma que cada vez que você clica no atalho, o programa é executado. Há outra abordagem, via API Gio
já existente. Esse tipo de API seria usado quando você desenvolve um aplicativo de desktop apropriado para o Ubuntu ou outro sistema que usa o desktop relacionado ao GNOME. O script abaixo ilustra a abordagem com a API Gio
.
#!/usr/bin/env python
from __future__ import print_function
from gi.repository import Gio, GObject
import subprocess
def on_changed(settings, key):
# This will run if specific key of a schema changed
print("Language changed")
# Do something else here, for example call external program
subprocess.call(['xmodmap','-e', 'keycode 52=y'])
subprocess.call(['xmodmap','-e', 'keycode 29=z'])
def main():
# We're focusing on this specific schema
settings = Gio.Settings("org.gnome.desktop.input-sources")
# Once the "current" key changes, on-changed function will run
settings.connect("changed::current", on_changed)
loop = GObject.MainLoop()
loop.run()
if __name__ == "__main__":
main()
Existem vantagens distintas para essa abordagem ao interferir nos atalhos:
- Você não precisa editar os atalhos. Eu não vou exagerar, mas a configuração para esta resposta é apenas fazer o script iniciar automaticamente quando você faz o login . li>
- Como ele usa a API de eventos da GIO, não estamos tagarelando nas configurações duas vezes toda vez que mudamos de idioma. Nós deixamos a mudança de idioma acontecer como sempre teria acontecido. Isso faz com que seja mais rápido e menos intensivo em termos de recursos ao alterar idiomas.
- Como está sempre ouvindo, nunca esperamos que o Python coloque suas calças e carregue um script. Ele carrega uma vez, no login e pronto para alterações.
- Como ele usa a API, qualquer outra outra que altere o idioma de entrada (ícones de menu, gsettings) ativará o evento e, portanto, esse script.
Existem algumas preocupações nos comentários do outro pôster, mas embora este seja um script persistente, ele também trabalha a seu favor. Os escassos recursos que consomem superam em muito o fato de que ele consome uma fração de um percentual de RAM.