Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.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 检索物理屏幕大小_C_Xlib - Fatal编程技术网

C 检索物理屏幕大小

C 检索物理屏幕大小,c,xlib,C,Xlib,Xorg启动并创建一个虚拟屏幕 虚拟屏幕大小确定为3120 x 1050 我想是用xinerama跨越1680x1050和1440x900两个物理屏幕 没有配置文件,我不想更改系统设置 我的应用程序使用DisplayWidth和DisplayHeight来检索屏幕大小,这在单屏幕设置中很好 maxwidth = DisplayWidth (dpy, scrnum); maxheight = DisplayHeight (dpy, scrnum); 但是在自动创建虚拟屏幕的双屏幕设置中,这些函数

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

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

我想是用xinerama跨越1680x1050和1440x900两个物理屏幕

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

我的应用程序使用DisplayWidth和DisplayHeight来检索屏幕大小,这在单屏幕设置中很好

maxwidth = DisplayWidth (dpy, scrnum);
maxheight = DisplayHeight (dpy, scrnum);
但是在自动创建虚拟屏幕的双屏幕设置中,这些函数返回虚拟屏幕的大小

我尝试了不同的方法来检索物理屏幕大小,结果相同:

maxwidth = XWidthOfScreen (XScreenOfDisplay(dpy, scrnum));
maxheight = XHeightOfScreen (XScreenOfDisplay(dpy, scrnum));


是否可以仅使用Xlib检索物理屏幕的大小?我希望避免仅仅为了设置窗口的大小而添加更多库依赖项,但这可能是使用Xrand扩展可以实现的吗?

我知道的唯一方法是使用您提到的Xrandr扩展。您将需要使用XRGetScreenResources并通过每个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;
}
#包括
#包括
#包括
int main()
{
Display*Display=XOpenDisplay(空);
XRRScreenResources*screens=XRRGetScreenResources(显示,DefaultRootWindow(显示));
XRRCrtcInfo*info=NULL;
int i=0;
对于(i=0;incrtc;i++){
info=XRRGetCrtcInfo(显示、屏幕、屏幕->crtcs[i]);
printf(“%dx%d\n”,信息->宽度,信息->高度);
XRRFreeCrtcInfo(信息);
}
XRR自由屏幕资源(屏幕);
返回0;
}

这是一个良好的开端,但稳健的解决方案要复杂一些。请参阅:。
#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;
}