[英]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服务器将命令分发给其从属服务器。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.