【问题标题】:x11/xlib XCreateSimpleWindow over multiple X servers多个 X 服务器上的 x11/xlib XCreateSimpleWindow
【发布时间】:2011-06-27 18:15:12
【问题描述】:

我正在尝试按照本教程使用 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);

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

感谢您的帮助

【问题讨论】:

  • 你有两个 X 服务器或两个屏幕(zaphod 模式)连接到一个 X 服务器?
  • 两个 X11 服务器并不一定意味着两个 GPU。一个系统可以运行任意数量的 X 服务器和任意数量的 GPU,包括零。 (想想 Xnest 和 Xvnc。)
  • 我的系统i由3个物理屏幕组成,连接两个gpu;在第一个 gpu 上有一个 X11 服务器,在第二个 gpu 上有第二个 x11 服务器驱动两个屏幕(双视图)

标签: linux window x11 xlib xorg


【解决方案1】:

嵌套如下:

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

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

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

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

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

【讨论】:

    【解决方案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.0:0.1。 (所有这些都是假设只有这些 X 服务器的最简单情况,在其他 VT 或虚拟 X 服务器(如 Xvfb、Xnest 或 Xephyr)上没有额外的 X 服务器。)

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

    【讨论】:

      【解决方案3】:

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

      http://dmx.sourceforge.net/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-08-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-01
        • 2017-04-14
        • 2011-05-19
        • 1970-01-01
        相关资源
        最近更新 更多