我想知道如何获取我系统上所有Xorg显示器的列表,以及与每个显示器关联的屏幕列表。我花了一些时间浏览Xlib文档,但无法找到我想要的功能。请假定除了POSIX投诉OS和X(例如,没有GTK),我没有其他依赖项。如果我所要求的是不可能假设这些最小的依赖关系,那么使用其他库的解决方案是好的。获取所有Xorg显示器的列表
非常感谢您的帮助!
我想知道如何获取我系统上所有Xorg显示器的列表,以及与每个显示器关联的屏幕列表。我花了一些时间浏览Xlib文档,但无法找到我想要的功能。请假定除了POSIX投诉OS和X(例如,没有GTK),我没有其他依赖项。如果我所要求的是不可能假设这些最小的依赖关系,那么使用其他库的解决方案是好的。获取所有Xorg显示器的列表
非常感谢您的帮助!
我知道获取显示列表的唯一方法是检查/tmp/.X11-unix
目录。
一旦你这样做了,你可以使用Xlib来查询每个显示器的更多信息。
每例如:
#include <stdio.h>
#include <dirent.h>
#include <string.h>
#include <X11/Xlib.h>
int main(void) {
DIR* d = opendir("/tmp/.X11-unix");
if (d != NULL) {
struct dirent *dr;
while ((dr = readdir(d)) != NULL) {
if (dr->d_name[0] != 'X')
continue;
char display_name[64] = ":";
strcat(display_name, dr->d_name + 1);
Display *disp = XOpenDisplay(display_name);
if (disp != NULL) {
int count = XScreenCount(disp);
printf("Display %s has %d screens\n",
display_name, count);
int i;
for (i=0; i<count; i++)
printf(" %d: %dx%d\n",
i, XDisplayWidth(disp, i), XDisplayHeight(disp, i));
XCloseDisplay(disp);
}
}
closedir(d);
}
return 0;
}
运行上面给了我这个输出,我目前的显示器/屏:
Display :0 has 1 screens
0: 3046x1050
Display :1 has 2 screens
0: 1366x768
1: 1680x1050
从来没有发现上市比其他X显示的更好的方法。我非常想知道是否有更好的选择。
像netcoder写,所述问题有两个不同的部分:
连接到X服务器
的方法建立到使用XOpenDisplay()
X服务器的连接。连接使用XCloseDisplay()
拆除。这个线程中的netcoders代码是如何正确执行的一个很好的例子。
正如netcoder提到的那样,问题在于没有可靠的方法来找出进程可以连接到哪个X服务器。他的代码检查X插座的典型位置,/tmp/.X11-unix/
。如果用户是远程连接的,例如通过SSH(启用了X转发),那么该方法的确可以工作,而不是,而不是。在这种情况下,实际上只有DISPLAY
环境变量(也许还有一些欺骗性的文件。~/.Xauthority
文件)。
不幸的是,我不知道任何更好的方法。我个人更喜欢使用每个用户的配置文件 - 说~/.application/displays
- ,在这里用户可以列出服务器名称的应用程序应该尽量在相同的格式DISPLAY
环境变量连接,除了默认的。它不是自动的(netcoder的代码是),但是这种方法更适合我。
找出关于由X服务器
XScreenCount()
提供将返回由该方法当前被连接到X服务器提供画面的数量的画面。如果您只需要屏幕尺寸,请按照网络代码示例。有关更多详细信息,请使用XScreenOfDisplay(Display,index)
获取Screen
指针; 0
< = index
< XScreenCount(Display)
。
在C代码,宏ScreenCount()
和ScreenOfDisplay()
通常比实际的函数调用多一点有效。
对于solaris的某些配置,看起来显示器插槽可以位于'/ usr/spool/sockets/X11 /'用于hpux和'/ var/tsol/doors/.X11-unix /'。尽管如此,我认为这些是非常罕见的,你可以依靠'/ tmp/.X11-unix /'。 – Azmisov 2015-02-19 20:33:51