Cocoa-программно добавление приложения ко всем пространствам
Можно ли программно добавить приложение ко всем пространствам? Я бы хотел, чтобы мое приложение было на всех пространствах по умолчанию.
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. Тогда просто убейте дока.
Используйте команду 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