Как нарисовать рабочий стол на Mac OS X? - PullRequest
11 голосов
/ 13 февраля 2011

Я хочу нарисовать рабочий стол на 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.)

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

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

Ответы [ 2 ]

21 голосов
/ 14 февраля 2011

Вы должны создать подкласс 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;
}
2 голосов
/ 13 февраля 2011

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

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

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

...