Как использовать платформу Apple GameController из инструмента командной строки macOS? - PullRequest
3 голосов
/ 18 марта 2019

Я пытаюсь заставить следующий код работать как инструмент командной строки macOS. Важно, чтобы это не было приложение Какао, так что это не вариант.

Этот же код прекрасно работает в том же проекте с целью приложения Cocoa и обнаруживает совместимый контроллер, но при запуске в качестве цели инструмента командной строки ничего не происходит, и API не показывает подключенных контроллеров.

Очевидно, что некоторые из них придуманы ... это просто самое простое, что я мог бы свести к этому и иметь некоторые признаки того, что происходит, когда это действительно работает.

#import <Cocoa/Cocoa.h>
#import <GameController/GameController.h>


int main( int argc, const char * argv[] )
{
    @autoreleasepool
    {
        NSApplication * application = [NSApplication sharedApplication];

        NSNotificationCenter * center = [NSNotificationCenter defaultCenter];

        [center addObserverForName: GCControllerDidConnectNotification
                            object: nil
                             queue: nil
                        usingBlock: ^(NSNotification * note) {
                            GCController * controller = note.object;
                            printf( "ATTACHED: %s\n", controller.vendorName.UTF8String );
                        }
         ];

        bool shouldKeepRunning = true;
        while (shouldKeepRunning)
        {
            printf( "." );

            while (true)
            {
                NSEvent * event = [application
                                   nextEventMatchingMask: NSEventMaskAny
                                   untilDate: nil
                                   inMode: NSDefaultRunLoopMode
                                   dequeue: YES];
                if (event == NULL)
                {
                    break;
                }
                else
                {
                    [application sendEvent: event];
                }
            }

            usleep( 100 * 1000 );
        }
    }

    return 0;
}

Я предполагаю, что это как-то связано с настройкой приложения Какао или обработкой циклов событий. Или, может быть, есть какой-то внутренний триггер, который инициализирует каркас GameController. Похоже, у API нет явного способа его инициализации.

https://developer.apple.com/documentation/gamecontroller?language=objc

Может кто-нибудь пролить свет на то, как я могу заставить это работать?

В конечном счете, этот код действительно должен работать внутри пакета Core Foundation, поэтому, если он действительно мог бы работать с циклом запуска Core Foundation, это было бы идеально.

...