c -可能的分辨率与多个显示使用Xinerama



我正在尝试列出所有具有Xinerama和Xrandr的显示器。这是应该完成的代码:

int i, j, screenCount, sizeCount, eventBase, errorBase;
char displayName[64];
DIR *dir;
struct dirent *direntry;
XRRScreenSize *sizes;
XRRScreenConfiguration *screenConfig;
XineramaScreenInfo *xineramaInfo;
Display *disp;
Window root;
dir = opendir("/tmp/.X11-unix");
while((direntry = readdir(dir)) != NULL){
    if(direntry->d_name[0] != 'X'){
        continue;
    }
    snprintf(displayName, 64, ":%s", direntry->d_name + 1);
    disp = XOpenDisplay(displayName);
    if(disp != NULL){
        if(XineramaQueryExtension(disp, &eventBase, &errorBase) && XineramaIsActive(disp)){
            xineramaInfo = XineramaQueryScreens(disp, &screenCount);
        }else{
            break;
        }
        printf("Display %s has %d screensn", displayName, screenCount);
        for(i = 0; i < screenCount; i++){
            root = RootWindow(disp, i);
            screenConfig = XRRGetScreenInfo(disp, root);
            sizes = XRRConfigSizes(screenConfig, &sizeCount);
            for(j = 0; j < sizeCount; j++){
                printf("%d x %dn", sizes[j].width, sizes[j].height);
            }
        }
        XCloseDisplay(disp);
        XFree(xineramaInfo);
    }
}

但是会抛出以下错误:

Display :0 has 3 screens
1680 x 1050
1600 x 1200
1280 x 1024
1024 x 768
832 x 624
800 x 600
640 x 480
720 x 400
X Error of failed request:  BadWindow (invalid Window parameter)
  Major opcode of failed request:  140 (RANDR)
  Minor opcode of failed request:  5 (RRGetScreenInfo)
  Resource id in failed request:  0x18
  Serial number of failed request:  16
  Current serial number in output stream:  16

是我的代码有什么问题,或者是不可能列出所有分辨率从所有显示器与Xinerama?

在长时间查看Xrandr的源代码后,我找到了解决方案:

bool findResolutions(Display *display)
{
    int i, j, k, eventBase, errorBase;
    Window root;
    XRRScreenResources *resources;
    XRROutputInfo *outputInfo;
    if(!XineramaQueryExtension(display, &eventBase, &errorBase) || !XineramaIsActive(display)){
        printf("Xinerama not supported or activen");
        return false;
    }
    root = RootWindow(display, 0);
    resources = XRRGetScreenResources(display, root);
    for(i = 0; i < resources->noutput; i++){
        outputInfo = XRRGetOutputInfo(display, resources, resources->outputs[i]);
        for(j = 0; j < outputInfo->nmode; j++){
            for(k = 0; k < resources->nmode; k++){
                if(outputInfo->modes[j] == resources->modes[k].id){
                    printf("%dx%d", resources->modes[k].width, resources->modes[k].height);
                    break;
                }
            }
        }
        XRRFreeOutputInfo(outputInfo);
    }
    XRRFreeScreenResources(resources);
    return true;
}

相关内容

  • 没有找到相关文章

最新更新