11

这是对 xrandr 的示例调用:

$ xrandr --output LVDS --mode 1680x1050 --pos 0x0 --rotate normal --output S-video --off --output DVI-0 --mode 1024x768 --pos 1680x104 --rotate normal

考虑一个调用成功的系统;有两个屏幕(LVDS 和 DVI-0)以不同的分辨率工作。DVI-0 位于右侧中间。

如何在 C 程序中获取所有这些信息?我检查了 xrandr 源代码,但我发现它很难阅读并且没有明显的方法来查询 --pos 值(编辑:它隐藏在明显的视线中,感谢 ernestopheles 的回答我明白了)。

我知道我可以用 XGetWindowProperty 询问 _NET_WORKAREA,但据我所知,它并没有告诉屏幕位置,只是包含它们的理想矩形的大小。

在对 xrandr 代码进行了一些其他研究之后,这段代码似乎是解决方案的一个进步。然而我不相信,第 2940 行附近的 xrandr.c 假设 crtc_info 可能不可用。我仍然想念另一种获得分辨率和位置的方法。

    #include <stdio.h>
    #include <X11/extensions/Xrandr.h>

    int main() {
        显示 *disp;
        XRRScreenResources *屏幕;
        XRROutputInfo *信息;
        XRRCrtcInfo *crtc_info;
        int iscres;
        int icrtc;

        显示 = XOpenDisplay(0);
        screen = XRRGetScreenResources (disp, DefaultRootWindow(disp));
        for (iscres = screen->noutput; iscres > 0; ) {
            --iscres;

            info = XRRGetOutputInfo (disp, screen, screen->outputs[iscres]);
            if (info->connection == RR_Connected) {
                for (icrtc = info->ncrtc; icrtc > 0;) {
                    --icrtc;

                    crtc_info = XRRGetCrtcInfo (disp, screen, screen->crtcs[icrtc]);
                    fprintf(stderr, "==> %dx%d+%dx%d\n", crtc_info->x, crtc_info->y, crtc_info->width, crtc_info->height);

                    XRRFreeCrtcInfo(crtc_info);
                }
            }
            XRRFreeOutputInfo(信息);
        }
        XRRFreeScreenResources(屏幕);

        返回0;
    }

4

3 回答 3

8

您可以通过以下方式获得每个屏幕分辨率:

Display *dpy;
XRRScreenResources *screen;
XRRCrtcInfo *crtc_info;

dpy = XOpenDisplay(":0");
screen = XRRGetScreenResources (dpy, DefaultRootWindow(dpy));
//0 to get the first monitor   
crtc_info = XRRGetCrtcInfo (dpy, screen, screen->crtcs[0]);     

之后crtc_info->width将包含监视器的宽度和crtc_info->xx 位置。

不要忘记包括:

#include <X11/Xlib.h>
#include <X11/extensions/Xrandr.h>

并使用 -lX11 -lXrandr 编译以链接库

于 2014-03-17T18:00:19.013 回答
1

我不确定我是否正确理解了这个问题。假设,要读取x-server当前状态的参数,使用如下命令:

xrandr -q
并解析其输出:

LVDS connected 1680x1050+0+0 (normal left inverted right x axis y axis) 123mm x 123mm 
[...]

对于第一个屏幕和

TV_SVIDEO connected 1024x768+1680x104 (normal left inverted right x axis y axis) 123mm x 123mm
[...]

第二个。可以在用 C 编写的程序中运行命令并对其进行解析。

于 2012-12-04T17:55:56.183 回答
0

您可以使用info->crtc而不是screen->crtcs[icrtc].

于 2019-04-11T04:17:29.923 回答