From 52ca25398088514ff3b2d29b3b8aa5cdf584c252 Mon Sep 17 00:00:00 2001 From: lamagu <3057978296@qq.com> Date: Fri, 9 Oct 2026 22:11:34 +0800 Subject: [PATCH] [fix] delay signaling offline indication during reconnects --- .../src/gui/application/gui_application.cpp | 20 ++++++++++++++++++- .../src/gui/application/gui_application.h | 5 +++++ deps/submodules/minirtc | 2 +- 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/apps/desktop/src/gui/application/gui_application.cpp b/apps/desktop/src/gui/application/gui_application.cpp index b8d989db..1a457ed3 100644 --- a/apps/desktop/src/gui/application/gui_application.cpp +++ b/apps/desktop/src/gui/application/gui_application.cpp @@ -74,6 +74,10 @@ namespace { using namespace std::chrono_literals; +// Median reconnect to the signal server lands around 7 s on a lossy path, so a +// drop shorter than this is almost always already being recovered from. +constexpr auto kSignalOfflineGrace = 10s; + std::optional GenerateRandomPassword(std::string_view current) { constexpr std::string_view alphabet = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; @@ -2471,7 +2475,21 @@ void GuiApplication::SyncMainWindow() { std::lock_guard lock(password_change_mutex_); ui_->main->set_password_change_pending(password_change_pending_); } - ui_->main->set_signal_connected(signal_connected_); + const bool signal_online = signal_connected_.load(); + if (signal_online) { + signal_lost_at_valid_ = false; + } else if (!signal_lost_at_valid_) { + signal_lost_at_ = std::chrono::steady_clock::now(); + signal_lost_at_valid_ = true; + } + // Reconnects routinely take several seconds on a lossy path; only report + // offline once the connection has stayed down long enough to be a real + // outage rather than a blip the reconnect is already recovering from. + const bool signal_offline = + !signal_online && signal_lost_at_valid_ && + std::chrono::steady_clock::now() - signal_lost_at_ > + kSignalOfflineGrace; + ui_->main->set_signal_connected(!signal_offline); ui_->main->set_signal_tls_error(signal_status_ == SignalStatus::SignalTlsCertError); ui_->main->set_update_available(update_available_); diff --git a/apps/desktop/src/gui/application/gui_application.h b/apps/desktop/src/gui/application/gui_application.h index 4a840c1d..29c6d18d 100644 --- a/apps/desktop/src/gui/application/gui_application.h +++ b/apps/desktop/src/gui/application/gui_application.h @@ -106,6 +106,11 @@ private: cursor_delivery_states_; uint32_t cursor_state_sequence_ = 0; std::chrono::steady_clock::time_point next_video_frame_time_{}; + // The signal server is reached over a lossy path that routinely drops for the + // few seconds a reconnect takes, so the main window holds its "connected" + // indication through a brief blip instead of flickering offline. + std::chrono::steady_clock::time_point signal_lost_at_{}; + bool signal_lost_at_valid_ = false; #if defined(__linux__) && !defined(__APPLE__) bool use_xwayland_gui_ = false; bool use_x11_custom_titlebar_ = false; diff --git a/deps/submodules/minirtc b/deps/submodules/minirtc index c44807de..23b5b02c 160000 --- a/deps/submodules/minirtc +++ b/deps/submodules/minirtc @@ -1 +1 @@ -Subproject commit c44807de578d3ec7f21b264ef9c8937ff34f4329 +Subproject commit 23b5b02cc8ae0f6345841295bbeaecf51d12e792