2016-02-19 8 views
1

Итак, я пытаюсь собрать простое полноэкранное приложение 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 требовал выполнения цикла цикла?

ответ

1

IOKit и HID работы через Мах сообщения, который, в свою очередь, глубоко интегрирован с механизмом runloop , как вы нашли. Если вы действительно хотите заняться опросом, вы можете использовать функцию CFRunLoopRunInMode с нулевым таймаутом для проверки событий.

Возможно, вы захотите использовать CVDisplayLink для вызова кода рендеринга при каждом обновлении вертикальной рамки. Обратный вызов линии отображения будет вызываться из runloop, поэтому вы можете оставить свой основной поток, запущенный в CFRunLoopRun().

См. https://developer.apple.com/library/mac/qa/qa1385/_index.html, как Apple рекомендует структурировать обработку событий в приложениях OpenGL.

+0

Отлично, поэтому, если я выбираю занятый опрос, установив HID для использования CFRunLoopInMode, там технически не будет механизма runloop в моей программе? –

+0

Кроме того, спасибо за отзыв CVDisplayLink, я знал о версии iOS, но не о OSX. –

+0

Ну, будет механизм runloop, но вы можете выбрать, когда runloop должен обрабатывать события, и как только он обрабатывает все ожидающие события события, он вернется из 'CFRunLoopInMode' и вернет управление вашему приложению. – pmdj

0

Оказывается, мне нужно создать отдельный PTHREAD с функцией CreateInputManager, указать, что IOHIDManager является планирование обратного вызова на CFRunLoopGetCurrent() и стартует цикл выполнения на эту тему, позвонив CFRunLoopRun().

Интересно, есть ли способ, чтобы получить IOHIDManager работать с набившей оскоминой опросом вместо этих обратных вызовов ...

 Смежные вопросы

  • Нет связанных вопросов^_^