Как узнать, можно ли свернуть окно при двойном щелчке по заголовку? - PullRequest
7 голосов
/ 23 мая 2011

Это изображение из SystemPreferences> Внешний вид enter image description here

Я хочу знать, как получить это значение программно?

Я спрашиваю, потому что рисую окно с настраиваемой заголовкой иЯ хочу, чтобы он был похож (по поведению) как можно больше на обычные (ненастроенные) окна какао.

Может быть, терминальная команда, которую я могу передать, или есть API-интерфейс какао, который это делает?

РЕДАКТИРОВАНИЕ:

Ответ (спасибо NSGod)

- (void)mouseUp:(NSEvent *)event{

    if ([event clickCount] == 2) {
        //Get settings from "System Preferences" >  "Appearance" > "Double-click on windows title bar to minimize"
        NSString *const MDAppleMiniaturizeOnDoubleClickKey = @"AppleMiniaturizeOnDoubleClick";
        NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
        // [userDefaults addSuiteNamed:NSGlobalDomain]; // unnecessary
        BOOL shouldMiniaturize = [[userDefaults objectForKey:MDAppleMiniaturizeOnDoubleClickKey] boolValue];
        if (shouldMiniaturize) {
            [self miniaturize:self];
        }
    }
}

Позже я обнаружил, что Внешний вид (Аква / Графит) можно найти:

NSString * const kAppleAquaColorVariant = @"AppleAquaColorVariant";
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
// [userDefaults addSuiteNamed:NSGlobalDomain]; // unnecessary  
NSNumber *color = [userDefaults objectForKey:kAppleAquaColorVariant];
if ([color intValue] == 6) {//graphite is 6 
    imageName = [imageName stringByAppendingFormat:@"_graphite"];
}else{//defaults to aqua, (aqua is 1)
    imageName = [imageName stringByAppendingFormat:@"_colorsryg"];
}

Что тоже может быть полезным:)

1 Ответ

5 голосов
/ 23 мая 2011

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

NSString * const MDAppleMiniaturizeOnDoubleClickKey = @"AppleMiniaturizeOnDoubleClick";

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
// [userDefaults addSuiteNamed:NSGlobalDomain]; // unnecessary

NSNumber *miniaturize = [userDefaults
                     objectForKey:MDAppleMiniaturizeOnDoubleClickKey];

NSLog(@"AppleMiniaturizeOnDoubleClick == %@",
                ([miniaturize boolValue] ? @"YES" : @"NO"));

(Этот параметр предпочтения хранится в невидимом .GlobalPreferences.plist в папке ~ / Library / Preferences /).

Обратите внимание, что по умолчанию опция «двойной щелчок для минимизации» отключена, поэтому, если вы проверяете наличие AppleMiniaturizeOnDoubleClick и он возвращает nil, это означает, что он выключен.(Пользовательские значения по умолчанию начинают сохранять значения, только если они отличаются от значений по умолчанию).

Этот ключ такой же в Leopard, как и в Snow Leopard.(Он не изменился ни в Lion, ни в Mountain Lion).

Конечно, в NSWindow, -(BOOL)_shouldMiniaturizeOnDoubleClick есть секретный (приватный) метод, но я бы не рекомендовал использовать приватные методы.

[ОБНОВЛЕНИЕ] Относительно комментария Catfish_Man: вы правы в том, что строка [userDefaults addSuiteNamed:NSGlobalDomain]; не нужна, поскольку NSUserDefaults уже имеет возможность читать глобальные настройки.(Я изменил приведенный выше код, чтобы отразить это).

"Кроме того, NSGlobalDomain не переведен в .GlobalPreferences.plist для этого метода."

I 'Я не уверен, что следую за тобой там.NSUserDefaults построен на основе CFPreferences, который определяет следующие 6 констант:

Приложение:

 kCFPreferencesAnyApplication,
 kCFPreferencesCurrentApplication

Хост:

 kCFPreferencesAnyHost,
 kCFPreferencesCurrentHost

Пользователь:

 kCFPreferencesAnyUser,
 kCFPreferencesCurrentUser

С учетом вымышленного идентификатора пакета приложения "com.markdouma.App" и одного хоста (в зависимости от вашего текущего местоположения в сети, которое не изменится для этого примера), обычно есть 8 мест, где может храниться информация о предпочтениях.твой диск.(ПРИМЕЧАНИЕ. Указанные пути приведены только в демонстрационных целях; точные местоположения файлов могут быть изменены).8 различных местоположений возникают из-за различной комбинации констант CFPreferences:

/ Library / Preferences / .GlobalPreferences.plist (kCFPreferencesAnyApplication, kCFPreferencesAnyUser, kCFPreferencesAnyHost)

/Library/Preferences/com.markdouma.App.plist
(kCFPreferencesCurrentApplication, kCFPreferencesAnyUser, kCFPreferencesAnyHost)

/ Библиотека / Предпочтения / ByHost / .GlobalPreferences.UNIQUE_HOST_IDENTIFIER.plist (kCFPreferencesAnyApplication, kCFPreferencesAnyUser, kCFPreferencesCurrentHost)

/Библиотека / Настройки / ByHost / com.markdouma.App.UNIQUE_HOST_IDENTIFIER.plist (kCFPreferencesCurrentApplication, kCFPreferencesAnyUser, kCFPreferencesCurrentHost)

~ / Библиотека / Настройки / .GlobalPreferences.plist (kCFPreferencesAnyApplication, kCFPreferencesCurrentUser, kCFPreferencesAnyHost)

~ / Library / Preferences / com.markdouma.App.plist (kCFPreferencesCurrentApplication, kCFPreferencesCurrentUser, kCFPreferencesAnyHost)

~ / Library / Preferences / ByHost / .GlobalPreferences.UNIQUE_HOST_IDENTIFIER.plist (kCFPreferencesAnyApplication, kCFPreferencesCurrentUser, kCFPreferencesCurrentHost)

~ / Library / Preferences / ByHost / com.markdouma.App.UNIQUE_HOST_IDENTIFIER.plist (kCFPreferencesCurrentApplication, kCFPreferencesCurrentUser, kCFPreferencesCurrentHost)

Хотя NSUserDefaults может выполнять запись только в комбинацию доменов, выделенную курсивом, автоматически имеет доступ на чтение к комбинациям доменов, выделенным жирным шрифтом .Другими словами, без необходимости что-либо делать, я могу автоматически запустить следующий код и распечатать результаты:

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];

NSNumber *miniaturize = [userDefaults
                 objectForKey:@"AppleMiniaturizeOnDoubleClick"];

NSNumber *fastUserSwitching = [userDefaults
                 objectForKey:@"MultipleSessionEnabled"];

NSLog(@"AppleMiniaturizeOnDoubleClick == %@",
            ([miniaturize boolValue] ? @"YES" : @"NO"));

NSLog(@"MultipleSessionEnabled == %@",
            ([fastUserSwitching boolValue] ? @"YES" : @"NO"));

Запуск этого кода в моей системе выводит следующие результаты:

 AppleMiniaturizeOnDoubleClick == YES
 MultipleSessionEnabled == YES

Это имеет смысл, поскольку у меня есть быстрое переключение пользователей и двойной щелчок, чтобы минимизировать включенные параметры.MultipleSessionsEnabled хранится в локальном домене в /Library/Preferences/.GlobalPreferences.plist, а AppleMiniaturizeOnDoubleClick хранится в пользовательском домене в ~/Library/Preferences/.GlobalPreferences.plist.

Пример проекта: NSUserDefaultsFinagler.zip

"Кроме того, это медленно, пожалуйста. Не делайте этого."

Извините, но это не имеет смысла (если мы согласились, что мы больше неиспользуя addSuiteNamed:).Пользовательские значения по умолчанию кэшируются приложением, поэтому вызовы занимают считанные миллисекунды.Не будет ли заметной разницы между запросом у пользователя по умолчанию значения для ключа, представляющего значение локального приложения, или ключа, представляющего глобальное значение?

AFAIK, это единственное «допустимое» (приложениесовместимый с магазином) способ достижения цели ОП.Если есть другое, более эффективное средство, пожалуйста, уточните.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...