C++ 与GLFW和x27有问题;Debian上的s回调glfwSetDropCallback
我目前正在创建一个轻量级程序来查看和操作3D对象,类似于程序混合器或3DS maxC++ 与GLFW和x27有问题;Debian上的s回调glfwSetDropCallback,c++,opengl,glfw,C++,Opengl,Glfw,我目前正在创建一个轻量级程序来查看和操作3D对象,类似于程序混合器或3DS max 我使用C++、GLFW和OpenGL。虽然我计划让它跨平台,但我目前只在一台运行Debian9.0(stretch)和XFCE桌面环境的计算机上工作 目前,无论我如何尝试,回调glfwSetDropCallback似乎从未被调用。我设置了断点和断言,但什么都没有。我尝试过的所有其他回调都可以正常工作。我已经从我的项目中包括了我的GLFW cpp。如果还需要别的什么,尽管问吧 最后一点,我只是在使用GLFW,因为其
我使用C++、GLFW和OpenGL。虽然我计划让它跨平台,但我目前只在一台运行Debian9.0(stretch)和XFCE桌面环境的计算机上工作
目前,无论我如何尝试,回调glfwSetDropCallback似乎从未被调用。我设置了断点和断言,但什么都没有。我尝试过的所有其他回调都可以正常工作。我已经从我的项目中包括了我的GLFW cpp。如果还需要别的什么,尽管问吧 最后一点,我只是在使用GLFW,因为其他的东西对我来说都太重了。另外,直接使用X11似乎需要做很多工作,但收获不大,特别是因为我需要为每个OS I目标提供不同的解决方案。最后,我只希望能够将项目拖放到我的程序窗口中,然后让我的代码对路径做一些处理#包括“GLFWindow.h”
#包括
#包括
//用于回调的变量。
静态布尔键[1024];
静态std::矢量拖放;
静态摄像机*\u摄像机;
静态GLdouble*_lastX;
静态GLdouble*整形术;
GLFWindow::GLFWindow()
:m_window(nullptr)、m_lastX(0.0)、m_lastY(0.0)
{
glfwInit();
glfwWindowHint(GLFW_上下文_版本_主要,GLFW_版本_主要);
glfwWindowHint(GLFW_上下文_版本_次要,GLFW_版本_次要);
glfwWindowHint(GLFW_OPENGL_配置文件、GLFW_OPENGL_核心配置文件);
glfwWindowHint(GLFW_可调整大小,GL_为FALSE);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT,GL_FALSE);//用于OSX
glfwWindowHint(GLFW_聚焦,GL_真实);
标准::cout编辑:
首先,确保您使用的是最新的稳定GLFW版本(现在是3.2.1)
最明显的原因可能是,您从未调用GLFWindow::PollEvents()
,因此也从未调用glfwPollEvents()
。然而,我怀疑这是原因,因为您从未提及任何其他输入问题
要验证回调是否真的从未被调用,请尝试以下示例:
glfwInit();
// You might need some of the window hints
GLFWwindow *window = glfwCreateWindow(600, 400, "Test glfwSetDropCallback", NULL, NULL);
glfwSetDropCallback(window, [](GLFWwindow*, int count, const char **paths)
{
std::cout << "Drag and Drop count - " << count << std::endl;
for (unsigned int i = 0; i < count; ++i)
std::cout << "- " << paths[i] << std::endl;
});
while (!glfwWindowShouldClose(window))
{
glfwSwapBuffers(window);
glfwPollEvents();
}
glfwDestroyWindow(window);
glfwTerminate();
glfwInit();
//您可能需要一些窗口提示
GLFWwindow*window=glfwCreateWindow(600400,“测试glfwSetDropCallback”,NULL,NULL);
glfwSetDropCallback(窗口,[](GLFWwindow*,整数计数,常量字符**路径)
{
谢谢你的回复。我还有一段时间(窗口未关闭)在我看来,主要是轮询与您的示例类似的事件。因此,您是正确的,这不是我的事件轮询。我创建了一个新项目并运行了您的简单代码测试,我看到了与以前相同的问题。因此,听起来像是我怀疑的问题,可能是GLFW和X11存在错误,或者我的X11没有为此配置。我对directl几乎没有经验y与X11接口。我会在有时间的时候研究测试你的第二个建议。另外,我打电话给std::cout好的,我认为这是一个bug,我会将它报告给GLFW。我刚刚运行了你提到的X11代码,并报告支持它。
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xos.h>
Display *display =XOpenDisplay((char *)0);
if(XInternAtom(display, "XdndAware", False))
std::cout << "Supported" << std::endl;
glfwInit();
// You might need some of the window hints
GLFWwindow *window = glfwCreateWindow(600, 400, "Test glfwSetDropCallback", NULL, NULL);
glfwSetDropCallback(window, [](GLFWwindow*, int count, const char **paths)
{
std::cout << "Drag and Drop count - " << count << std::endl;
for (unsigned int i = 0; i < count; ++i)
std::cout << "- " << paths[i] << std::endl;
});
while (!glfwWindowShouldClose(window))
{
glfwSwapBuffers(window);
glfwPollEvents();
}
glfwDestroyWindow(window);
glfwTerminate();
Display *display = ...
if (XInternAtom(display, "XdndAware", False))
std::cout << "Supported" << std::endl;