GLFW监视器回调未触发

时间:2016-04-14 16:50:40

标签: javascript c++ node.js glfw

我正在为Node.js开发一组GLFW 3.1.2绑定。我遇到了一个特定API的问题,特别是glfwSetMonitorCallback API。

问题是当我断开显示器或将显示器连接到系统时,它没有被触发。

以下是我的回调处理程序:

void monitor::onGLFWMonitor (GLFWmonitor* monitor, int action) {
    Isolate* isolate = Isolate::GetCurrent();
    HandleScope scope(isolate);

    auto it = monitor::monitorObjects.find(monitor);
    Local<Object> jsMonitor;

    if (it == monitor::monitorObjects.end()) {
        // New monitor, add it
        jsMonitor = monitor::monitorObjectTemplate.Get(isolate)->NewInstance();
        jsMonitor->SetAlignedPointerInInternalField(0, monitor);
        jsMonitor->SetInternalField(1, String::NewFromUtf8(isolate, "GLFWmonitor"));
        CopyablePersistent<Object> perst(isolate, jsMonitor);
        MonitorIndexedPair<Object> pr(monitor, perst);
        it = monitor::monitorObjects.insert(pr).first;
    } else {
        jsMonitor = it->second.Get(isolate);
    }

    if (action == GLFW_DISCONNECTED) {
        // Monitor removed, clean up!
        jsMonitor->SetAlignedPointerInInternalField(0, NULL);
        monitor::monitorObjects.erase(it);
        // TODO Cleanup video modes once implemented
    }

    if (monitor::monitorCallback.IsEmpty()) {
        // No callback, do nothing
        return;
    }

    Local<Function> callback = monitor::monitorCallback.Get(isolate);
    const unsigned int argc = 2;
    Local<Value> argv[argc] = {
        jsMonitor,
        Number::New(isolate, action)
    };
    callback->Call(isolate->GetCurrentContext()->Global(), argc, argv);
}

它被设置为glfwInit的任何调用的一部分,如此:

void core::init (const FunctionCallbackInfo<Value>& args) {
    Isolate* isolate = Isolate::GetCurrent();
    HandleScope scope(isolate);

    bool result = glfwInit();

    if (result == GL_TRUE) {
        // Setup callbacks
        glfwSetMonitorCallback(monitor::onGLFWMonitor);
    }

    args.GetReturnValue().Set(Boolean::New(isolate, result == GL_TRUE));
}

我在回调函数中添加了几个printf语句,但它们都没有生成。另外,如果我调用glfwGetMonitors,它总是返回错误数量的监视器。 EG:我有两个显示器,断开一个,glfwGetMonitors仍然返回两个显示器。

我在运行Windows 7,Windows 8 / 8.1和Windows 10的多台计算机上看到此问题。我们将不胜感激。

1 个答案:

答案 0 :(得分:0)

经过多一点挖掘,我已经确定了问题的原因。我编写的简单测试用例从未调用过glfwPollEvents,因此我的回调都不会被触发。