Измените обои на всех десктопах в OS X 10.7 Lion?

Я хотел бы поменять обои на всех десктопах (ранее "пробелы" ) на экране. Начиная с OS X 10.6, существует категория для NSWorkspace, которая позволяет устанавливать обои, однако, когда я использую эту функцию, только обои текущего рабочего стола меняются, а все остальные рабочие станции остаются неизменными.

Затем я просмотрел планку предпочтений рабочего стола и написал класс, который изменяет его, чтобы отразить изменения, которые я хочу (в основном устанавливают новый путь к файлу изображения). После сохранения нового файла я отправил уведомление com.apple.desktop "BackgroundChanged" - Google, если вы не знаете, о чем я говорю, так это то, как люди меняли обои за 10,6 дней. Сначала это не дало результата, поэтому вместо "nil" в качестве словаря userInfo я отправил точно такой же словарь userInfo, что и Apple, когда вы меняете обои в своих настройках (подпишитесь на уведомление в приложении и измените обои в приложении настроек, и вы увидите, как это выглядит). Удача помогла мне здесь, когда я отправил уведомление таким образом по какой-то причине, Dock разбился, и когда он перезагрузился, он загрузил настройки из файла настроек, отображая мои изменения.

Это работает на 10.7.1, однако я бы а) скорее не имел плохой опыт работы с док-станцией сбой и перезагрузку, и б) использовать путь, который более или менее гарантированно работает в будущих выпусках. Использование ошибки не похоже на стабильный путь.

Любые другие идеи о том, как изменить обои всех настольных компьютеров? Я также не уверен, является ли текущее поведение категории обоев NSWorkspace или ошибка, однако, судя по поведению панели предпочтений обоев, кажется, что это первый случай.

Ответы

Ответ 1

Нет апи для установки одинаковых обоев для всех экранов или всех пространств, 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;
}