2011-09-25 6 views
15

Me gustaría cambiar el fondo de todos los escritorios (anteriormente "espacios") en una pantalla. A partir de OS X 10.6 hay una categoría para NSWorkspace que permite la configuración del fondo de pantalla, sin embargo, cuando uso esta función, solo se cambia el fondo de pantalla del escritorio actual y todos los demás escritorios permanecen sin cambios.Cambiar el fondo de pantalla en todos los escritorios en OS X 10.7 Lion?

Luego miré a la lista de preferencias de escritorio y escribí una clase que la modifica para reflejar los cambios que quiero (básicamente establecer una nueva ruta de archivo de imagen). Después de que se guardó el nuevo archivo, envié la notificación "BackgroundChanged" de com.apple.desktop - Google si no sabes de lo que estoy hablando, esta fue la forma en que las personas cambiaron los fondos de pantalla en los últimos 10.6 días. Al principio, esto no produjo ningún resultado, así que en lugar de "nil" como userInfo dictionary envié exactamente el mismo diccionario userInfo junto con Apple cuando cambias el fondo de pantalla en tu configuración (suscríbete a la notificación en una aplicación y cambia el fondo de pantalla en la aplicación de configuración y verá cómo se ve). La suerte me ayudó aquí, cuando envié la notificación de esta manera por alguna razón el Dock se bloqueó y cuando se recargó, cargó la configuración del archivo de preferencias mostrando mis cambios.

Esto funciona en 10.7.1, sin embargo, yo a) no tengo la mala experiencia del usuario de la falla del muelle y la recarga, yb) uso una ruta que está más o menos garantizada para trabajar en futuras versiones, así . Explotar un error no parece un camino estable.

¿Alguna otra idea sobre cómo cambiar el fondo de pantalla de todos los escritorios? Tampoco estoy seguro si el comportamiento actual de la categoría de fondos de escritorio de NSWorkspace es intencionado o un error, sin embargo, a juzgar por el comportamiento del panel de preferencias de fondo de pantalla, parece que el primero es el caso.

Respuesta

7

No hay API para configurar el mismo fondo de pantalla para todas las pantallas o espacios, NSWorkspace setDesktopImageURL se implementa de tal manera que solo establece el fondo para el espacio actual en la pantalla actual, así es como las Preferencias del sistema también lo hacen .

Además del método volátil de modificar manualmente ~/Library/Preferences/com.apple.desktop.plist (el formato podría cambiar) y usar las notificaciones para volver a cargarlo (bloqueos que experimentó) lo que puede hacer es configurar el fondo de pantalla para espacios a medida que el usuario cambia a él, por ejemplo busque NSWorkspaceActiveSpaceDidChangeNotification (si su aplicación no siempre se está ejecutando, podría decirle al usuario que cambie a todos los espacios a los que desea que se aplique el fondo de pantalla), podría decirse que estos métodos no son ideales, pero al menos no son volátiles.

-(void)setWallpaper 
{ 
    NSWorkspace *sws = [NSWorkspace sharedWorkspace]; 
    NSURL *image = [NSURL fileURLWithPath:@"/Library/Desktop Pictures/Andromeda Galaxy.jpg"]; 
    NSError *err = nil; 
    for (NSScreen *screen in [NSScreen screens]) { 
     NSDictionary *opt = [sws desktopImageOptionsForScreen:screen];   
     [sws setDesktopImageURL:image forScreen:screen options:opt error:&err]; 
     if (err) { 
      NSLog(@"%@",[err localizedDescription]); 
     }else{ 
      NSNumber *scr = [[screen deviceDescription] objectForKey:@"NSScreenNumber"]; 
      NSLog(@"Set %@ for space %i on screen %@",[image path],[self spaceNumber],scr); 
     } 
    } 
} 

-(int)spaceNumber 
{ 
    CFArrayRef windowsInSpace = CGWindowListCopyWindowInfo(kCGWindowListOptionAll | kCGWindowListOptionOnScreenOnly, kCGNullWindowID);  
    for (NSMutableDictionary *thisWindow in (NSArray *)windowsInSpace) { 
     if ([thisWindow objectForKey:(id)kCGWindowWorkspace]){ 
      return [[thisWindow objectForKey:(id)kCGWindowWorkspace] intValue]; 
     } 
    } 
    return -1; 
} 
+0

Gracias valexa, las notificaciones de ActiveSpaceChanged son en realidad lo que terminé usando por ahora. Funciona pero no es tan elegante como solo poder configurarlos con un solo comando – Robin

Cuestiones relacionadas