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!"); } }