检索物理屏幕尺寸

4

Xorg启动并创建一个虚拟屏幕。

虚拟屏幕大小确定为3120 x 1050。

该虚拟屏幕跨越了我的两个物理屏幕,分辨率分别为1680x1050和1440x900,我猜测是使用了xinerama。

没有配置文件,我也不想更改系统设置。

我的应用程序使用DisplayWidth和DisplayHeight来获取屏幕尺寸,在单屏设置下很好用。

maxwidth = DisplayWidth (dpy, scrnum);
maxheight = DisplayHeight (dpy, scrnum);

但是在双屏幕设置中,会自动创建一个虚拟屏幕,这些函数将返回虚拟屏幕的大小。我尝试了不同的方法来获取物理屏幕大小,但结果都一样。
maxwidth = XWidthOfScreen (XScreenOfDisplay(dpy, scrnum));
maxheight = XHeightOfScreen (XScreenOfDisplay(dpy, scrnum));

或者

XWindowAttributes attr;
XGetWindowAttributes(dpy, RootWindow(dpy, scrnum), &attr);
maxwidth = attr.width;
maxheight = attr.height;

只使用Xlib,能否检索到物理屏幕的尺寸?我想避免添加更多的库依赖项来设置窗口的大小,但也许可以使用Xrand扩展来实现这一点?

1个回答

5
我所知道的唯一方法是使用你提到的 Xrandr 扩展。你需要使用 XRRGetScreenResources 并循环遍历每个 Crtc 以获取所需信息。
#include <X11/Xlib.h>
#include <X11/extensions/Xrandr.h>
#include <stdio.h>

int main()
{
    Display *display = XOpenDisplay(NULL);
    XRRScreenResources *screens = XRRGetScreenResources(display, DefaultRootWindow(display));
    XRRCrtcInfo *info = NULL;
    int i = 0;

    for (i = 0; i < screens->ncrtc; i++) {
        info = XRRGetCrtcInfo(display, screens, screens->crtcs[i]);
        printf("%dx%d\n", info->width, info->height);
        XRRFreeCrtcInfo(info);
    }
    XRRFreeScreenResources(screens);

    return 0;
}

这是一个不错的开始,但是一个强大的解决方案会更加复杂。请参见:https://dev59.com/G43da4cB1Zd3GeqPwjW2。 - marski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接