Как программно изменить настройки Dock? - PullRequest
2 голосов
/ 12 мая 2011

Я новичок в программировании Cocoa / macOS. Я только что узнал, что NSUserDefaults можно использовать для изменения настроек приложения / системы, как это делает команда defaults.

Но я не знаю, как заставить эти настройки обновляться.

например, я использую NSUserDefaults, чтобы установить размер дока 32, и синхронизировать настройку. Но док сохраняет старые настройки.

Даже когда я использую defaults write com.apple.dock tilesize 32 для изменения его размера, он не будет обновляться, пока я не выйду из системы и не войду в систему.

Есть ли какая-либо другая технология для уведомления док-станции о получении обновления? Я знаю, что Системные настройки могут сделать это.

Спасибо!

Ответы [ 3 ]

3 голосов
/ 12 мая 2011

Док Mac OS X не перезагружает свои настройки, пока он не будет убит и перезапущен.Точно так же, как вам нужно изменить его настройки вручную через терминал (defaults write com.apple.dock tilesize 32; killall Dock), вы должны сделать это в коде.Итак, пока вы написали часть кода defaults, вы должны написать часть kill:

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

Если вы хотите сделать это, не убивая док, извините, но вывам не повезло.Хотя может быть скрытый API, чтобы заставить док-станцию ​​перезагружать свои настройки на лету, во всех моих поисках я никогда не обнаруживал никаких намеков на то, как это можно сделать (в скрытом распределенном центре уведомлений нет сообщений о том, что большинство приложенийвзаимодействовать друг с другом).

1 голос
/ 21 августа 2017

С помощью волшебства отладчика XCode и некоторой отформатированной разборки я создал этот короткий заголовочный файл, который вы можете вставить в свой код (GitHub gist здесь ). Надеемся, что названия функций говорят сами за себя.

// TO USE THESE INTERFACES, you MUST link against ApplicationServices.framework.

#pragma once

#ifdef __cplusplus
extern "C" {
#endif

    // Boolean preferences
    extern void CoreDockSetLaunchAnimationsEnabled(bool enable);
    extern void CoreDockSetMagnificationEnabled(bool enable);
    extern void CoreDockSetAutoHideEnabled(bool enable);
    extern void CoreDockSetMinimizeInPlace(bool enable);

    // Sets other preferences such as whether the indicators below the app icons are shown
    // 'preferenceDict' is a CFDictionary containing a magic key value
    // Will require further inspection of Dock.prefpane to find all the keys
    // (I haven't noted them down)
    extern void CoreDockSetPreferences(CFDictionaryRef preferenceDict);

#ifdef __cplusplus
} // extern "C"
#endif

Настройки, обновленные таким образом, отражаются мгновенно, потому что эти функции на самом деле внутренне сообщают сервису com.apple.dock.
Веселись!

ОБРАТИТЕ ВНИМАНИЕ: Это частные системные API. Любые приложения, представленные в Mac App Store, использующие эти API , будут отклонены . С другой стороны, если у вас нет намерений в App Store, использование этих интерфейсов не повредит. Похоже, они существовали с самого зарождения Mac OS X, и маловероятно, что они исчезнут в ближайшем будущем, если вообще когда-либо.

0 голосов
/ 12 мая 2011

Вы можете использовать AppleScript, чтобы установить некоторые свойства док-станции с помощью сценариев «Системные настройки». Возможно, вы захотите взглянуть на вопрос, можете ли вы использовать этот подход вместо этого?Может, вызвать какой-нибудь AppleScript из вашего приложения?

...