web-dev-qa-db-fra.com

Comment lancer l'exécution automatique de commandes sur un commutateur de disposition du clavier?

Je veux exécuter les commandes suivantes:

xmodmap -e "keycode 52=y"
xmodmap -e "keycode 29=z"

chaque fois que je change la disposition de mon clavier (Shift+Alt). Y'a-t'il un quelconque moyen d'y arriver?

Comment la commutation de langue est mise en œuvre sur Ubuntu

Par défaut, la source d'entrée d'Ubuntu est définie dans une base de données appelée gsettings. Chaque paramètre est associé à un schéma spécifique. En particulier, la commutation de langue est associée au schéma org.gnome.desktop.input-sources. C’est celui qui nous intéresse pour toutes les versions modernes d’Ubuntu.

Plus spécifiquement, nous nous intéressons à sa clé current. Lorsque vous changez de langue via l'interface graphique, cette clé est modifiée. Vous pouvez faire beaucoup de choses avec, de changer de langue d’entrée en ligne de commande à définir des raccourcis pour chaque méthode de saisie , voire définir une méthode de saisie pour chaque personne). app peut être fait. Une façon de le faire consiste à utiliser la commande gsettings ou la commande dconf. Ce sont des programmes externes qui résident dans votre dossier /usr/bin/ (c'est la même méthode que celle utilisée par la réponse de Jacob). Une autre manière consiste à utiliser un ensemble spécifique d’utilitaires (en réalité les API) pour le langage de programmation Python. C'est la méthode que je vais montrer dans ma réponse.

Il est à noter que gsettings ne fonctionne pas toujours. Si vous utilisez une méthode d'entrée non standard, telle que fcitx par exemple, il se peut que cela ne soit pas vrai. En fait, sogou-pinyin (méthode de saisie en chinois) utilise quelque chose d'autre appelé dbus, donc l'approche avec gsettings ne fonctionnera pas. Mais dans le cas simple où vous avez Ubuntu par défaut, la base de données gsettings est suffisante.

Détecter le changement de méthode d'entrée

Jacob utilise une seule commande externe gsettings et modifie des raccourcis, de sorte que le programme s'exécute chaque fois que vous cliquez dessus. Il existe une autre approche, via l'API Gio déjà existante. Ce type d'API serait utilisé lorsque vous développez une application de bureau appropriée pour Ubuntu ou un autre système utilisant un bureau lié à GNOME. Le script ci-dessous illustre l'approche avec l'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 __== "__main__":
  main()

Cette approche présente des avantages distincts par rapport à l’interférence des raccourcis:

  • Vous n'êtes pas obligé de modifier les raccourcis. Je ne vais pas exagérer cela, mais la configuration de cette réponse consiste simplement à créer le script démarre automatiquement lorsque vous vous connectez .
  • Comme elle utilise l'API d'événement GIO, nous ne retenons pas gsettings deux fois à chaque changement de langue. Nous avons laissé le changement de langue se produire comme il l'aurait toujours fait. Cela le rend plus rapide et moins gourmand en ressources lors du changement de langue.
  • Comme nous sommes toujours à l’écoute, nous n’attendons jamais que Python enfile son pantalon et charge un script. Il se charge une fois, lors de la connexion, puis il est prêt pour les modifications.
  • Parce qu'il utilise l'API, tout élément qui change la langue de saisie (icônes de menu, gsettings) déclenchera l'événement et donc ce script.

Il y a quelques inquiétudes dans les commentaires de l’autre affiche mais bien qu’il s’agisse d’un script persistant, il joue également en sa faveur. Les maigres ressources qu'elle consomme l'emportent largement sur le fait qu'il consommera une fraction de un pour cent de la mémoire vive.

10
Sergiy Kolodyazhnyy

Un fichier en cours d'exécution?

Je crains que le changement de source ne soit une fonction intégrée de Unity, qui n’est pas disponible en option client de l’extérieur. Cependant , cela ne signifie pas que nous ne disposons d'aucune option pour réaliser exactement ce que vous voulez.

Solution scriptée pour combiner le changement de disposition avec votre commande

Remplacement du raccourci d'origine

Les sources d'entrée peuvent être récupérées par la commande:

gsettings get org.gnome.desktop.input-sources sources

La sortie ressemble à:

[('xkb', 'us+intl'), ('xkb', 'us'), ('xkb', 'nl'), ('xkb', 'be')]

La mise en page peut être définie avec la commande:

gsettings set org.gnome.desktop.input-sources current <index> 

De cette façon, nous pouvons remplacer le raccourci clavier par une version scriptée pour passer à la langue suivante et exécuter votre commande de la même manière. temps.

Le scénario

#!/usr/bin/env python3
import subprocess
import ast
import sys

arg = sys.argv[1]

key = "org.gnome.desktop.input-sources"

def get(cmd): return subprocess.check_output(cmd).decode("utf-8")

def run(cmd): subprocess.call(["/bin/bash", "-c", cmd])

langs = len(ast.literal_eval(get(["gsettings", "get", key, "sources"])))
currlang = int(get(["gsettings", "get", key, "current"]).split()[-1].strip())

if arg == "+":
    next_lang = currlang+1 if currlang < langs-1 else 0
Elif arg == "-":
    next_lang = currlang-1 if currlang > 0 else langs-1

for cmd in [
    "gsettings set "+key+" current "+str(next_lang),
    'xmodmap -e "keycode 52=y"',
    'xmodmap -e "keycode 29=z"',
    ]: run(cmd)

Installer

  1. Copiez le script dans un fichier vide, enregistrez-le sous le nom change_lang.py
  2. Test - lancez le script avec la commande:

    python3 /path/to/change_lang.py +
    

    et éventuellement:

    python3 /path/to/change_lang.py -
    

    Votre mise en page devrait changer et vos commandes devraient s'exécuter.

  3. Si tout fonctionne correctement, ouvrez Paramètres système, allez à "Clavier"> "Raccourcis"> "Saisie". Cliquez sur le raccourci pour changer de source (à droite, pour définir le raccourci), puis appuyez sur la touche de retour arrière pour désactiver le raccourci.

    enter image description here

  4. Ajoutez maintenant le même raccourci aux raccourcis personnalisés: choisissez: Paramètres système> "Clavier"> "Raccourcis"> "Raccourcis personnalisés". Cliquez sur le "+" et ajoutez la commande:

    python3 /path/to/change_lang.py +
    

    Au raccourci que vous venez de désactiver à l’étape 2.

    De plus, vous pouvez définir un raccourci pour vous déplacer en sens inverse (définir la source précédente de la liste):

    python3 /path/to/change_lang.py -
    

C'est ça. Maintenant, le changement de langue est combiné à la commande que vous souhaitez exécuter.

Ce qu'il fait

  • Chaque fois que vous appuyez sur votre raccourci, le script est appelé à la recherche de la langue actuelle par la commande:

    gsettings get org.gnome.desktop.input-sources current
    
  • Le script passe ensuite au suivant, ou au précédent, en fonction de l'argument, à l'aide de la commande:

    gsettings set org.gnome.desktop.input-sources current <index>
    

Ressources

L'utilisation de gsettings est extrêmement faible en jus et, en combinant la commande pour définir la langue avec vos commandes, le script ne s'exécute que lors du changement de langue .

Je pense que c’est le moyen le plus élégant et, bien que vous ne remarquiez pas sur votre facture d’électricité, le plus bas sur le long terme. Le choix entre un processus en cours d'exécution, utilisant l'API, ou une option d'exécution à la demande est cependant une question de goût.

Notez également que le script change d'abord de langue, puis exécute les autres commandes. Il n'y a aucune différence notable dans la réponse dans les deux réponses que ce soit.

8
Jacob Vlijm