Приложение Macos зависает при использовании NSDistributedNotificationCenter и CFRunLoopAddSource - PullRequest
0 голосов
/ 21 февраля 2020

У меня есть приложение MacOS, созданное с использованием Qt. Там я создал NSDistributedNotificationCenter, чтобы получать уведомления при изменении настроек доступности (наблюдая «com.apple.accessibility.api»). Также у меня есть CFRunLoopAddSource для мониторинга событий нажатия клавиш.

Однако, когда я запускаю программу и меняю доступность приложения, приложение зависает и не может нормально его запустить.

Может ли кто-нибудь помочь понять, почему это происходит?

Это код:

Здесь я создаю наблюдателя: создание / удаление контролируется нажатием кнопки

- (void)createObserver
{
[[NSDistributedNotificationCenter defaultCenter] addObserver:self
            selector:@selector(didToggleAccessStatus:)
                name:@"com.apple.accessibility.api"
              object:nil
  suspensionBehavior:NSNotificationSuspensionBehaviorDeliverImmediately];
}

И вот как я могу добавить регистратор событий:

// Create an event tap to retrieve keypresses.
CGEventMask eventMask = (CGEventMaskBit(kCGEventKeyDown) | 
CGEventMaskBit(kCGEventFlagsChanged) |
                          CGEventMaskBit(kCGEventLeftMouseDown) |
                          CGEventMaskBit(kCGEventRightMouseDown) |
                          CGEventMaskBit(kCGEventMouseMoved) |
                          CGEventMaskBit(kCGEventScrollWheel));
                                  //| CGEventMaskBit(kCGEventLeftMouseDragged)
                                  //| CGEventMaskBit(kCGEventRightMouseDragged)
                                  //| CGEventMaskBit(kCGEventOtherMouseDragged););
CFMachPortRef           m_eventTap = nullptr;
CFRunLoopSourceRef      m_runLoopSource = nullptr;
 m_eventTap = CGEventTapCreate(
     kCGSessionEventTap, kCGHeadInsertEventTap, kCGEventTapOptionDefault,
     eventMask, myCGEventCallback, nullptr);

 if (m_eventTap != Q_NULLPTR) {
    NSLog(@"CGEventTap created");
    // Create a run loop source and add enable the event tap.
    m_runLoopSource = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, m_eventTap, 0);
    CFRunLoopAddSource(CFRunLoopGetCurrent()/*CFRunLoopGetMain()*/, m_runLoopSource, kCFRunLoopCommonModes);
    CGEventTapEnable(m_eventTap, true);
    //CFRunLoopRun();
 }
 else {
     m_runLoopSource = Q_NULLPTR;
     NSLog(@"Error creating CGEventTap");
 }

Любые идеи, пожалуйста?

Заранее спасибо и всего наилучшего

...