我在GNOME 3桌面上遇到GLFW3问题。 我已经在几台Linux机器上测试了这一点,包括全新安装的Ubuntu 16.04 LTS机器(使用Unity)。
每个GLFW3应用程序都会出现问题。 如果我按住任意键,则会发出正常键GLFW_PRESS,同时发出GLFW_REPEAT事件。
但是如果我释放密钥,则会发出一个GLFW_RELEASE事件,然后是另一个GLFW_PRESS(有时是多个GLFW_REPEAT)事件。
这是一个最小的例子:
#include <GLFW/glfw3.h>
#include <cstdio>
void glfw_key_callback(GLFWwindow* w, int key, int scancode, int action, int mods) {
printf("win %p: key %d, scancode %d, action %d, mods %d\n", w, key, scancode, action, mods);
}
int main() {
if (!glfwInit()) {
printf("Failed to init glfw!\n");
return 1;
}
GLFWwindow* window = glfwCreateWindow(800, 600, "Key input test", 0, 0);
glfwMakeContextCurrent(window);
glfwSetKeyCallback(window, glfw_key_callback);
while (!glfwWindowShouldClose(window)) {
glfwWaitEvents();
glfwSwapBuffers(window);
}
return 0;
}
当我按住Space并在几秒钟后释放它时的示例输出:
win 0x104fb20: key 32, scancode 65, action 1, mods 0
win 0x104fb20: key 32, scancode 65, action 2, mods 0
...
win 0x104fb20: key 32, scancode 65, action 2, mods 0
win 0x104fb20: key 32, scancode 65, action 0, mods 0
win 0x104fb20: key 32, scancode 65, action 1, mods 0
win 0x104fb20: key 32, scancode 65, action 2, mods 0
win 0x104fb20: key 32, scancode 65, action 0, mods 0
我也尝试使用当前的GLFW3开发版本(来自https://github.com/glfw/glfw.git)编译和运行此程序,但结果相同。
然后我搜索了这个事件来自的glfw3源代码。 我在glfw3源x11_window.c中找到了XPending()调用。 但看起来这个添加事件是从X11系统发出的, 所以我不确定这是否是GLFW或X11问题?
在其他桌面环境中,例如Mate Desktop,一切正常。