33 votes

Modifier la disposition de l'affichage dans OS X/MacOS de manière programmatique

Je dois périodiquement déplacer mon écran (physiquement). 1 ) et cela nécessite également de réorganiser la disposition de mon affichage dans les Préférences Système. Faire cela manuellement tout le temps est une véritable plaie. Existe-t-il un moyen de le faire de manière programmatique ?


1 Je travaille d'un côté de la table quand je suis seul, mais quand je veux faire équipe avec quelqu'un, je passe de l'autre côté de la table parce qu'il y a plus d'espace inutilisé disponible pour une deuxième personne. En retournant l'écran pour faire face à l'autre côté de la table, l'écran passe de la droite de mon ordinateur portable à la gauche, puisque l'ordinateur portable se place sur un support dans les deux cas.

35voto

Jake Hilborn Points 1086

Désolé pour la réponse tardive. Vous pouvez utiliser displayplacer pour définir des profils pour vos deux arrangements. Enregistrez les profils dans un script ou utilisez quelque chose comme BetterTouchTool pour une touche de raccourci pour changer la disposition de votre moniteur.

https://github.com/jakehilborn/displayplacer

17voto

Billy Points 201

J'ai trouvé comment automatiser le changement d'affichage en utilisant un raccourci clavier avec displayplacer et ça marche comme sur des roulettes !

J'ai configuré une macro en utilisant Maestro du clavier pour changer automatiquement la disposition du bureau à l'aide d'un raccourci clavier.

Instructions pour configurer le raccourci clavier

  1. Installer Plaque d'affichage en utilisant Homebrew
  2. Utilisez Keyboard Maestro et créez une macro.
  3. Ajouter l'action Execute Shell script pour chaque écran que vous avez (j'en ai 3).
  4. Ouvrez Préférences Système > Affichages et modifiez votre disposition en plaçant la barre de menu à droite d'un écran (sens de type droite-gauche).
  5. Ouvrez votre terminal et exécutez le programme displayplacer list commande
  6. Copiez la sortie du bas, par exemple displayplacer "id:<screenId> res:<width>x<height> hz:<num> color_depth:<num> scaling:<on/off> origin:(<x>,<y>) degree:<0/90/180/270>"
  7. Collez la sortie dans votre action macro.
  8. Répétez les étapes 4 à 7 et arrêtez-vous après avoir fait l'écran principal sur lequel vous gardez votre barre de menu.
  9. Configurez un raccourci clavier pour votre macro.
  10. Exécutez votre Macro avec votre nouveau raccourci et regardez la magie se produire sous vos yeux.

Conseils utiles

  1. Si vous avez un problème avec l'exécution displayplacer de Keyboard Maestro, il est probable que vous utilisez un bash différent dans votre terminal/iTerm comme oh-my-zsh lorsque vous l'avez installé en utilisant Homebrew. Si c'est le cas, suivez ces instructions de mon autre poste pour réparer votre displayplacer référence binaire.

  2. Voici un capture d'écran pour voir mon installation de Keyboard Maestro en fonctionnement avec displayplacer .

  3. Vous devrez peut-être exécuter votre macro une deuxième fois si vous avez accidentellement touché votre raccourci.

10voto

user3439894 Points 52496

En utilisant mon MacBook Pro, qui se trouve normalement à gauche de mon écran Thunderbolt, et mon écran Thunderbolt, voici comment utiliser hsscreens et AppleScript pour alterner les deux dispositions de manière programmatique en fonction de la disposition actuelle. Le résultat final est une application AppleScript qui, lorsqu'elle est exécutée, bascule simplement d'un arrangement à l'autre. Cette application peut être exécutée de toutes les manières normales dont une autre application peut être exécutée.

Dans l'image ci-dessous, vous voyez le normal y flipped arrangements des écrans et de la barre de menu montrant les relations de différence entre mon MacBook Pro et mon écran Thunderbolt.

Screen Arrangements

Cette application AppleScript, ainsi que l'application hsscreens Ce fichier exécutable binaire permet de basculer de manière programmatique entre les deux dispositions présentées dans l'image ci-dessus, en déplaçant l'écran du MacBook Pro à droite ou à gauche de l'écran Thunderbolt et en maintenant la barre de menu sur l'écran du MacBook Pro.

A code pour cela, je devais déterminer ce que le arrangement actuel et d'agir en conséquence. Pour ce faire, j'ai utilisé hmscreens -info dans un terminal deux fois, une fois dans chaque arrangement .

En regardant les informations produites, j'ai vu un élément d'information que je pouvais grep pour, afin d'établir un drapeau pour basculer contre.


Sortie de hmscreens -info dans un arrangement normal des affichages :

$ hmscreens -info
Screen ID: 68822100
Size: {1440, 900}
Global Position: {{0, 0}, {1440, 900}}
Color Space: NSCalibratedRGBColorSpace
BitsPerPixel: 32
Resolution(dpi): {144, 144}
Refresh Rate: 0
Uses Quartz Extreme: YES

Screen ID: 68695180
Size: {2560, 1440}
Global Position: {{1440, -540}, {4000, 900}}
Color Space: NSCalibratedRGBColorSpace
BitsPerPixel: 32
Resolution(dpi): {72, 72}
Refresh Rate: 0
Uses Quartz Extreme: YES

$

Sortie de hmscreens -info dans un arrangement inversé des affichages :

$ hmscreens -info
Screen ID: 68822100
Size: {1440, 900}
Global Position: {{0, 0}, {1440, 900}}
Color Space: NSCalibratedRGBColorSpace
BitsPerPixel: 32
Resolution(dpi): {144, 144}
Refresh Rate: 0
Uses Quartz Extreme: YES

Screen ID: 68695180
Size: {2560, 1440}
Global Position: {{-2560, -540}, {0, 900}}
Color Space: NSCalibratedRGBColorSpace
BitsPerPixel: 32
Resolution(dpi): {72, 72}
Refresh Rate: 0
Uses Quartz Extreme: YES

$

Il était évident, pour moi, que je devais utiliser des informations provenant de Global Position: pour déterminer ce que le arrangement actuel des affichages étaient. J'ai immédiatement vu -2560 comme unique entre la sortie et un moyen de déterminer la arrangement actuel . Si je grep ed pour -2560 et je l'ai trouvé alors j'étais dans le arrangement inversé et non le arrangement normal . C'est donc ce que j'ai utilisé pour déterminer le arrangement actuel et ainsi basculer entre les deux arrangements . (Note : -2560 n'était pas la seule chose unique, c'est juste ce sur quoi je me suis concentré en premier et j'ai senti qu'il y avait un moyen facile d'analyser l'information pour définir un drapeau à bascule avec.)

Sauvegarder l'AppleScript code ci-dessous comme une demande et placez une copie de la hmscreens dans le fichier exécutable binaire de l <appname>.app/Contents/Resources dossier. De cette façon, l'application, par exemple /Applications/Toggle Displays Arrangements.app est autonome et ne dépend pas d'une localisation externe de l'entreprise. hmscreens fichier exécutable binaire.

Évidemment, vous devrez déterminer ce qu'il faut grep ou utiliser une méthode différente pour définir le drapeau à bascule et modifier le code ci-dessous pour répondre à vos besoins particuliers (s'il s'agit d'un autre cas d'utilisation ou d'un cas d'utilisation différent).

AppleScript code :

set hms to (path to me as text) & "Contents:Resources:hmscreens"

set screenIDs to paragraphs of (do shell script quoted form of POSIX path of hms & " -screenIDs")
if (count of screenIDs) is greater than 1 then

    set normalOrentation to "1"
    try
        set normalOrentation to do shell script quoted form of POSIX path of hms & " -info | grep '\\-2560'"
    end try
    if normalOrentation is "1" then
        set othersPosition to "left"
    else
        set othersPosition to "right"
    end if

    set secondScreen to item 1 of screenIDs
    do shell script quoted form of POSIX path of hms & " -setMainID " & secondScreen & " -othersStartingPosition " & othersPosition

else

    tell me
        activate
        display dialog "Only one screen is attached to your computer!" buttons {"OK"} default button 1 with icon note
    end tell

end if

L'image ci-dessous montre la mise en évidence syntaxique de l'AppleScript code .

AppleScript Code

6voto

Simon Alford Points 173

displayplacer est parfait et a rendu l'essentiel du processus très facile. Je l'ai utilisé dans un script d'Automator pour basculer entre deux profils d'arrangement, puis j'ai mis en place la possibilité de déclencher ces script à partir de la barre de menu. Voici un enregistrement du processus par lequel je suis passé.

enter image description here

  • Suivez les instructions aquí pour installer displayplacer et obtenir les commandes pour définir vos deux mises en page.
  • Suivez les instructions aquí pour faire un script d'Automator.
  • Pour que mon script s'exécute sans erreur, j'ai dû ajouter la ligne suivante export PATH=/usr/local/bin:$PATH avant d'exécuter la commande displayplayer. Conseils tirés de aquí .
  • Pour exécuter les scripts à partir de la barre de menu, consultez le document suivant aquí .
  • Mes scripts d'Automator "d'action rapide" étaient sauvegardés en /Users/alfordsimon/Library/Services mais le lien précédent prévoyait qu'ils soient placés en /Users/alfordsimon/Library/Scripts alors je les ai déplacés.

4voto

user332214 Points 91

Ce n'est pas AppleScript, mais voici une bibliothèque Python qui s'interface avec les bindings PyObjC et qui permet un contrôle approfondi des paramètres d'affichage du Mac appelé "Display Manager". Nous avons mis à jour Display Manager, qui est une bibliothèque Python open-source permettant de modifier manuellement ou automatiquement les paramètres d'affichage d'un Mac individuel ou d'une flotte de Mac. Elle gère de manière programmatique les écrans Mac, notamment la résolution d'affichage, le taux de rafraîchissement, la rotation, la luminosité, la mise en miroir des écrans et l'underscan HDMI. Son objectif principal est de permettre aux administrateurs système et aux développeurs de configurer automatiquement un nombre quelconque d'écrans Mac, en utilisant la ligne de commande scripts et la bibliothèque Python Display Manager. Il peut facilement être intégré à Jamf Pro, Outset ou Munki ou à d'autres systèmes de gestion des clients.

Nous utilisons Display Manager dans notre environnement pour de multiples cas d'utilisation, par exemple sur nos systèmes d'affichage numérique pour faire pivoter l'écran de 90 degrés et définir exactement l'underscan HDMI, sur les podiums pour définir la mise en miroir vidéo et permettre à l'instructeur d'activer ou de désactiver rapidement la mise en miroir, définir la résolution et la luminosité par défaut sur les systèmes partagés comme les laboratoires des étudiants ou les systèmes du personnel/de la faculté et réinitialiser la valeur par défaut après certains moments comme la connexion/la déconnexion de l'utilisateur ou à la demande, etc.

Si vous souhaitez revoir le code ou l'essayer, consultez le dépôt GitHub suivant...

https://github.com/univ-of-utah-marriott-library-apple/display_manager

N'hésitez pas à nous faire savoir si vous avez des questions, des problèmes ou des demandes de fonctionnalités.

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