0

我正在尝试按照本教程使用 xlib http://tronche.com/gui/x/xlib/进行编程

这是我到目前为止写的代码

  display = XOpenDisplay(NULL);
  screen  = XDefaultScreen(display);
  width   = 640;
  height  = 480;

  XLockDisplay(display);
  fullscreen = 0;
  window[0] = XCreateSimpleWindow(display, XDefaultRootWindow(display),
                                  0, 0, width, height, 0, 0, 0);
  window[1] = XCreateSimpleWindow(display, XDefaultRootWindow(display),
                                  0, 0, width, height, 0, 0, 0);

但是我不明白这一点:在没有 xinerama 的具有两个 X11 服务器(两个 gpus)的系统上,如果我希望该窗口 [0] 转到第一个 xserver 和第二个 xserver,我应该调用哪些函数?我想我对显示,屏幕,窗口感到困惑......

谢谢你的帮助

4

3 回答 3

3

嵌套如下:

  • X 服务器(也称为显示器)是您使用 X11 协议与之交谈的东西。XID(例如窗口 ID、GC ID、像素图 ID 等)在显示中将是唯一的。传统上,显示器具有一个键盘和一个鼠标,尽管如今它更加复杂。

  • X 屏幕与根窗口一一对应。根窗口是没有父窗口的窗口(窗口树的根)。所有非根窗口都是根窗口的孩子(或孩子的孩子等)。

  • 窗口是屏幕内的一个矩形区域。窗口以分层树的形式排列,其中父窗口剪辑其子窗口(子窗口可以完全或部分位于父窗口的范围之外,但只有父窗口内的部分可见)。(“矩形”是个小谎言,你真的可以应用形状蒙版,但暂时忘记它。)

  • 物理监视器可能对应于屏幕,也可能不对应于屏幕。TwinView 和 Xinerama 是将一个屏幕扩展到两个或多个监视器的功能的名称。每个监视器可以是自己的屏幕,也可以是多监视器屏幕的一部分。

传统上,窗口不能移动到不同的屏幕,因为屏幕可能具有不同的硬件属性(例如不同的位深度)。使用 TwinView 或 Xinerama,您可以在监视器之间移动窗口,而您不能使用每个监视器的屏幕。显示器上的所有屏幕都共享相同的输入设备(鼠标和键盘)。

于 2011-02-15T18:40:54.690 回答
2

如果它们确实是两个不同的 X 服务器(请参阅 Havoc 的解释),那么您需要执行以下操作:

Display displays[2];

displays[0] = XOpenDisplay(":0.0");
displays[1] = XOpenDisplay(":1.0");

[...]

window[0] = XCreateSimpleWindow(displays[0], XDefaultRootWindow(displays[0]),
                                0, 0, width, height, 0, 0, 0);
window[1] = XCreateSimpleWindow(displays[1], XDefaultRootWindow(displays[1]),
                                0, 0, width, height, 0, 0, 0);

如果它们是同一 X 服务器上的不同 X 屏幕,则显示将是:0.0and :0.1。(这都是假设只有那些 X 服务器的最简单情况,而在其他 VT 或虚拟 X 服务器(如 Xvfb、Xnest 或 Xephyr)上没有额外的 X 服务器。)

当然,任何严肃的 GUI 编程都可以使用 GTK+ 或 Qt 等工具包完成,而不是原始的 Xlib 调用。

于 2011-02-15T19:24:25.970 回答
1

在给出的答案之上,看看 DMX(分布式多头),它允许将多个 X 服务器/屏幕组合成一个大屏幕,由一个单独的 X 服务器提供服务,该 X 服务器将命令分派到其从属服务器。

http://dmx.sourceforge.net/

于 2011-02-16T16:44:07.197 回答