Как нарисовать рабочий стол на Mac OS X?

Я хочу нарисовать рабочий стол на Mac OS X (Snow Leopard). В частности, я хочу достичь того же эффекта, что и запуск:

/System/Library/Frameworks/ScreenSaver.framework/Resources/
ScreenSaverEngine.app/Contents/MacOS/ScreenSaverEngine -background

(Если вы не рядом с компьютером, это отображает заставку, где вы обычно видите фон рабочего стола.)

Я знаю, как сделать окно без границы (путем подкласса NSWindow и переопределения initWithContentRect:styleMask:backing:defer: чтобы установить стиль окна в NSBorderlessWindowMask) и без тени (сетхассадоу: нет.)

Я знаю, что могу вызвать setLevel: kCGDesktopWindowLevel или kCGDesktopIconWindowLevel, чтобы поместить мое окно под другие окна (см. вопрос 418791.) Однако это не совсем то, что я хочу, потому что окно на этом уровне все еще находится поверх значков рабочего стола. Я хочу быть поверх фона рабочего стола, но ниже значков.

мой взгляд, непрозрачно. Если есть техника, которая разбивает фон рабочего стола, это нормально.

2 ответов


вы должны создать подкласс NSWindow и до (kCGDesktopWindowLevel - 1). Это получит ваше окно под значками. Вы также должны убедиться, что ваше окно не станет ключевым или основным и что оно правильно обрабатывает Exposé/Spaces, не перемещаясь.

- (id)initWithContentRect:(NSRect)contentRect styleMask:(NSUInteger)windowStyle backing:(NSBackingStoreType)bufferingType defer:(BOOL)deferCreation
{
    self = [super initWithContentRect:contentRect styleMask:windowStyle backing:bufferingType defer:deferCreation];
    if(self)
    {
        [self setLevel:kCGDesktopWindowLevel - 1];
        [self setCollectionBehavior:
            (NSWindowCollectionBehaviorCanJoinAllSpaces | 
             NSWindowCollectionBehaviorStationary | 
             NSWindowCollectionBehaviorIgnoresCycle)];
    }
    return self;
}

- (BOOL)canBecomeMainWindow
{
    return false;
}

- (BOOL)canBecomeKeyWindow
{
    return false;
}

чтобы отобразить над рабочим столом, но под значками рабочего стола, вам нужно сделать две вещи:

  1. вызов [window setLevel:kCGDesktopWindowLevel] плавать под другими окнами приложений.
  2. вызов [window orderBack:self] для слоя за окном, которое рисует значки рабочего стола.

что-то во время запуска приложения выводит приложение на передний план, поэтому вы должны вызвать orderBack: in applicationDidFinishLaunching: метод делегата приложения.