bool DisplayResX::SwitchToVideoMode(int width, int height, double desired_rate) { double rate; DisplayResScreen desired_screen(width, height, 0, 0, -1.0, desired_rate); int idx = DisplayResScreen::FindBestMatch(m_videoModesUnsorted, desired_screen, rate); if (idx >= 0) { short finalrate; MythXDisplay *display = NULL; XRRScreenConfiguration *cfg = GetScreenConfig(display); if (!cfg) return false; Rotation rot; XRRConfigCurrentConfiguration(cfg, &rot); // Search real xrandr rate for desired_rate finalrate = (short) rate; for (uint i = 0; i < m_videoModes.size(); i++) { if ((m_videoModes[i].Width() == width) && (m_videoModes[i].Height() == height)) { if (m_videoModes[i].Custom()) { finalrate = m_videoModes[i].realRates[rate]; LOG(VB_PLAYBACK, LOG_INFO, QString("Dynamic TwinView rate found, set %1Hz as " "XRandR %2") .arg(rate) .arg(finalrate)); } break; } } Window root = display->GetRoot(); Status status = XRRSetScreenConfigAndRate(display->GetDisplay(), cfg, root, idx, rot, finalrate, CurrentTime); XRRFreeScreenConfigInfo(cfg); delete display; if (RRSetConfigSuccess != status) LOG(VB_GENERAL, LOG_ERR, "XRRSetScreenConfigAndRate() call failed."); return RRSetConfigSuccess == status; } LOG(VB_GENERAL, LOG_ERR, "Desired Resolution and FrameRate not found."); return false; }
bool DisplayResX::SwitchToVideoMode(int width, int height, short desired_rate) { short rate; DisplayResScreen desired_screen(width, height, 0, 0, -1.0, desired_rate); int idx = DisplayResScreen::FindBestMatch(m_video_modes_unsorted, desired_screen, rate); if (idx >= 0) { Display *display = NULL; XRRScreenConfiguration *cfg = GetScreenConfig(display); if (!cfg) return false; X11L; Rotation rot; XRRConfigCurrentConfiguration(cfg, &rot); Window root = DefaultRootWindow(display); Status status = XRRSetScreenConfigAndRate(display, cfg, root, idx, rot, rate, CurrentTime); XRRFreeScreenConfigInfo(cfg); XCloseDisplay(display); X11U; if (RRSetConfigSuccess != status) cerr<<"DisplaResX: XRRSetScreenConfigAndRate() call failed."<<endl; return RRSetConfigSuccess == status; } cerr<<"DisplaResX: Desired Resolution and FrameRate not found."<<endl; return false; }