Поменять обои на всех рабочих столах в OS X 10.7 Lion? - PullRequest
15 голосов
/ 25 сентября 2011

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

Iзатем посмотрел на список параметров рабочего стола и написал класс, который модифицирует его, чтобы отразить изменения, которые я хочу (в основном, установить новый путь к файлу изображения).После того, как новый файл был сохранен, я отправил com.apple.desktop уведомление «BackgroundChanged» - Google, если вы не знаете, о чем я говорю, именно так люди меняли обои за 10.6 дней.Сначала это не дало никаких результатов, поэтому вместо «nil» в качестве словаря userInfo я отправил точно такой же словарь userInfo, как Apple, когда вы меняете обои в настройках (подпишитесь на уведомление в приложении и измените обои).в настройках приложения вы увидите как это выглядит).Удача помогла мне в этом, когда я отправил уведомление таким образом по какой-то причине, разбился док-станция, и когда он перезагрузился, он загрузил настройки из файла настроек, таким образом отображая мои изменения., Я бы а) скорее не испытал бы неприятных ощущений от сбоя и перезагрузки док-станции, и б) использовал бы путь, который более или менее гарантированно будет работать и в будущих версиях.Использование ошибки не похоже на стабильный путь.

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

1 Ответ

7 голосов
/ 01 марта 2012

Нет 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;
}
...