【发布时间】:2019-03-18 16:54:45
【问题描述】:
我正在尝试将以下代码用作 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 run】,第二个是上面的手动事件循环。结果是一样的。
https://www.dropbox.com/s/a6fw3nuegq7bg8x/ControllerTest.zip?dl=0
【问题讨论】:
-
从来没有用过这个框架,但现在我倾向于尝试。我有一个 Xbox 360 Wireless,ControllersLite 可以识别它。但是,我似乎无法使用 GameController 发现它。你有保证可以工作的最小示例项目吗?
-
GameController 仅支持 Apple 官方认证的 MFi 控制器。对于 macOS,我只知道两个:SteelSeries Nimbus 和 Horipad Ultimate。
-
该死的。这意味着我在这里无能为力。好吧,至少要有赏金吧。
标签: objective-c macos cocoa core-foundation gamecontroller