From e9fce5b8b8d092a68aa031f7fb78f380d4baf407 Mon Sep 17 00:00:00 2001 From: dijunkun Date: Mon, 26 Jan 2026 22:52:58 +0800 Subject: [PATCH] [feat] display remote controller hostname instead of remote id --- src/gui/render.h | 2 ++ src/gui/render_callback.cpp | 37 ++++++++++++++------ src/gui/windows/server_window.cpp | 57 ++++++++++++++++++++----------- 3 files changed, 65 insertions(+), 31 deletions(-) diff --git a/src/gui/render.h b/src/gui/render.h index e71a4f9..0b9c0fc 100644 --- a/src/gui/render.h +++ b/src/gui/render.h @@ -668,7 +668,9 @@ class Render { /* ------ server mode ------ */ std::unordered_map connection_status_; + std::unordered_map connection_host_names_; std::string selected_server_remote_id_ = ""; + std::string selected_server_remote_hostname_ = ""; FileTransferState file_transfer_; }; } // namespace crossdesk diff --git a/src/gui/render_callback.cpp b/src/gui/render_callback.cpp index 08ea64f..5dc0350 100644 --- a/src/gui/render_callback.cpp +++ b/src/gui/render_callback.cpp @@ -495,24 +495,39 @@ void Render::OnReceiveDataBufferCb(const char* data, size_t size, std::string remote_id(user_id, user_id_size); // std::shared_lock lock(render->client_properties_mutex_); - if (render->client_properties_.find(remote_id) != - render->client_properties_.end()) { - // local - auto props = render->client_properties_.find(remote_id)->second; - if (remote_action.type == ControlType::host_infomation && - props->remote_host_name_.empty()) { - props->remote_host_name_ = std::string(remote_action.i.host_name, - remote_action.i.host_name_size); - LOG_INFO("Remote hostname: [{}]", props->remote_host_name_); + if (remote_action.type == ControlType::host_infomation) { + if (render->client_properties_.find(remote_id) != + render->client_properties_.end()) { + // client mode + auto props = render->client_properties_.find(remote_id)->second; + if (props && props->remote_host_name_.empty()) { + props->remote_host_name_ = std::string(remote_action.i.host_name, + remote_action.i.host_name_size); + LOG_INFO("Remote hostname: [{}]", props->remote_host_name_); + + for (int i = 0; i < remote_action.i.display_num; i++) { + props->display_info_list_.push_back( + DisplayInfo(remote_action.i.display_list[i], + remote_action.i.left[i], remote_action.i.top[i], + remote_action.i.right[i], remote_action.i.bottom[i])); + } + } + FreeRemoteAction(remote_action); + } else { + // server mode + render->connection_host_names_[remote_id] = std::string( + remote_action.i.host_name, remote_action.i.host_name_size); + LOG_INFO("Remote hostname: [{}]", + render->connection_host_names_[remote_id]); for (int i = 0; i < remote_action.i.display_num; i++) { - props->display_info_list_.push_back( + render->display_info_list_.push_back( DisplayInfo(remote_action.i.display_list[i], remote_action.i.left[i], remote_action.i.top[i], remote_action.i.right[i], remote_action.i.bottom[i])); } + FreeRemoteAction(remote_action); } - FreeRemoteAction(remote_action); } else { // remote if (remote_action.type == ControlType::mouse && render->mouse_controller_) { diff --git a/src/gui/windows/server_window.cpp b/src/gui/windows/server_window.cpp index c6c4e10..afa813d 100644 --- a/src/gui/windows/server_window.cpp +++ b/src/gui/windows/server_window.cpp @@ -106,44 +106,61 @@ int Render::RemoteClientInfoWindow() { float font_scale = localization_language_index_ == 0 ? 0.5f : 0.45f; - ImGui::SetWindowFontScale(localization_language_index_ == 0 ? 0.5f : 0.48f); - - std::vector remote_ids; - remote_ids.reserve(connection_status_.size()); - for (const auto& kv : connection_status_) { - remote_ids.push_back(kv.first); + std::vector remote_hostnames; + remote_hostnames.reserve(connection_host_names_.size()); + for (const auto& kv : connection_host_names_) { + remote_hostnames.push_back(kv.second); } - if (!selected_server_remote_id_.empty()) { - if (std::find(remote_ids.begin(), remote_ids.end(), - selected_server_remote_id_) == remote_ids.end()) { + auto find_remote_id_by_hostname = + [this](const std::string& hostname) -> std::string { + for (const auto& kv : connection_host_names_) { + if (kv.second == hostname) { + return kv.first; + } + } + return {}; + }; + + if (!selected_server_remote_hostname_.empty()) { + if (std::find(remote_hostnames.begin(), remote_hostnames.end(), + selected_server_remote_hostname_) == remote_hostnames.end()) { + selected_server_remote_hostname_.clear(); selected_server_remote_id_.clear(); } } - if (selected_server_remote_id_.empty() && !remote_ids.empty()) { - selected_server_remote_id_ = remote_ids.front(); + if (selected_server_remote_hostname_.empty() && !remote_hostnames.empty()) { + selected_server_remote_hostname_ = remote_hostnames.front(); + selected_server_remote_id_ = + find_remote_id_by_hostname(selected_server_remote_hostname_); } + ImGui::SetWindowFontScale(font_scale); ImGui::AlignTextToFramePadding(); ImGui::Text("%s", localization::controller[localization_language_index_].c_str()); ImGui::SameLine(); const char* selected_preview = "-"; - if (!selected_server_remote_id_.empty()) { - selected_preview = selected_server_remote_id_.c_str(); + if (!selected_server_remote_hostname_.empty()) { + selected_preview = selected_server_remote_hostname_.c_str(); } else if (!remote_client_id_.empty()) { selected_preview = remote_client_id_.c_str(); } ImGui::SetNextItemWidth(remote_client_info_window_width * - (localization_language_index_ == 0 ? 0.65f : 0.6f)); + (localization_language_index_ == 0 ? 0.68f : 0.62f)); + ImGui::SetWindowFontScale(localization_language_index_ == 0 ? 0.45f : 0.4f); + ImGui::AlignTextToFramePadding(); if (ImGui::BeginCombo("##server_remote_id", selected_preview)) { - ImGui::SetWindowFontScale(font_scale); - for (int i = 0; i < static_cast(remote_ids.size()); i++) { - const bool selected = (remote_ids[i] == selected_server_remote_id_); - if (ImGui::Selectable(remote_ids[i].c_str(), selected)) { - selected_server_remote_id_ = remote_ids[i]; + ImGui::SetWindowFontScale(localization_language_index_ == 0 ? 0.45f : 0.4f); + for (int i = 0; i < static_cast(remote_hostnames.size()); i++) { + const bool selected = + (remote_hostnames[i] == selected_server_remote_hostname_); + if (ImGui::Selectable(remote_hostnames[i].c_str(), selected)) { + selected_server_remote_hostname_ = remote_hostnames[i]; + selected_server_remote_id_ = + find_remote_id_by_hostname(selected_server_remote_hostname_); } if (selected) { ImGui::SetItemDefaultFocus(); @@ -167,7 +184,7 @@ int Render::RemoteClientInfoWindow() { localization::connection_status[localization_language_index_].c_str()); ImGui::SameLine(); - switch (connection_status_[selected_server_remote_id_]) { + switch (status) { case ConnectionStatus::Connected: ImGui::Text( "%s",