From c0f85ad191468a9dd13fb9afb37a7feebfefddae Mon Sep 17 00:00:00 2001 From: reionwong Date: Tue, 20 Oct 2026 22:22:06 +0800 Subject: [PATCH] fix(wlan): keep the Wi-Fi switch on the requested state until it applies --- src/pages/network/wlan/wlanpage.cpp | 38 +++++++++++++++++++++-------- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/src/pages/network/wlan/wlanpage.cpp b/src/pages/network/wlan/wlanpage.cpp index 234f767..fa9384b 100644 --- a/src/pages/network/wlan/wlanpage.cpp +++ b/src/pages/network/wlan/wlanpage.cpp @@ -3,6 +3,7 @@ #include #include +#include #include "base/i18n.h" #include "base/timer.h" @@ -92,6 +93,7 @@ public: m_subscriptions.push_back(m_list.changed.connect([this] { update(); })); m_subscriptions.push_back(m_enabled.changed.connect([this] { + settleWireless(); update(); joinRequestedNetwork(); })); @@ -167,18 +169,32 @@ private: m_details->show(); } + // The switch shows the requested state until NetworkManager reports it, + // so that a list refresh in between does not flip it back. void wirelessToggled(bool checked) { - if (m_list.isMock()) + if (m_list.isMock() || checked == wirelessEnabled()) return; - if (checked) { - if (!m_enabled.isWirelessEnabled()) { - m_handler.enableWireless(true); - m_handler.requestScan(); - } - } else if (m_enabled.isWirelessEnabled()) { - m_handler.enableWireless(false); - } + m_requestedWireless = checked; + ++m_wirelessRequests; + m_handler.enableWireless(checked, [this](const cutefish::base::dbus::Reply& reply) { + --m_wirelessRequests; + if (reply.isError()) + m_requestedWireless.reset(); + settleWireless(); + update(); + }); + if (checked) + m_handler.requestScan(); + update(); + } + + bool wirelessEnabled() const { return m_requestedWireless.value_or(m_enabled.isWirelessEnabled()); } + + void settleWireless() + { + if (m_wirelessRequests == 0 && m_requestedWireless == m_enabled.isWirelessEnabled()) + m_requestedWireless.reset(); } // The status bar sends enterprise networks here. The window and @@ -198,7 +214,7 @@ private: { const bool mock = m_list.isMock(); content()->setVisible(m_enabled.isWirelessHwEnabled() || mock); - m_switch->setChecked(mock || m_enabled.isWirelessEnabled()); + m_switch->setChecked(mock || wirelessEnabled()); const std::vector items = m_list.rows(nm::ConnectionType::Wireless); // Switching networks leaves the old one Deactivating until the new one @@ -264,6 +280,8 @@ private: std::vector m_subscriptions; NewNetworkDialog m_newNetwork; std::unique_ptr m_details; + std::optional m_requestedWireless; + int m_wirelessRequests = 0; ColumnLayout* m_view; Card* m_mainCard;