From b7ff972997e721a2bab3d02e3ae82b5e16bb7fed Mon Sep 17 00:00:00 2001 From: Vasily Date: Sun, 10 Mar 2019 19:12:05 +0100 Subject: [PATCH] Update desktop overlay waiting logic The old version waited for a set amount of time (2 seconds) before checking and then exiting. The new logic checks every second for up to 7 seconds. This should deal with variances in startup time across machines. On my machine the desktop overlay seems to be initialized after 2-3 seconds. --- src/tabcontrollers/UtilitiesTabController.cpp | 42 ++++++++++++------- 1 file changed, 27 insertions(+), 15 deletions(-) diff --git a/src/tabcontrollers/UtilitiesTabController.cpp b/src/tabcontrollers/UtilitiesTabController.cpp index 7f9da8b..32dcdb5 100644 --- a/src/tabcontrollers/UtilitiesTabController.cpp +++ b/src/tabcontrollers/UtilitiesTabController.cpp @@ -546,36 +546,48 @@ void UtilitiesTabController::eventLoopTick() } } -void UtilitiesTabController::setUpDesktopOverlay( float desktopWidthInMeters ) +bool steamDesktopOverlayExists() { vr::VROverlayHandle_t pOverlayHandle = 0; auto error = vr::VROverlay()->FindOverlay( steamDesktopOverlaykey, &pOverlayHandle ); if ( error != vr::VROverlayError_None ) { - m_steamDesktopOverlayAvailable = false; LOG( INFO ) << "Could not find overlay \"" << steamDesktopOverlaykey << "\": " << vr::VROverlay()->GetOverlayErrorNameFromEnum( error ); + return false; + } + return true; +} - std::this_thread::sleep_for( std::chrono::seconds( 2 ) ); +void UtilitiesTabController::setUpDesktopOverlay( float desktopWidthInMeters ) +{ + auto setOverlayVariablesSuccess = [this, desktopWidthInMeters]() { + m_steamDesktopOverlayAvailable = true; + setSteamDesktopOverlayWidth( desktopWidthInMeters, true, true ); + LOG( INFO ) << "Found overlay \"" << steamDesktopOverlaykey << "\"."; + }; - error = vr::VROverlay()->FindOverlay( steamDesktopOverlaykey, - &pOverlayHandle ); - if ( error != vr::VROverlayError_None ) + if ( steamDesktopOverlayExists() ) + { + setOverlayVariablesSuccess(); + return; + } + + constexpr auto timeBetweenAdditionalAttempts = std::chrono::seconds( 1 ); + constexpr auto maxAttempts = 7; + for ( int attempts = 0; attempts < maxAttempts; ++attempts ) + { + std::this_thread::sleep_for( timeBetweenAdditionalAttempts ); + if ( steamDesktopOverlayExists() ) { - LOG( INFO ) << "Could not find overlay \"" << steamDesktopOverlaykey - << "\" after waiting: " - << vr::VROverlay()->GetOverlayErrorNameFromEnum( - error ); + setOverlayVariablesSuccess(); return; } - LOG( INFO ) << "Found overlay \"" << steamDesktopOverlaykey - << "\" after waiting."; } - m_steamDesktopOverlayAvailable = true; - - setSteamDesktopOverlayWidth( desktopWidthInMeters, true, true ); + LOG( INFO ) << "Could not find overlay \"" << steamDesktopOverlaykey + << "\" after " << maxAttempts << " extra attempts."; } bool UtilitiesTabController::steamDesktopOverlayAvailable() const