Wayland 缺少全屏显示器选择功能。
作者: SylvanSerenity创建于 2026年9月18日更新于 2026年9月18日
问题原因
- 在 Wayland 中,
glfwGetPrimaryMonitor()返回第一个可用的显示器,而glfwSetWindowPosCallback()不能正常工作。 - 如果使用
glfwGetPrimaryMonitor()返回的"主"显示器或基于窗口位置的显示器(因为 Wayland 不支持窗口位置),则它将使用第一个可用的显示器,即使该显示器不是系统的主显示器。 - 使用
glfwSetWindowAttrib(me.w.h.raw, c.GLFW_DECORATED, c.GLFW_FALSE)的glfwMaximizeWindow()会显示任务栏。如果不知道要设置的大小(即显示器大小),则手动调整窗口大小也不可能。 - 即使您添加了自定义的 Wayland 表面进入监听器,也无法注册它,因为 Wayland 最多只支持一次表面监听器,而 GLFW 已经在使用中!
讨论
虽然您可以使用窗口位置来推导当前显示器,并将其与 Win32 和 X11(也许是 Cocoa?)上枚举的显示器的边界进行比较,但由于 Wayland 不允许您操作窗口位置,因此无法做到这一点。如前所述,Wayland 确实提供了一个表面监听器,用于监听进入和离开事件,但 GLFW 的实现不仅将其保持为私有,而且还阻止您使用自己的监听器来获取它。一个工作的方法可能是在窗口上添加一个子表面,并为其添加监听器,但这似乎是一个非常大的工作绕过方法。 这似乎也给其他库带来了问题,例如 Cubyz 和 tev。
解决方案
我认为 glfwGetCurrentMonitor() 功能请求(#1699)是解决此问题的最佳方法。它解决了我和其他人不得不手动实现的一个常见实现问题,而 Wayland 则很好地支持了 wl_surface_listener 结构的 enter 回调函数。
内容来源: glfw/glfw