voi*_*ter 12 c unix linux window-managers xorg
我想知道如何获得系统中所有Xorg显示的列表,以及与每个显示相关的屏幕列表.我花了一些时间查看Xlib文档,但无法找到能够满足我想要的功能.请假设除了POSIX投诉操作系统和X(例如,没有GTK)之外我没有其他依赖项.如果假设这些最小的依赖关系,我的问题是不可能的,那么使用其他库的解决方案就可以了.
非常感谢您的帮助!
net*_*der 17
我知道获取显示列表的唯一方法是检查/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;
}
Run Code Online (Sandbox Code Playgroud)
运行以上操作可以使用我当前的显示/屏幕输出此输出:
Display :0 has 1 screens
0: 3046x1050
Display :1 has 2 screens
0: 1366x768
1: 1680x1050
Run Code Online (Sandbox Code Playgroud)
从来没有找到一种更好的方式来列出除此之外的X显示器.我非常想知道是否存在更好的替代方案.
正如 netcoder 所写,该问题有两个不同的部分:
连接到 X 服务器
该进程使用 建立与 X 服务器的连接XOpenDisplay()。使用 断开连接XCloseDisplay()。该线程中的 netcoders 代码是如何正确执行此操作的一个很好的示例。
正如 netcoder 提到的,问题在于没有可靠的方法来找出进程可以连接到哪些 X 服务器。他的代码检查 X 套接字所在的典型位置/tmp/.X11-unix/。如果用户是远程连接(例如通过 SSH(启用了 X 转发)),则该方法根本不起作用。在这种情况下,实际上只有DISPLAY环境变量(也许还有一些关于~/.Xauthority文件的技巧)。
不幸的是,我也不知道有什么更好的方法。我个人更喜欢使用每用户配置文件——比如说——,除了默认的名称之外,~/.application/displays用户还可以在其中列出应用程序应尝试以与环境变量相同的格式连接的服务器名称。DISPLAY它不是自动的(netcoder 的代码是自动的),但这种方法更适合我。
查找 X 服务器提供的屏幕
XScreenCount()将返回进程当前连接到的 X 服务器提供的屏幕数量。如果您只需要屏幕尺寸,请遵循 netcoders 示例。如需更详细的信息,请使用XScreenOfDisplay(Display,index)获取Screen指针;0<= index< XScreenCount(Display)。
在 C 代码中,宏ScreenCount()和ScreenOfDisplay()通常比实际的函数调用更有效。