2009-09-08 17 views
5

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.

risposta

7

C'è una variabile di ambiente denominata SECURITYSESSIONID impostata da loginwindow.app e viene passata alle applicazioni dell'utente. La variabile non è impostata se si effettua il login tramite ssh. Serve come una specie di maniglia per parlare con il server della finestra.

Problema: l'esistenza di questa variabile non significa che questo utente controlli attualmente il gestore di finestre (si pensi al cambio rapido utente).

C'è una funzione chiamata CGSessionCopyCurrentDictionary nel quadro ApplicationServices che sembra essere molto promettente:

Valore di ritorno: Un dizionario sessione server finestra, o NULL se il chiamante non è in esecuzione all'interno di una sessione al quarzo GUI o dalla finestra il server è disabilitato. Dovresti rilasciare il dizionario quando hai finito di usarlo. Per informazioni sulle coppie chiave-valore in questo dizionario, vedere "Proprietà sessione server finestre".

+2

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! –

+1

Non dimenticare di controllare se la sessione è la corrente (l'utente controlla il server della finestra: non viene allontanato rapidamente) –

+1

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. –

Problemi correlati