繁体   English   中英

多个X服务器上的x11 / xlib XCreateSimpleWindow

[英]x11/xlib XCreateSimpleWindow over multiple X servers

我正在尝试按照本教程使用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服务器(两个GPU)且没有xinerama的系统上,如果我希望window [0]转到第一个xserver和第二个xserver,我应该调用什么功能? 我认为我对显示,屏幕,窗口感到困惑。

谢谢你的帮助

嵌套如下:

  • X服务器(也称为显示器)是您与X11协议进行对话的对象。 XID(例如窗口ID,GC ID,像素图ID等)在显示器中将是唯一的。 传统上,显示器具有一个键盘和一个鼠标,尽管如今更加复杂。

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

  • 窗口是屏幕内的矩形区域。 窗口按层次结构树排列,父窗口在其中修剪子对象(子窗口可以全部或部分位于父范围之外,但仅可见父内部的部分)。 (“矩形”是一个小谎言,您可以真正应用形状遮罩,但现在就算了吧。)

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

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

如果它们确实是两个不同的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调用。

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

http://dmx.sourceforge.net/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM