我在 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)上,一切对我来说都很好。