6 votes

Basculer vers une source d'entrée spécifique dans OS X dans Catalina avec AppleScript

Je utilise différents dispositions de clavier et je passe de l'un à l'autre en utilisant un simple script

on changeKeyboardLayout(layoutName)
    tell application "System Events" to tell process "SystemUIServer"
        tell (1st menu bar item of menu bar 1 whose description is "text input") to {click, click (menu 1's menu item layoutName)}
    end tell
end changeKeyboardLayout
changeKeyboardLayout("German LaTeX2")

Cela fonctionnait bien jusqu'à la dernière mise à jour. Je ne parle pas vraiment AppleScript, mais un peu de test indique que SystemUIServer n'a plus accès à un élément de menu portant le nom "text input". En tentant

tell application "System Events" to tell process "SystemUIServer" to get value of attribute "AXDescription" of every menu bar item of menu bar 1

je reçois Siri, blutooth, time machine, clock et quelques autres. Il semble donc que le menu de source d'entrée soit maintenant géré différemment, mais je n'ai aucune idée de comment ou comment le découvrir (toutes les recherches m'ont dirigé vers des scripts similaires au mien)

Mise à jour 2019/12/10

Les solutions suggérées jusqu'à présent ont toutes des défauts, dans un cas vous obtenez toujours un retard de 5 secondes qui est plutôt long et l'astuce consistant à tuer "System Events" comme indiqué dans un autre message ne semble pas toujours fonctionner, parfois cela entraîne un dépassement de délai pour le script (ce qui est encore pire que d'avoir le retard de 5 secondes tout le temps), donc il semble que cela nécessite toujours une meilleure solution

8voto

Adibe7 Points 842

J'ai rencontré le même problème de vouloir passer rapidement entre plusieurs sources d'entrée avec des raccourcis clavier depuis que Catalina a cassé l'ancienne méthode utilisant AppleScript. Bien que les méthodes ci-dessus fonctionnent, elles sont plutôt maladroites, peu fiables et lentes (du moins pour moi).

Après un peu de recherche sur internet, j'ai trouvé une meilleure solution. Quelqu'un a écrit un programme utilitaire en ligne de commande/terminal qui change les disposition des sources d'entrée par leur nom et qui fonctionne très bien, en changeant de sources d'entrée instantanément (testé sous Catalina).

Voici les étapes à suivre :

  1. Téléchargez les fichiers sources depuis https://github.com/minoki/InputSourceSelector - cliquez sur le bouton vert Code Télécharger ZIP
  2. Extrayez le fichier ZIP
  3. Ouvrez le terminal et naviguez jusqu'au dossier dézippé
  4. Exécutez la commande make dans ce dossier, et un exécutable "InputSourceSelector" sera produit. (Vous devrez peut-être ajouter des autorisations d'exécution via chmod +x InputSourceSelector).

Maintenant, vous pouvez lister et basculer entre les sources d'entrée avec ces commandes :

  • ./InputSourceSelector list-enabled - pour lister toutes les sources d'entrée actuellement activées
  • ./InputSourceSelector current - pour afficher l'id de la source d'entrée actuellement sélectionnée
  • ./InputSourceSelector select - pour basculer vers une source d'entrée par son id

Consultez le README sur la page de l'auteur pour plus de commandes.

Ensuite, pour changer les dispositions, utilisez la commande 'select' avec un :

  • ./InputSourceSelector select com.apple.keylayout.US
  • ./InputSourceSelector select com.apple.keylayout.Dvorak
  • ./InputSourceSelector select com.apple.keylayout.Spanish

Le est l'id avant les parenthèses, par exemple :

  • Pour "com.apple.keylayout.US (U.S.)", l'id est "com.apple.keylayout.US"
  • Pour "com.apple.keylayout.Dvorak (Dvorak)", l'id est "com.apple.keylayout.Dvorak"
  • Pour "com.apple.keylayout.Spanish (Spanish)", l'id est "com.apple.keylayout.Spanish"

Pour les ids avec des espaces, vous devrez peut-être les mettre entre guillemets doubles.

Vous pouvez maintenant placer le fichier exécutable dans '/usr/local/bin' pour le rendre disponible à l'échelle du système, et exécuter la commande sans le './' précédent depuis n'importe où dans le système.

Vous pouvez également créer quelques raccourcis pour passer rapidement entre les différentes sources d'entrée dans BetterTouchTool ou un programme similaire.

Dans BetterTouchTool, ajoutez simplement un raccourci clavier global, et pour l'Action assignée, sélectionnez "Exécuter une commande terminal". Dans la fenêtre de commande terminal, utilisez la commande /usr/local/bin/InputSourceSelector select com.apple.keylayout.Dvorak ou toute autre source d'entrée vers laquelle vous souhaitez basculer.

0 votes

Parfait, fonctionne comme un charme!

0 votes

Est-ce que je dois faire quelque chose de différent pour le faire fonctionner dans un script shell? C'est un outil génial, beaucoup plus rapide que AppleScript et il fonctionne bien dans tout le système dans le terminal shell, mais quand j'essaie de l'exécuter à partir d'un fichier .sh, il ne fait rien malgré le drapeau 'x'.

2voto

user3439894 Points 52496

Malheureusement, les choses ont changé dans macOS Catalina et vous devrez activer ce menu d'une manière différente.

L'exemple suivant de AppleScript, présenté ci-dessous, fonctionne pour moi dans macOS Catalina, cependant, comme je testais dans une machine virtuelle, je ne sais pas si le décalage temporel dans l'exécution du code, entre le clic sur le menu cible et le code suivant, est inhérent à un problème dans la machine virtuelle ou s'il sera le même sur une machine physique.

Je n'ai pas de German LaTeX2 donc j'ai utilisé German à la place, même si j'ai remplacé cela par commodité dans le code après les tests.

Les avertissements habituels s'appliquent à l'utilisation de ceci dans: Préférences Système > Sécurité et confidentialité > Confidentialité > Accessibilité

Exemple code AppleScript:

tell application "System Events" to ¬
    tell application process "TextInputMenuAgent" to ¬
        tell menu bar item 1 of menu bar 2
            click
            click menu item "German LaTeX2" of menu 1
        end tell

Cela fait la même chose d'une manière différente, et l'une de ces façons peut être plus rapide.

tell application "System Events" to ¬
    tell application process "TextInputMenuAgent" to ¬
        click menu bar item 1 of menu bar 2

tell application "System Events"
    keystroke "g"
    key code 36

Pour utiliser l'exemple code AppleScript dans un handler:

changeKeyboardLayout("German LaTeX2")

on changeKeyboardLayout(layoutName)
    tell application "System Events" to ¬
        tell application process "TextInputMenuAgent" to ¬
            tell menu bar item 1 of menu bar 2
                click
                click menu item layoutName of menu 1
            end tell
end changeKeyboardLayout

Ou la deuxième version du code:

changeKeyboardLayout("German LaTeX2")

on changeKeyboardLayout(layoutName)
    tell application "System Events" to ¬
        tell application process "TextInputMenuAgent" to ¬
            click menu bar item 1 of menu bar 2
    tell application "System Events"
        keystroke (premier élément de texte de layoutName)
        key code 36
    end tell

Note: L'<em>exemple</em> <strong>code</strong> <em>AppleScript</em> est juste cela et ne contient aucun traitement des <em>erreurs</em> comme il peut être approprié. Il incombe à l'utilisateur d'ajouter tout <em>traitement des erreurs</em> qui peut être approprié, nécessaire ou souhaité. Consultez l'<a href="https://developer.apple.com/library/archive/documentation/AppleScript/Conceptual/AppleScriptLangGuide/reference/ASLR_control_statements.html#//apple_ref/doc/uid/TP40000983-CH6g-129232" rel="nofollow noreferrer"><strong>try</strong></a> <em>déclaratif</em> et la <a href="https://developer.apple.com/library/archive/documentation/AppleScript/Conceptual/AppleScriptLangGuide/reference/ASLR_control_statements.html#//apple_ref/doc/uid/TP40000983-CH6g-129657" rel="nofollow noreferrer"><strong>error</strong></a> <em>déclaratif</em> dans le <a href="https://developer.apple.com/library/archive/documentation/AppleScript/Conceptual/AppleScriptLangGuide/introduction/ASLR_intro.html" rel="nofollow noreferrer"><strong>Guide de Langage AppleScript</strong></a>. Voir aussi, <a href="https://developer.apple.com/library/archive/documentation/AppleScript/Conceptual/AppleScriptLangGuide/reference/ASLR_error_xmpls.html#//apple_ref/doc/uid/TP40000983-CH221-SW1" rel="nofollow noreferrer"><strong>Travailler avec des Erreurs</strong></a>.

0 votes

Merci. La première version fonctionne pour moi, la deuxième ne fonctionne pas pour moi car j'ai plusieurs éléments dans la liste commençant par "g". Le retard se produit également sur une machine physique. et il est long (5 secondes?) Mais j'ai trouvé cette réponse ici apple.stackexchange.com/a/92386 qui aide si je la combine avec la vôtre, c'est-à-dire qu'elle fonctionne sans se bloquer.

1 votes

@Frank Mittelbach, Bien que pour le moment je n'aie pas besoin de ça, étant donné que tous les scripts actuels que j'utilise ne sont pas sujets à ce bug, j'ai tout de même enregistré une copie de la page web liée pour référence future si nécessaire. Au fait, cela a rendu l'exécution près de l'instantanée dans la machine virtuelle aussi. Merci!

2voto

Frank Mittelbach Points 163

Pour mémoire, en combinant la réponse sur la façon d'accéder au menu de source d'entrée dans Catalina avec une réponse qui traite du bug (?) générant un retard donne une version qui fonctionne aussi bien que l'ancienne :

on changeKeyboardLayout(layoutName)
    launch application "System Events"
    delay 0.2
    ignoring application responses
        tell application "System Events" to tell process "TextInputMenuAgent"
            click menu bar item 1 of menu bar 2
        end tell
    end ignoring
    do shell script "killall System\\ Events"
    delay 0.1
    tell application "System Events" to tell process "TextInputMenuAgent"
        tell menu bar item 1 of menu bar 2
            click menu item layoutName of menu 1
        end tell
    end tell
end changeKeyboardLayout

changeKeyboardLayout("German LaTeX2")

Mise à jour 2019/12/10

Le truc consistant à tuer "System Events" comme mentionné dans l'autre publication ne semble pas toujours fonctionner, parfois cela entraîne un délai d'attente pour le script (ce qui est encore pire que d'avoir un délai de 5 secondes tout le temps), il semble donc que la solution à ma question soit encore quelque peu ouverte

1voto

OnePablo Points 1

J'ai écrit ce script il y a un moment qui utilise une API de carbon pour modifier la source de saisie du clavier à travers des appels système de bas niveau, ce qui serait normalement idéal et évidemment préférable à la manipulation de l'interface utilisateur. Cela dit, il a quelques années, je ne pourrais donc pas dire avec certitude s'il sera toujours viable dans Catalina, notamment parce que carbon est obsolète ou en voie de l'être, mais le script est écrit en JavaScript pour l'automatisation, qui, comme l'AppleScript, est en train de tomber en morceaux.

Cependant, je vais le poster quand même, au cas où il aurait de la valeur dans le nouvel environnement OS :

ObjC.import('Carbon');

nil = $();

unwrap = ObjC.deepUnwrap.bind(ObjC);
bind = ObjC.bindFunction.bind(ObjC);
bind('CFMakeCollectable', [ 'id', [ 'void *' ] ]);
Ref.prototype.nsObject = function() {
    return unwrap($.CFMakeCollectable(this));
}

function run() {
    const lang = 'Allemand';

    const currentSource = $.TISCopyCurrentKeyboardInputSource();
    const sources   = unwrap($.TISCreateInputSourceList(nil, false)),
          sourceIDs = sources.map(src => $.TISGetInputSourceProperty(
                                      src,'TISPropertyInputSourceID')
                             .nsObject()),
          sourceID  = sourceIDs.filter(src=>src.indexOf(lang)!==-1)[0],
          source    = unwrap($.TISCreateInputSourceList(
                            { 'TISPropertyInputSourceID' : sourceID },
                      false))[0];
    const status    = $.TISSelectInputSource(source);
    return (status==0);
}

0 votes

Il plante l'Éditeur de scripts défini en JavaScript sur macOS Catalina 10.15.1, sans changer la langue d'entrée.

0 votes

@user3439894 C'est dommage, mais pas du tout surprenant. Le JavaScriptOSA noyau a simplement été laissé à l'abandon, bien que je pense que c'est le pont Objective-C qui s'effondre, car les plantages ont commencé à Mojave chaque fois que le moteur OSA tentait de faire le pont vers/depuis des références de style C. Je l'ai également écrit en Swift, que j'ai quelque part, à moins que je ne l'aie laissé sur mon MacBook avant qu'il ne parte en réparation.

1voto

Mr.Biscuit Points 11

J'ai trouvé une solution alternative qui garantit aucun retard, en utilisant le raccourci clavier système ^F8 (prédéfini dans "Préférences Système > Clavier > Raccourcis > Clavier > Déplacer le focus sur les menus d'état")

en combinant avec la quantité souhaitée de pressions sur la touche fléchée vers le bas et un Return, ça fonctionne très bien

Je souhaite que ce qui précède ressemble à de l'AppleScript pour vous, en fait je ne peux toujours pas écrire le plus simple des AppleScripts après des années à l'utiliser.

J'ai donc défini la série de pressions sur les touches ci-dessus dans BetterTouchTool, ça fait l'affaire :)

Capture d'écran BetterTouchTool

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X