Come si può trovare quale monitor ha la barra dei menu in AppleScript?

2

Giocare con AppleScript Voglio modificare la posizione di alcune finestre con position ma sto riscontrando un problema nel definire il monitor. Attualmente ho diversi monitor di dimensioni e marca che mi collego al mio MacBook durante i miei viaggi. L'unica ripetizione con tutti e quattro i monitor a cui mi collego è che il monitor che voglio manipolare include la barra dei menu.

Durante il test con do shell script "system_profiler SPDisplaysDataType non sono sicuro che il testo restituito di Main Display: Yes consideri il principale dove si trova la barra dei menu dall'estrazione:

Graphics/Displays:

    Intel Iris Pro:

      Chipset Model: Intel Iris Pro
      Type: GPU
      Bus: Built-In
      VRAM (Dynamic, Max): 1536 MB
      Metal: Supported
      Displays:
        Color LCD:
          Display Type: Built-In Retina LCD
          Resolution: 2880 x 1800 Retina
          Mirror: Off
          Online: Yes
          Rotation: Supported
          Automatically Adjust Brightness: Yes
          Connection Type: DisplayPort
        Thunderbolt Display:
          Display Type: LCD
          Resolution: 2560 x 1440
          Main Display: Yes
          Mirror: Off
          Online: Yes
          Rotation: Supported
          Automatically Adjust Brightness: No
          Connection Type: DisplayPort

Se la mia ipotesi di Main Display è corretta, come dovrei grep correttamente la risoluzione del display principale identificato in modo da poter manipolare le finestre?

Quando eseguo una ricerca, alcuni di essi appaiono comunemente in ogni schermo:

Quindi non so se si tratterebbe di due domande in una. Sono un po 'confuso su come viene determinata la sequenza quando ci si connette a più monitor (ad esempio oggi potrei essere collegato a un display a fulmine ma domani potrei essere collegato a due monitor Dells attraverso i miei due DisplayPort) e se c'è un modo per puntare un monitor in particolare sulla base della barra dei menu.

Posso già rilevare l'app e le sue dimensioni con:

tell application "System Events" to tell application process "Notes" to set theSize to get size of window 1
set theWidth to item 1 of theSize
set theHeight to item 2 of theSize

ma il mio problema cade nel determinare la risoluzione in modo da poter calcolare position e bounds per spostare la finestra dell'app.

    
posta ʀ2ᴅ2 24.10.2017 - 19:13
fonte

3 risposte

2

Aggiorna

Rimosso la mia risposta originale. Ecco un approccio completamente diverso che preferisco rispetto alla mia soluzione originale. Questa versione utilizza effettivamente l'aggiunta di script "Image Events".

Questo script otterrà i nomi dei display collegati al tuo computer. I valori restituiti di "display" Display 1 "saranno sempre" quale monitor ha la barra dei menu in AppleScript? "

property activeDesktop : missing value
property activeDesktopResolution : missing value

set displayNames to {}

tell application "Image Events"
    set theDisplays to displays
    repeat with i from 1 to number of items in theDisplays
        set this_item to item i of theDisplays
        set theName to name of display profile of item i of theDisplays
        set end of displayNames to theName
        set activeDesktop to item 1 of displayNames
    end repeat
end tell

tell application "Finder"
    set activeDesktopResolution to bounds of window of desktop
    set activeDesktopResolution to items 3 thru 4 of activeDesktopResolution
end tell

set theResultz to display dialog activeDesktop & "  " & item 1 of activeDesktopResolution & " x " & item 2 of activeDesktopResolution ¬
    buttons ¬
    "OK" with title ¬
    "Your Current Display and Its Resolution" with icon 1 ¬
    giving up after 10

    
risposta data 27.10.2017 - 00:48
fonte
2

Nel mio test, sei corretto sul fatto che il display principale è quello con il menu assegnato in Displays System Prefs. Ho provato spostando la barra dei menu da un display all'altro e eseguendo il tuo script. I risultati suggeriscono che, ovunque sia la barra dei menu, quel display avrà "Main Display: Yes" nelle sue informazioni.

Per analizzare la risoluzione, utilizzerei l'argomento -xml per il comando system_profiler per ottenere un testo coerente da cercare e quindi usare i delimitatori di testo di Apple per analizzare i dati. Ho scritto questo script, e quando cambio il menu avanti e indietro, restituisce la risoluzione del display principale corrente. Potrebbe essere necessario modificare i delimitatori a seconda di ciò che il sistema operativo restituisce per il report del profiler del sistema.

Ho aggiunto commenti incorporati nel codice qui sotto per spiegare cosa sta facendo lo script.

set pfl to do shell script "system_profiler -xml SPDisplaysDataType"

set tid to text item delimiters
set text item delimiters to "</data><key>_name</key>"--in my reports, each display section starts with this xml code

ignoring white space --allows us to not worry about returns, tabs, spaces, etc.
    repeat with i from 2 to count of pfl's text items
        set aDisplay to pfl's text item i
        if aDisplay contains "<key>spdisplays_main</key><string>spdisplays_yes</string>" then--check if this display is the main
            set text item delimiters to "<key>_spdisplays_resolution</key><string>"--this is the xml code for the resolution
            set displayRes to aDisplay's text item 2
            set text item delimiters to "</string"--remove the ending xml code
            set displayRes to displayRes's text item 1
        end if
    end repeat
end ignoring
set text item delimiters to tid --always text text item delimiters back to default
return displayRes

EDIT: poiché hai postato la forma regolare di system_profiler in precedenza, ho riscritto lo script per analizzare quell'output. Mi sembra un po 'più rischioso dell'uso dell'XML, ma dovrebbe essere compilato ed eseguito correttamente sul tuo sistema senza apportare modifiche.

set pfl to do shell script "system_profiler SPDisplaysDataType"
set tid to text item delimiters
set text item delimiters to "Displays:"
set pfl to text item 3 of pfl
set text item delimiters to "Mirror:"
repeat with i from 1 to count of pfl's text items
    set aDisplay to pfl's text item i
    ignoring white space
        if aDisplay contains "Main Display: Yes" then
            if aDisplay contains "Resolution:" then
                set text item delimiters to "Resolution: "
                set displayRes to text item 2 of aDisplay
                considering white space
                    set text item delimiters to "\r" --line breaks should be \r
                    set displayRes to text item 1 of displayRes
                    set text item delimiters to "\n" --or they might be \n
                    set displayRes to text item 1 of displayRes
                end considering
            end if
        end if
    end ignoring
    set text item delimiters to "Mirror:"
end repeat
set text item delimiters to tid
return displayRes
    
risposta data 24.10.2017 - 21:24
fonte
2

Testato sul mio MacBook Pro con un display Thunderbolt allegato e la barra dei menu su di esso, il seguente ha funzionato:

set theMainDisplayName to do shell script "system_profiler SPDisplaysDataType | grep -B 5 'Main Display:' | awk '{sub(/^[ \t]+/, \"\"); print $0; exit}'"
return theMainDisplayName

Result:
"Thunderbolt Display:"

Se cambio Barra dei menu in MacBook Pro , restituisce il nome del display di esso, invece del nome del Display Thunderbolt .

Per la risoluzione del mio display Thunderbolt :

set theMainDisplayResolution to do shell script "system_profiler SPDisplaysDataType | grep -B 3 'Main Display:' | awk '/Resolution:/{print $2,$3,$4}'"
return theMainDisplayResolution

Result:
"2560 x 1440"

Se cambio Barra dei menu in MacBook Pro , restituisce la risoluzione del display di esso, invece della risoluzione del Display Thunderbolt .

Dai anche un'occhiata alle mie risposte a Script per riposizionare la barra dei menu nella configurazione di due monitor e Modifica la disposizione del display in OS X a livello di codice per un paio di utilità di terze parti potresti anche trovare utile.

Nota: non ho alcuna affiliazione con gli sviluppatori delle utility menzionate e utilizzate nelle mie risposte nei link sopra.

Comprensione un po 'dei comandi della shell usati nei comandi do shell script :

Comando porzione del comando do shell script :

system_profiler SPDisplaysDataType | grep -B 5 'Main Display:' | awk '{sub(/^[ \t]+/, \"\"); print $0; exit}'
  • system_profiler - Segnala la configurazione hardware e software del sistema.
    • SPDisplaysDataType - Genera un report di testo contenente solo informazioni su Grafica e Display.
  • | Tubo per dirigere output di procedere comando a input del prossimo comando .
  • grep - Cerca file pattern. L'utilità grep cerca tutti i file di input specificati, selezionando le linee che corrispondono a uno o più pattern.
    • −B num - Stampa le righe num del contesto principale prima di ogni incontro.
    • 'Main Display:' Pattern da abbinare.
  • | Tubo per dirigere output di procedere comando a input del prossimo comando .
  • awk - Linguaggio di scansione e elaborazione diretto al pattern.
    • sub(/^[ \t]+/, \"\") - Funzione stringa sostitutiva - sub(regexp, replacement) - Utilizzata in questa istanza per rimuovere spazi bianchi iniziali.
      • ^ - Asserisce la posizione all'inizio della stringa.
      • [ \t] : corrisponde a un singolo carattere presente nell'elenco.
        • space - Corrisponde letteralmente al carattere space . Nota che space è usato qui per indicare un singolo carattere di spazio (ASCII 32).
        • \t - Corrisponde a un carattere di tabulazione (ASCII 9).
      • + - Corrisponde tra uno e un numero illimitato di volte, il più volte possibile, restituendo secondo necessità (goloso).
      • \"\" - La sostituzione è con nulla ( "" ). Il "" è scappato, \ , quindi il comando può essere compilato e passato alla shell. Se immesso direttamente nella riga di comando, "" non dovrebbe essere sfuggito.
    • print $0 - Stampa il record completo. - In questo caso stampa la quinta riga sopra Main Display: , san lo spazio bianco iniziale
    • exit - Esce dopo la stampa del primo record .

Comando porzione del comando do shell script :

system_profiler SPDisplaysDataType | grep -B 3 'Main Display:' | awk '/Resolution:/{print $2,$3,$4}'

In questo comando do shell script la porzione awk '/Resolution:/{print $2,$3,$4}' procede come segue:

L' output di e.g.:

$ system_profiler SPDisplaysDataType | grep -B 3 'Main Display:'
          Resolution: 2560 x 1440
          Pixel Depth: 32-Bit Color (ARGB8888)
          Display Serial Number: C08Z4120F6FB
          Main Display: Yes
$

Ottiene convogliato a awk e cerca l' input per un record contenente Resolution: che trova il seguente record corrisponde:

          Resolution: 2560 x 1440

Il comando print $2,$3,$4 , stampa il secondo, il terzo e il quarto campi del record . La , virgola tra i campi $n consiste nell'inserire uno spazio . L' output di cui è:

2560 x 1440
    
risposta data 24.10.2017 - 21:05
fonte

Leggi altre domande sui tag