silvansky
@silvansky

Как заблокировать запуск скринсейвера в OS X и разблокировать назад?

Всем доброго дня!


Передо мной стоит, казалось бы, простая цель: на время заблокировать запуск скринсейвера, как это делает, к примеру, любой видеоплеер.


Функции IOPMAssertionCreateWithName и IOPMAssertionRelease из IOKit нагуглились быстро, как и демо-код. Но, к сожалению, он у меня не заработал.


Точнее, заработал, но не в полной мере. Скринсейвер блокируется, но не разблокируется.


Я сделал маленький тестовый пример: github.com/silvansky/OSX-TestSleep — суть сводится к этому куску:

- (IBAction)toggle:(id)sender
{
	if (_assertionID == kIOPMNullAssertionID)
	{
		// toggle on
		CFStringRef reasonForActivity= CFSTR("Test reason");

		IOReturn success = IOPMAssertionCreateWithName(kIOPMAssertionTypePreventUserIdleDisplaySleep, kIOPMAssertionLevelOn, reasonForActivity, &_assertionID);
		[self.statusField setStringValue:@"Assert ON"];
		NSLog(@"*** lock: %d, success: %d", _assertionID, success);
	}
	else
	{
		// toggle off
		IOReturn success = IOPMAssertionRelease(_assertionID);
		[self.statusField setStringValue:@"Assert OFF"];
		NSLog(@"*** unlock: %d. success: %d", _assertionID, success);
		_assertionID = kIOPMNullAssertionID;
	}
}


По первому нажатию на кнопку всё ок — скринсейвер не стартует. По второму — всё не ок, скринсейвер по прежнему не стартует. Помогает лишь завершение программы.


Может ли кто-либо подсказать, в чём здесь проблема?


Тестил на OS X 10.8.2, Xcode 4.5.1.
  • Вопрос задан
  • 3036 просмотров
Решения вопроса 1
pcholberg
@pcholberg
Можно добавить кнопку со следующим вызовом:
- (IBAction)log:(id)sender
{
    NSLog(@"\n_____________________\n");
    NSDictionary* assertions = nil;
    IOPMCopyAssertionsByProcess((CFDictionaryRef*)&assertions);
    NSLog(@"%@", assertions);
}


В моём случае в логе видно, что по высвобождению Assertion создаётся ещё один процессом powerd, который блокирует спящий режим/скринсейвер на лишние 60 секунд. Похоже, что этот багэта фича появилась в 10.8.2
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы