2010-03-10 10 views
11

Diciamo che voglio scrivere una semplice applicazione Cocoa per rendere più utile la funzione Spaces di Leopard. Vorrei configurare ogni spazio per avere, diciamo, diversoRilevare quando uno spazio cambia in Spazi in Mac OS X

  • schermo risoluzioni
  • layout di tastiera
  • di volume (per l'audio)

Quindi ci sono due parti per la mia domanda:

  1. Suppongo che ci siano modi per modificare queste tre cose indipendentemente da Spaces, giusto? Se é cosi, come?
  2. Come posso rilevare nella mia app quando si verifica uno spazio, e quando ciò accade, determinare a quale spazio l'utente è appena passato? Leopard invia alcune notifiche distribuite o qualcosa del genere?

Aggiornamento: ci deve essere qualche modalità API pubblica per fare ciò, a giudicare da tutte le app relative a Spaces sul Mac App Store.

risposta

9

Come dice Peter, in 10.6 è possibile utilizzare NSWorkSpaceNSWorkspaceActiveSpaceDidChangeNotification per ottenere una notifica quando lo spazio di lavoro cambia.

È quindi possibile determinare lo spazio corrente utilizzando Quartz API, la chiave del dizionario kCGWindowWorkspace contiene lo spazio di lavoro. esempio:

int currentSpace; 
// get an array of all the windows in the current Space 
CFArrayRef windowsInSpace = CGWindowListCopyWindowInfo(kCGWindowListOptionAll | kCGWindowListOptionOnScreenOnly, kCGNullWindowID);  

// now loop over the array looking for a window with the kCGWindowWorkspace key 
for (NSMutableDictionary *thisWindow in (NSArray *)windowsInSpace) 
{ 
    if ([thisWindow objectForKey:(id)kCGWindowWorkspace]) 
     { 
      currentSpace = [thisWindow objectForKey(id)kCGWindowWorkspace] intValue]; 
      break; 
     } 
} 

In alternativa è possibile ottenere lo spazio utilizzando l'API private, dare un'occhiata a CGSPrivate.h, che ti permette di fare questo:

int currentSpace = 0; 
CGSGetWorkspace(_CGSDefaultConnection(), &currentSpace); 

Per cambiare la risoluzione dello schermo si vorrà guardare Quartz services, per modificare il volume this may be helpful.

+0

Grazie. Ma cosa succede se non ci sono finestre nello spazio? Questo caso può essere gestito tramite API pubblica? – Enchilada

+1

Nella tua app crea una finestra trasparente e impostala unisci a tutti gli spazi, quindi cerca quella nella serie di finestre. Per impostare una finestra su tutti gli spazi, utilizzare questo: [transparentWindow setCollectionBehavior: NSWindowCollectionBehaviorCanJoinAllSpaces] – BendiLow

+1

Quando si utilizza 'kCGWindowWorkspace' ho notato che l'ID spazio cambia dopo un riavvio per gli spazi dopo il primo (su Lion). Ciò rende la memorizzazione dell'ID praticamente inutile ... Esiste un'altra API pubblica per questo? (Forse collegato a questo: http://openradar.appspot.com/9241430) – Mark

5

NSWorkspace invia un NSWorkspaceActiveSpaceDidChangeNotification sul proprio centro di notifica, ma solo su Snow Leopard.

+1

Sì, ma la notifica indica solo che lo spazio cambia. Ma non esiste un dizionario userInfo con quella notifica con informazioni come quello che è lo spazio corrente, ecc. Quindi non è davvero una potente notifica .. – Enchilada