2010-03-10 8 views
11

Digamos que quiero escribir una aplicación Cocoa simple para hacer que la función Espacios de Leopard sea más útil. Me gustaría configurar cada espacio que tiene, por ejemplo, diferentesDetectando cuando un espacio cambia en Espacios en Mac OS X

  • resoluciones de pantalla
  • disposiciones de teclado
  • volumen (para audio)

Así que hay dos partes a mi pregunta:

  1. Supongo que hay formas de modificar estas tres cosas independientemente de Spaces, ¿verdad? ¿Si es así, cómo?
  2. ¿Cómo puedo detectar en mi aplicación cuando se produce un cambio de espacio, y cuando eso sucede, determine a qué espacio el usuario acaba de cambiar? ¿Leopard envía algunas notificaciones distribuidas o algo así?

Actualización: Tiene que haber alguna forma de API pública para hacer esto, a juzgar por todas las aplicaciones relacionadas con Spaces en la Mac App Store.

Respuesta

9

Como dice Peter, en 10.6 puede usar el NSWorkSpaceNSWorkspaceActiveSpaceDidChangeNotification para recibir una notificación cuando el espacio de trabajo cambie.

Puede determinar el espacio actual utilizando la API de Quartz, la clave del diccionario kCGWindowWorkspace contiene el espacio de trabajo. por ejemplo:

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; 
     } 
} 

Como alternativa se puede obtener el espacio mediante la API privada, echar un vistazo a CGSPrivate.h que le permite hacer esto:

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

Para cambiar la resolución de pantalla que usted quiere mira Quartz services, para alterar el volumen this may be helpful.

+0

Gracias. Pero, ¿y si no hay ventanas en el espacio? ¿Se puede manejar ese caso a través de una API pública? – Enchilada

+1

En su aplicación, cree una ventana transparente y configúrela para unir todos los espacios, luego búsquela en la matriz de ventanas. Para establecer una ventana en todos los espacios use esto: [transparentWindow setCollectionBehavior: NSWindowCollectionBehaviorCanJoinAllSpaces] – BendiLow

+1

Cuando uso 'kCGWindowWorkspace' noté que el Space ID cambia después de un reinicio por espacios después del primero (en Lion). Eso hace que almacenar el ID sea bastante inútil ... ¿Hay otra API pública para esto? (Quizás relacionado con esto: http://openradar.appspot.com/9241430) – Mark

5

NSWorkspace publica un NSWorkspaceActiveSpaceDidChangeNotification en su propio centro de notificaciones, pero solo en Snow Leopard.

+1

Sí, pero esa notificación solo indica que el espacio cambia. Pero no hay ningún diccionario de usuario con esa notificación con información como cuál es el espacio actual, etc. Por lo tanto, no es realmente una notificación poderosa. – Enchilada