Modifier les arrangements d'affichage dans OS X par programmation

8

Je dois périodiquement déplacer mon affichage (physiquement 1 ), ce qui nécessite également de réarranger ma disposition d'affichage dans les Préférences Système. Le faire manuellement tout le temps est une douleur au cou. Est-il possible de le faire par programme?


1 Je travaille sur un côté de la table lorsque je travaille en solo, mais lorsque je veux me jumeler avec quelqu'un, je bascule de l'autre côté de la table car il y a plus d'espace disponible pour une seconde personne. Si vous faites pivoter l'écran pour qu'il fasse face à l'autre côté de la table, cela signifie qu'il va de la droite à la gauche de mon ordinateur portable, puis de la gauche, car l'ordinateur portable se tient debout dans un sens ou dans l'autre.

iconoclaste
la source
1
Juste une note ... J'ai modifié le code car il n'était pas nécessaire de reproduire ce que j'avais déjà fait dans la if normalOrentation ... déclaration . Cela avait juste besoin de couvrir les informations pour le drapeau à bascule . Le code répliqué a été déplacé et défini en dessous.
user3439894

Réponses:

11

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 comme raccourci clavier pour changer la disposition de votre moniteur.

https://github.com/jakehilborn/displayplacer

Jake Hilborn
la source
3
Il n'y a aucune raison de s'excuser pour avoir répondu après une longue période. Ni moi ni personne d’autre n’avons le droit d’ attendre votre réponse. Votre réponse est tout aussi utile à quiconque cherche une solution à ce problème. J'apprécie votre travail - et votre réponse - et compte bien en faire une partie de ma configuration. Merci!
iconoclaste
6

À l'aide de mon MacBook Pro, qui se trouve normalement à gauche de mon écran Thunderbolt et de mon écran Thunderbolt, vous expliquerez comment utiliser hsscreens et AppleScript pour basculer les deux arrangements par programme en fonction de la manière dont ils sont organisés. Le résultat final est une application AppleScript qui, une fois exécutée, bascule simplement entre les deux arrangements. Cette application peut être exécutée de la même manière que toute autre application.

Dans l'image ci-dessous, vous voyez les agencements normal et inversé des écrans et de la barre de menus indiquant les différences de relation entre mon MacBook Pro et Thunderbolt Display.

Arrangements d'écran

Cette application AppleScript, ainsi que le hsscreensfichier exécutable binaire, bascule par programme entre les deux arrangements présentés dans l'image ci-dessus, en déplaçant l'affichage du MacBook Pro vers la droite ou vers la gauche de l'affichage Thunderbolt en maintenant la barre des menus sur l'affichage du MacBook Pro.

Pour coder cela, je devais déterminer quelle était la configuration actuelle et agir en conséquence. Pour ce faire, j'ai utilisé hmscreens -infodeux fois dans un terminal, une fois dans chaque arrangement .

En regardant les informations fournies, j'ai vu une information que je pouvais utiliser greppour pouvoir définir un drapeau contre lequel basculer.


Sortie de hmscreens -infodans une disposition normale 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 -infodans un arrangement renversé 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

$

Si cela était évident, je devais utiliser les informations de Global Position:pour déterminer la disposition actuelle des écrans. J'ai immédiatement vu -2560comme unique entre la sortie et un moyen de déterminer la disposition actuelle . Si je grepcherchais -2560et trouvais cela, j'étais dans un arrangement renversé , pas dans un arrangement normal . C’est donc ce que j’ai utilisé pour déterminer l’ arrangement actuel et basculer ainsi entre les deux arrangements . (Remarque: ce -2560n'était pas la seule chose unique, c'est juste ce sur quoi je me suis concentré en premier et j'ai trouvé un moyen facile d'analyser les informations pour définir un drapeau à bascule .)

Enregistrez le code AppleScript ci-dessous en tant qu'application et placez une copie du hmscreensfichier exécutable binaire dans le <appname>.app/Contents/Resourcesdossier. Ainsi, l'application, par exemple, /Applications/Toggle Displays Arrangements.appest autonome et ne dépend pas d'un emplacement externe du hmscreensfichier exécutable binaire.

Évidemment, vous devrez déterminer quoi faire grepou utiliser une méthode différente pour définir le drapeau à bascule et modifier le code ci-dessous en conséquence afin de répondre à vos besoins particuliers (le cas échéant, sinon ce cas d'utilisation ou différent).

Code AppleScript :

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 coloration syntaxique du code AppleScript .

Code AppleScript

utilisateur3439894
la source
Je suis actuellement incapable de faire fonctionner ce travail. OS X tue hmsscreensinstantanément, avant de pouvoir faire quoi que ce soit: [1] 9612 killed hmscreens -info. Des idées comment résoudre cette situation?
iconoclaste
@iconoclast, Cela a été posté il y a deux ans, l'avez-vous testé à ce moment-là et avez-vous réussi, ou le faites-vous pour la première fois? Aussi, avez-vous essayé de télécharger à nouveau le fichier et d’essayer avec une nouvelle copie? Avez-vous redémarré entre deux échecs? Cela fonctionne toujours pour moi avec macOS High Sierra 10.13.5. Lorsque j'ai posté ceci, j'utilisais OS X Mountain Lion.
user3439894
Je crois que cela a fonctionné à l'origine, mais à un moment donné s'est arrêté.
iconoclaste
Cela fonctionne toujours. Copiez simplement l'outil dans votre dossier Applications. Puis démarrez-le en utilisant, par exemple, /Applications/hmscreens -infovotre ligne de commande
Karl Adler le
1

J'ai utilisé les exemples ci-dessus pour créer un script Apple simple "Permuter écrans".

display dialog "Swap Screens?" buttons {"Cancel", "OK"} default button "OK" cancel button "Cancel" giving up after 15

set hms to "Applications: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 firstScreen to item 1 of screenIDs

    set secondScreen to item 2 of screenIDs

    set othersPosition to "right"

    do shell script quoted form of POSIX path of hms & " -setMainID " & secondScreen & " -othersStartingPosition " & othersPosition

else

    display dialog "Only See One Screen"

end if

Cela a fonctionné comme un champion ... Je peux cliquer sur une seule icône et mes écrans s'alignent exactement comme je le souhaite.

Prendre plaisir! E-

Earl Funderburk
la source
0

Ce n'est pas AppleScript, mais voici une bibliothèque python qui s'interface avec les liaisons PyObjC et fournit un contrôle approfondi des paramètres d'affichage Mac appelé "Gestionnaire d'affichage". Nous avons mis à jour le gestionnaire d'affichage, une bibliothèque python à code source ouvert, qui permet de modifier manuellement ou automatiquement un ensemble de paramètres d'affichage d'un Mac. Il gère par programme les affichages Mac, y compris la résolution d'affichage, la fréquence de rafraîchissement, la rotation, la luminosité, la duplication d'écran et le sous-balayage HDMI. Son objectif principal est de permettre aux administrateurs système et aux développeurs de configurer automatiquement tout nombre d'écrans Mac, à l'aide des scripts de ligne de commande et de la bibliothèque Display Manager Python. Il peut facilement être intégré à Jamf Pro, Outset ou Munki ou à d’autres systèmes de gestion client.

Nous utilisons Display Manager dans notre environnement pour de nombreux cas d'utilisation, comme sur nos systèmes d'affichage numérique, afin de faire pivoter l'écran de 90 degrés et de définir avec précision le sous-balayage HDMI, le réglage de la mise en miroir vidéo et permettre à l'instructeur d'activer ou de désactiver rapidement la mise en miroir, de définir la résolution par défaut. luminosité sur les systèmes partagés tels que les laboratoires d'étudiants ou les systèmes du personnel / faculté et réinitialiser les valeurs par défaut après, par exemple, connexion / déconnexion de l'utilisateur ou à la demande, etc.

Si vous souhaitez consulter le code ou l'essayer, consultez le référentiel GitHub suivant ...

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

S'il vous plaît laissez-nous savoir si vous avez une question, des problèmes ou des demandes de fonctionnalités.

utilisateur332214
la source
Cela semble intéressant, mais peut-être excessif pour ce que je veux. (Mais je ne suis pas l'électeur, en passant. En fait ... je vais passer au vote, car cela semble potentiellement utile.) Merci de l'avoir posté!
iconoclaste
Bien sûr, np. Faites savoir si vous avez des questions, des problèmes ou des demandes de fonctionnalités.
user332214