From d6d8ecd6c55f70defec93e1cf86ce18fcd8250aa Mon Sep 17 00:00:00 2001 From: dijunkun Date: Mon, 19 Jan 2026 00:47:34 +0800 Subject: [PATCH] [feat] add server window --- src/gui/render.cpp | 78 +++++++++++++++++++++++++++++++ src/gui/render.h | 25 ++++++++++ src/gui/render_callback.cpp | 3 ++ src/gui/windows/server_window.cpp | 23 +++++++++ 4 files changed, 129 insertions(+) create mode 100644 src/gui/windows/server_window.cpp diff --git a/src/gui/render.cpp b/src/gui/render.cpp index 1aa6b46..ddb1dd8 100644 --- a/src/gui/render.cpp +++ b/src/gui/render.cpp @@ -939,6 +939,55 @@ int Render::DestroyStreamWindow() { return 0; } +int Render::CreateServerWindow() { + if (server_window_created_) { + return 0; + } + server_ctx_ = ImGui::CreateContext(); + if (!server_ctx_) { + LOG_ERROR("Server context is null"); + return -1; + } + ImGui::SetCurrentContext(server_ctx_); + if (!SDL_CreateWindowAndRenderer( + "Server window", (int)server_window_width_, + (int)server_window_height_, + SDL_WINDOW_HIGH_PIXEL_DENSITY | SDL_WINDOW_BORDERLESS, + &server_window_, &server_renderer_)) { + LOG_ERROR("Error creating server_window_ and server_renderer_: {}", + SDL_GetError()); + return -1; + } + SDL_SetWindowResizable(server_window_, true); + // for window region action + SDL_SetWindowHitTest(server_window_, HitTestCallback, this); + SetupFontAndStyle(false); + ImGui_ImplSDL3_InitForSDLRenderer(server_window_, server_renderer_); + ImGui_ImplSDLRenderer3_Init(server_renderer_); + server_window_created_ = true; + server_window_inited_ = true; + LOG_INFO("Server window inited"); + return 0; +} + +int Render::DestroyServerWindow() { + if (server_ctx_) { + ImGui::SetCurrentContext(server_ctx_); + } + + if (server_renderer_) { + SDL_DestroyRenderer(server_renderer_); + } + + if (server_window_) { + SDL_DestroyWindow(server_window_); + } + + server_window_created_ = false; + + return 0; +} + int Render::SetupFontAndStyle(bool main_window) { float font_size = 32.0f; @@ -1183,6 +1232,23 @@ int Render::DrawStreamWindow() { return 0; } +int Render::DrawServerWindow() { + if (!server_ctx_) { + LOG_ERROR("Server context is null"); + return -1; + } + ImGui::SetCurrentContext(server_ctx_); + ImGui_ImplSDLRenderer3_NewFrame(); + ImGui_ImplSDL3_NewFrame(); + ImGui::NewFrame(); + ServerWindow(); + ImGui::Render(); + SDL_RenderClear(server_renderer_); + ImGui_ImplSDLRenderer3_RenderDrawData(ImGui::GetDrawData(), server_renderer_); + SDL_RenderPresent(server_renderer_); + return 0; +} + int Render::Run() { latest_version_info_ = CheckUpdate(); if (!latest_version_info_.empty() && @@ -1357,12 +1423,17 @@ void Render::MainLoop() { UpdateLabels(); HandleRecentConnections(); HandleStreamWindow(); + HandleServerWindow(); DrawMainWindow(); if (stream_window_inited_) { DrawStreamWindow(); } + if (need_to_send_host_info_) { + DrawServerWindow(); + } + UpdateInteractions(); if (need_to_send_host_info_) { @@ -1454,6 +1525,13 @@ void Render::HandleStreamWindow() { } } +void Render::HandleServerWindow() { + if (need_to_create_server_window_) { + CreateServerWindow(); + need_to_create_server_window_ = false; + } +} + void Render::Cleanup() { Clipboard::StopMonitoring(); diff --git a/src/gui/render.h b/src/gui/render.h index 7f3a992..eebcd7a 100644 --- a/src/gui/render.h +++ b/src/gui/render.h @@ -181,6 +181,7 @@ class Render { void UpdateInteractions(); void HandleRecentConnections(); void HandleStreamWindow(); + void HandleServerWindow(); void Cleanup(); void CleanupFactories(); void CleanupPeer(std::shared_ptr props); @@ -202,6 +203,7 @@ class Render { int MainWindow(); int UpdateNotificationWindow(); int StreamWindow(); + int ServerWindow(); int LocalWindow(); int RemoteWindow(); int RecentConnectionsWindow(); @@ -226,11 +228,15 @@ class Render { int DestroyMainWindow(); int CreateStreamWindow(); int DestroyStreamWindow(); + int CreateServerWindow(); + int DestroyServerWindow(); int SetupFontAndStyle(bool main_window); int DestroyMainWindowContext(); int DestroyStreamWindowContext(); + int DestroyServerWindowContext(); int DrawMainWindow(); int DrawStreamWindow(); + int DrawServerWindow(); int ConfirmDeleteConnection(); int NetTrafficStats(std::shared_ptr& props); void DrawConnectionStatusText( @@ -487,6 +493,25 @@ class Render { float stream_window_dpi_scaling_w_ = 1.0f; float stream_window_dpi_scaling_h_ = 1.0f; + // server window render + SDL_Window* server_window_ = nullptr; + SDL_Renderer* server_renderer_ = nullptr; + ImGuiContext* server_ctx_ = nullptr; + + // server window properties + bool need_to_create_server_window_ = false; + bool server_window_created_ = false; + bool server_window_inited_ = false; + int server_window_width_default_ = 600; + int server_window_height_default_ = 400; + float server_window_width_ = 600; + float server_window_height_ = 400; + SDL_PixelFormat server_pixformat_ = SDL_PIXELFORMAT_NV12; + int server_window_width_real_ = 600; + int server_window_height_real_ = 400; + float server_window_dpi_scaling_w_ = 1.0f; + float server_window_dpi_scaling_h_ = 1.0f; + bool label_inited_ = false; bool connect_button_pressed_ = false; bool password_validating_ = false; diff --git a/src/gui/render_callback.cpp b/src/gui/render_callback.cpp index 5390509..0c33b02 100644 --- a/src/gui/render_callback.cpp +++ b/src/gui/render_callback.cpp @@ -622,6 +622,7 @@ void Render::OnConnectionStatusCb(ConnectionStatus status, const char* user_id, switch (status) { case ConnectionStatus::Connected: { + render->need_to_create_server_window_ = true; render->need_to_send_host_info_ = true; render->start_screen_capturer_ = true; render->start_speaker_capturer_ = true; @@ -647,6 +648,8 @@ void Render::OnConnectionStatusCb(ConnectionStatus status, const char* user_id, kv.second == ConnectionStatus::Failed || kv.second == ConnectionStatus::Disconnected; })) { + render->need_to_create_server_window_ = false; + render->need_to_send_host_info_ = false; render->start_screen_capturer_ = false; render->start_speaker_capturer_ = false; render->start_mouse_controller_ = false; diff --git a/src/gui/windows/server_window.cpp b/src/gui/windows/server_window.cpp new file mode 100644 index 0000000..4398097 --- /dev/null +++ b/src/gui/windows/server_window.cpp @@ -0,0 +1,23 @@ +#include "render.h" + +namespace crossdesk { +int Render::ServerWindow() { + ImGui::SetNextWindowSize( + ImVec2(main_window_width_ - 2 * main_child_window_x_padding_, + main_window_height_ - status_bar_height_ - + main_window_text_y_padding_ - main_child_window_y_padding_), + ImGuiCond_Always); + ImGui::SetNextWindowPos( + ImVec2(main_child_window_x_padding_, main_window_text_y_padding_), + ImGuiCond_Always); + ImGui::Begin("##server_window", nullptr, + ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | + ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoCollapse | + ImGuiWindowFlags_NoScrollbar | + ImGuiWindowFlags_NoScrollWithMouse); + // server window content goes here + ImGui::Text("Server Window Content"); + ImGui::End(); + return 0; +} +} // namespace crossdesk \ No newline at end of file