From a94da8802f8f1ed40d2a6aa1825f263da29d335f Mon Sep 17 00:00:00 2001 From: dijunkun Date: Thu, 26 Feb 2026 18:06:07 +0800 Subject: [PATCH] [feat] make MainWindow and ServerWindow use rounded corners --- src/common/rounded_corner_button.cpp | 63 +++++++++++++++++++ src/common/rounded_corner_button.h | 20 ++++++ src/gui/panels/local_peer_panel.cpp | 4 +- src/gui/panels/recent_connections_panel.cpp | 4 +- src/gui/render.cpp | 35 +++++++---- src/gui/toolbars/status_bar.cpp | 13 ++-- src/gui/toolbars/title_bar.cpp | 22 +++++-- src/gui/windows/about_window.cpp | 2 +- src/gui/windows/connection_status_window.cpp | 2 +- src/gui/windows/main_settings_window.cpp | 2 +- src/gui/windows/main_window.cpp | 5 +- src/gui/windows/request_permission_window.mm | 2 +- src/gui/windows/server_settings_window.cpp | 2 +- src/gui/windows/server_window.cpp | 19 ++++-- .../windows/update_notification_window.cpp | 2 +- 15 files changed, 157 insertions(+), 40 deletions(-) create mode 100644 src/common/rounded_corner_button.cpp create mode 100644 src/common/rounded_corner_button.h diff --git a/src/common/rounded_corner_button.cpp b/src/common/rounded_corner_button.cpp new file mode 100644 index 0000000..4df7b4d --- /dev/null +++ b/src/common/rounded_corner_button.cpp @@ -0,0 +1,63 @@ +#include "rounded_corner_button.h" + +namespace crossdesk { +bool RoundedCornerButton(const char* label, const ImVec2& size, float rounding, + ImDrawFlags round_flags, bool enabled, + ImU32 normal_col, ImU32 hover_col, ImU32 active_col, + ImU32 border_col) { + ImGuiWindow* current_window = ImGui::GetCurrentWindow(); + if (current_window->SkipItems) return false; + + const ImGuiStyle& style = ImGui::GetStyle(); + + ImGuiID button_id = current_window->GetID(label); + ImVec2 cursor_pos = current_window->DC.CursorPos; + ImVec2 button_size = ImGui::CalcItemSize(size, 0.0f, 0.0f); + ImRect button_rect(cursor_pos, ImVec2(cursor_pos.x + button_size.x, + cursor_pos.y + button_size.y)); + ImGui::ItemSize(button_rect); + if (!ImGui::ItemAdd(button_rect, button_id)) return false; + + bool is_hovered = false, is_held = false; + bool is_pressed = false; + if (enabled) { + is_pressed = + ImGui::ButtonBehavior(button_rect, button_id, &is_hovered, &is_held); + } + + if (normal_col == 0) normal_col = ImGui::GetColorU32(ImGuiCol_Button); + if (hover_col == 0) hover_col = ImGui::GetColorU32(ImGuiCol_ButtonHovered); + if (active_col == 0) active_col = ImGui::GetColorU32(ImGuiCol_ButtonActive); + if (border_col == 0) border_col = ImGui::GetColorU32(ImGuiCol_Border); + + ImU32 fill_color = normal_col; + if (is_held && is_hovered) + fill_color = active_col; + else if (is_hovered) + fill_color = hover_col; + + if (!enabled) fill_color = IM_COL32(120, 120, 120, 180); + + ImDrawList* window_draw_list = ImGui::GetWindowDrawList(); + + window_draw_list->AddRectFilled(button_rect.Min, button_rect.Max, fill_color, + rounding, round_flags); + + if (style.FrameBorderSize > 0.0f) { + window_draw_list->AddRect(button_rect.Min, button_rect.Max, border_col, + rounding, round_flags, style.FrameBorderSize); + } + + ImU32 text_color = + ImGui::GetColorU32(enabled ? ImGuiCol_Text : ImGuiCol_TextDisabled); + + const char* label_end = ImGui::FindRenderedTextEnd(label); + ImGui::PushStyleColor(ImGuiCol_Text, + ImGui::ColorConvertU32ToFloat4(text_color)); + ImGui::RenderTextClipped(button_rect.Min, button_rect.Max, label, label_end, + nullptr, ImVec2(0.5f, 0.5f), &button_rect); + ImGui::PopStyleColor(); + + return is_pressed; +} +} // namespace crossdesk diff --git a/src/common/rounded_corner_button.h b/src/common/rounded_corner_button.h new file mode 100644 index 0000000..c11623c --- /dev/null +++ b/src/common/rounded_corner_button.h @@ -0,0 +1,20 @@ +/* + * @Author: DI JUNKUN + * @Date: 2026-02-26 + * Copyright (c) 2026 by DI JUNKUN, All Rights Reserved. + */ + +#ifndef _ROUNDED_CORNER_BUTTON_H_ +#define _ROUNDED_CORNER_BUTTON_H_ + +#include "imgui.h" +#include "imgui_internal.h" + +namespace crossdesk { +bool RoundedCornerButton(const char* label, const ImVec2& size, float rounding, + ImDrawFlags round_flags, bool enabled = true, + ImU32 normal_col = 0, ImU32 hover_col = 0, + ImU32 active_col = 0, ImU32 border_col = 0); +} // namespace crossdesk + +#endif \ No newline at end of file diff --git a/src/gui/panels/local_peer_panel.cpp b/src/gui/panels/local_peer_panel.cpp index 04a13e2..9c4ba73 100644 --- a/src/gui/panels/local_peer_panel.cpp +++ b/src/gui/panels/local_peer_panel.cpp @@ -101,7 +101,7 @@ int Render::LocalWindow() { ImGuiCol_WindowBg, ImVec4(1.0f, 1.0f, 1.0f, 1.0f - (float)time_duration)); ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0.0f); - ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 5.0f); + ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 6.0f); ImGui::Begin("ConnectionStatusWindow", nullptr, ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoSavedSettings); @@ -180,7 +180,7 @@ int Render::LocalWindow() { ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding, 3.0f); ImGui::PushStyleColor(ImGuiCol_WindowBg, ImVec4(1.0, 1.0, 1.0, 1.0)); ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 1.0f); - ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 5.0f); + ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 6.0f); ImGui::Begin("ResetPasswordWindow", nullptr, ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoMove | diff --git a/src/gui/panels/recent_connections_panel.cpp b/src/gui/panels/recent_connections_panel.cpp index 9881761..bdfc9e7 100644 --- a/src/gui/panels/recent_connections_panel.cpp +++ b/src/gui/panels/recent_connections_panel.cpp @@ -9,7 +9,7 @@ int Render::RecentConnectionsWindow() { ImGuiIO& io = ImGui::GetIO(); float recent_connection_window_width = io.DisplaySize.x; float recent_connection_window_height = - io.DisplaySize.y * (0.46f - STATUS_BAR_HEIGHT); + io.DisplaySize.y * (0.455f - STATUS_BAR_HEIGHT); ImGui::SetNextWindowPos(ImVec2(0, io.DisplaySize.y * 0.55f), ImGuiCond_Always); ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0.0f, 0.0f)); @@ -256,7 +256,7 @@ int Render::ConfirmDeleteConnection() { ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding, 3.0f); ImGui::PushStyleColor(ImGuiCol_WindowBg, ImVec4(1.0, 1.0, 1.0, 1.0)); ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 1.0f); - ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 5.0f); + ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 6.0f); ImGui::Begin("ConfirmDeleteConnectionWindow", nullptr, ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoMove | diff --git a/src/gui/render.cpp b/src/gui/render.cpp index ed3c1df..5d5b8a5 100644 --- a/src/gui/render.cpp +++ b/src/gui/render.cpp @@ -298,7 +298,7 @@ SDL_HitTestResult Render::HitTestCallback(SDL_Window* window, float mouse_grab_padding = render->title_bar_button_width_ * 0.16f; if (area->y < render->title_bar_button_width_ && area->y > mouse_grab_padding && - area->x < window_width - render->title_bar_button_width_ * 4.0f && + area->x < window_width - render->title_bar_button_width_ * 3.0f && area->x > mouse_grab_padding) { return SDL_HITTEST_DRAGGABLE; } @@ -914,9 +914,10 @@ int Render::CreateMainWindow() { ImGui::SetCurrentContext(main_ctx_); if (!SDL_CreateWindowAndRenderer( - "Remote Desk", (int)main_window_width_, (int)main_window_height_, + "CrossDesk Main Window", (int)main_window_width_, + (int)main_window_height_, SDL_WINDOW_HIGH_PIXEL_DENSITY | SDL_WINDOW_BORDERLESS | - SDL_WINDOW_HIDDEN, + SDL_WINDOW_HIDDEN | SDL_WINDOW_TRANSPARENT, &main_window_, &main_renderer_)) { LOG_ERROR("Error creating MainWindow and MainRenderer: {}", SDL_GetError()); return -1; @@ -946,6 +947,8 @@ int Render::CreateMainWindow() { // for window region action SDL_SetWindowHitTest(main_window_, HitTestCallback, this); + SDL_SetRenderDrawBlendMode(main_renderer_, SDL_BLENDMODE_BLEND); + SetupFontAndStyle(&main_windows_system_chinese_font_); ImGuiStyle& style = ImGui::GetStyle(); @@ -1002,9 +1005,10 @@ int Render::CreateStreamWindow() { ImGui::SetCurrentContext(stream_ctx_); if (!SDL_CreateWindowAndRenderer( - "Stream window", (int)stream_window_width_, + "CrossDesk Stream Window", (int)stream_window_width_, (int)stream_window_height_, - SDL_WINDOW_HIGH_PIXEL_DENSITY | SDL_WINDOW_BORDERLESS, + SDL_WINDOW_HIGH_PIXEL_DENSITY | SDL_WINDOW_BORDERLESS | + SDL_WINDOW_TRANSPARENT, &stream_window_, &stream_renderer_)) { LOG_ERROR("Error creating stream_window_ and stream_renderer_: {}", SDL_GetError()); @@ -1018,6 +1022,8 @@ int Render::CreateStreamWindow() { // for window region action SDL_SetWindowHitTest(stream_window_, HitTestCallback, this); + SDL_SetRenderDrawBlendMode(stream_renderer_, SDL_BLENDMODE_BLEND); + SetupFontAndStyle(&stream_windows_system_chinese_font_); ImGuiStyle& style = ImGui::GetStyle(); @@ -1073,12 +1079,12 @@ int Render::CreateServerWindow() { 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 | - SDL_WINDOW_TRANSPARENT, - &server_window_, &server_renderer_)) { + if (!SDL_CreateWindowAndRenderer( + "CrossDesk Server Window", (int)server_window_width_, + (int)server_window_height_, + SDL_WINDOW_HIGH_PIXEL_DENSITY | SDL_WINDOW_BORDERLESS | + SDL_WINDOW_TRANSPARENT, + &server_window_, &server_renderer_)) { LOG_ERROR("Error creating server_window_ and server_renderer_: {}", SDL_GetError()); return -1; @@ -1290,6 +1296,8 @@ int Render::DrawMainWindow() { ImGuiIO& io = ImGui::GetIO(); ImGui::PushStyleColor(ImGuiCol_WindowBg, ImVec4(1.0f, 1.0f, 1.0f, 1.0f)); + ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 6.0f); + ImGui::SetNextWindowPos(ImVec2(0, 0), ImGuiCond_Always); ImGui::SetNextWindowSize(ImVec2(io.DisplaySize.x, io.DisplaySize.y), ImGuiCond_Always); @@ -1298,6 +1306,7 @@ int Render::DrawMainWindow() { ImGuiWindowFlags_NoBringToFrontOnFocus | ImGuiWindowFlags_NoDocking); ImGui::PopStyleColor(); + ImGui::PopStyleVar(); TitleBar(true); @@ -1318,6 +1327,7 @@ int Render::DrawMainWindow() { ImGui::Render(); SDL_SetRenderScale(main_renderer_, io.DisplayFramebufferScale.x, io.DisplayFramebufferScale.y); + SDL_SetRenderDrawColor(main_renderer_, 0, 0, 0, 0); SDL_RenderClear(main_renderer_); ImGui_ImplSDLRenderer3_RenderDrawData(ImGui::GetDrawData(), main_renderer_); SDL_RenderPresent(main_renderer_); @@ -1367,6 +1377,7 @@ int Render::DrawStreamWindow() { ImGui::Render(); SDL_SetRenderScale(stream_renderer_, io.DisplayFramebufferScale.x, io.DisplayFramebufferScale.y); + SDL_SetRenderDrawColor(stream_renderer_, 0, 0, 0, 255); SDL_RenderClear(stream_renderer_); // std::shared_lock lock(client_properties_mutex_); @@ -1406,7 +1417,7 @@ int Render::DrawServerWindow() { ImGui::Render(); SDL_SetRenderScale(server_renderer_, io.DisplayFramebufferScale.x, io.DisplayFramebufferScale.y); - SDL_SetRenderDrawColor(server_renderer_, 255, 255, 255, 255); + SDL_SetRenderDrawColor(server_renderer_, 0, 0, 0, 0); SDL_RenderClear(server_renderer_); ImGui_ImplSDLRenderer3_RenderDrawData(ImGui::GetDrawData(), server_renderer_); SDL_RenderPresent(server_renderer_); diff --git a/src/gui/toolbars/status_bar.cpp b/src/gui/toolbars/status_bar.cpp index ccbb636..997b1d4 100644 --- a/src/gui/toolbars/status_bar.cpp +++ b/src/gui/toolbars/status_bar.cpp @@ -9,15 +9,17 @@ int Render::StatusBar() { float status_bar_width = io.DisplaySize.x; float status_bar_height = io.DisplaySize.y * STATUS_BAR_HEIGHT; - ImGui::PushStyleColor(ImGuiCol_ChildBg, ImVec4(1.0f, 1.0f, 1.0f, 1.0f)); static bool a, b, c, d, e; ImGui::SetNextWindowPos(ImVec2(0, io.DisplaySize.y * (1 - STATUS_BAR_HEIGHT)), ImGuiCond_Always); - ImGui::BeginChild( - "StatusBar", ImVec2(status_bar_width, status_bar_height), - ImGuiChildFlags_Border, - ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoBringToFrontOnFocus); + ImGui::PushStyleColor(ImGuiCol_ChildBg, ImVec4(1.0f, 1.0f, 1.0f, 0.0f)); + ImGui::PushStyleColor(ImGuiCol_Border, ImVec4(1.0f, 1.0f, 1.0f, 0.0f)); + ImGui::BeginChild("StatusBar", ImVec2(status_bar_width, status_bar_height), + ImGuiChildFlags_Border, + ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoMove | + ImGuiWindowFlags_NoBringToFrontOnFocus); + ImGui::PopStyleColor(2); ImVec2 dot_pos = ImVec2(status_bar_width * 0.025f, io.DisplaySize.y * (1 - STATUS_BAR_HEIGHT * 0.5f)); @@ -40,7 +42,6 @@ int Render::StatusBar() { .c_str()); ImGui::SetWindowFontScale(1.0f); - ImGui::PopStyleColor(); ImGui::EndChild(); return 0; } diff --git a/src/gui/toolbars/title_bar.cpp b/src/gui/toolbars/title_bar.cpp index 46d793e..950766f 100644 --- a/src/gui/toolbars/title_bar.cpp +++ b/src/gui/toolbars/title_bar.cpp @@ -2,6 +2,7 @@ #include "localization.h" #include "rd_log.h" #include "render.h" +#include "rounded_corner_button.h" constexpr double kNewVersionIconBlinkIntervalSec = 2.0; constexpr double kNewVersionIconBlinkOnTimeSec = 1.0; @@ -23,7 +24,7 @@ int Render::TitleBar(bool main_window) { if (io.DisplaySize.x > 0.0f && io.DisplaySize.y > 0.0f) { title_bar_width = io.DisplaySize.x; title_bar_height = io.DisplaySize.y * TITLE_BAR_HEIGHT; - title_bar_height_padding = io.DisplaySize.y * (TITLE_BAR_HEIGHT + 0.01f); + title_bar_height_padding = io.DisplaySize.y * TITLE_BAR_HEIGHT; title_bar_button_width = io.DisplaySize.x * TITLE_BAR_BUTTON_WIDTH; title_bar_button_height = io.DisplaySize.y * TITLE_BAR_BUTTON_HEIGHT; @@ -45,7 +46,7 @@ int Render::TitleBar(bool main_window) { title_bar_button_height = title_bar_button_height_; } - ImGui::PushStyleColor(ImGuiCol_ChildBg, ImVec4(1.0f, 1.0f, 1.0f, 1.0f)); + ImGui::PushStyleColor(ImGuiCol_ChildBg, ImVec4(1.0f, 1.0f, 1.0f, 0.0f)); ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0, 0)); ImGui::SetNextWindowPos(ImVec2(0, 0), ImGuiCond_Always); ImGui::BeginChild(main_window ? "MainTitleBar" : "StreamTitleBar", @@ -285,8 +286,20 @@ int Render::TitleBar(bool main_window) { float xmark_pos_y = title_bar_button_height * 0.5f; float xmark_size = title_bar_button_width * 0.33f; std::string close_button = "##xmark"; // ICON_FA_XMARK; - if (ImGui::Button(close_button.c_str(), - ImVec2(title_bar_button_width, title_bar_button_height))) { + bool close_button_clicked = false; + if (main_window) { + close_button_clicked = RoundedCornerButton( + close_button.c_str(), + ImVec2(title_bar_button_width, title_bar_button_height), 8.5f, + ImDrawFlags_RoundCornersTopRight, true, IM_COL32(0, 0, 0, 0), + IM_COL32(250, 0, 0, 255), IM_COL32(255, 0, 0, 128)); + } else { + close_button_clicked = + ImGui::Button(close_button.c_str(), + ImVec2(title_bar_button_width, title_bar_button_height)); + } + + if (close_button_clicked) { #if _WIN32 if (enable_minimize_to_tray_) { tray_->MinimizeToTray(); @@ -299,6 +312,7 @@ int Render::TitleBar(bool main_window) { } #endif } + draw_list->AddLine(ImVec2(xmark_pos_x - xmark_size / 2 - 0.25f, xmark_pos_y - xmark_size / 2 + 0.75f), ImVec2(xmark_pos_x + xmark_size / 2 - 1.5f, diff --git a/src/gui/windows/about_window.cpp b/src/gui/windows/about_window.cpp index 5a4defd..b5f4b8f 100644 --- a/src/gui/windows/about_window.cpp +++ b/src/gui/windows/about_window.cpp @@ -77,7 +77,7 @@ int Render::AboutWindow() { ImGui::PushStyleColor(ImGuiCol_WindowBg, ImVec4(1.0f, 1.0f, 1.0f, 1.0f)); ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 1.0f); - ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 5.0f); + ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 6.0f); ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding, 3.0f); ImGui::SetWindowFontScale(0.5f); ImGui::Begin( diff --git a/src/gui/windows/connection_status_window.cpp b/src/gui/windows/connection_status_window.cpp index 66f55b1..a6876bb 100644 --- a/src/gui/windows/connection_status_window.cpp +++ b/src/gui/windows/connection_status_window.cpp @@ -18,7 +18,7 @@ bool Render::ConnectionStatusWindow( ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding, 3.0f); ImGui::PushStyleColor(ImGuiCol_WindowBg, ImVec4(1.0f, 1.0f, 1.0f, 1.0f)); ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 1.0f); - ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 5.0f); + ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 6.0f); ImGui::Begin("ConnectionStatusWindow", nullptr, ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoMove | diff --git a/src/gui/windows/main_settings_window.cpp b/src/gui/windows/main_settings_window.cpp index 42a3bfa..e7a6314 100644 --- a/src/gui/windows/main_settings_window.cpp +++ b/src/gui/windows/main_settings_window.cpp @@ -50,7 +50,7 @@ int Render::SettingWindow() { int settings_items_offset = 0; ImGui::PushStyleColor(ImGuiCol_WindowBg, ImVec4(1.0f, 1.0f, 1.0f, 1.0f)); - ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 5.0f); + ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 6.0f); ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding, 3.0f); ImGui::Begin(localization::settings[localization_language_index_].c_str(), diff --git a/src/gui/windows/main_window.cpp b/src/gui/windows/main_window.cpp index abbc012..6f4182a 100644 --- a/src/gui/windows/main_window.cpp +++ b/src/gui/windows/main_window.cpp @@ -14,7 +14,8 @@ int Render::MainWindow() { ImGui::SetNextWindowPos(ImVec2(0.0f, io.DisplaySize.y * (TITLE_BAR_HEIGHT)), ImGuiCond_Always); ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0.0f, 0.0f)); - ImGui::PushStyleColor(ImGuiCol_ChildBg, ImVec4(1.0f, 1.0f, 1.0f, 1.0f)); + ImGui::PushStyleColor(ImGuiCol_ChildBg, ImVec4(1.0f, 1.0f, 1.0f, 0.0f)); + ImGui::PushStyleColor(ImGuiCol_Border, ImVec4(1.0f, 1.0f, 1.0f, 0.0f)); ImGui::BeginChild( "DeskWindow", ImVec2(local_remote_window_width, local_remote_window_height), @@ -22,7 +23,7 @@ int Render::MainWindow() { ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoBringToFrontOnFocus); ImGui::PopStyleVar(); - ImGui::PopStyleColor(); + ImGui::PopStyleColor(2); LocalWindow(); diff --git a/src/gui/windows/request_permission_window.mm b/src/gui/windows/request_permission_window.mm index 3a207c3..8f69114 100644 --- a/src/gui/windows/request_permission_window.mm +++ b/src/gui/windows/request_permission_window.mm @@ -127,7 +127,7 @@ int Render::RequestPermissionWindow() { ImGui::PushStyleColor(ImGuiCol_WindowBg, ImVec4(1.0f, 1.0f, 1.0f, 1.0f)); ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 1.0f); - ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 5.0f); + ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 6.0f); ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding, 3.0f); ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0.0f, 0.0f)); diff --git a/src/gui/windows/server_settings_window.cpp b/src/gui/windows/server_settings_window.cpp index b3bd8c5..9e15803 100644 --- a/src/gui/windows/server_settings_window.cpp +++ b/src/gui/windows/server_settings_window.cpp @@ -51,7 +51,7 @@ int Render::SelfHostedServerWindow() { { ImGui::SetWindowFontScale(0.5f); ImGui::PushStyleColor(ImGuiCol_WindowBg, ImVec4(1.0f, 1.0f, 1.0f, 1.0f)); - ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 5.0f); + ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 6.0f); ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding, 3.0f); ImGui::Begin(localization::self_hosted_server_settings diff --git a/src/gui/windows/server_window.cpp b/src/gui/windows/server_window.cpp index e4183cd..d9042d6 100644 --- a/src/gui/windows/server_window.cpp +++ b/src/gui/windows/server_window.cpp @@ -8,6 +8,7 @@ #include "localization.h" #include "rd_log.h" #include "render.h" +#include "rounded_corner_button.h" namespace crossdesk { @@ -48,17 +49,19 @@ int Render::ServerWindow() { ImGui::SetNextWindowSize(ImVec2(server_window_width_, server_window_height_), ImGuiCond_Always); ImGui::SetNextWindowPos(ImVec2(0, 0), ImGuiCond_Always); - + ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 6.0f); ImGui::Begin("##server_window", nullptr, ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoScrollWithMouse); + ImGui::PopStyleVar(); server_window_title_bar_height_ = title_bar_height_; - ImGui::PushStyleColor(ImGuiCol_ChildBg, ImVec4(1.0f, 1.0f, 1.0f, 1.0f)); + ImGui::PushStyleColor(ImGuiCol_ChildBg, ImVec4(1.0f, 1.0f, 1.0f, 0.0f)); ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0, 0)); + ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 6.0f); ImGui::SetNextWindowPos(ImVec2(0, 0), ImGuiCond_Always); ImGui::BeginChild( "ServerTitleBar", @@ -83,9 +86,13 @@ int Render::ServerWindow() { const char* icon = server_window_collapsed_ ? ICON_FA_ANGLE_DOWN : ICON_FA_ANGLE_UP; std::string toggle_label = std::string(icon) + "##server_toggle"; - if (ImGui::Button(toggle_label.c_str(), - ImVec2(server_title_bar_button_width, - server_title_bar_button_height))) { + + bool toggle_clicked = RoundedCornerButton( + toggle_label.c_str(), + ImVec2(server_title_bar_button_width, server_title_bar_button_height), + 8.5f, ImDrawFlags_RoundCornersTopLeft, true, IM_COL32(0, 0, 0, 0), + IM_COL32(0, 0, 0, 25), IM_COL32(255, 255, 255, 255)); + if (toggle_clicked) { if (server_window_) { int w = 0; int h = 0; @@ -114,7 +121,7 @@ int Render::ServerWindow() { } ImGui::EndChild(); - ImGui::PopStyleVar(); + ImGui::PopStyleVar(2); ImGui::PopStyleColor(); RemoteClientInfoWindow(); diff --git a/src/gui/windows/update_notification_window.cpp b/src/gui/windows/update_notification_window.cpp index 538bfa0..535e7b9 100644 --- a/src/gui/windows/update_notification_window.cpp +++ b/src/gui/windows/update_notification_window.cpp @@ -77,7 +77,7 @@ int Render::UpdateNotificationWindow() { ImGui::PushStyleColor(ImGuiCol_WindowBg, ImVec4(1.0f, 1.0f, 1.0f, 1.0f)); ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 1.0f); - ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 5.0f); + ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 6.0f); ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding, 3.0f); ImGui::Begin( localization::notification[localization_language_index_].c_str(),