2011-09-25 105 views
15

我想在屏幕上更改所有桌面(以前的“空格”)的壁纸。从OS X 10.6开始,有一个允许设置壁纸的NSWorkspace类别,但是,当我使用此功能时,只有当前桌面的壁纸发生变化,其他所有桌面保持不变。更改OS X 10.7 Lion中所有桌面上的壁纸?

然后,我看了桌面偏好plist并编写了一个类,修改它以反映我想要的更改(基本上设置了一个新的图像文件路径)。新文件保存后,我发送了com.apple.desktop“BackgroundChanged”通知 - 谷歌如果你不知道我在说什么,这是人们在10.6天前更换壁纸的方式。起初,这并没有产生任何结果,所以不是“无”作为userInfo字典,我发送完全相同的userInfo字典一样,当你在你的设置中更改壁纸时,苹果会做的(订阅通知在应用程序中,并更改壁纸在设置应用程序中,你会看到它的样子)。幸运在这里帮助了我,当我以这种方式发送通知时出于某种原因Dock发生崩溃并且重新加载时,它会从首选项文件加载设置,从而显示我的更改。

这可以在10.7.1上运行,但是,我会a)宁愿没有糟糕的坞站崩溃和重新加载的用户体验,以及b)使用或多或少保证在未来版本中工作的路径。利用一个错误似乎不是一条稳定的路径。

有关如何更改所有桌面墙纸的其他想法?我也不确定目前的NSWorkspace壁纸类别的行为是打算还是错误的,但是,从壁纸偏好窗格的行为来看,前者似乎是这样。

回答

7

没有API为所有屏幕或所有空间设置相同的壁纸,NSWorkspace setDesktopImageURL它被实现为它只在当前屏幕上设置当前空间的壁纸,这也是系统首选项如何实现的。

除了手动修改〜/ Library/Preferences/com.apple.desktop.plist(格式可能会更改)和使用通知来重新加载它(崩溃经验丰富)的方法之外,您可以将壁纸设置为用户切换到的空间,例如寻找NSWorkspaceActiveSpaceDidChangeNotification(如果你的应用程序不总是运行,你可以告诉用户切换到他希望壁纸应用到的所有空间),可以说这些方法并不理想,但至少它们不是不稳定的。

-(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

感谢valexa,ActiveSpaceChanged通知实际上是我现在最终使用的。虽然有效,但它不像只能用一个命令设置它们那么优雅 – Robin