std::vector<RESOLUTION_WHR> CWinSystemBase::ScreenResolutions(float refreshrate) { std::vector<RESOLUTION_WHR> resolutions; for (unsigned int idx = RES_CUSTOM; idx < CDisplaySettings::GetInstance().ResolutionInfoSize(); idx++) { RESOLUTION_INFO info = CDisplaySettings::GetInstance().GetResolutionInfo(idx); AddResolution(resolutions, idx, refreshrate); } // Can't assume a sort order sort(resolutions.begin(), resolutions.end(), resSortPredicate); return resolutions; }
std::vector<RESOLUTION_WHR> CWinSystemBase::ScreenResolutions(int screen, float refreshrate) { std::vector<RESOLUTION_WHR> resolutions; for (unsigned int idx = RES_DESKTOP; idx < CDisplaySettings::GetInstance().ResolutionInfoSize(); idx++) { RESOLUTION_INFO info = CDisplaySettings::GetInstance().GetResolutionInfo(idx); if (info.iScreen == screen) AddResolution(resolutions, idx, refreshrate); } // Can't assume a sort order // don't touch RES_DESKTOP which is index 0 sort(resolutions.begin()+1, resolutions.end(), resSortPredicate); return resolutions; }
void CWinSystemWin32::UpdateResolutions() { CWinSystemBase::UpdateResolutions(); UpdateResolutionsInternal(); if(m_MonitorsInfo.size() < 1) return; float refreshRate = 0; int w = 0; int h = 0; uint32_t dwFlags; // Primary m_MonitorsInfo[m_nPrimary].ScreenNumber = 0; w = m_MonitorsInfo[m_nPrimary].ScreenWidth; h = m_MonitorsInfo[m_nPrimary].ScreenHeight; if( (m_MonitorsInfo[m_nPrimary].RefreshRate == 59) || (m_MonitorsInfo[m_nPrimary].RefreshRate == 29) || (m_MonitorsInfo[m_nPrimary].RefreshRate == 23) ) refreshRate = (float)(m_MonitorsInfo[m_nPrimary].RefreshRate + 1) / 1.001f; else refreshRate = (float)m_MonitorsInfo[m_nPrimary].RefreshRate; dwFlags = m_MonitorsInfo[m_nPrimary].Interlaced ? D3DPRESENTFLAG_INTERLACED : 0; UpdateDesktopResolution(CDisplaySettings::Get().GetResolutionInfo(RES_DESKTOP), 0, w, h, refreshRate, dwFlags); CLog::Log(LOGNOTICE, "Primary mode: %s", CDisplaySettings::Get().GetResolutionInfo(RES_DESKTOP).strMode.c_str()); // Desktop resolution of the other screens if(m_MonitorsInfo.size() >= 2) { int xbmcmonitor = 1; // The screen number+1 showed in the GUI display settings for (unsigned int monitor = 0; monitor < m_MonitorsInfo.size(); monitor++) { if (monitor != m_nPrimary) { m_MonitorsInfo[monitor].ScreenNumber = xbmcmonitor; w = m_MonitorsInfo[monitor].ScreenWidth; h = m_MonitorsInfo[monitor].ScreenHeight; if( (m_MonitorsInfo[monitor].RefreshRate == 59) || (m_MonitorsInfo[monitor].RefreshRate == 29) || (m_MonitorsInfo[monitor].RefreshRate == 23) ) refreshRate = (float)(m_MonitorsInfo[monitor].RefreshRate + 1) / 1.001f; else refreshRate = (float)m_MonitorsInfo[monitor].RefreshRate; dwFlags = m_MonitorsInfo[monitor].Interlaced ? D3DPRESENTFLAG_INTERLACED : 0; RESOLUTION_INFO res; UpdateDesktopResolution(res, xbmcmonitor++, w, h, refreshRate, dwFlags); CDisplaySettings::Get().AddResolutionInfo(res); CLog::Log(LOGNOTICE, "Secondary mode: %s", res.strMode.c_str()); } } } // The rest of the resolutions. The order is not important. for (unsigned int monitor = 0; monitor < m_MonitorsInfo.size(); monitor++) { for(int mode = 0;; mode++) { DEVMODE devmode; ZeroMemory(&devmode, sizeof(devmode)); devmode.dmSize = sizeof(devmode); if(EnumDisplaySettings(m_MonitorsInfo[monitor].DeviceName, mode, &devmode) == 0) break; if(devmode.dmBitsPerPel != 32) continue; float refreshRate; if(devmode.dmDisplayFrequency == 59 || devmode.dmDisplayFrequency == 29 || devmode.dmDisplayFrequency == 23) refreshRate = (float)(devmode.dmDisplayFrequency + 1) / 1.001f; else refreshRate = (float)(devmode.dmDisplayFrequency); dwFlags = (devmode.dmDisplayFlags & DM_INTERLACED) ? D3DPRESENTFLAG_INTERLACED : 0; RESOLUTION_INFO res; UpdateDesktopResolution(res, m_MonitorsInfo[monitor].ScreenNumber, devmode.dmPelsWidth, devmode.dmPelsHeight, refreshRate, dwFlags); AddResolution(res); CLog::Log(LOGNOTICE, "Additional mode: %s", res.strMode.c_str()); } } }