2014-06-22 11 views
5

Ho bisogno di identificare univocamente un display nella misura in cui i display sono effettivamente caratteristici. Pertanto, gli stessi modelli di display, inseriti nella stessa porta fisica, non sarebbero trattati come diversi, ma sostanzialmente tutto il resto sarebbe.CGDirectDisplayID, più GPU, CGDisplayIOServicePort deprecato e display identificativi in ​​modo univoco

Quando cambia la GPU di sistema, anche CGDirectDisplayID cambia, ma non in modo documentato. La sperimentazione indica che lo stesso ID schermo sarà diverso di 2 a seconda della GPU utilizzata.

CGDisplayID changing issues

Un modo per superare questo è stato quello di ottenere una stringa di Registro di sistema IO per il display:

io_service_t servicePort = CGDisplayIOServicePort (cgDisplayID); 
io_service_t root = IODisplayForFramebuffer (servicePort, kNilOptions); 
NSDictionary* ioRegistryDict = nil; 
NSString*  displayKey = nil; 

IORegistryEntryCreateCFProperties (root, (CFMutableDictionaryRef *)&ioRegistryDict, kCFAllocatorDefault, kNilOptions); 

if (ioRegistryDict) 
    displayKey = [ioRegistryDict objectForKey:@"IODisplayPrefsKey"]; 

Questo metodo funziona bene, tranne che in 10.9, CGDisplayIOServicePort è deprecato.

Considerato tutto questo e il consiglio di Apple di non memorizzare nella cache NSScreens (che comunque non funziona per questo scopo), qual è il modo migliore per identificare in modo affidabile gli schermi in modo da poter dire (ad esempio) la differenza tra uno schermo a casa e uno al lavoro?

Non voglio dover fare affidamento sulla risoluzione dello schermo perché l'utente che cambia la risoluzione non deve essere considerato un display diverso. Né dovrebbe essere considerato diverso lo stesso schermo su diverse GPU.

Un obiettivo secondario è trovare un modo che, dato un CGDirectDisplayID, come posso determinare che cosa sarebbe il CGDirectDisplayID per lo stesso schermo se dovesse verificarsi un interruttore GPU? Questo mi permetterebbe almeno di tenere traccia dei display di CGDirectDisplayID a patto che potessi abbinare i due risultati dei due controller GPU.

+0

Non sono esattamente sicuro di quali proprietà di un display si desidera influenzare la nozione di "uguale" rispetto a "diversa", ma è necessario considerare le funzioni di Quartz Display Services come 'CGDisplayModelNumber()', 'CGDisplaySerialNumber() ',' CGDisplayUnitNumber() 'e' CGDisplayVendorNumber() '. –

+0

Il riferimento al quarzo afferma che "Quando si assegna un ID display, Quartz considera i seguenti parametri: Fornitore, Modello, Numero di serie e Posizione nel registro I/O Kit" Quando eseguo il mio MBP sulla GPU integrata ottengo: displayID : 2.077.805,631 mila. Sulla veloce GPU (AMD Radeon) ottengo un displayID: 69678016. In entrambi i casi il venditore, il modello, s/n e l'unità sono gli stessi: 1552, 40143, 0, 0. Quindi che altro Apple sta facendo questo sta causando questi Gli ID devono essere diversi? – Trygve

+0

Non lo so. Dubito che la lista fosse esaustiva. Ma perché ti importa? Ho pensato che stavi cercando un modo per identificare un display che * non * cambiava con la GPU. –

risposta

0

Usa CFUUIDRef che può essere ottenuta utilizzando CGDisplayCreateUUIDFromDisplayID (CGDirectDisplayID DisplayID), e si può ottenere l'UUID indietro con CGDisplayGetDisplayIDFromUUID (CFUUIDRef uuid)

Questo è quello che sto usando per identificare in modo univoco viene visualizzato anche quando i loro cambiamenti CGDirectDisplayID . Sfortunatamente, queste funzioni non sono adeguatamente documentate da Apple, ma i miei test su più Mac con display multipli hanno dimostrato che il CFUUIDRef ottenuto è unico e coerente, anche quando CGDirectDisplayID cambia per qualsiasi ragione.

Queste chiamate API sono disponibili in ApplicationServices in 10.7 - 10.12 e ColorSync dal 10.13.