16

我想知道如何获得系统上所有 Xorg 显示器的列表,以及与每个显示器关联的屏幕列表。我花了一些时间浏览 Xlib 文档,但找不到可以满足我需求的函数。请假设除了符合 POSIX 的操作系统和 X(例如,没有 GTK)之外,我没有其他依赖项。如果假设这些最小依赖项不可能实现我的要求,那么使用其他库的解决方案就可以了。

非常感谢您的帮助!

4

2 回答 2

23

我知道获取显示列表的唯一方法是检查/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 显示的方法。我非常想知道是否存在更好的选择。

于 2012-07-06T18:49:54.123 回答
4

就像 netcoder 写的那样,这个问题有两个不同的部分:

  1. 连接到 X 服务器

    该过程使用XOpenDisplay(). 使用 断开连接XCloseDisplay()。此线程中的 netcoders 代码是如何正确执行此操作的一个很好的示例。

    正如 netcoder 所提到的,问题在于没有可靠的方法来找出进程可以连接到哪些 X 服务器。他的代码检查 X 套接字的典型位置,/tmp/.X11-unix/. 如果用户是远程连接的,例如通过 SSH(启用 X 转发),这种方法根本不起作用。在那种情况下,实际上只有DISPLAY环境变量(也许还​​有一些诡计的~/.Xauthority文件)。

    不幸的是,我也不知道有什么更好的方法。我个人更喜欢使用每个用户的配置文件——比如~/.application/displays——用户可以在其中列出应用程序应该尝试以与环境变量相同的格式连接的服务器名称DISPLAY,除了默认的。它不是自动的(netcoder 的代码是),但这种方法更适合我。

  2. 了解 X 服务器提供的屏幕

    XScreenCount()将返回进程当前连接到的 X 服务器提供的屏幕数量。如果您只需要屏幕尺寸,请按照 netcoders 示例。更详细的信息,使用XScreenOfDisplay(Display,index)获取Screen指针;0<= index< XScreenCount(Display).

    在 C 代码中,宏ScreenCount()ScreenOfDisplay()通常比实际的函数调用更有效。

于 2012-07-06T19:15:33.437 回答