Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 获取所有Xorg显示的列表_C_Linux_Unix_Xorg_Window Managers - Fatal编程技术网

C 获取所有Xorg显示的列表

C 获取所有Xorg显示的列表,c,linux,unix,xorg,window-managers,C,Linux,Unix,Xorg,Window Managers,我想知道如何获得系统上所有Xorg显示器的列表,以及与每个显示器相关联的屏幕列表。我花了一些时间浏览Xlib文档,但找不到一个满足我要求的函数。请假设我除了POSIX和X之外没有其他依赖项(例如,没有GTK)。如果我所问的假设这些最小的依赖关系是不可能的,那么使用其他库的解决方案就可以了 非常感谢你的帮助 我知道获取显示列表的唯一方法是检查/tmp/.X11 unix目录 完成此操作后,您可以使用Xlib查询每个显示以获取更多信息 每个示例: #include <stdio.h> #

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


非常感谢你的帮助

我知道获取显示列表的唯一方法是检查
/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;
}

除此之外,从未找到更好的方法来列出X显示。我非常想知道是否存在更好的替代方案。

正如netcoder所写,问题有两个不同的部分:

  • 与X服务器的连接

    该进程使用
    XOpenDisplay()
    建立与X服务器的连接。使用
    XCloseDisplay()
    断开连接。这个线程中的netcoders代码是如何正确执行的一个很好的示例

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

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

  • 了解X服务器提供的屏幕


    XScreenCount()
    将返回进程当前连接到的X服务器提供的屏幕数。如果您只需要屏幕尺寸,请遵循netcoders示例。有关详细信息,请使用
    XScreenOfDisplay(Display,index)
    获取
    屏幕上的
    指针
    0
    对于hpux和solaris的某些配置,显示套接字可能位于
    /usr/spool/sockets/X11/
    /var/tsol/doors/.X11 unix/
    中。尽管如此,我认为这些非常罕见,您可以只依靠libx11 dev运行
    gcc-o screen.c-L/usr/X11/lib-lX11
    Display :0 has 1 screens
     0: 3046x1050
    Display :1 has 2 screens
     0: 1366x768
     1: 1680x1050