X11全屏窗口(OpenGL)

6

我正在使用Xlib(X11)在Linux (Ubuntu 11.10)上编写一个OpenGL应用程序。实现窗口和全屏模式之间切换的最简单方法是什么?

2个回答

9
这里是Havoc P建议的实现的示例,为了让下一个人更省心,我们提供了以下内容:
void fullscreen(Display* dpy, Window win) {
  Atom atoms[2] = { XInternAtom(dpy, "_NET_WM_STATE_FULLSCREEN", False), None };
  XChangeProperty(
      dpy, 
      win, 
      XInternAtom(dpy, "_NET_WM_STATE", False),
      XA_ATOM, 32, PropModeReplace, (unsigned char*)atoms, 1
  );
}

请解释为什么这样做,而不是只给出答案。 - Sled
嗯,当我使用这段代码片段时,gcc会抱怨。根据“XChangeProperty”手册,前述函数的倒数第二个参数不应该是原子数组,而应该是字符串,对吧? - fouric
XChangeProperty可能会误导性地使用unsigned char* data,但实际上它是指向原子数组的指针,就像上面的代码片段一样。gcc有什么抱怨吗?如果您尝试将其编译为C++代码,则需要使用显式转换,例如(unsigned char*)atoms。 - Emil Mikulic
T @ArtB Havoc已经解释了为什么它能工作。就像第一行所说的那样:这只是实现,我发布它是为了让其他人可以复制+粘贴。 - Emil Mikulic
@EmilMikulic 它被审核系统标记了,而SO应该是自包含的...但这会导致一些看起来很傻的边角情况。在这种情况下,我要么编辑他的答案以包含您的代码(您可能没有权利),要么将他的答案复制到您自己的答案中。请注意,在审核模式下,我们看不到问题或任何其他答案,我们只看到您的答案孤立存在。 - Sled
@EmilMikulic 应该使用 void*,因为属性可以是任何类型,而不仅仅是 Atom。但是 X11 和这个函数特别是早于 ANSI C 和 void - n. m.

4
在协议级别上,可以查看带有附属客户端消息和全屏状态标志的_NET_WM_STATE属性。这在EWMH规范中指定。如果窗口管理器不支持官方提示,您可能需要手动实现全屏,并且EWMH规范提供了一种检查支持内容的方式。如果您不想让人们意外离开全屏状态,还可以抓取鼠标指针和/或键盘。或者,为避免学习底层的X窗口系统枯燥细节,您可以直接使用SDL、GTK或Qt等工具库,它们应该都有一个简单方法调用来切换全屏状态。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接