Блокировка экрана на «Маке» из Си
Как-то я программировал на Си под «Мак» блокировку жестом перед датчиком освещения. Сегодня показывал его коллегам, оказалось ничего не работает — метод, который я использовал для вызова экрана блокировки перестал принимать на вход 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, ¤tSession);
// блокируем текущую сессию
CGSCreateLoginSession(¤tSession);
Обновлённая версия лежит там же — на «Гитхабе».
Для тех, кто не знает как скомпилировать (как я), у меня получилось так:
gcc -o lightlock lightlock.c -framework IOKit -framework CoreFoundation -framework ApplicationServices
Комментарий для kipelovets:
Серьёзно? Вы первую строку в программе посмотрите.
Сначала прочитал «на Make из Си». Сразу представил ’system(«make screenlock»)’.