From 4e27efd1a6061c7cea345e1c9f4eb9eb0f96a0bd Mon Sep 17 00:00:00 2001 From: FrogTheFrog Date: Wed, 15 Jan 2025 22:26:14 +0200 Subject: [PATCH 1/3] fix(display): retry reverting configuration only if device was added/removed --- src/display_device.cpp | 38 +++++++++++++++++++++++++++++++++--- third-party/libdisplaydevice | 2 +- 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/src/display_device.cpp b/src/display_device.cpp index e337e9a8b78..a053daa89d5 100644 --- a/src/display_device.cpp +++ b/src/display_device.cpp @@ -674,11 +674,43 @@ namespace display_device { scheduler_option.m_execution = SchedulerOptions::Execution::ScheduledOnly; } - DD_DATA.sm_instance->schedule([try_once = (option == revert_option_e::try_once)](auto &settings_iface, auto &stop_token) { - // Here we want to keep retrying indefinitely until we succeed. - if (settings_iface.revertSettings() || try_once) { + DD_DATA.sm_instance->schedule([try_once = (option == revert_option_e::try_once), tried_out_devices = std::set {}](auto &settings_iface, auto &stop_token) mutable { + if (try_once) { + settings_iface.revertSettings(); stop_token.requestStop(); + return; } + + auto available_devices { [&settings_iface]() { + const auto devices { settings_iface.enumAvailableDevices() }; + std::set available_devices; + + std::transform( + std::begin(devices), std::end(devices), + std::inserter(available_devices, std::end(available_devices)), + [](const auto &device) { return device.m_device_id + " - " + device.m_friendly_name; }); + + return available_devices; + }() }; + if (available_devices == tried_out_devices) { + BOOST_LOG(debug) << "Skipping reverting configuration, because the no newly added/removed devices were detected since last check. Currently available devices:\n" + << toJson(available_devices); + return; + } + + if (const auto result { settings_iface.revertSettings() }; result == SettingsManager::RevertResult::Ok) { + stop_token.requestStop(); + return; + } + else if (result == SettingsManager::RevertResult::ApiTemporarilyUnavailable) { + // Do nothing and retry next time + return; + } + + // If we have failed to revert settings then we will try to do it next time only if a device was added/removed + BOOST_LOG(warning) << "Failed to revert display device configuration (will retry once devices are added or removed). Enabling all of the available devices:\n" + << toJson(available_devices); + tried_out_devices.swap(available_devices); }, scheduler_option); } diff --git a/third-party/libdisplaydevice b/third-party/libdisplaydevice index 2c431bce298..63599b07659 160000 --- a/third-party/libdisplaydevice +++ b/third-party/libdisplaydevice @@ -1 +1 @@ -Subproject commit 2c431bce2981ebb4b6c116c7e11372a045596b70 +Subproject commit 63599b07659a5d1dd554a24bd0c8e96b21e21112 From 0e0ece574599cf6f1d5c38d07318290f06528414 Mon Sep 17 00:00:00 2001 From: FrogTheFrog Date: Thu, 16 Jan 2025 00:07:27 +0200 Subject: [PATCH 2/3] fix stuff --- src/display_device.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/display_device.cpp b/src/display_device.cpp index a053daa89d5..de6d738ce9b 100644 --- a/src/display_device.cpp +++ b/src/display_device.cpp @@ -676,21 +676,21 @@ namespace display_device { DD_DATA.sm_instance->schedule([try_once = (option == revert_option_e::try_once), tried_out_devices = std::set {}](auto &settings_iface, auto &stop_token) mutable { if (try_once) { - settings_iface.revertSettings(); + std::ignore = settings_iface.revertSettings(); stop_token.requestStop(); return; } auto available_devices { [&settings_iface]() { const auto devices { settings_iface.enumAvailableDevices() }; - std::set available_devices; + std::set parsed_devices; std::transform( std::begin(devices), std::end(devices), - std::inserter(available_devices, std::end(available_devices)), + std::inserter(parsed_devices, std::end(parsed_devices)), [](const auto &device) { return device.m_device_id + " - " + device.m_friendly_name; }); - return available_devices; + return parsed_devices; }() }; if (available_devices == tried_out_devices) { BOOST_LOG(debug) << "Skipping reverting configuration, because the no newly added/removed devices were detected since last check. Currently available devices:\n" @@ -698,11 +698,12 @@ namespace display_device { return; } - if (const auto result { settings_iface.revertSettings() }; result == SettingsManager::RevertResult::Ok) { + using enum SettingsManagerInterface::RevertResult; + if (const auto result { settings_iface.revertSettings() }; result == Ok) { stop_token.requestStop(); return; } - else if (result == SettingsManager::RevertResult::ApiTemporarilyUnavailable) { + else if (result == ApiTemporarilyUnavailable) { // Do nothing and retry next time return; } From fd2d4d393555216a0ce7d2f9916a8e474630d640 Mon Sep 17 00:00:00 2001 From: FrogTheFrog Date: Thu, 16 Jan 2025 00:11:41 +0200 Subject: [PATCH 3/3] typo --- src/display_device.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/display_device.cpp b/src/display_device.cpp index de6d738ce9b..fc273fcb725 100644 --- a/src/display_device.cpp +++ b/src/display_device.cpp @@ -693,7 +693,7 @@ namespace display_device { return parsed_devices; }() }; if (available_devices == tried_out_devices) { - BOOST_LOG(debug) << "Skipping reverting configuration, because the no newly added/removed devices were detected since last check. Currently available devices:\n" + BOOST_LOG(debug) << "Skipping reverting configuration, because no newly added/removed devices were detected since last check. Currently available devices:\n" << toJson(available_devices); return; }