Итак, я пытаюсь собрать простое полноэкранное приложение OpenGL с использованием CGL и IOHIDManager, чтобы изучить API более низкого уровня. В настоящее время я создаю контекст OpenGL и запускаю его в полноэкранном режиме. Я пытаюсь добавить клавиатуру, поэтому я могу выйти из приложения. Я нашел много похожих примеров использования IOHIDManager для чтения ключей, но независимо от того, что я делаю, мой обратный вызов не срабатывает.IOHIDManager не вызывает обратный вызов для клавиатуры
Мой обратный вызов - это просто функция, которая печатает «здесь». Я не уверен, где я ошибаюсь - я пробовал как CFRunLoopGetCurrent(), так и CFRunLoopMain(). Мой главный - это просто цикл while. Что дает?
CFMutableDictionaryRef CreateMatchingDictionary(UInt32 usage_page, UInt32 usage) {
CFMutableDictionaryRef dictionary = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, &kCFCopyStringDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
CFNumberRef page_number = CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &usage_page);
CFDictionarySetValue(dictionary, CFSTR(kIOHIDDeviceUsagePageKey), page_number);
CFRelease(page_number);
CFNumberRef usage_number = CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &usage);
CFDictionarySetValue(dictionary, CFSTR(kIOHIDDeviceUsageKey), usage_number);
CFRelease(usage_number);
return dictionary;
}
void CreateInputManager() {
IOHIDManagerRef hid_manager = IOHIDManagerCreate(kCFAllocatorDefault, kIOHIDOptionsTypeNone);
CFMutableDictionaryRef matching_dictionary = CreateMatchingDictionary(kHIDPage_GenericDesktop, kHIDUsage_GD_Keyboard);
IOHIDManagerSetDeviceMatching(hid_manager, matching_dictionary);
IOHIDManagerRegisterInputValueCallback(hid_manager, KeyboardCallback, NULL);
IOHIDManagerOpen(hid_manager, kIOHIDOptionsTypeNone);
IOHIDManagerScheduleWithRunLoop(hid_manager, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
}
void KeyboardCallback(void *context, IOReturn result, void *sender, IOHIDValueRef value) {
puts("CALLBACK!");
}
int main() {
// Commented out CGL context & fullscreen window creation
CreateInputManager();
while(true) {
;
}
}
UPDATE
Если я ставлю CFRunLoopRun() в конце функции CreateInputManager, моя функция вызывается, но функция никогда не возвращает. Как это должно работать в однопоточном приложении CGL? Является ли это строгим требованием, чтобы IOHIDManager требовал выполнения цикла цикла?
Отлично, поэтому, если я выбираю занятый опрос, установив HID для использования CFRunLoopInMode, там технически не будет механизма runloop в моей программе? –
Кроме того, спасибо за отзыв CVDisplayLink, я знал о версии iOS, но не о OSX. –
Ну, будет механизм runloop, но вы можете выбрать, когда runloop должен обрабатывать события, и как только он обрабатывает все ожидающие события события, он вернется из 'CFRunLoopInMode' и вернет управление вашему приложению. – pmdj