[feat] support multiple web clients connecting simultaneously

This commit is contained in:
dijunkun
2025-11-10 16:54:56 +08:00
parent 78eb069cc8
commit 017af3eea4
3 changed files with 39 additions and 25 deletions

View File

@@ -49,10 +49,10 @@ class Render {
bool connection_established_ = false; bool connection_established_ = false;
bool rejoin_ = false; bool rejoin_ = false;
bool net_traffic_stats_button_pressed_ = 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 mouse_controller_is_started_ = false;
bool audio_capture_button_pressed_ = true; bool audio_capture_button_pressed_ = true;
bool control_mouse_ = false; bool control_mouse_ = true;
bool streaming_ = false; bool streaming_ = false;
bool is_control_bar_in_left_ = true; bool is_control_bar_in_left_ = true;
bool control_bar_hovered_ = false; bool control_bar_hovered_ = false;
@@ -313,7 +313,7 @@ class Render {
bool screen_capturer_is_started_ = false; bool screen_capturer_is_started_ = false;
bool start_speaker_capturer_ = false; bool start_speaker_capturer_ = false;
bool speaker_capturer_is_started_ = false; bool speaker_capturer_is_started_ = false;
bool start_keyboard_capturer_ = false; bool start_keyboard_capturer_ = true;
bool keyboard_capturer_is_started_ = false; bool keyboard_capturer_is_started_ = false;
bool foucs_on_main_window_ = false; bool foucs_on_main_window_ = false;
bool foucs_on_stream_window_ = false; bool foucs_on_stream_window_ = false;
@@ -472,6 +472,9 @@ class Render {
client_properties_; client_properties_;
void CloseTab(decltype(client_properties_)::iterator& it); void CloseTab(decltype(client_properties_)::iterator& it);
/* ------ stream window property end ------ */ /* ------ stream window property end ------ */
/* ------ server mode ------ */
std::unordered_map<std::string, ConnectionStatus> connection_status_;
}; };
} // namespace crossdesk } // namespace crossdesk
#endif #endif

View File

@@ -403,7 +403,7 @@ void Render::OnConnectionStatusCb(ConnectionStatus status, const char* user_id,
props->connection_status_ = status; props->connection_status_ = status;
switch (status) { switch (status) {
case ConnectionStatus::Connected: case ConnectionStatus::Connected: {
if (!render->need_to_create_stream_window_ && if (!render->need_to_create_stream_window_ &&
!render->client_properties_.empty()) { !render->client_properties_.empty()) {
render->need_to_create_stream_window_ = true; 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_width_,
(int)(render->stream_window_height_ - render->title_bar_height_)}; (int)(render->stream_window_height_ - render->title_bar_height_)};
break; break;
}
case ConnectionStatus::Disconnected: case ConnectionStatus::Disconnected:
case ConnectionStatus::Failed: case ConnectionStatus::Failed:
case ConnectionStatus::Closed: 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;
props->connection_established_ = false; props->connection_established_ = false;
props->mouse_control_button_pressed_ = false; props->mouse_control_button_pressed_ = false;
if (props->dst_buffer_) { if (props->dst_buffer_) {
@@ -431,8 +426,10 @@ void Render::OnConnectionStatusCb(ConnectionStatus status, const char* user_id,
props->texture_width_); props->texture_width_);
} }
render->CleanSubStreamWindowProperties(props); render->CleanSubStreamWindowProperties(props);
break; break;
case ConnectionStatus::IncorrectPassword: }
case ConnectionStatus::IncorrectPassword: {
render->password_validating_ = false; render->password_validating_ = false;
render->password_validating_time_++; render->password_validating_time_++;
if (render->connect_button_pressed_) { if (render->connect_button_pressed_) {
@@ -442,39 +439,53 @@ void Render::OnConnectionStatusCb(ConnectionStatus status, const char* user_id,
localization::connect[render->localization_language_index_]; localization::connect[render->localization_language_index_];
} }
break; break;
case ConnectionStatus::NoSuchTransmissionId: }
case ConnectionStatus::NoSuchTransmissionId: {
if (render->connect_button_pressed_) { if (render->connect_button_pressed_) {
props->connection_established_ = false; props->connection_established_ = false;
render->connect_button_label_ = render->connect_button_label_ =
localization::connect[render->localization_language_index_]; localization::connect[render->localization_language_index_];
} }
break; break;
}
default: default:
break; break;
} }
} else { } else {
render->is_client_mode_ = false; render->is_client_mode_ = false;
render->show_connection_status_window_ = true; render->show_connection_status_window_ = true;
render->connection_status_[remote_id] = status;
switch (status) { switch (status) {
case ConnectionStatus::Connected: case ConnectionStatus::Connected: {
render->need_to_send_host_info_ = true; render->need_to_send_host_info_ = true;
render->start_screen_capturer_ = true; render->start_screen_capturer_ = true;
render->start_speaker_capturer_ = true; render->start_speaker_capturer_ = true;
render->start_mouse_controller_ = true; render->start_mouse_controller_ = true;
break; break;
case ConnectionStatus::Closed: }
render->start_screen_capturer_ = false; case ConnectionStatus::Closed: {
render->start_speaker_capturer_ = false; if (std::all_of(render->connection_status_.begin(),
render->start_mouse_controller_ = false; render->connection_status_.end(), [](const auto& kv) {
render->start_keyboard_capturer_ = false; return kv.second == ConnectionStatus::Closed ||
render->need_to_send_host_info_ = false; kv.second == ConnectionStatus::Failed ||
if (props) props->connection_established_ = false; kv.second == ConnectionStatus::Disconnected;
if (render->audio_capture_) { })) {
render->StopSpeakerCapturer(); render->start_screen_capturer_ = false;
render->audio_capture_ = 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; break;
}
default: default:
break; break;
} }