这是对 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; }