mirror of
https://github.com/kunkundi/crossdesk.git
synced 2026-10-24 13:48:51 +08:00
[fix] show truthful signaling recovery state and pin safe retries
This commit is contained in:
@@ -74,10 +74,6 @@ namespace {
|
|||||||
|
|
||||||
using namespace std::chrono_literals;
|
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<std::string> GenerateRandomPassword(std::string_view current) {
|
std::optional<std::string> GenerateRandomPassword(std::string_view current) {
|
||||||
constexpr std::string_view alphabet =
|
constexpr std::string_view alphabet =
|
||||||
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
|
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
|
||||||
@@ -1890,6 +1886,7 @@ void GuiApplication::Tick() {
|
|||||||
HandlePasswordChangeResult();
|
HandlePasswordChangeResult();
|
||||||
HandleCredentialRecovery();
|
HandleCredentialRecovery();
|
||||||
if (!peer_) {
|
if (!peer_) {
|
||||||
|
signal_connection_indicator_.Reset();
|
||||||
CreateConnectionPeer();
|
CreateConnectionPeer();
|
||||||
}
|
}
|
||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
@@ -2482,20 +2479,9 @@ void GuiApplication::SyncMainWindow() {
|
|||||||
ui_->main->set_password_change_pending(password_change_pending_);
|
ui_->main->set_password_change_pending(password_change_pending_);
|
||||||
}
|
}
|
||||||
const bool signal_online = signal_connected_.load();
|
const bool signal_online = signal_connected_.load();
|
||||||
if (signal_online) {
|
ui_->main->set_signal_connected(signal_online);
|
||||||
signal_lost_at_valid_ = false;
|
ui_->main->set_signal_reconnecting(
|
||||||
} else if (!signal_lost_at_valid_) {
|
signal_connection_indicator_.Update(signal_online));
|
||||||
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_ ==
|
ui_->main->set_signal_tls_error(signal_status_ ==
|
||||||
SignalStatus::SignalTlsCertError);
|
SignalStatus::SignalTlsCertError);
|
||||||
ui_->main->set_update_available(update_available_);
|
ui_->main->set_update_available(update_available_);
|
||||||
|
|||||||
@@ -14,6 +14,7 @@
|
|||||||
|
|
||||||
#include <remote_action.h>
|
#include <remote_action.h>
|
||||||
|
|
||||||
|
#include "application/signal_connection_indicator.h"
|
||||||
#include "runtime/cursor_state_provider.h"
|
#include "runtime/cursor_state_provider.h"
|
||||||
#include "runtime/gui_runtime.h"
|
#include "runtime/gui_runtime.h"
|
||||||
|
|
||||||
@@ -106,11 +107,7 @@ private:
|
|||||||
cursor_delivery_states_;
|
cursor_delivery_states_;
|
||||||
uint32_t cursor_state_sequence_ = 0;
|
uint32_t cursor_state_sequence_ = 0;
|
||||||
std::chrono::steady_clock::time_point next_video_frame_time_{};
|
std::chrono::steady_clock::time_point next_video_frame_time_{};
|
||||||
// The signal server is reached over a lossy path that routinely drops for the
|
SignalConnectionIndicator signal_connection_indicator_;
|
||||||
// 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__)
|
#if defined(__linux__) && !defined(__APPLE__)
|
||||||
bool use_xwayland_gui_ = false;
|
bool use_xwayland_gui_ = false;
|
||||||
bool use_x11_custom_titlebar_ = false;
|
bool use_x11_custom_titlebar_ = false;
|
||||||
|
|||||||
@@ -0,0 +1,38 @@
|
|||||||
|
#ifndef CROSSDESK_SIGNAL_CONNECTION_INDICATOR_H_
|
||||||
|
#define CROSSDESK_SIGNAL_CONNECTION_INDICATOR_H_
|
||||||
|
|
||||||
|
#include <chrono>
|
||||||
|
#include <optional>
|
||||||
|
|
||||||
|
namespace crossdesk {
|
||||||
|
|
||||||
|
// Presentation state only. The actual connected flag remains authoritative
|
||||||
|
// for actions and other UI consumers, including the announcement inbox.
|
||||||
|
class SignalConnectionIndicator {
|
||||||
|
public:
|
||||||
|
using Clock = std::chrono::steady_clock;
|
||||||
|
|
||||||
|
bool Update(bool connected, Clock::time_point now = Clock::now()) {
|
||||||
|
if (connected) {
|
||||||
|
disconnected_at_.reset();
|
||||||
|
} else if (was_connected_) {
|
||||||
|
disconnected_at_ = now;
|
||||||
|
}
|
||||||
|
was_connected_ = connected;
|
||||||
|
return disconnected_at_ &&
|
||||||
|
now - *disconnected_at_ < std::chrono::seconds(10);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Reset() {
|
||||||
|
was_connected_ = false;
|
||||||
|
disconnected_at_.reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool was_connected_ = false;
|
||||||
|
std::optional<Clock::time_point> disconnected_at_;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace crossdesk
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -259,6 +259,8 @@ struct TranslationRow {
|
|||||||
X(signal_disconnected, u8"未连接服务器", "Disconnected", \
|
X(signal_disconnected, u8"未连接服务器", "Disconnected", \
|
||||||
u8"Нет подключения к серверу") \
|
u8"Нет подключения к серверу") \
|
||||||
X(signal_reconnect, u8"重新连接", "Reconnect", u8"Переподключиться") \
|
X(signal_reconnect, u8"重新连接", "Reconnect", u8"Переподключиться") \
|
||||||
|
X(signal_reconnecting, u8"正在重新连接...", "Reconnecting...", \
|
||||||
|
u8"Переподключение...") \
|
||||||
X(signal_tls_cert_error, u8"证书验证失败,请重新安装自托管根证书", \
|
X(signal_tls_cert_error, u8"证书验证失败,请重新安装自托管根证书", \
|
||||||
"Certificate verification failed. Reinstall the self-hosted root " \
|
"Certificate verification failed. Reinstall the self-hosted root " \
|
||||||
"certificate.", \
|
"certificate.", \
|
||||||
|
|||||||
@@ -66,6 +66,7 @@ export global UiStrings {
|
|||||||
in-out property <string> signal-disconnected: "Signal server disconnected";
|
in-out property <string> signal-disconnected: "Signal server disconnected";
|
||||||
in-out property <string> tls-error: "Signal server TLS certificate error";
|
in-out property <string> tls-error: "Signal server TLS certificate error";
|
||||||
in-out property <string> signal-reconnect: "Reconnect";
|
in-out property <string> signal-reconnect: "Reconnect";
|
||||||
|
in-out property <string> signal-reconnecting: "Reconnecting...";
|
||||||
in-out property <string> update-available: "A new version is available";
|
in-out property <string> update-available: "A new version is available";
|
||||||
in-out property <string> new-version: "New version";
|
in-out property <string> new-version: "New version";
|
||||||
in-out property <string> check-for-updates: "Check for updates";
|
in-out property <string> check-for-updates: "Check for updates";
|
||||||
@@ -306,6 +307,7 @@ export component MainWindow inherits Window {
|
|||||||
in property <bool> password-visible: true;
|
in property <bool> password-visible: true;
|
||||||
in property <bool> password-change-pending: false;
|
in property <bool> password-change-pending: false;
|
||||||
in property <bool> signal-connected: false;
|
in property <bool> signal-connected: false;
|
||||||
|
in property <bool> signal-reconnecting: false;
|
||||||
in property <bool> signal-tls-error: false;
|
in property <bool> signal-tls-error: false;
|
||||||
in property <[RecentConnection]> recent-connections;
|
in property <[RecentConnection]> recent-connections;
|
||||||
in property <[AnnouncementItem]> announcements;
|
in property <[AnnouncementItem]> announcements;
|
||||||
@@ -1211,7 +1213,7 @@ export component MainWindow inherits Window {
|
|||||||
width: 8px;
|
width: 8px;
|
||||||
height: 8px;
|
height: 8px;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
background: root.signal-tls-error ? #f59e0b : #ef4444;
|
background: root.signal-tls-error || root.signal-reconnecting ? #f59e0b : #ef4444;
|
||||||
}
|
}
|
||||||
Text {
|
Text {
|
||||||
x: 28px;
|
x: 28px;
|
||||||
@@ -1219,6 +1221,7 @@ export component MainWindow inherits Window {
|
|||||||
height: 18px;
|
height: 18px;
|
||||||
text: root.signal-tls-error ? UiStrings.tls-error
|
text: root.signal-tls-error ? UiStrings.tls-error
|
||||||
: root.signal-connected ? UiStrings.signal-connected
|
: root.signal-connected ? UiStrings.signal-connected
|
||||||
|
: root.signal-reconnecting ? UiStrings.signal-reconnecting
|
||||||
: UiStrings.signal-disconnected;
|
: UiStrings.signal-disconnected;
|
||||||
color: #343941;
|
color: #343941;
|
||||||
font-size: ImGuiFontStyle.base;
|
font-size: ImGuiFontStyle.base;
|
||||||
|
|||||||
@@ -112,6 +112,8 @@ inline int ApplyMainWindowStrings(
|
|||||||
strings.set_tls_error(Text(localization::signal_tls_cert_error[language]));
|
strings.set_tls_error(Text(localization::signal_tls_cert_error[language]));
|
||||||
strings.set_signal_reconnect(
|
strings.set_signal_reconnect(
|
||||||
Text(localization::signal_reconnect[language]));
|
Text(localization::signal_reconnect[language]));
|
||||||
|
strings.set_signal_reconnecting(
|
||||||
|
Text(localization::signal_reconnecting[language]));
|
||||||
strings.set_update_available(
|
strings.set_update_available(
|
||||||
Text(localization::new_version_available[language]));
|
Text(localization::new_version_available[language]));
|
||||||
strings.set_new_version(Text(localization::new_version[language]));
|
strings.set_new_version(Text(localization::new_version[language]));
|
||||||
|
|||||||
Vendored
+1
-1
Submodule deps/submodules/minirtc updated: 23b5b02cc8...bd664c3356
Reference in New Issue
Block a user