From 21661f7e8fb7640e66067a251513ffa352b44f92 Mon Sep 17 00:00:00 2001 From: Kai Sommerfeld Date: Tue, 18 Jun 2019 17:48:55 +0200 Subject: [PATCH 1/3] [Android][windowing] Don't assume display mode ids are constant. --- xbmc/platform/android/activity/XBMCApp.cpp | 6 ++++++ xbmc/windowing/android/AndroidUtils.cpp | 8 +++++++- xbmc/windowing/android/AndroidUtils.h | 1 + xbmc/windowing/android/WinSystemAndroid.cpp | 7 ++++++- xbmc/windowing/android/WinSystemAndroid.h | 2 ++ 5 files changed, 22 insertions(+), 2 deletions(-) diff --git a/xbmc/platform/android/activity/XBMCApp.cpp b/xbmc/platform/android/activity/XBMCApp.cpp index e9ae1ab0737f9..a6bab84433c04 100644 --- a/xbmc/platform/android/activity/XBMCApp.cpp +++ b/xbmc/platform/android/activity/XBMCApp.cpp @@ -1395,6 +1395,12 @@ void CXBMCApp::onDisplayAdded(int displayId) void CXBMCApp::onDisplayChanged(int displayId) { CLog::Log(LOGDEBUG, "CXBMCApp::%s: id: %d", __FUNCTION__, displayId); + + // Update display modes + CWinSystemAndroid* winSystemAndroid = dynamic_cast(CServiceBroker::GetWinSystem()); + if (winSystemAndroid) + winSystemAndroid->UpdateDisplayModes(); + m_displayChangeEvent.Set(); android_printf("%s: ", __PRETTY_FUNCTION__); } diff --git a/xbmc/windowing/android/AndroidUtils.cpp b/xbmc/windowing/android/AndroidUtils.cpp index 372fb71023415..14314d744b1a5 100644 --- a/xbmc/windowing/android/AndroidUtils.cpp +++ b/xbmc/windowing/android/AndroidUtils.cpp @@ -239,7 +239,7 @@ bool CAndroidUtils::GetNativeResolution(RESOLUTION_INFO *res) const bool CAndroidUtils::SetNativeResolution(const RESOLUTION_INFO &res) { - CLog::Log(LOGDEBUG, "CAndroidUtils: SetNativeResolution: %s: %dx%d %dx%d@%f", res.strId.c_str(), res.iWidth, res.iHeight, res.iScreenWidth, res.iScreenHeight, res.fRefreshRate); + CLog::Log(LOGNOTICE, "CAndroidUtils: SetNativeResolution: %s: %dx%d %dx%d@%f", res.strId.c_str(), res.iWidth, res.iHeight, res.iScreenWidth, res.iScreenHeight, res.fRefreshRate); if (s_hasModeApi) { @@ -314,6 +314,12 @@ bool CAndroidUtils::ProbeResolutions(std::vector &resolutions) return false; } +bool CAndroidUtils::UpdateDisplayModes() +{ + fetchDisplayModes(); + return true; +} + void CAndroidUtils::OnSettingChanged(std::shared_ptr setting) { const std::string &settingId = setting->GetId(); diff --git a/xbmc/windowing/android/AndroidUtils.h b/xbmc/windowing/android/AndroidUtils.h index e006ff1f4133a..8ef50fcbe3ca3 100644 --- a/xbmc/windowing/android/AndroidUtils.h +++ b/xbmc/windowing/android/AndroidUtils.h @@ -24,6 +24,7 @@ class CAndroidUtils : public ISettingCallback virtual bool GetNativeResolution(RESOLUTION_INFO *res) const; virtual bool SetNativeResolution(const RESOLUTION_INFO &res); virtual bool ProbeResolutions(std::vector &resolutions); + virtual bool UpdateDisplayModes(); // Implementation of ISettingCallback static const std::string SETTING_LIMITGUI; diff --git a/xbmc/windowing/android/WinSystemAndroid.cpp b/xbmc/windowing/android/WinSystemAndroid.cpp index 3790d3e0a0ee7..83b19d5ba3a81 100644 --- a/xbmc/windowing/android/WinSystemAndroid.cpp +++ b/xbmc/windowing/android/WinSystemAndroid.cpp @@ -129,7 +129,7 @@ bool CWinSystemAndroid::CreateNewWindow(const std::string& name, if (m_dispResetState != RESET_NOTWAITING) { - CLog::Log(LOGINFO, "CWinSystemAndroid::CreateNewWindow: cannot create window while resetting"); + CLog::Log(LOGERROR, "CWinSystemAndroid::CreateNewWindow: cannot create window while resetting"); return false; } @@ -244,6 +244,11 @@ void CWinSystemAndroid::SetHDMIState(bool connected) } } +void CWinSystemAndroid::UpdateDisplayModes() +{ + m_android->UpdateDisplayModes(); +} + bool CWinSystemAndroid::Hide() { return false; diff --git a/xbmc/windowing/android/WinSystemAndroid.h b/xbmc/windowing/android/WinSystemAndroid.h index e7f11dbff2a2f..088c0842e86f9 100644 --- a/xbmc/windowing/android/WinSystemAndroid.h +++ b/xbmc/windowing/android/WinSystemAndroid.h @@ -37,6 +37,8 @@ class CWinSystemAndroid : public CWinSystemBase, public ITimerCallback void SetHDMIState(bool connected); + void UpdateDisplayModes(); + bool HasCursor() override { return false; }; bool Hide() override; From 721f0a36a7a0bc7b7cefa7f28d348cb931bd571e Mon Sep 17 00:00:00 2001 From: Kai Sommerfeld Date: Thu, 20 Jun 2019 20:41:19 +0200 Subject: [PATCH 2/3] [Android][windowing] Update display settings on display resolution info change. Simplify and fix CWinSystemAndroid::UpdateResolutions(bool bUpdateDesktopRes). --- xbmc/windowing/android/WinSystemAndroid.cpp | 64 +++++++++++++-------- xbmc/windowing/android/WinSystemAndroid.h | 3 + 2 files changed, 44 insertions(+), 23 deletions(-) diff --git a/xbmc/windowing/android/WinSystemAndroid.cpp b/xbmc/windowing/android/WinSystemAndroid.cpp index 83b19d5ba3a81..7890f0437c7e3 100644 --- a/xbmc/windowing/android/WinSystemAndroid.cpp +++ b/xbmc/windowing/android/WinSystemAndroid.cpp @@ -156,48 +156,59 @@ bool CWinSystemAndroid::DestroyWindow() } void CWinSystemAndroid::UpdateResolutions() +{ + UpdateResolutions(true); +} + +void CWinSystemAndroid::UpdateResolutions(bool bUpdateDesktopRes) { CWinSystemBase::UpdateResolutions(); - RESOLUTION_INFO resDesktop, curDisplay; std::vector resolutions; - if (!m_android->ProbeResolutions(resolutions) || resolutions.empty()) { CLog::Log(LOGWARNING, "CWinSystemAndroid::%s failed.", __FUNCTION__); } - /* ProbeResolutions includes already all resolutions. - * Only get desktop resolution so we can replace xbmc's desktop res - */ - if (m_android->GetNativeResolution(&curDisplay)) + const RESOLUTION_INFO resWindow = CDisplaySettings::GetInstance().GetResolutionInfo(RES_WINDOW); + + RESOLUTION_INFO resDesktop; + if (bUpdateDesktopRes) + { + // ProbeResolutions includes already all resolutions. + // Only get desktop resolution so we can replace Kodi's desktop res. + RESOLUTION_INFO curDisplay; + if (m_android->GetNativeResolution(&curDisplay)) + resDesktop = curDisplay; + } + else { - resDesktop = curDisplay; + // Do not replace Kodi's desktop res, just update the data. + resDesktop = CDisplaySettings::GetInstance().GetResolutionInfo(RES_DESKTOP); } - RESOLUTION res_index = RES_CUSTOM; + CDisplaySettings::GetInstance().ClearCustomResolutions(); - for (size_t i = 0; i < resolutions.size(); i++) + for (auto& res : resolutions) { - // if this is a new setting, - // create a new empty setting to fill in. - while ((int)CDisplaySettings::GetInstance().ResolutionInfoSize() <= res_index) + CServiceBroker::GetWinSystem()->GetGfxContext().ResetOverscan(res); + CDisplaySettings::GetInstance().AddResolutionInfo(res); + + if (resDesktop.iScreenWidth == res.iScreenWidth && + resDesktop.iScreenHeight == res.iScreenHeight && + (resDesktop.dwFlags & D3DPRESENTFLAG_MODEMASK) == (res.dwFlags & D3DPRESENTFLAG_MODEMASK) && + std::fabs(resDesktop.fRefreshRate - res.fRefreshRate) < FLT_EPSILON) { - RESOLUTION_INFO res; - CDisplaySettings::GetInstance().AddResolutionInfo(res); + CDisplaySettings::GetInstance().GetResolutionInfo(RES_DESKTOP) = res; } - CServiceBroker::GetWinSystem()->GetGfxContext().ResetOverscan(resolutions[i]); - CDisplaySettings::GetInstance().GetResolutionInfo(res_index) = resolutions[i]; - - if (resDesktop.iScreenWidth == resolutions[i].iScreenWidth && - resDesktop.iScreenHeight == resolutions[i].iScreenHeight && - (resDesktop.dwFlags & D3DPRESENTFLAG_MODEMASK) == (resolutions[i].dwFlags & D3DPRESENTFLAG_MODEMASK) && - fabs(resDesktop.fRefreshRate - resolutions[i].fRefreshRate) < FLT_EPSILON) + if (resWindow.iScreenWidth == res.iScreenWidth && + resWindow.iScreenHeight == res.iScreenHeight && + (resWindow.dwFlags & D3DPRESENTFLAG_MODEMASK) == (res.dwFlags & D3DPRESENTFLAG_MODEMASK) && + std::fabs(resWindow.fRefreshRate - res.fRefreshRate) < FLT_EPSILON) { - CDisplaySettings::GetInstance().GetResolutionInfo(RES_DESKTOP) = resolutions[i]; + CDisplaySettings::GetInstance().GetResolutionInfo(RES_WINDOW) = res; } - res_index = (RESOLUTION)((int)res_index + 1); } } @@ -246,7 +257,14 @@ void CWinSystemAndroid::SetHDMIState(bool connected) void CWinSystemAndroid::UpdateDisplayModes() { + // re-fetch display modes m_android->UpdateDisplayModes(); + + if (m_nativeWindow) + { + // update display settings + UpdateResolutions(false); + } } bool CWinSystemAndroid::Hide() diff --git a/xbmc/windowing/android/WinSystemAndroid.h b/xbmc/windowing/android/WinSystemAndroid.h index 088c0842e86f9..06822233489c9 100644 --- a/xbmc/windowing/android/WinSystemAndroid.h +++ b/xbmc/windowing/android/WinSystemAndroid.h @@ -78,4 +78,7 @@ class CWinSystemAndroid : public CWinSystemBase, public ITimerCallback CCriticalSection m_resourceSection; std::vector m_resources; CDecoderFilterManager *m_decoderFilterManager; + +private: + void UpdateResolutions(bool bUpdateDesktopRes); }; From 47ca1586a77a27c3de903fe4fcde2eda3bf272a0 Mon Sep 17 00:00:00 2001 From: Kai Sommerfeld Date: Fri, 21 Jun 2019 11:47:45 +0200 Subject: [PATCH 3/3] [settings] CDisplaySettings::Clear must insert RES_CUSTOM dummy elements into m_resolutions after clearing it. Otherwise CDisplaysettings::AddAddResolutionInfo will put new infos at wrong place in m_resolutions if CDisplaySettings::Clear was called before. --- xbmc/settings/DisplaySettings.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/xbmc/settings/DisplaySettings.cpp b/xbmc/settings/DisplaySettings.cpp index e808eaa438cc5..9bd6ce43b49de 100644 --- a/xbmc/settings/DisplaySettings.cpp +++ b/xbmc/settings/DisplaySettings.cpp @@ -87,7 +87,7 @@ static std::string ModeFlagsToString(unsigned int flags, bool identifier) CDisplaySettings::CDisplaySettings() { - m_resolutions.insert(m_resolutions.begin(), RES_CUSTOM, RESOLUTION_INFO()); + m_resolutions.resize(RES_CUSTOM); m_zoomAmount = 1.0f; m_pixelRatio = 1.0f; @@ -218,6 +218,7 @@ void CDisplaySettings::Clear() CSingleLock lock(m_critical); m_calibrations.clear(); m_resolutions.clear(); + m_resolutions.resize(RES_CUSTOM); m_zoomAmount = 1.0f; m_pixelRatio = 1.0f;