From 017af3eea4701cade7faaf4f0a04b4dd9f9c02b9 Mon Sep 17 00:00:00 2001 From: dijunkun Date: Mon, 10 Nov 2025 16:54:56 +0800 Subject: [PATCH] [feat] support multiple web clients connecting simultaneously --- src/gui/render.h | 9 ++++--- src/gui/render_callback.cpp | 53 ++++++++++++++++++++++--------------- submodules/minirtc | 2 +- 3 files changed, 39 insertions(+), 25 deletions(-) diff --git a/src/gui/render.h b/src/gui/render.h index 3cd68ca..977ee49 100644 --- a/src/gui/render.h +++ b/src/gui/render.h @@ -49,10 +49,10 @@ class Render { bool connection_established_ = false; bool rejoin_ = false; bool net_traffic_stats_button_pressed_ = false; - bool mouse_control_button_pressed_ = false; + bool mouse_control_button_pressed_ = true; bool mouse_controller_is_started_ = false; bool audio_capture_button_pressed_ = true; - bool control_mouse_ = false; + bool control_mouse_ = true; bool streaming_ = false; bool is_control_bar_in_left_ = true; bool control_bar_hovered_ = false; @@ -313,7 +313,7 @@ class Render { bool screen_capturer_is_started_ = false; bool start_speaker_capturer_ = false; bool speaker_capturer_is_started_ = false; - bool start_keyboard_capturer_ = false; + bool start_keyboard_capturer_ = true; bool keyboard_capturer_is_started_ = false; bool foucs_on_main_window_ = false; bool foucs_on_stream_window_ = false; @@ -472,6 +472,9 @@ class Render { client_properties_; void CloseTab(decltype(client_properties_)::iterator& it); /* ------ stream window property end ------ */ + + /* ------ server mode ------ */ + std::unordered_map connection_status_; }; } // namespace crossdesk #endif \ No newline at end of file diff --git a/src/gui/render_callback.cpp b/src/gui/render_callback.cpp index 70afac9..ff2032f 100644 --- a/src/gui/render_callback.cpp +++ b/src/gui/render_callback.cpp @@ -403,7 +403,7 @@ void Render::OnConnectionStatusCb(ConnectionStatus status, const char* user_id, props->connection_status_ = status; switch (status) { - case ConnectionStatus::Connected: + case ConnectionStatus::Connected: { if (!render->need_to_create_stream_window_ && !render->client_properties_.empty()) { render->need_to_create_stream_window_ = true; @@ -414,15 +414,10 @@ void Render::OnConnectionStatusCb(ConnectionStatus status, const char* user_id, (int)render->stream_window_width_, (int)(render->stream_window_height_ - render->title_bar_height_)}; break; + } case ConnectionStatus::Disconnected: case ConnectionStatus::Failed: - case ConnectionStatus::Closed: - render->password_validating_time_ = 0; - render->start_screen_capturer_ = false; - render->start_speaker_capturer_ = false; - render->start_mouse_controller_ = false; - render->start_keyboard_capturer_ = false; - render->control_mouse_ = false; + case ConnectionStatus::Closed: { props->connection_established_ = false; props->mouse_control_button_pressed_ = false; if (props->dst_buffer_) { @@ -431,8 +426,10 @@ void Render::OnConnectionStatusCb(ConnectionStatus status, const char* user_id, props->texture_width_); } render->CleanSubStreamWindowProperties(props); + break; - case ConnectionStatus::IncorrectPassword: + } + case ConnectionStatus::IncorrectPassword: { render->password_validating_ = false; render->password_validating_time_++; if (render->connect_button_pressed_) { @@ -442,39 +439,53 @@ void Render::OnConnectionStatusCb(ConnectionStatus status, const char* user_id, localization::connect[render->localization_language_index_]; } break; - case ConnectionStatus::NoSuchTransmissionId: + } + case ConnectionStatus::NoSuchTransmissionId: { if (render->connect_button_pressed_) { props->connection_established_ = false; render->connect_button_label_ = localization::connect[render->localization_language_index_]; } break; + } default: break; } } else { render->is_client_mode_ = false; render->show_connection_status_window_ = true; + render->connection_status_[remote_id] = status; switch (status) { - case ConnectionStatus::Connected: + case ConnectionStatus::Connected: { render->need_to_send_host_info_ = true; render->start_screen_capturer_ = true; render->start_speaker_capturer_ = true; render->start_mouse_controller_ = true; break; - case ConnectionStatus::Closed: - render->start_screen_capturer_ = false; - render->start_speaker_capturer_ = false; - render->start_mouse_controller_ = false; - render->start_keyboard_capturer_ = false; - render->need_to_send_host_info_ = false; - if (props) props->connection_established_ = false; - if (render->audio_capture_) { - render->StopSpeakerCapturer(); - render->audio_capture_ = false; + } + case ConnectionStatus::Closed: { + if (std::all_of(render->connection_status_.begin(), + render->connection_status_.end(), [](const auto& kv) { + return kv.second == ConnectionStatus::Closed || + kv.second == ConnectionStatus::Failed || + kv.second == ConnectionStatus::Disconnected; + })) { + render->start_screen_capturer_ = false; + render->start_speaker_capturer_ = false; + render->start_mouse_controller_ = false; + render->start_keyboard_capturer_ = false; + render->need_to_send_host_info_ = false; + if (props) props->connection_established_ = false; + if (render->audio_capture_) { + render->StopSpeakerCapturer(); + render->audio_capture_ = false; + } + + render->connection_status_.erase(remote_id); } break; + } default: break; } diff --git a/submodules/minirtc b/submodules/minirtc index ec3aa09..ac85966 160000 --- a/submodules/minirtc +++ b/submodules/minirtc @@ -1 +1 @@ -Subproject commit ec3aa094e7b2ea0c3bef1d2b94e500a19ee2f008 +Subproject commit ac85966241beaa948117997c01cd8927c3aecaf6