void CWinSystemGLES::UpdateResolutions() { CWinSystemBase::UpdateResolutions(); int w = 1280; int h = 720; UpdateDesktopResolution(g_settings.m_ResInfo[RES_DESKTOP], 0, w, h, 0.0); }
// TODO: Fix me void CWinSystemEGL::UpdateResolutions() { CWinSystemBase::UpdateResolutions(); // Add desktop resolution #ifdef _WIN32 DEVMODE dm; ZeroMemory(&dm, sizeof(dm)); dm.dmSize = sizeof(dm); EnumDisplaySettingsEx(NULL, ENUM_CURRENT_SETTINGS, &dm, 0); UpdateDesktopResolution(g_settings.m_ResInfo[RES_DESKTOP], 0, dm.dmPelsWidth, dm.dmPelsHeight, 60); #else UpdateDesktopResolution(g_settings.m_ResInfo[RES_DESKTOP], 0, 1920, 1080, 60); #endif }
void CWinSystemGbm::UpdateResolutions() { CWinSystemBase::UpdateResolutions(); UpdateDesktopResolution(CDisplaySettings::GetInstance().GetResolutionInfo(RES_DESKTOP), 0, m_DRM->m_mode->hdisplay, m_DRM->m_mode->vdisplay, m_DRM->m_mode->vrefresh); std::vector<RESOLUTION_INFO> resolutions; if (!m_DRM->GetModes(resolutions) || resolutions.empty()) { CLog::Log(LOGWARNING, "CWinSystemGbm::%s - Failed to get resolutions", __FUNCTION__); } else { CDisplaySettings::GetInstance().ClearCustomResolutions(); for (unsigned int i = 0; i < resolutions.size(); i++) { g_graphicsContext.ResetOverscan(resolutions[i]); CDisplaySettings::GetInstance().AddResolutionInfo(resolutions[i]); CLog::Log(LOGNOTICE, "Found resolution %dx%d for display %d with %dx%d%s @ %f Hz", resolutions[i].iWidth, resolutions[i].iHeight, resolutions[i].iScreen, resolutions[i].iScreenWidth, resolutions[i].iScreenHeight, resolutions[i].dwFlags & D3DPRESENTFLAG_INTERLACED ? "i" : "", resolutions[i].fRefreshRate); } } CDisplaySettings::GetInstance().ApplyCalibrations(); }
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()); } } }
void CWinSystemX11::UpdateResolutions() { CWinSystemBase::UpdateResolutions(); int numScreens = XScreenCount(m_dpy); g_xrandr.SetNumScreens(numScreens); bool switchOnOff = CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOSCREEN_BLANKDISPLAYS); m_userOutput = CSettings::GetInstance().GetString(CSettings::SETTING_VIDEOSCREEN_MONITOR); if (m_userOutput.compare("Default") == 0) switchOnOff = false; if(g_xrandr.Query(true, !switchOnOff)) { XOutput *out = NULL; if (m_userOutput.compare("Default") != 0) { out = g_xrandr.GetOutput(m_userOutput); if (out) { XMode mode = g_xrandr.GetCurrentMode(m_userOutput); if (!mode.isCurrent && !switchOnOff) { out = NULL; } } } if (!out) { m_userOutput = g_xrandr.GetModes()[0].name; out = g_xrandr.GetOutput(m_userOutput); } if (switchOnOff) { // switch on output g_xrandr.TurnOnOutput(m_userOutput); // switch off other outputs std::vector<XOutput> outputs = g_xrandr.GetModes(); for (size_t i=0; i<outputs.size(); i++) { if (StringUtils::EqualsNoCase(outputs[i].name, m_userOutput)) continue; g_xrandr.TurnOffOutput(outputs[i].name); } } XMode mode = g_xrandr.GetCurrentMode(m_userOutput); if (mode.id.empty()) mode = g_xrandr.GetPreferredMode(m_userOutput); m_bIsRotated = out->isRotated; if (!m_bIsRotated) UpdateDesktopResolution(CDisplaySettings::GetInstance().GetResolutionInfo(RES_DESKTOP), 0, mode.w, mode.h, mode.hz); else UpdateDesktopResolution(CDisplaySettings::GetInstance().GetResolutionInfo(RES_DESKTOP), 0, mode.h, mode.w, mode.hz); CDisplaySettings::GetInstance().GetResolutionInfo(RES_DESKTOP).strId = mode.id; CDisplaySettings::GetInstance().GetResolutionInfo(RES_DESKTOP).strOutput = m_userOutput; } else { m_userOutput = "No Output"; m_nScreen = DefaultScreen(m_dpy); int w = DisplayWidth(m_dpy, m_nScreen); int h = DisplayHeight(m_dpy, m_nScreen); UpdateDesktopResolution(CDisplaySettings::GetInstance().GetResolutionInfo(RES_DESKTOP), 0, w, h, 0.0); } // erase previous stored modes CDisplaySettings::GetInstance().ClearCustomResolutions(); CLog::Log(LOGINFO, "Available videomodes (xrandr):"); XOutput *out = g_xrandr.GetOutput(m_userOutput); if (out != NULL) { std::vector<XMode>::iterator modeiter; CLog::Log(LOGINFO, "Output '%s' has %" PRIdS" modes", out->name.c_str(), out->modes.size()); for (modeiter = out->modes.begin() ; modeiter!=out->modes.end() ; modeiter++) { XMode mode = *modeiter; CLog::Log(LOGINFO, "ID:%s Name:%s Refresh:%f Width:%d Height:%d", mode.id.c_str(), mode.name.c_str(), mode.hz, mode.w, mode.h); RESOLUTION_INFO res; res.iScreen = 0; // not used by X11 res.iWidth = mode.w; res.iHeight = mode.h; res.iScreenWidth = mode.w; res.iScreenHeight = mode.h; if (!m_bIsRotated) { res.iWidth = mode.w; res.iHeight = mode.h; } else { res.iWidth = mode.h; res.iHeight = mode.w; } if (mode.h>0 && mode.w>0 && out->hmm>0 && out->wmm>0) res.fPixelRatio = ((float)out->wmm/(float)mode.w) / (((float)out->hmm/(float)mode.h)); else res.fPixelRatio = 1.0f; CLog::Log(LOGINFO, "Pixel Ratio: %f", res.fPixelRatio); res.strMode = StringUtils::Format("%s: %s @ %.2fHz", out->name.c_str(), mode.name.c_str(), mode.hz); res.strOutput = out->name; res.strId = mode.id; res.iSubtitles = (int)(0.965*mode.h); res.fRefreshRate = mode.hz; res.bFullScreen = true; if (mode.h > 0 && ((float)mode.w / (float)mode.h >= 1.59)) res.dwFlags = D3DPRESENTFLAG_WIDESCREEN; else res.dwFlags = 0; g_graphicsContext.ResetOverscan(res); CDisplaySettings::GetInstance().AddResolutionInfo(res); } } CDisplaySettings::GetInstance().ApplyCalibrations(); }