我正在尝试将以下代码用作 macOS 命令行工具。重要的是这不是 Cocoa 应用程序,因此这不是一个选项。
相同的代码在具有 Cocoa App 目标的同一个项目中完美运行,并检测到兼容的控制器,但是当作为命令行工具目标运行时,什么也没有发生,并且 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 );
}
];
[application finishLaunching];
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;
}
我猜这与 Cocoa 应用程序的设置方式或事件循环的处理方式有关。或者也许有一些初始化 GameController 框架的内部触发器。API 似乎没有任何明确的方式来初始化它。
https://developer.apple.com/documentation/gamecontroller?language=objc
任何人都可以阐明我如何让这个工作?
最终,这段代码确实需要在 Core Foundation 包中工作,所以如果它实际上可以与 Core Foundation 运行循环一起工作,那将是理想的。
- 编辑 -
我做了一个测试项目来更清楚地说明这个问题。有两个构建目标。Cocoa 应用程序构建目标工作并接收控制器连接事件。另一个构建目标,只是一个简单的 CLI 应用程序,不起作用。它们都使用相同的源文件。它还包括两个代码路径,一个是传统的【NSApp运行】,第二个是上面的手动事件循环。结果是一样的。
https://www.dropbox.com/s/a6fw3nuegq7bg8x/ControllerTest.zip?dl=0