以下是对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() { Display *disp; XRRScreenResources *screen; XRROutputInfo *info; XRRCrtcInfo *crtc_info; int iscres; int icrtc; disp = 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 (info); } XRRFreeScreenResources(screen); return 0; }
您可以通过这样做获得每个屏幕分辨率:
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->x
x位置。
不要忘记包括:
#include <X11/Xlib.h>
#include <X11/extensions/Xrandr.h>
并使用-lX11 -lXrandr进行编译以链接库
我不确定,我是否正确理解了这个问题。假设您想要读出x-server当前状态的参数,请使用以下命令:
xrandr -qand parse its output:
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编写的程序中完成。
您可以使用info->crtc
而不是screen->crtcs[icrtc]
。