Ejemplo n.º 1
0
void RenderContextImplGLX::EnumVideoModes(VideoModeList& videoModes) {
    // check for xrandr support
    videoModes.clear();
    bool fallback = false;
    if ((xrandrSupported = IsXRandrSupported())) {
        XRRScreenSize* screenSize;
        int nsizes = 0;

        Trace("XRANDR is enabled");
        screenSize = XRRSizes(display, screenIndex, &nsizes);
        if (!nsizes)
            fallback = true;
        videoModes.reserve((size_t) nsizes);
        for (int i = 0; i < nsizes; ++i) {
            VideoMode vmode;
            vmode.width = uint16(screenSize[i].width);
            vmode.height = uint16(screenSize[i].height);

            int nrates;
            short* rates = XRRRates(display, screenIndex, i, &nrates);
            for (int j = 0; j < nrates; ++j) {
                vmode.refreshRate = uint16(rates[j]);
                videoModes.push_back(vmode);
            }
        }
        Window root = RootWindow(display, screenIndex);
        Rotation rotation;
        XRRScreenConfiguration *conf = XRRGetScreenInfo(display, root);
        int currsize = XRRConfigCurrentConfiguration(conf, &rotation);
        VideoMode current = VideoMode(screenSize[currsize].width,
                                      screenSize[currsize].height, XRRConfigCurrentRate(conf));
        std::sort(videoModes.begin(), videoModes.end());
        auto it = std::find(videoModes.begin(), videoModes.end(), current);
        if (it != videoModes.end())
            baseContext->SetOriginalVideoMode((uint32)(it - videoModes.begin()));
        else {
            videoModes.push_back(current);
            baseContext->SetOriginalVideoMode((uint32)videoModes.size() - 1);
        }
        XRRFreeScreenConfigInfo(conf);
    } /* check vid modes*/
    if (fallback || !videoModes.size()) {
        VideoMode vmode;
        vmode.width = DisplayWidth(display, screenIndex);
        vmode.height = DisplayHeight(display, screenIndex);
        vmode.refreshRate = 0;
        videoModes.push_back(vmode);
        baseContext->SetOriginalVideoMode((uint32)videoModes.size() - 1);
        Error("Viewmode set in fallback mode!");
    }
}