Sto scrivendo un framework per OS X che può essere utilizzato da applicazioni con o senza una connessione a OS X WindowServer (ad esempio, sia le app della GUI che le app della riga di comando vengono eseguite, ad esempio una sessione ssh). Una classe nel framework è per il tracciamento dei file nella cartella home dell'utente attraverso le directory network e mobile home (su OS X, gli utenti possono avere la loro home directory servita tramite AFP da un server - una "home directory di rete" - o stessa cartella home sincronizzata per l'accesso offline - una "directory home mobile").Determina se WindowServer è disponibile?
Perché ho bisogno di tracciare i file attraverso i filesystem, abbiamo scelto di usare percorsi relativi, piuttosto che gli alias OS X (oi 10.6 segnalibri NSURL
). Quando non è possibile trovare un file, ho bisogno di chiedere all'utente l'input per riposizionarlo (come il modo in cui Alias Manager richiede all'utente di ricollegare un alias non funzionante). Se l'applicazione ha (o può fare) una connessione al WindowServer, questo è semplice come usare un NSOpenPanel
. Tuttavia, quando l'app non può stabilire una connessione con il WindowServer, ho bisogno di utilizzare un metodo alternativo per ottenere l'input dell'utente.
Quindi, come posso sapere quale metodo utilizzare dal codice di famework? C'è un modo per determinare in modo programmatico se una connessione WindowServer è disponibile (o possibile)?
Riconosco che un'architettura alternativa, in cui il client framework fornisce un meccanismo di callback per richiedere all'utente di lasciare che la strategia di raccolta input venga fornita dall'applicazione chiamante. Mi piacerebbe rendere le cose il più semplici possibile per l'applicazione chiamante, tuttavia, quindi la mia prima scelta sarebbe incapsulare questi dettagli nel framework, se possibile.
Sembra che CGWindowServerCFMachPort possa anche fornire le stesse informazioni in questo caso (restituisce anche NULL) quando nessun server di Windows è disponibile. Grazie per il puntatore! –
Non dimenticare di controllare se la sessione è la corrente (l'utente controlla il server della finestra: non viene allontanato rapidamente) –
Poiché Leone 'CGWindowServerCFMachPort' riuscirà anche se non c'è una sessione corrente quindi non va bene. 'CGSessionCopyCurrentDictionary' è un po 'più affidabile, ma non puoi ancora dirlo a ssh da Terminal perché entrambi ora forniranno informazioni complete sulla sessione in modo che' SSH_CONNECTION' sia l'unico modo per dirlo. –