为什么XOpenDisplay()没有显示错误的显示名称

时间:2014-06-15 13:16:00

标签: c unix x11

有人可以向我解释为什么XOpenDisplay()不会因显示名称错误而失败吗?只要名称遵循语法约定,它似乎总是成功 - 即使指定的主机名不存在。如果字符串使用错误的语法,XOpenDisplay()似乎只会失败,例如

d = XOpenDisplay("foobar");       // fails - presumably because of bad syntax in string
d = XOpenDisplay("foobar:0.0");   // works - although there is no host named "foobar"

当指定不存在的主机名时,XOpenDisplay()似乎回退到$ DISPLAY。那是怎么回事?我在Xlib文档中找不到关于这些回退的任何内容。如果它是正确的行为,有没有办法检查返回的显示是否真的把我连接到" foobar:0.0"或者它是否只是$ DISPLAY的后备?

2 个答案:

答案 0 :(得分:0)

这似乎是相当弱的行为,但http://tronche.com/gui/x/xlib/display/opening.html说:

  

显示名称的编码和解释是实现   依赖

所以似乎允许这种“解释”。

要判断是否已打开默认显示,您可以尝试:

d_default = XOpenDisplay(NULL);
d = XOpenDisplay("foobar:0.0");
if (!d || d == d_default) {
  // foobar:0.0 was not opened.
}

如果这不起作用,因为dd_default即使引用相同的硬件也不同,您可能会尝试比较_XDisplay结构的字段而不是返回的指针,它们显然指向不同的结构,因为它们引用相同的硬件,某些地方必须具有类似的数据。有关可能性,请参阅以下参考,但最简单的(如果可行)可能是查看是否d->fd == d_default->fd

参考:http://xwindow.angelfire.com/page28.html

答案 1 :(得分:0)

我知道强制连接到特定显示器的唯一方法是将所需的显示名称粘贴到环境中:

setenv("DISPLAY", "foobar:0.0", 1);
d = XOpenDisplay(0);

这通常也是可取的,因为正确的显示名称也会传播到已启动的任何子进程,但如果您想避免这种情况,则可以记录旧$DISPLAY并在之后恢复它。