Domanda:
Change display arrangement in OS X/macOS programmatically
iconoclast
2016-08-15 19:47:35 UTC
view on stackexchange narkive permalink

Devo periodicamente spostare il mio display (fisicamente 1 ) e questo richiede anche riorganizzare la mia disposizione del display nelle Preferenze di Sistema.Farlo manualmente tutto il tempo è un dolore al collo.C'è un modo per farlo in modo programmatico?


1 Lavoro su un lato di un tavolo quando lavoro da solo, ma quando voglio accoppiarmi con qualcuno passo dall'altra parte del tavolo perché ha più spazio inutilizzato disponibile per un secondopersona.Capovolgere il display in modo che sia rivolto verso l'altro lato del tavolo significa che il display passa da essere a destra del mio laptop a essere a sinistra, poiché il laptop va su un supporto in entrambi i modi.
Solo una nota ... Ho modificato il codice in quanto non c'era bisogno di replicare ciò che avevo fatto in precedenza in "if normalOrentation ..." _statement_.Ciò serviva solo per coprire le informazioni per _toggle flag_.Il _code_ replicato è stato spostato e posizionato sotto di esso.
Sei risposte:
#1
+14
Jake Hilborn
2018-03-31 20:49:37 UTC
view on stackexchange narkive permalink

Ci scusiamo per la risposta tardiva.Puoi utilizzare Displayplacer per impostare i profili per entrambi gli arrangiamenti.Salvare i profili in uno script o utilizzare qualcosa come BetterTouchTool per un tasto di scelta rapida per modificare il layout del monitor.

https://github.com/jakehilborn/displayplacer

Non c'è motivo di scusarsi per aver risposto dopo un lungo periodo di tempo.Né io né nessun altro abbiamo il diritto di _aspettare_ la tua risposta.La tua risposta è altrettanto utile per chiunque cerchi una soluzione a questo problema.Apprezzo il tuo lavoro - e la tua risposta - e ho intenzione di renderlo parte della mia organizzazione.Grazie!
#2
+8
user3439894
2016-08-16 23:50:52 UTC
view on stackexchange narkive permalink

Utilizzando il mio MacBook Pro, che normalmente si trova a sinistra del mio display Thunderbolt, e il mio display Thunderbolt, quanto segue mostrerà come utilizzare hsscreens e AppleScript per alternare le due disposizioni a livello di programmazione in base a come è attualmente organizzato. Il risultato finale è un'applicazione AppleScript che, quando viene eseguita, passa semplicemente avanti e indietro tra le due disposizioni. Questa app può essere eseguita in tutti i modi normali in cui è possibile eseguire qualsiasi altra applicazione.

Nell'immagine sottostante, vedi le disposizioni normale e capovolta dei display e della barra dei menu che mostrano le differenze di relazione tra il mio MacBook Pro e il display Thunderbolt.

Screen Arrangements

Questa applicazione AppleScript, insieme al file eseguibile binario hsscreens , alterna programmaticamente tra le due disposizioni mostrate nell'immagine sopra, spostando il display del MacBook Pro a destra o sinistra del display Thunderbolt mantenendo il Barra dei menu sul display del MacBook Pro.

Per codificare questo, avevo bisogno di determinare quale fosse l ' disposizione corrente e poi agire di conseguenza. Per fare questo ho usato due volte hmscreens -info in un terminale, una volta in ogni disposizione .

Guardando le informazioni emesse, ho visto una parte di informazioni che potrei grep per, al fine di impostare un flag contro cui attivare.


Output di hmscreens -info in una disposizione normale dei display:

  $ hmscreens -info
ID schermo: 68822100
Dimensioni: {1440, 900}
Posizione globale: {{0, 0}, {1440, 900}}
Spazio colore: NSCalibratedRGBColorSpace
BitsPerPixel: 32
Risoluzione (dpi): {144, 144}
Frequenza di aggiornamento: 0
Utilizza Quartz Extreme: SI

ID schermo: 68695180
Dimensioni: {2560, 1440}
Posizione globale: {{1440, -540}, {4000, 900}}
Spazio colore: NSCalibratedRGBColorSpace
BitsPerPixel: 32
Risoluzione (dpi): {72, 72}
Frequenza di aggiornamento: 0
Utilizza Quartz Extreme: SI

$
 

Output di hmscreens -info in una disposizione capovolta dei display:

  $ hmscreens -info
ID schermo: 68822100
Dimensioni: {1440, 900}
Posizione globale: {{0, 0}, {1440, 900}}
Spazio colore: NSCalibratedRGBColorSpace
BitsPerPixel: 32
Risoluzione (dpi): {144, 144}
Frequenza di aggiornamento: 0
Utilizza Quartz Extreme: SI

ID schermo: 68695180
Dimensioni: {2560, 1440}
Posizione globale: {{-2560, -540}, {0, 900}}
Spazio colore: NSCalibratedRGBColorSpace
BitsPerPixel: 32
Risoluzione (dpi): {72, 72}
Frequenza di aggiornamento: 0
Utilizza Quartz Extreme: SI

$
 

Se era ovvio, per me, dovevo usare le informazioni di Posizione globale: per determinare quale fosse la disposizione corrente dei Display. Ho immediatamente visto -2560 unico tra l'output e un modo per determinare la disposizione corrente . Se ho grep edito per -2560 e l'ho trovato, allora ero nella disposizione capovolta , non nella disposizione normale . Quindi questo è ciò che ho usato per determinare l ' arrangiamento corrente e quindi passare da uno all'altro dei due arrangiamenti . (Nota: -2560 non era l'unica cosa unica, è solo ciò su cui mi sono concentrato per primo e ho sentito un modo semplice per analizzare le informazioni con cui impostare un flag di attivazione / disattivazione .)

Salva il codice AppleScript di seguito come applicazione e inserisci una copia del file eseguibile binario hmscreens all'interno di <appname>.app/Contents/Resources cartella. In questo modo l'app, ad es. / Applications / Toggle Displays Arrangements.app è autonomo e non dipende da una posizione esterna del file eseguibile binario hmscreens .

Ovviamente dovrai determinare cosa grep o utilizzare un metodo diverso per impostare il flag di attivazione / disattivazione e modificare il codice di seguito di conseguenza per soddisfare le tue esigenze particolari (se diverso da questo caso d'uso o un caso d'uso diverso).

codice AppleScript:

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

imposta screenIDs ai paragrafi di (esegui la forma citata dallo script di shell del percorso POSIX di hms & "-screenIDs")
if (count of screenIDs) è maggiore di 1 allora

    imposta normalOrentation su "1"
    provare
        imposta normalOrentation per eseguire script di shell in forma quotata del percorso POSIX di hms & "-info | grep '\\ - 2560'"
    fine prova
    se normalOrentation è "1" allora
        imposta altriPosizione a "sinistra"
    altro
        imposta altriPosizione a "destra"
    finisci se

    impostare secondScreen sull'elemento 1 di screenIDs
    esegui script di shell forma quotata di POSIX percorso di hms & "-setMainID" & secondScreen & "-othersStartingPosition" & othersPosition

altro

    Dimmi
        attivare
        display dialog "Solo uno schermo è attaccato al tuo computer!" pulsanti {"OK"} pulsante predefinito 1 con nota icona
    fine raccontare

finisci se
 

L'immagine seguente mostra l'evidenziazione sintattica del codice AppleScript.

AppleScript Code

Al momento non riesco a farlo funzionare.OS X uccide immediatamente `hmsscreens`, prima che possa fare qualsiasi cosa:` [1] 9612 ha ucciso hmscreens -info`.Qualche idea su come risolvere questa situazione?
@iconoclast, Questo è stato pubblicato due anni fa, lo hai testato allora e ha funzionato, o lo stai facendo solo per la prima volta.Inoltre, hai provato a scaricare nuovamente il file e provare con una nuova copia?Hai riavviato tra un fallimento e l'altro?Questo funziona ancora per me con macOS High Sierra 10.13.5.Quando l'ho pubblicato originariamente, stavo usando OS X Mountain Lion.
Credo che in origine funzionasse, ma a un certo punto si è fermato.
Funziona ancora.Basta copiare lo strumento nella cartella delle applicazioni.Quindi avvialo utilizzando ad es.`/ Applicazioni / hmscreens -info` dalla riga di comando
#3
+8
Billy
2020-01-20 22:32:06 UTC
view on stackexchange narkive permalink

Ho capito come automatizzare il cambio di visualizzazione utilizzando una scorciatoia da tastiera con displayplacer e funziona a meraviglia!

Ho impostato una macro utilizzando Keyboard Maestro per scorrere automaticamente la disposizione del desktop utilizzando una scorciatoia da tastiera.

Istruzioni per impostare la scorciatoia da tastiera

  1. Installa displayplacer utilizzando Homebrew
  2. Usa Keyboard Maestro e crea una macro
  3. Aggiungi l'azione Esegui script shell per ogni display che hai (ne ho 3).
  4. Apri Preferenze di Sistema> Visualizza e modifica la disposizione posizionando la barra dei menu a destra di una schermata (direzione del testo da destra a sinistra)
  5. Apri il tuo terminale ed esegui il comando displayplacer list
  6. Copia l'output inferiore, ad es. displayplacer "id: <screenId> res: <width>x<height> Hz: <num> Profondità di colore: scala <num>: origine <on / off>: (<x>, <y>) Grado: <0 / 90/180 / 270>"
  7. Incolla l'output nell'azione macro.
  8. Ripeti i passaggi 4-7 e interrompi dopo aver eseguito la schermata principale in cui mantieni attiva la barra dei menu.
  9. Imposta una scorciatoia da tastiera per la tua macro.
  10. Esegui la tua macro con la nuova scorciatoia e guarda la magia accadere davanti ai tuoi occhi.

Suggerimenti utili

  1. Se hai un problema con l'esecuzione di displayplacer da Keyboard Maestro, è probabile che tu stia utilizzando una bash diversa nel tuo terminale / iTerm come oh-my-zsh quando l'hai installato utilizzando Homebrew. In tal caso, segui queste istruzioni dal mio altro post per correggere il tuo riferimento binario displayplacer .

  2. Ecco uno screenshot per visualizzare la mia configurazione di Keyboard Maestro funzionante con displayplacer.

  3. Potrebbe essere necessario eseguire la macro una seconda volta se si preme accidentalmente la scorciatoia.

#4
+2
user332214
2018-08-17 23:47:59 UTC
view on stackexchange narkive permalink

Questo non è AppleScript, ma ecco una libreria python che si interfaccia con i collegamenti PyObjC che fornisce un controllo approfondito delle impostazioni di visualizzazione del Mac chiamato "Display Manager". Abbiamo aggiornato Display Manager, che è una libreria python open source che può modificare manualmente o automaticamente una singola o una flotta di impostazioni di visualizzazione del Mac. Gestisce in modo programmatico i display Mac, inclusi risoluzione del display, frequenza di aggiornamento, rotazione, luminosità, mirroring dello schermo e underscan HDMI. Il suo scopo principale è consentire agli amministratori di sistema e agli sviluppatori di configurare automaticamente un numero qualsiasi di schermi Mac, utilizzando gli script della riga di comando e la libreria Python di Display Manager. Può essere facilmente integrato in Jamf Pro, Outset o Munki o altri sistemi di gestione client.

Usiamo Display Manager nel nostro ambiente per molteplici casi d'uso come sui nostri sistemi di visualizzazione digitale per ruotare il display di 90 gradi e impostare esattamente l'undercan HDMI, sui podi impostare il mirroring video e consentire all'istruttore di attivare o disattivare rapidamente il mirroring, impostato risoluzione predefinita & luminosità su sistemi condivisi come laboratori studenti o sistemi del personale / facoltà e reimposta l'impostazione predefinita dopo in momenti come login / logout utente o su richiesta, ecc.

Se sei interessato a rivedere il codice o provarlo, consulta il seguente repository GitHub ...

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

Fateci sapere se avete domande, problemi o richieste di funzionalità.

Sembra interessante, ma forse eccessivo per quello che voglio.(A proposito, però, non sono il votante negativo. In effetti ... voterò a favore, poiché sembra _potenzialmente_ utile.) Grazie per averlo postato!
Certo, np.Informa l'uso in caso di domande, problemi o richieste di funzionalità.
#5
+2
Earl Funderburk
2018-10-18 21:32:53 UTC
view on stackexchange narkive permalink

Ho utilizzato gli esempi precedenti per creare un semplice script Apple "Swap Screens".

  visualizza la finestra di dialogo "Swap Screens?"pulsanti {"Annulla", "OK"} predefinito pulsante "OK" Annulla pulsante "Annulla" rinuncia dopo 15

imposta hms su "Applicazioni: hmscreens"
imposta screenIDs ai paragrafi di (esegui la forma citata dallo script di shell del percorso POSIX di hms & "-screenIDs")
if (count of screenIDs) è maggiore di 1 allora

    impostare firstScreen sull'elemento 1 di screenIDs

    impostare secondScreen sull'elemento 2 di screenIDs

    imposta altriPosizione a "destra"

    esegui lo script di shell forma quotata di POSIX percorso di hms & "-setMainID" & secondScreen & "-othersStartingPosition" & othersPosition

altro

    mostra la finestra di dialogo "Visualizza solo una schermata"

finisci se
 

Ha funzionato come un campione ... posso fare clic su un'icona e i miei schermi si allineano proprio come voglio.

Buon divertimento! E-

#6
+1
Michael Graham
2020-05-15 07:13:19 UTC
view on stackexchange narkive permalink

Puoi anche utilizzare Hammerspoon per eseguire questa operazione in modo programmatico.Ho questo nel mio script di inizializzazione Hammerspoon:

  - scambia lo schermo principale: monitor esterno o laptop
hs.hotkey.bind ({"cmd", "alt", "ctrl", "shift"}, "f11", function ()
  - allScreens sembra restituire le schermate in ordine primario, non primario
  - quindi con due schermi, questo funziona sempre sul non primario
  hs.screen.allScreens () [2]: setPrimary ()
fine)
 
Lo scambio di posizione non è lo stesso dello scambio che è primario.Questo cambia anche la posizione fisica dei monitor?
Nella mia esperienza non cambia la posizione fisica dei monitor;cambia solo la schermata principale. (Sto usando OSX 10.13.6 e Hammerspoon 0.9.78)


Questa domanda e risposta è stata tradotta automaticamente dalla lingua inglese. Il contenuto originale è disponibile su stackexchange, che ringraziamo per la licenza cc by-sa 3.0 con cui è distribuito.
Loading...