[feat] add server window

This commit is contained in:
dijunkun
2026-01-19 00:47:34 +08:00
parent 669fac7f50
commit d6d8ecd6c5
4 changed files with 129 additions and 0 deletions

View File

@@ -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();

View File

@@ -181,6 +181,7 @@ class Render {
void UpdateInteractions();
void HandleRecentConnections();
void HandleStreamWindow();
void HandleServerWindow();
void Cleanup();
void CleanupFactories();
void CleanupPeer(std::shared_ptr<SubStreamWindowProperties> 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<SubStreamWindowProperties>& 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;

View File

@@ -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;

View File

@@ -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