Как нарисовать рабочий стол в 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) и без тени (setHasShadow:NO.)

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

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


person Dominic Cooney    schedule 13.02.2011    source источник


Ответы (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;
}
person Rob Keniger    schedule 13.02.2011

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

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

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

person Dominic Cooney    schedule 13.02.2011