Всем доброго дня!
Передо мной стоит, казалось бы, простая цель: на время заблокировать запуск скринсейвера, как это делает, к примеру, любой видеоплеер.
Функции
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.