Блокировка экрана на «Маке» из Си

Как-то я программировал на Си под «Мак» блокировку жестом перед датчиком освещения. Сегодня показывал его коллегам, оказалось ничего не работает — метод, который я использовал для вызова экрана блокировки перестал принимать на вход NULL. Тогда как в интернетах только этот способ везде и упоминается:
CGSCreateLoginSession(NULL);
// теперь выдаёт
// Assertion failed: (sid != NULL), function CGSCreateLoginSession, file Services/Connection/CGSSession.c, line 418.
Возможно в «Эль-Капитане» (последней версии «МакОСи») что-то поменялось — функция CGSCreateLoginSession считается недокументированной, никакой информации о ней мне найти не удалось.

В общем, покапался я в заголовочных файлах, подбором и интуицией родил код, который блокирует экран и под «Эль-Капитаном», заодно и утилиту свою поправил:
// получаем словарик с атрибутами текущей сессии
CFDictionaryRef dict = CGSCopyCurrentSessionDictionary();
// выбираем из него идентификатор текущей сессии, получаем его в виде int
CFNumberRef number = (CFNumberRef) CFDictionaryGetValue(dict, CFSTR("kCGSSessionIDKey"));
CGSSessionID currentSession;
CFNumberGetValue(number, kCFNumberIntType, &currentSession);
// блокируем текущую сессию
CGSCreateLoginSession(&currentSession);
Обновлённая версия лежит там же — на «Гитхабе».
21 октября 2015 17:23

kipelovets (инкогнито)
22 октября 2015, 13:22

Для тех, кто не знает как скомпилировать (как я), у меня получилось так:

gcc -o lightlock lightlock.c -framework IOKit -framework CoreFoundation -framework ApplicationServices

bolknote.ru (bolknote.ru)
22 октября 2015, 13:38, ответ предназначен kipelovets

Серьёзно? Вы первую строку в программе посмотрите.

pavelpat (инкогнито)
22 октября 2015, 14:45

Сначала прочитал "на Make из Си". Сразу представил 'system("make screenlock")'.

Ваше имя или адрес блога (можно OpenID):

Текст вашего комментария, не HTML:

Кому бы вы хотели ответить (или кликните на его аватару)