Cocoa-программно добавление приложения ко всем пространствам


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

5 4

5 ответов:

Необходимые вам методы находятся в NSWindow.

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

- (void)setCollectionBehavior:(NSWindowCollectionBehavior)behavior

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

- (BOOL)canBeVisibleOnAllSpaces

Этот фрагмент кода работает для меня (по крайней мере, на 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) 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

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

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

Applescript; открытие приложения в Пробел N

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

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

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

Обратите внимание, что вы должны перезагрузить док (killall Dock) и каким-то образом выполнить эти команды из вашего приложения. Из objective-c вы можете использовать следующий фрагмент кода, чтобы выйти из дока:
NSRunningApplication *dock = [NSRunningApplicationrunningApplicationWithBundleIdentifier:@"com.apple.dock"];
[dock terminate];

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

quit application "Dock"

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

#import "alwaysOnTopAppDelegate.h"

@implementation alwaysOnTopAppDelegate

@synthesize window;

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

@end