Какао - программно добавление приложения во все пространства - PullRequest
4 голосов
/ 18 сентября 2011

есть ли способ программно добавить приложение во все пробелы?Я бы хотел, чтобы мое приложение было по умолчанию во всех местах.

Ответы [ 5 ]

3 голосов
/ 18 сентября 2011

Методы, которые вам нужны, находятся в NSWindow.

Для использования Lion:

- (void)setCollectionBehavior:(NSWindowCollectionBehavior)behavior

Для Pre-Lion переопределите следующее, чтобы вернуть YES:

- (BOOL)canBeVisibleOnAllSpaces
2 голосов
/ 18 сентября 2011

Этот фрагмент кода работает для меня (по крайней мере на 10.6.8 в небольшом проекте, над которым я недавно работал):

-(void)windowDidLoad {
    // Make the window visible on all Spaces
    if([[self window] respondsToSelector: @selector(setCollectionBehavior:)]) {
        [[self window] setCollectionBehavior: NSWindowCollectionBehaviorCanJoinAllSpaces];
    }
    else if([[self window] respondsToSelector: @selector(canBeVisibleOnAllSpaces)]) {
        [[self window] canBeVisibleOnAllSpaces]; // AVAILABLE_MAC_OS_X_VERSION_10_5_AND_LATER_BUT_DEPRECATED
    }
}

Я поместил этот код в (собственный подкласс) WindowController дляглавное окно приложения.

1 голос
/ 21 сентября 2011

Хорошо. Программная привязка рабочих пространств, приложений и приложений не работала. Я попробовал:

1) Verified no entries were in System Preferences->Spaces

2) defaults write com.apple.dock workspaces-app-bindings -dict-add com.apple.mail 65544

3) killall Dock (also needed to kill System Preferences )

4) Opened System Preferences->Spaces to verify the Mail app entry 
   appeared and was set to Every Space

5) Launched Mail, but it was still stuck to Space 1

6) Only when I went back into System Preferences->Spaces and changed the 
   Mail app *from* Every Space and then *back* to Every Space did the Mail 
   app stick to every space

Итак, системные настройки делают что-то дополнительное, чтобы активировать настройку. Кто-нибудь знает, что это может быть? Спасибо!

Обновление: так что я смог заставить это работать, используя api applecript вместо пользовательских api по умолчанию. В следующем посте рассказывается, как добавить запись с использованием appleScript. Тогда просто убей док.

Applescript; открытие приложения в пространстве № N

0 голосов
/ 28 сентября 2011

Ваш представитель приложения должен выглядеть следующим образом ...

#import "alwaysOnTopAppDelegate.h"

@implementation alwaysOnTopAppDelegate

@synthesize window;

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    [window setCollectionBehavior:NSWindowCollectionBehaviorCanJoinAllSpaces];
}

@end
0 голосов
/ 18 сентября 2011

Используйте команду defaults, которая поставляется с OS X, например:

defaults write com.apple.dock workspaces-app-bindings -dict-add com.apple.mail 65544

Выполнив приведенную выше команду, вы устанавливаете приложение, обозначенное «com.apple.mail», чтобы оно отображалось в каждом поле. 65544 - это магическое значение, говорящее «каждый пробел». Если пара ключ-значение (идентификатор + настройки) существует, она будет перезаписана.

Обратите внимание, что вам необходимо перезагрузить Dock (killall Dock) и каким-то образом выполнить эти команды из вашего приложения. В рамках цели-c вы можете использовать следующий фрагмент для выхода из Dock:

NSRunningApplication *dock = [NSRunningApplicationrunningApplicationWithBundleIdentifier:@"com.apple.dock"];
[dock terminate];

Из AppleScript используйте следующее:

quit application "Dock"
...