diff --git a/src/common/platform.cpp b/src/common/platform.cpp index 17bec97..5b67841 100644 --- a/src/common/platform.cpp +++ b/src/common/platform.cpp @@ -12,6 +12,9 @@ #include #include #elif __linux__ +#include +#include +#include #include #include #include diff --git a/src/gui/assets/layouts/layout.h b/src/gui/assets/layouts/layout.h index 55de48c..c9e8617 100644 --- a/src/gui/assets/layouts/layout.h +++ b/src/gui/assets/layouts/layout.h @@ -7,85 +7,87 @@ #ifndef _LAYOUT_STYLE_H_ #define _LAYOUT_STYLE_H_ -#define MENU_WINDOW_WIDTH_CN 300 -#define MENU_WINDOW_HEIGHT_CN 280 -#define LOCAL_WINDOW_WIDTH_CN 300 -#define LOCAL_WINDOW_HEIGHT_CN 280 -#define REMOTE_WINDOW_WIDTH_CN 300 -#define REMOTE_WINDOW_HEIGHT_CN 280 -#define MENU_WINDOW_WIDTH_EN 190 -#define MENU_WINDOW_HEIGHT_EN 245 -#define IPUT_WINDOW_WIDTH 160 -#define INPUT_WINDOW_PADDING_CN 66 -#define INPUT_WINDOW_PADDING_EN 96 -#define SETTINGS_WINDOW_WIDTH_CN 202 -#define SETTINGS_WINDOW_WIDTH_EN 248 +#include "render.h" + +#define MENU_WINDOW_WIDTH_CN 300 * dpi_scale_ +#define MENU_WINDOW_HEIGHT_CN 280 * dpi_scale_ +#define LOCAL_WINDOW_WIDTH_CN 300 * dpi_scale_ +#define LOCAL_WINDOW_HEIGHT_CN 280 * dpi_scale_ +#define REMOTE_WINDOW_WIDTH_CN 300 * dpi_scale_ +#define REMOTE_WINDOW_HEIGHT_CN 280 * dpi_scale_ +#define MENU_WINDOW_WIDTH_EN 190 * dpi_scale_ +#define MENU_WINDOW_HEIGHT_EN 245 * dpi_scale_ +#define IPUT_WINDOW_WIDTH 160 * dpi_scale_ +#define INPUT_WINDOW_PADDING_CN 66 * dpi_scale_ +#define INPUT_WINDOW_PADDING_EN 96 * dpi_scale_ +#define SETTINGS_WINDOW_WIDTH_CN 202 * dpi_scale_ +#define SETTINGS_WINDOW_WIDTH_EN 248 * dpi_scale_ #if USE_CUDA #if _WIN32 -#define SETTINGS_WINDOW_HEIGHT_CN 405 -#define SETTINGS_WINDOW_HEIGHT_EN 405 +#define SETTINGS_WINDOW_HEIGHT_CN 405 * dpi_scale_ +#define SETTINGS_WINDOW_HEIGHT_EN 405 * dpi_scale_ #else -#define SETTINGS_WINDOW_HEIGHT_CN 375 -#define SETTINGS_WINDOW_HEIGHT_EN 375 +#define SETTINGS_WINDOW_HEIGHT_CN 375 * dpi_scale_ +#define SETTINGS_WINDOW_HEIGHT_EN 375 * dpi_scale_ #endif #else #if _WIN32 -#define SETTINGS_WINDOW_HEIGHT_CN 375 -#define SETTINGS_WINDOW_HEIGHT_EN 375 +#define SETTINGS_WINDOW_HEIGHT_CN 375 * dpi_scale_ +#define SETTINGS_WINDOW_HEIGHT_EN 375 * dpi_scale_ #else -#define SETTINGS_WINDOW_HEIGHT_CN 345 -#define SETTINGS_WINDOW_HEIGHT_EN 345 +#define SETTINGS_WINDOW_HEIGHT_CN 345 * dpi_scale_ +#define SETTINGS_WINDOW_HEIGHT_EN 345 * dpi_scale_ #endif #endif -#define SELF_HOSTED_SERVER_CONFIG_WINDOW_WIDTH_CN 228 -#define SELF_HOSTED_SERVER_CONFIG_WINDOW_WIDTH_EN 275 -#define SELF_HOSTED_SERVER_CONFIG_WINDOW_HEIGHT_CN 195 -#define SELF_HOSTED_SERVER_CONFIG_WINDOW_HEIGHT_EN 195 -#define LANGUAGE_SELECT_WINDOW_PADDING_CN 120 -#define LANGUAGE_SELECT_WINDOW_PADDING_EN 167 -#define VIDEO_QUALITY_SELECT_WINDOW_PADDING_CN 120 -#define VIDEO_QUALITY_SELECT_WINDOW_PADDING_EN 167 -#define VIDEO_FRAME_RATE_SELECT_WINDOW_PADDING_CN 120 -#define VIDEO_FRAME_RATE_SELECT_WINDOW_PADDING_EN 167 -#define VIDEO_ENCODE_FORMAT_SELECT_WINDOW_PADDING_CN 120 -#define VIDEO_ENCODE_FORMAT_SELECT_WINDOW_PADDING_EN 167 -#define ENABLE_HARDWARE_VIDEO_CODEC_CHECKBOX_PADDING_CN 171 -#define ENABLE_HARDWARE_VIDEO_CODEC_CHECKBOX_PADDING_EN 218 -#define ENABLE_TURN_CHECKBOX_PADDING_CN 171 -#define ENABLE_TURN_CHECKBOX_PADDING_EN 218 -#define ENABLE_SRTP_CHECKBOX_PADDING_CN 171 -#define ENABLE_SRTP_CHECKBOX_PADDING_EN 218 -#define ENABLE_SELF_HOSTED_SERVER_CHECKBOX_PADDING_CN 171 -#define ENABLE_SELF_HOSTED_SERVER_CHECKBOX_PADDING_EN 218 -#define ENABLE_AUTOSTART_PADDING_CN 171 -#define ENABLE_AUTOSTART_PADDING_EN 218 -#define ENABLE_DAEMON_PADDING_CN 171 -#define ENABLE_DAEMON_PADDING_EN 218 -#define ENABLE_MINIZE_TO_TRAY_PADDING_CN 171 -#define ENABLE_MINIZE_TO_TRAY_PADDING_EN 218 -#define SELF_HOSTED_SERVER_HOST_INPUT_BOX_PADDING_CN 90 -#define SELF_HOSTED_SERVER_HOST_INPUT_BOX_PADDING_EN 137 -#define SELF_HOSTED_SERVER_PORT_INPUT_BOX_PADDING_CN 90 -#define SELF_HOSTED_SERVER_PORT_INPUT_BOX_PADDING_EN 137 -#define SETTINGS_SELECT_WINDOW_WIDTH 73 -#define SELF_HOSTED_SERVER_INPUT_WINDOW_WIDTH 130 -#define SETTINGS_OK_BUTTON_PADDING_CN 65 -#define SETTINGS_OK_BUTTON_PADDING_EN 83 -#define SELF_HOSTED_SERVER_CONFIG_OK_BUTTON_PADDING_CN 78 -#define SELF_HOSTED_SERVER_CONFIG_OK_BUTTON_PADDING_EN 91 -#define UPDATE_NOTIFICATION_OK_BUTTON_PADDING_CN 162 -#define UPDATE_NOTIFICATION_OK_BUTTON_PADDING_EN 146 +#define SELF_HOSTED_SERVER_CONFIG_WINDOW_WIDTH_CN 228 * dpi_scale_ +#define SELF_HOSTED_SERVER_CONFIG_WINDOW_WIDTH_EN 275 * dpi_scale_ +#define SELF_HOSTED_SERVER_CONFIG_WINDOW_HEIGHT_CN 195 * dpi_scale_ +#define SELF_HOSTED_SERVER_CONFIG_WINDOW_HEIGHT_EN 195 * dpi_scale_ +#define LANGUAGE_SELECT_WINDOW_PADDING_CN 120 * dpi_scale_ +#define LANGUAGE_SELECT_WINDOW_PADDING_EN 167 * dpi_scale_ +#define VIDEO_QUALITY_SELECT_WINDOW_PADDING_CN 120 * dpi_scale_ +#define VIDEO_QUALITY_SELECT_WINDOW_PADDING_EN 167 * dpi_scale_ +#define VIDEO_FRAME_RATE_SELECT_WINDOW_PADDING_CN 120 * dpi_scale_ +#define VIDEO_FRAME_RATE_SELECT_WINDOW_PADDING_EN 167 * dpi_scale_ +#define VIDEO_ENCODE_FORMAT_SELECT_WINDOW_PADDING_CN 120 * dpi_scale_ +#define VIDEO_ENCODE_FORMAT_SELECT_WINDOW_PADDING_EN 167 * dpi_scale_ +#define ENABLE_HARDWARE_VIDEO_CODEC_CHECKBOX_PADDING_CN 171 * dpi_scale_ +#define ENABLE_HARDWARE_VIDEO_CODEC_CHECKBOX_PADDING_EN 218 * dpi_scale_ +#define ENABLE_TURN_CHECKBOX_PADDING_CN 171 * dpi_scale_ +#define ENABLE_TURN_CHECKBOX_PADDING_EN 218 * dpi_scale_ +#define ENABLE_SRTP_CHECKBOX_PADDING_CN 171 * dpi_scale_ +#define ENABLE_SRTP_CHECKBOX_PADDING_EN 218 * dpi_scale_ +#define ENABLE_SELF_HOSTED_SERVER_CHECKBOX_PADDING_CN 171 * dpi_scale_ +#define ENABLE_SELF_HOSTED_SERVER_CHECKBOX_PADDING_EN 218 * dpi_scale_ +#define ENABLE_AUTOSTART_PADDING_CN 171 * dpi_scale_ +#define ENABLE_AUTOSTART_PADDING_EN 218 * dpi_scale_ +#define ENABLE_DAEMON_PADDING_CN 171 * dpi_scale_ +#define ENABLE_DAEMON_PADDING_EN 218 * dpi_scale_ +#define ENABLE_MINIZE_TO_TRAY_PADDING_CN 171 * dpi_scale_ +#define ENABLE_MINIZE_TO_TRAY_PADDING_EN 218 * dpi_scale_ +#define SELF_HOSTED_SERVER_HOST_INPUT_BOX_PADDING_CN 90 * dpi_scale_ +#define SELF_HOSTED_SERVER_HOST_INPUT_BOX_PADDING_EN 137 * dpi_scale_ +#define SELF_HOSTED_SERVER_PORT_INPUT_BOX_PADDING_CN 90 * dpi_scale_ +#define SELF_HOSTED_SERVER_PORT_INPUT_BOX_PADDING_EN 137 * dpi_scale_ +#define SETTINGS_SELECT_WINDOW_WIDTH 73 * dpi_scale_ +#define SELF_HOSTED_SERVER_INPUT_WINDOW_WIDTH 130 * dpi_scale_ +#define SETTINGS_OK_BUTTON_PADDING_CN 65 * dpi_scale_ +#define SETTINGS_OK_BUTTON_PADDING_EN 83 * dpi_scale_ +#define SELF_HOSTED_SERVER_CONFIG_OK_BUTTON_PADDING_CN 78 * dpi_scale_ +#define SELF_HOSTED_SERVER_CONFIG_OK_BUTTON_PADDING_EN 91 * dpi_scale_ +#define UPDATE_NOTIFICATION_OK_BUTTON_PADDING_CN 162 * dpi_scale_ +#define UPDATE_NOTIFICATION_OK_BUTTON_PADDING_EN 146 * dpi_scale_ #ifdef _WIN32 -#define UPDATE_NOTIFICATION_RESERVED_HEIGHT 130 +#define UPDATE_NOTIFICATION_RESERVED_HEIGHT 130 * dpi_scale_ #elif __APPLE__ -#define UPDATE_NOTIFICATION_RESERVED_HEIGHT 100 +#define UPDATE_NOTIFICATION_RESERVED_HEIGHT 100 * dpi_scale_ #else -#define UPDATE_NOTIFICATION_RESERVED_HEIGHT 100 +#define UPDATE_NOTIFICATION_RESERVED_HEIGHT 100 * dpi_scale_ #endif -#define REQUEST_PERMISSION_WINDOW_WIDTH_CN 130 -#define REQUEST_PERMISSION_WINDOW_HEIGHT_CN 125 -#define REQUEST_PERMISSION_WINDOW_WIDTH_EN 260 -#define REQUEST_PERMISSION_WINDOW_HEIGHT_EN 125 -#define REQUEST_PERMISSION_WINDOW_CHECKBOX_PADDING_CN 90 -#define REQUEST_PERMISSION_WINDOW_CHECKBOX_PADDING_EN 210 +#define REQUEST_PERMISSION_WINDOW_WIDTH_CN 130 * dpi_scale_ +#define REQUEST_PERMISSION_WINDOW_HEIGHT_CN 125 * dpi_scale_ +#define REQUEST_PERMISSION_WINDOW_WIDTH_EN 260 * dpi_scale_ +#define REQUEST_PERMISSION_WINDOW_HEIGHT_EN 125 * dpi_scale_ +#define REQUEST_PERMISSION_WINDOW_CHECKBOX_PADDING_CN 90 * dpi_scale_ +#define REQUEST_PERMISSION_WINDOW_CHECKBOX_PADDING_EN 210 * dpi_scale_ #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 6083c3a..6912bb9 100644 --- a/src/gui/panels/local_peer_panel.cpp +++ b/src/gui/panels/local_peer_panel.cpp @@ -76,7 +76,8 @@ int Render::LocalWindow() { ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4(0, 0, 0, 0)); ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4(0, 0, 0, 0)); ImGui::SetWindowFontScale(0.5f); - if (ImGui::Button(ICON_FA_COPY, ImVec2(22, 38))) { + if (ImGui::Button(ICON_FA_COPY, + ImVec2(22 * dpi_scale_, 38 * dpi_scale_))) { local_id_copied_ = true; ImGui::SetClipboardText(client_id_); copy_start_time_ = ImGui::GetTime(); @@ -156,23 +157,27 @@ int Render::LocalWindow() { ImGui::SetWindowFontScale(0.5f); auto l_x = ImGui::GetCursorScreenPos().x; auto l_y = ImGui::GetCursorScreenPos().y; - if (ImGui::Button(ICON_FA_EYE, ImVec2(22, 38))) { + if (ImGui::Button(ICON_FA_EYE, + ImVec2(22 * dpi_scale_, 38 * dpi_scale_))) { show_password_ = !show_password_; } if (!show_password_) { ImDrawList* draw_list = ImGui::GetWindowDrawList(); - draw_list->AddLine(ImVec2(l_x + 3.0f, l_y + 12.5f), - ImVec2(l_x + 20.3f, l_y + 26.5f), - IM_COL32(239, 240, 242, 255), 2.0f); - draw_list->AddLine(ImVec2(l_x + 3.0f, l_y + 11.0f), - ImVec2(l_x + 20.3f, l_y + 25.0f), - IM_COL32(0, 0, 0, 255), 1.5f); + draw_list->AddLine( + ImVec2(l_x + 3.0f * dpi_scale_, l_y + 12.5f * dpi_scale_), + ImVec2(l_x + 20.3f * dpi_scale_, l_y + 26.5f * dpi_scale_), + IM_COL32(239, 240, 242, 255), 2.0f); + draw_list->AddLine( + ImVec2(l_x + 3.0f * dpi_scale_, l_y + 11.0f * dpi_scale_), + ImVec2(l_x + 20.3f * dpi_scale_, l_y + 25.0f * dpi_scale_), + IM_COL32(0, 0, 0, 255), 1.5f); } ImGui::SameLine(); - if (ImGui::Button(ICON_FA_PEN, ImVec2(22, 38))) { + if (ImGui::Button(ICON_FA_PEN, + ImVec2(22 * dpi_scale_, 38 * dpi_scale_))) { show_reset_password_window_ = true; } ImGui::SetWindowFontScale(1.0f); diff --git a/src/gui/panels/recent_connections_panel.cpp b/src/gui/panels/recent_connections_panel.cpp index 09c8e6d..fb18d68 100644 --- a/src/gui/panels/recent_connections_panel.cpp +++ b/src/gui/panels/recent_connections_panel.cpp @@ -12,9 +12,9 @@ int Render::RecentConnectionsWindow() { ImGui::PushStyleColor(ImGuiCol_ChildBg, ImVec4(1.0f, 1.0f, 1.0f, 1.0f)); ImGui::BeginChild( "RecentConnectionsWindow", - ImVec2(main_window_width_default_, - main_window_height_default_ - title_bar_height_ - - local_window_height_ - status_bar_height_ + 1.0f), + ImVec2(main_window_width_, main_window_height_ - title_bar_height_ - + local_window_height_ - status_bar_height_ + + 1.0f), ImGuiChildFlags_Border, ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoTitleBar | @@ -41,14 +41,15 @@ int Render::ShowRecentConnections() { ImVec2 sub_window_pos = ImGui::GetCursorPos(); std::map sub_containers_pos; float recent_connection_sub_container_width = - recent_connection_image_width_ + 16.0f; + recent_connection_image_width_ + 16.0f * dpi_scale_; float recent_connection_sub_container_height = - recent_connection_image_height_ + 36.0f; + recent_connection_image_height_ + 36.0f * dpi_scale_; ImGui::PushStyleColor(ImGuiCol_ChildBg, ImVec4(239.0f / 255, 240.0f / 255, 242.0f / 255, 1.0f)); ImGui::PushStyleVar(ImGuiStyleVar_ChildRounding, 10.0f); ImGui::BeginChild("RecentConnectionsContainer", - ImVec2(main_window_width_default_ - 50.0f, 145.0f), + ImVec2(main_window_width_ * 0.95f, + recent_connection_sub_container_height * 1.1f), ImGuiChildFlags_Border, ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoTitleBar | @@ -60,8 +61,8 @@ int Render::ShowRecentConnections() { ImGui::PopStyleColor(); size_t recent_connections_count = recent_connections_.size(); int count = 0; - float button_width = 22; - float button_height = 22; + float button_width = 22 * dpi_scale_; + float button_height = 22 * dpi_scale_; for (auto& it : recent_connections_) { sub_containers_pos[it.first] = ImGui::GetCursorPos(); std::string recent_connection_sub_window_name = @@ -206,17 +207,20 @@ int Render::ShowRecentConnections() { if (count != recent_connections_count - 1) { ImVec2 line_start = - ImVec2(image_screen_pos.x + recent_connection_image_width_ + 20.0f, + ImVec2(image_screen_pos.x + recent_connection_image_width_ + + 20.0f * dpi_scale_, image_screen_pos.y); ImVec2 line_end = ImVec2( - image_screen_pos.x + recent_connection_image_width_ + 20.0f, + image_screen_pos.x + recent_connection_image_width_ + + 20.0f * dpi_scale_, image_screen_pos.y + recent_connection_image_height_ + button_height); ImGui::GetWindowDrawList()->AddLine(line_start, line_end, IM_COL32(0, 0, 0, 122), 1.0f); } count++; - ImGui::SameLine(0, count != recent_connections_count ? 26.0f : 0.0f); + ImGui::SameLine( + 0, count != recent_connections_count ? 26.0f * dpi_scale_ : 0.0f); } ImGui::EndChild(); diff --git a/src/gui/panels/remote_peer_panel.cpp b/src/gui/panels/remote_peer_panel.cpp index 962e1fc..a04dc63 100644 --- a/src/gui/panels/remote_peer_panel.cpp +++ b/src/gui/panels/remote_peer_panel.cpp @@ -75,7 +75,8 @@ int Render::RemoteWindow() { remote_id.erase(remove_if(remote_id.begin(), remote_id.end(), static_cast(&isspace)), remote_id.end()); - if (ImGui::Button(ICON_FA_ARROW_RIGHT_LONG, ImVec2(55, 38)) || + if (ImGui::Button(ICON_FA_ARROW_RIGHT_LONG, + ImVec2(55 * dpi_scale_, 38 * dpi_scale_)) || enter_pressed) { connect_button_pressed_ = true; bool found = false; @@ -181,6 +182,20 @@ int Render::ConnectTo(const std::string& remote_id, const char* password, memcpy(&props->params_, ¶ms_, sizeof(Params)); props->params_.user_id = props->local_id_.c_str(); props->peer_ = CreatePeer(&props->params_); + props->control_window_min_width_ = + props->control_window_min_width_ * dpi_scale_; + props->control_window_min_height_ = + props->control_window_min_height_ * dpi_scale_; + props->control_window_max_width_ = + props->control_window_max_width_ * dpi_scale_; + props->control_window_max_height_ = + props->control_window_max_height_ * dpi_scale_; + props->control_window_width_ = + props->control_window_width_ * dpi_scale_; + props->control_window_height_ = + props->control_window_height_ * dpi_scale_; + // props->control_bar_pos_x_ = props->control_bar_pos_x_ * dpi_scale_; + // props->control_bar_pos_y_ = props->control_bar_pos_y_ * dpi_scale_; if (!props->peer_) { LOG_INFO("Create peer [{}] instance failed", props->local_id_); diff --git a/src/gui/render.cpp b/src/gui/render.cpp index a138e27..7d4c299 100644 --- a/src/gui/render.cpp +++ b/src/gui/render.cpp @@ -133,9 +133,9 @@ SDL_HitTestResult Render::HitTestCallback(SDL_Window* window, int window_width, window_height; SDL_GetWindowSize(window, &window_width, &window_height); - if (area->y < 30 && area->y > MOUSE_GRAB_PADDING && - area->x < window_width - 120 && area->x > MOUSE_GRAB_PADDING && - !render->is_tab_bar_hovered_) { + if (area->y < 30 * render->dpi_scale_ && area->y > MOUSE_GRAB_PADDING && + area->x < window_width - 120 * render->dpi_scale_ && + area->x > MOUSE_GRAB_PADDING && !render->is_tab_bar_hovered_) { return SDL_HITTEST_DRAGGABLE; } @@ -605,6 +605,53 @@ void Render::UpdateInteractions() { } } +int Render::UpdateWindowSizeWithDpiScale(float dpi_scale) { + main_window_width_ = (int)(main_window_width_default_ * dpi_scale); + main_window_height_ = (int)(main_window_height_default_ * dpi_scale); + stream_window_width_ = (int)(stream_window_width_default_ * dpi_scale); + stream_window_height_ = (int)(stream_window_height_default_ * dpi_scale); + + local_window_width_ = (int)(local_window_width_ * dpi_scale); + local_window_height_ = (int)(local_window_height_ * dpi_scale); + remote_window_width_ = (int)(remote_window_width_ * dpi_scale); + remote_window_height_ = (int)(remote_window_height_ * dpi_scale); + local_child_window_width_ = (int)(local_child_window_width_ * dpi_scale); + local_child_window_height_ = (int)(local_child_window_height_ * dpi_scale); + remote_child_window_width_ = (int)(remote_child_window_width_ * dpi_scale); + remote_child_window_height_ = (int)(remote_child_window_height_ * dpi_scale); + main_window_text_y_padding_ = (int)(main_window_text_y_padding_ * dpi_scale); + main_child_window_x_padding_ = + (int)(main_child_window_x_padding_ * dpi_scale); + main_child_window_y_padding_ = + (int)(main_child_window_y_padding_ * dpi_scale); + title_bar_width_ = (int)(title_bar_width_ * dpi_scale); + title_bar_height_ = (int)(title_bar_height_ * dpi_scale); + status_bar_height_ = (int)(status_bar_height_ * dpi_scale); + connection_status_window_width_ = + (int)(connection_status_window_width_ * dpi_scale); + connection_status_window_height_ = + (int)(connection_status_window_height_ * dpi_scale); + notification_window_width_ = (int)(notification_window_width_ * dpi_scale); + notification_window_height_ = (int)(notification_window_height_ * dpi_scale); + about_window_width_ = (int)(about_window_width_ * dpi_scale); + about_window_height_ = (int)(about_window_height_ * dpi_scale); + update_notification_window_width_ = + (int)(update_notification_window_width_ * dpi_scale); + update_notification_window_height_ = + (int)(update_notification_window_height_ * dpi_scale); + + recent_connection_image_width_ = + (int)(recent_connection_image_width_ * dpi_scale); + recent_connection_image_height_ = + (int)(recent_connection_image_height_ * dpi_scale); + + if (thumbnail_) { + thumbnail_->SetThumbnailDpiScale(dpi_scale); + } + + return 0; +} + int Render::CreateMainWindow() { main_ctx_ = ImGui::CreateContext(); if (!main_ctx_) { @@ -614,9 +661,13 @@ int Render::CreateMainWindow() { ImGui::SetCurrentContext(main_ctx_); + dpi_scale_ = SDL_GetDisplayContentScale(SDL_GetPrimaryDisplay()); + LOG_INFO("System DPI scale before window creation: [{}]", dpi_scale_); + + UpdateWindowSizeWithDpiScale(dpi_scale_); + if (!SDL_CreateWindowAndRenderer( - "Remote Desk", (int)main_window_width_default_, - (int)main_window_height_default_, + "Remote Desk", (int)main_window_width_, (int)main_window_height_, SDL_WINDOW_HIGH_PIXEL_DENSITY | SDL_WINDOW_BORDERLESS | SDL_WINDOW_HIDDEN, &main_window_, &main_renderer_)) { @@ -630,6 +681,12 @@ int Render::CreateMainWindow() { // for window region action SDL_SetWindowHitTest(main_window_, HitTestCallback, this); + SetupFontAndStyle(); + + ImGuiStyle& style = ImGui::GetStyle(); + style.ScaleAllSizes(dpi_scale_); + style.FontScaleDpi = dpi_scale_; + #if _WIN32 SDL_PropertiesID props = SDL_GetWindowProperties(main_window_); HWND main_hwnd = (HWND)SDL_GetPointerProperty( @@ -641,6 +698,9 @@ int Render::CreateMainWindow() { localization_language_index_); #endif + ImGui_ImplSDL3_InitForSDLRenderer(main_window_, main_renderer_); + ImGui_ImplSDLRenderer3_Init(main_renderer_); + return 0; } @@ -674,8 +734,8 @@ int Render::CreateStreamWindow() { ImGui::SetCurrentContext(stream_ctx_); if (!SDL_CreateWindowAndRenderer( - "Stream window", (int)stream_window_width_default_, - (int)stream_window_height_default_, + "Stream window", (int)stream_window_width_, + (int)stream_window_height_, SDL_WINDOW_HIGH_PIXEL_DENSITY | SDL_WINDOW_BORDERLESS, &stream_window_, &stream_renderer_)) { LOG_ERROR("Error creating stream_window_ and stream_renderer_: {}", @@ -690,6 +750,13 @@ int Render::CreateStreamWindow() { // for window region action SDL_SetWindowHitTest(stream_window_, HitTestCallback, this); + SetupFontAndStyle(); + + SDL_SetRenderScale(stream_renderer_, dpi_scale_, dpi_scale_); + + ImGui_ImplSDL3_InitForSDLRenderer(stream_window_, stream_renderer_); + ImGui_ImplSDLRenderer3_Init(stream_renderer_); + // change props->stream_render_rect_ SDL_Event event; event.type = SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED; @@ -699,6 +766,9 @@ int Render::CreateStreamWindow() { stream_window_created_ = true; just_created_ = true; + stream_window_inited_ = true; + LOG_INFO("Stream window inited"); + return 0; } @@ -724,6 +794,8 @@ int Render::DestroyStreamWindow() { } int Render::SetupFontAndStyle() { + float font_size = 32.0f; + // Setup Dear ImGui style ImGuiIO& io = ImGui::GetIO(); @@ -733,7 +805,7 @@ int Render::SetupFontAndStyle() { ImFontConfig config; config.FontDataOwnedByAtlas = false; io.Fonts->AddFontFromMemoryTTF(OPPOSans_Regular_ttf, OPPOSans_Regular_ttf_len, - 32.0f, &config, + font_size, &config, io.Fonts->GetGlyphRangesChineseFull()); config.MergeMode = true; static const ImWchar icon_ranges[] = {ICON_MIN_FA, ICON_MAX_FA, 0}; @@ -769,8 +841,9 @@ int Render::SetupFontAndStyle() { std::ifstream font_file(font_paths[i], std::ios::binary); if (font_file.good()) { font_file.close(); - system_chinese_font_ = io.Fonts->AddFontFromFileTTF( - font_paths[i], 32.0f, &config, io.Fonts->GetGlyphRangesChineseFull()); + system_chinese_font_ = + io.Fonts->AddFontFromFileTTF(font_paths[i], font_size, &config, + io.Fonts->GetGlyphRangesChineseFull()); if (system_chinese_font_ != nullptr) { LOG_INFO("Loaded system Chinese font: {}", font_paths[i]); break; @@ -784,37 +857,11 @@ int Render::SetupFontAndStyle() { LOG_WARN("System Chinese font not found, using default font"); } - io.Fonts->Build(); ImGui::StyleColorsLight(); return 0; } -int Render::SetupMainWindow() { - if (!main_ctx_) { - LOG_ERROR("Main context is null"); - return -1; - } - - ImGui::SetCurrentContext(main_ctx_); - - SetupFontAndStyle(); - - SDL_GetWindowSizeInPixels(main_window_, &main_window_width_real_, - &main_window_height_real_); - main_window_dpi_scaling_w_ = main_window_width_real_ / main_window_width_; - main_window_dpi_scaling_h_ = main_window_width_real_ / main_window_width_; - SDL_SetRenderScale(main_renderer_, main_window_dpi_scaling_w_, - main_window_dpi_scaling_h_); - LOG_INFO("Use dpi scaling [{}x{}] for main window", - main_window_dpi_scaling_w_, main_window_dpi_scaling_h_); - - ImGui_ImplSDL3_InitForSDLRenderer(main_window_, main_renderer_); - ImGui_ImplSDLRenderer3_Init(main_renderer_); - - return 0; -} - int Render::DestroyMainWindowContext() { ImGui::SetCurrentContext(main_ctx_); ImGui_ImplSDLRenderer3_Shutdown(); @@ -824,42 +871,6 @@ int Render::DestroyMainWindowContext() { return 0; } -int Render::SetupStreamWindow() { - if (stream_window_inited_) { - return 0; - } - - if (!stream_ctx_) { - LOG_ERROR("Stream context is null"); - return -1; - } - - ImGui::SetCurrentContext(stream_ctx_); - - SetupFontAndStyle(); - - SDL_GetWindowSizeInPixels(stream_window_, &stream_window_width_real_, - &stream_window_height_real_); - - stream_window_dpi_scaling_w_ = - stream_window_width_real_ / stream_window_width_; - stream_window_dpi_scaling_h_ = - stream_window_width_real_ / stream_window_width_; - - SDL_SetRenderScale(stream_renderer_, stream_window_dpi_scaling_w_, - stream_window_dpi_scaling_h_); - LOG_INFO("Use dpi scaling [{}x{}] for stream window", - stream_window_dpi_scaling_w_, stream_window_dpi_scaling_h_); - - ImGui_ImplSDL3_InitForSDLRenderer(stream_window_, stream_renderer_); - ImGui_ImplSDLRenderer3_Init(stream_renderer_); - - stream_window_inited_ = true; - LOG_INFO("Stream window inited"); - - return 0; -} - int Render::DestroyStreamWindowContext() { stream_window_inited_ = false; ImGui::SetCurrentContext(stream_ctx_); @@ -883,9 +894,8 @@ int Render::DrawMainWindow() { ImGui::PushStyleColor(ImGuiCol_WindowBg, ImVec4(1.0f, 1.0f, 1.0f, 1.0f)); ImGui::SetNextWindowPos(ImVec2(0, 0), ImGuiCond_Always); - ImGui::SetNextWindowSize( - ImVec2(main_window_width_, main_window_height_default_), - ImGuiCond_Always); + ImGui::SetNextWindowSize(ImVec2(main_window_width_, main_window_height_), + ImGuiCond_Always); ImGui::Begin("MainRender", nullptr, ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoScrollbar | @@ -907,7 +917,11 @@ int Render::DrawMainWindow() { ImGui::End(); // Rendering + ImGuiIO& io = ImGui::GetIO(); + (void)io; ImGui::Render(); + SDL_SetRenderScale(main_renderer_, io.DisplayFramebufferScale.x, + io.DisplayFramebufferScale.y); SDL_RenderClear(main_renderer_); ImGui_ImplSDLRenderer3_RenderDrawData(ImGui::GetDrawData(), main_renderer_); SDL_RenderPresent(main_renderer_); @@ -929,7 +943,6 @@ int Render::DrawStreamWindow() { StreamWindow(); if (!fullscreen_button_pressed_) { - ImGui::PushStyleColor(ImGuiCol_WindowBg, ImVec4(1.0f, 1.0f, 1.0f, 1.0f)); ImGui::SetNextWindowPos(ImVec2(0, 0), ImGuiCond_Always); ImGui::SetNextWindowSize( ImVec2(stream_window_width_, @@ -940,14 +953,16 @@ int Render::DrawStreamWindow() { ImGuiWindowFlags_NoBringToFrontOnFocus | ImGuiWindowFlags_NoDocking); - ImGui::PopStyleColor(); - TitleBar(false); ImGui::End(); } // Rendering + ImGuiIO& io = ImGui::GetIO(); + (void)io; ImGui::Render(); + SDL_SetRenderScale(stream_renderer_, io.DisplayFramebufferScale.x, + io.DisplayFramebufferScale.y); SDL_RenderClear(stream_renderer_); // std::shared_lock lock(client_properties_mutex_); @@ -1081,7 +1096,6 @@ void Render::InitializeModules() { void Render::InitializeMainWindow() { CreateMainWindow(); - SetupMainWindow(); if (SDL_WINDOW_HIDDEN & SDL_GetWindowFlags(main_window_)) { SDL_ShowWindow(main_window_); } @@ -1192,7 +1206,6 @@ void Render::HandleRecentConnections() { void Render::HandleStreamWindow() { if (need_to_create_stream_window_) { CreateStreamWindow(); - SetupStreamWindow(); need_to_create_stream_window_ = false; } diff --git a/src/gui/render.h b/src/gui/render.h index 1e934a8..569a663 100644 --- a/src/gui/render.h +++ b/src/gui/render.h @@ -71,10 +71,10 @@ class Render { float sub_stream_window_height_ = 720; float control_window_min_width_ = 20; float control_window_max_width_ = 230; - float control_window_min_height_ = 40; - float control_window_max_height_ = 170; + float control_window_min_height_ = 35; + float control_window_max_height_ = 180; float control_window_width_ = 230; - float control_window_height_ = 40; + float control_window_height_ = 35; float control_bar_pos_x_ = 0; float control_bar_pos_y_ = 30; float mouse_diff_control_bar_pos_x_ = 0; @@ -175,14 +175,13 @@ class Render { private: int ConnectTo(const std::string& remote_id, const char* password, bool remember_password); + int UpdateWindowSizeWithDpiScale(float dpi_scale); int CreateMainWindow(); int DestroyMainWindow(); int CreateStreamWindow(); int DestroyStreamWindow(); int SetupFontAndStyle(); - int SetupMainWindow(); int DestroyMainWindowContext(); - int SetupStreamWindow(); int DestroyStreamWindowContext(); int DrawMainWindow(); int DrawStreamWindow(); @@ -342,6 +341,7 @@ class Render { int main_window_height_real_ = 540; float main_window_dpi_scaling_w_ = 1.0f; float main_window_dpi_scaling_h_ = 1.0f; + float dpi_scale_ = 1.0f; float main_window_width_default_ = 640; float main_window_height_default_ = 480; float main_window_width_ = 640; diff --git a/src/gui/render_callback.cpp b/src/gui/render_callback.cpp index 665568a..a416426 100644 --- a/src/gui/render_callback.cpp +++ b/src/gui/render_callback.cpp @@ -484,12 +484,12 @@ void Render::OnConnectionStatusCb(ConnectionStatus status, const char* user_id, render->need_to_send_host_info_ = true; render->start_screen_capturer_ = true; render->start_speaker_capturer_ = true; - // #ifdef CROSSDESK_DEBUG - // render->start_mouse_controller_ = false; - // render->start_keyboard_capturer_ = false; - // #else +#ifdef CROSSDESK_DEBUG + render->start_mouse_controller_ = false; + render->start_keyboard_capturer_ = false; +#else render->start_mouse_controller_ = true; - // #endif +#endif if (std::all_of(render->connection_status_.begin(), render->connection_status_.end(), [](const auto& kv) { return kv.first.find("web") != std::string::npos; diff --git a/src/gui/toolbars/control_bar.cpp b/src/gui/toolbars/control_bar.cpp index 4f47c76..03961ff 100644 --- a/src/gui/toolbars/control_bar.cpp +++ b/src/gui/toolbars/control_bar.cpp @@ -32,34 +32,41 @@ int LossRateDisplay(float loss_rate) { } int Render::ControlBar(std::shared_ptr& props) { - ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding, 3.0f); + ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding, 3.0f * dpi_scale_); if (props->control_bar_expand_) { - ImGui::SetCursorPosX(props->is_control_bar_in_left_ - ? (props->control_window_width_ + 5.0f) - : 38.0f); + float button_width = 25.0f * dpi_scale_; + float button_height = 25.0f * dpi_scale_; + + ImGui::SetCursorPosX( + props->is_control_bar_in_left_ + ? (props->control_window_width_ + 5.0f * dpi_scale_) + : 50.0f * dpi_scale_); // mouse control button ImDrawList* draw_list = ImGui::GetWindowDrawList(); if (props->is_control_bar_in_left_) { - draw_list->AddLine(ImVec2(ImGui::GetCursorScreenPos().x - 5.0f, - ImGui::GetCursorScreenPos().y - 7.0f), - ImVec2(ImGui::GetCursorScreenPos().x - 5.0f, - ImGui::GetCursorScreenPos().y - 7.0f + - props->control_window_height_), - IM_COL32(178, 178, 178, 255), 1.0f); + draw_list->AddLine( + ImVec2(ImGui::GetCursorScreenPos().x - 5.0f * dpi_scale_, + ImGui::GetCursorScreenPos().y - 7.0f * dpi_scale_), + ImVec2(ImGui::GetCursorScreenPos().x - 5.0f * dpi_scale_, + ImGui::GetCursorScreenPos().y - 7.0f * dpi_scale_ + + props->control_window_height_), + IM_COL32(178, 178, 178, 255), 1.0f); } std::string display = ICON_FA_DISPLAY; - if (ImGui::Button(display.c_str(), ImVec2(25, 25))) { + ImGui::SetWindowFontScale(0.9f); + if (ImGui::Button(display.c_str(), ImVec2(button_width, button_height))) { ImGui::OpenPopup("display"); } + ImGui::SetWindowFontScale(1.0f); ImVec2 btn_min = ImGui::GetItemRectMin(); ImVec2 btn_size_actual = ImGui::GetItemRectSize(); if (ImGui::BeginPopup("display")) { - ImGui::SetWindowFontScale(0.5f); + ImGui::SetWindowFontScale(0.8f); for (int i = 0; i < props->display_info_list_.size(); i++) { if (ImGui::Selectable(props->display_info_list_[i].name.c_str())) { props->selected_display_ = i; @@ -75,7 +82,6 @@ int Render::ControlBar(std::shared_ptr& props) { } props->display_selectable_hovered_ = ImGui::IsWindowHovered(); } - ImGui::SetWindowFontScale(1.0f); ImGui::EndPopup(); } @@ -96,7 +102,8 @@ int Render::ControlBar(std::shared_ptr& props) { std::string mouse = props->mouse_control_button_pressed_ ? ICON_FA_COMPUTER_MOUSE : ICON_FA_COMPUTER_MOUSE; - if (ImGui::Button(mouse.c_str(), ImVec2(25, 25))) { + ImGui::SetWindowFontScale(0.9f); + if (ImGui::Button(mouse.c_str(), ImVec2(button_width, button_height))) { if (props->connection_established_) { start_keyboard_capturer_ = !start_keyboard_capturer_; props->control_mouse_ = !props->control_mouse_; @@ -108,17 +115,20 @@ int Render::ControlBar(std::shared_ptr& props) { : localization::control_mouse[localization_language_index_]; } } + ImGui::SetWindowFontScale(1.0f); if (!props->mouse_control_button_pressed_) { + draw_list->AddLine(ImVec2(disable_mouse_x, disable_mouse_y), + ImVec2(disable_mouse_x + button_width * 0.75f, + disable_mouse_y + button_height * 0.75f), + IM_COL32(0, 0, 0, 255), 2.0f * dpi_scale_); draw_list->AddLine( - ImVec2(disable_mouse_x, disable_mouse_y), - ImVec2(disable_mouse_x + 16.0f, disable_mouse_y + 14.2f), - IM_COL32(0, 0, 0, 255), 2.0f); - draw_list->AddLine( - ImVec2(disable_mouse_x - 1.2f, disable_mouse_y + 1.2f), - ImVec2(disable_mouse_x + 15.3f, disable_mouse_y + 15.4f), + ImVec2(disable_mouse_x - 1.2f * dpi_scale_, + disable_mouse_y + 1.2f * dpi_scale_), + ImVec2(disable_mouse_x + button_width * 0.75f - 1.2f * dpi_scale_, + disable_mouse_y + button_height * 0.75f + 1.2f * dpi_scale_), ImGui::IsItemHovered() ? IM_COL32(66, 150, 250, 255) : IM_COL32(179, 213, 253, 255), - 2.0f); + 2.0f * dpi_scale_); } ImGui::SameLine(); @@ -131,7 +141,8 @@ int Render::ControlBar(std::shared_ptr& props) { std::string audio = props->audio_capture_button_pressed_ ? ICON_FA_VOLUME_HIGH : ICON_FA_VOLUME_HIGH; - if (ImGui::Button(audio.c_str(), ImVec2(25, 25))) { + ImGui::SetWindowFontScale(0.9f); + if (ImGui::Button(audio.c_str(), ImVec2(button_width, button_height))) { if (props->connection_established_) { props->audio_capture_button_pressed_ = !props->audio_capture_button_pressed_; @@ -148,17 +159,20 @@ int Render::ControlBar(std::shared_ptr& props) { props->data_label_.c_str()); } } + ImGui::SetWindowFontScale(1.0f); if (!props->audio_capture_button_pressed_) { + draw_list->AddLine(ImVec2(disable_audio_x, disable_audio_y), + ImVec2(disable_audio_x + button_width * 0.75f, + disable_audio_y + button_height * 0.75f), + IM_COL32(0, 0, 0, 255), 2.0f * dpi_scale_); draw_list->AddLine( - ImVec2(disable_audio_x, disable_audio_y), - ImVec2(disable_audio_x + 16.0f, disable_audio_y + 14.2f), - IM_COL32(0, 0, 0, 255), 2.0f); - draw_list->AddLine( - ImVec2(disable_audio_x - 1.2f, disable_audio_y + 1.2f), - ImVec2(disable_audio_x + 15.3f, disable_audio_y + 15.4f), + ImVec2(disable_audio_x - 1.2f * dpi_scale_, + disable_audio_y + 1.2f * dpi_scale_), + ImVec2(disable_audio_x + button_width * 0.75f - 1.2f * dpi_scale_, + disable_audio_y + button_height * 0.75f + 1.2f * dpi_scale_), ImGui::IsItemHovered() ? IM_COL32(66, 150, 250, 255) : IM_COL32(179, 213, 253, 255), - 2.0f); + 2.0f * dpi_scale_); } ImGui::SameLine(); @@ -170,7 +184,9 @@ int Render::ControlBar(std::shared_ptr& props) { button_color_style_pushed = true; } std::string net_traffic_stats = ICON_FA_SIGNAL; - if (ImGui::Button(net_traffic_stats.c_str(), ImVec2(25, 25))) { + ImGui::SetWindowFontScale(0.9f); + if (ImGui::Button(net_traffic_stats.c_str(), + ImVec2(button_width, button_height))) { props->net_traffic_stats_button_pressed_ = !props->net_traffic_stats_button_pressed_; props->control_window_height_is_changing_ = true; @@ -182,6 +198,7 @@ int Render::ControlBar(std::shared_ptr& props) { : localization::show_net_traffic_stats [localization_language_index_]; } + ImGui::SetWindowFontScale(1.0f); if (button_color_style_pushed) { ImGui::PopStyleColor(); button_color_style_pushed = false; @@ -191,7 +208,9 @@ int Render::ControlBar(std::shared_ptr& props) { // fullscreen button std::string fullscreen = fullscreen_button_pressed_ ? ICON_FA_COMPRESS : ICON_FA_EXPAND; - if (ImGui::Button(fullscreen.c_str(), ImVec2(25, 25))) { + ImGui::SetWindowFontScale(0.9f); + if (ImGui::Button(fullscreen.c_str(), + ImVec2(button_width, button_height))) { fullscreen_button_pressed_ = !fullscreen_button_pressed_; props->fullscreen_button_label_ = fullscreen_button_pressed_ @@ -205,13 +224,17 @@ int Render::ControlBar(std::shared_ptr& props) { } props->reset_control_bar_pos_ = true; } + ImGui::SetWindowFontScale(1.0f); ImGui::SameLine(); // close button std::string close_button = ICON_FA_XMARK; - if (ImGui::Button(close_button.c_str(), ImVec2(25, 25))) { + ImGui::SetWindowFontScale(0.9f); + if (ImGui::Button(close_button.c_str(), + ImVec2(button_width, button_height))) { CleanupPeer(props); } + ImGui::SetWindowFontScale(1.0f); ImGui::SameLine(); @@ -225,9 +248,10 @@ int Render::ControlBar(std::shared_ptr& props) { } } - ImGui::SetCursorPosX(props->is_control_bar_in_left_ - ? (props->control_window_width_ * 2 - 20.0f) - : 5.0f); + ImGui::SetCursorPosX( + props->is_control_bar_in_left_ + ? (props->control_window_width_ * 2 - 20.0f * dpi_scale_) + : 5.0f * dpi_scale_); std::string control_bar = props->control_bar_expand_ @@ -235,16 +259,19 @@ int Render::ControlBar(std::shared_ptr& props) { : ICON_FA_ANGLE_RIGHT) : (props->is_control_bar_in_left_ ? ICON_FA_ANGLE_RIGHT : ICON_FA_ANGLE_LEFT); - if (ImGui::Button(control_bar.c_str(), ImVec2(15, 25))) { + ImGui::SetWindowFontScale(0.9f); + if (ImGui::Button(control_bar.c_str(), + ImVec2(15.0f * dpi_scale_, 25.0f * dpi_scale_))) { props->control_bar_expand_ = !props->control_bar_expand_; props->control_bar_button_pressed_time_ = ImGui::GetTime(); props->control_window_width_is_changing_ = true; if (!props->control_bar_expand_) { - props->control_window_height_ = 40; + props->control_window_height_ = 35 * dpi_scale_; props->net_traffic_stats_button_pressed_ = false; } } + ImGui::SetWindowFontScale(1.0f); if (props->net_traffic_stats_button_pressed_ && props->control_bar_expand_) { NetTrafficStats(props); @@ -259,8 +286,7 @@ int Render::NetTrafficStats(std::shared_ptr& props) { ImGui::SetCursorPos(ImVec2(props->is_control_bar_in_left_ ? (props->control_window_width_ + 5.0f) : 5.0f, - 40.0f)); - + 35.0f * dpi_scale_)); if (ImGui::BeginTable("NetTrafficStats", 4, ImGuiTableFlags_BordersH, ImVec2(props->control_window_max_width_ - 10.0f, props->control_window_max_height_ - 60.0f))) { diff --git a/src/gui/toolbars/status_bar.cpp b/src/gui/toolbars/status_bar.cpp index 552a911..a761728 100644 --- a/src/gui/toolbars/status_bar.cpp +++ b/src/gui/toolbars/status_bar.cpp @@ -7,7 +7,7 @@ int Render::StatusBar() { ImGui::PushStyleColor(ImGuiCol_ChildBg, ImVec4(1.0f, 1.0f, 1.0f, 1.0f)); static bool a, b, c, d, e; ImGui::SetNextWindowPos( - ImVec2(0, main_window_height_default_ - status_bar_height_ - 1), + ImVec2(0, main_window_height_ - status_bar_height_ - 1), ImGuiCond_Always); ImGui::BeginChild( @@ -15,18 +15,20 @@ int Render::StatusBar() { ImGuiChildFlags_Border, ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoBringToFrontOnFocus); - ImVec2 dot_pos = - ImVec2(13, main_window_height_default_ - status_bar_height_ + 11.0f); + ImVec2 dot_pos = ImVec2(13.0f * dpi_scale_, + (main_window_height_ - status_bar_height_) * 1.025f); ImDrawList* draw_list = ImGui::GetWindowDrawList(); - draw_list->AddCircleFilled(dot_pos, 5.0f, + draw_list->AddCircleFilled(dot_pos, 5.0f * dpi_scale_, ImColor(signal_connected_ ? 0.0f : 1.0f, signal_connected_ ? 1.0f : 0.0f, 0.0f), 100); - draw_list->AddCircle(dot_pos, 6.0f, ImColor(1.0f, 1.0f, 1.0f), 100); + draw_list->AddCircle(dot_pos, 6.0f * dpi_scale_, ImColor(1.0f, 1.0f, 1.0f), + 100); ImGui::SetWindowFontScale(0.6f); draw_list->AddText( - ImVec2(25, main_window_height_default_ - status_bar_height_ + 3.0f), + ImVec2(25.0f * dpi_scale_, + (main_window_height_ - status_bar_height_) * 1.003f), ImColor(0.0f, 0.0f, 0.0f), signal_connected_ ? localization::signal_connected[localization_language_index_].c_str() diff --git a/src/gui/toolbars/title_bar.cpp b/src/gui/toolbars/title_bar.cpp index 9c28204..d394787 100644 --- a/src/gui/toolbars/title_bar.cpp +++ b/src/gui/toolbars/title_bar.cpp @@ -2,7 +2,7 @@ #include "rd_log.h" #include "render.h" -#define BUTTON_PADDING 36.0f +#define BUTTON_PADDING 36.0f * dpi_scale_ #define NEW_VERSION_ICON_RENDER_TIME_INTERVAL 2000 namespace crossdesk { @@ -11,7 +11,6 @@ int Render::TitleBar(bool main_window) { ImGui::PushStyleColor(ImGuiCol_MenuBarBg, ImVec4(1.0f, 1.0f, 1.0f, 0.0f)); ImGui::PushStyleColor(ImGuiCol_ChildBg, ImVec4(1.0f, 1.0f, 1.0f, 1.0f)); ImGui::SetNextWindowPos(ImVec2(0, 0), ImGuiCond_Always); - ImGui::SetWindowFontScale(0.8f); ImGui::BeginChild( main_window ? "MainTitleBar" : "StreamTitleBar", ImVec2(main_window ? main_window_width_ : stream_window_width_, @@ -19,23 +18,24 @@ int Render::TitleBar(bool main_window) { ImGuiChildFlags_Border, ImGuiWindowFlags_MenuBar | ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoBringToFrontOnFocus); - ImGui::SetWindowFontScale(1.0f); + ImGui::PopStyleColor(); ImDrawList* draw_list = ImGui::GetWindowDrawList(); if (ImGui::BeginMenuBar()) { + ImGui::SetWindowFontScale(0.8f); ImGui::SetCursorPosX( (main_window ? main_window_width_ : stream_window_width_) - - (BUTTON_PADDING * 3 - 3)); + (BUTTON_PADDING * 3 - 3.0f * dpi_scale_)); ImGui::PushStyleColor(ImGuiCol_HeaderHovered, ImVec4(0, 0, 0, 0.1f)); ImGui::PushStyleColor(ImGuiCol_HeaderActive, ImVec4(1.0f, 1.0f, 1.0f, 1.0f)); if (main_window) { - float bar_pos_x = ImGui::GetCursorPosX() + 6; - float bar_pos_y = ImGui::GetCursorPosY() + 15; + float bar_pos_x = ImGui::GetCursorPosX() + 6 * dpi_scale_; + float bar_pos_y = ImGui::GetCursorPosY() + 15 * dpi_scale_; std::string menu_button = " "; // ICON_FA_BARS; if (ImGui::BeginMenu(menu_button.c_str())) { - ImGui::SetWindowFontScale(0.5f); + ImGui::SetWindowFontScale(0.6f); if (ImGui::MenuItem( localization::settings[localization_language_index_].c_str())) { show_settings_window_ = true; @@ -77,7 +77,7 @@ int Render::TitleBar(bool main_window) { if (update_available_ && ImGui::IsItemHovered()) { ImGui::BeginTooltip(); - ImGui::SetWindowFontScale(0.5f); + ImGui::SetWindowFontScale(0.5f * dpi_scale_); std::string new_version_available_str = localization::new_version_available [localization_language_index_] + @@ -87,13 +87,12 @@ int Render::TitleBar(bool main_window) { ImGui::EndTooltip(); } - ImGui::SetWindowFontScale(1.0f); ImGui::EndMenu(); } else { show_new_version_icon_in_menu_ = true; } - float menu_bar_line_size = 15.0f; + float menu_bar_line_size = 15.0f * dpi_scale_; draw_list->AddLine(ImVec2(bar_pos_x, bar_pos_y - 6), ImVec2(bar_pos_x + menu_bar_line_size, bar_pos_y - 6), IM_COL32(0, 0, 0, 255)); @@ -136,6 +135,8 @@ int Render::TitleBar(bool main_window) { SelfHostedServerWindow(); AboutWindow(); } + } else { + ImGui::SetWindowFontScale(1.2f); } ImGui::PopStyleColor(2); @@ -148,15 +149,15 @@ int Render::TitleBar(bool main_window) { ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4(1.0f, 1.0f, 1.0f, 1.0f)); - float minimize_pos_x = ImGui::GetCursorPosX() + 12; - float minimize_pos_y = ImGui::GetCursorPosY() + 15; + float minimize_pos_x = ImGui::GetCursorPosX() + 12.0f * dpi_scale_; + float minimize_pos_y = ImGui::GetCursorPosY() + 15.0f * dpi_scale_; std::string window_minimize_button = "##minimize"; // ICON_FA_MINUS; if (ImGui::Button(window_minimize_button.c_str(), - ImVec2(BUTTON_PADDING, 30))) { + ImVec2(BUTTON_PADDING, 30.0f * dpi_scale_))) { SDL_MinimizeWindow(main_window ? main_window_ : stream_window_); } draw_list->AddLine(ImVec2(minimize_pos_x, minimize_pos_y), - ImVec2(minimize_pos_x + 12, minimize_pos_y), + ImVec2(minimize_pos_x + 12 * dpi_scale_, minimize_pos_y), IM_COL32(0, 0, 0, 255)); ImGui::PopStyleColor(2); @@ -167,33 +168,36 @@ int Render::TitleBar(bool main_window) { ImVec4(1.0f, 1.0f, 1.0f, 1.0f)); if (window_maximized_) { - float pos_x_top = ImGui::GetCursorPosX() + 11; - float pos_y_top = ImGui::GetCursorPosY() + 11; - float pos_x_bottom = ImGui::GetCursorPosX() + 13; - float pos_y_bottom = ImGui::GetCursorPosY() + 9; + float pos_x_top = ImGui::GetCursorPosX() + 11 * dpi_scale_; + float pos_y_top = ImGui::GetCursorPosY() + 11 * dpi_scale_; + float pos_x_bottom = ImGui::GetCursorPosX() + 13 * dpi_scale_; + float pos_y_bottom = ImGui::GetCursorPosY() + 9 * dpi_scale_; std::string window_restore_button = "##restore"; // ICON_FA_WINDOW_RESTORE; if (ImGui::Button(window_restore_button.c_str(), - ImVec2(BUTTON_PADDING, 30))) { + ImVec2(BUTTON_PADDING, 30.0f * dpi_scale_))) { SDL_RestoreWindow(stream_window_); window_maximized_ = false; } - draw_list->AddRect(ImVec2(pos_x_top, pos_y_top), - ImVec2(pos_x_top + 12, pos_y_top + 12), - IM_COL32(0, 0, 0, 255)); + draw_list->AddRect( + ImVec2(pos_x_top, pos_y_top), + ImVec2(pos_x_top + 12 * dpi_scale_, pos_y_top + 12 * dpi_scale_), + IM_COL32(0, 0, 0, 255)); draw_list->AddRect(ImVec2(pos_x_bottom, pos_y_bottom), - ImVec2(pos_x_bottom + 12, pos_y_bottom + 12), + ImVec2(pos_x_bottom + 12 * dpi_scale_, + pos_y_bottom + 12 * dpi_scale_), IM_COL32(0, 0, 0, 255)); - draw_list->AddRectFilled(ImVec2(pos_x_top + 1, pos_y_top + 1), - ImVec2(pos_x_top + 11, pos_y_top + 11), - IM_COL32(255, 255, 255, 255)); + draw_list->AddRectFilled( + ImVec2(pos_x_top + 1 * dpi_scale_, pos_y_top + 1 * dpi_scale_), + ImVec2(pos_x_top + 11 * dpi_scale_, pos_y_top + 11 * dpi_scale_), + IM_COL32(255, 255, 255, 255)); } else { - float maximize_pos_x = ImGui::GetCursorPosX() + 12; - float maximize_pos_y = ImGui::GetCursorPosY() + 10; + float maximize_pos_x = ImGui::GetCursorPosX() + 12 * dpi_scale_; + float maximize_pos_y = ImGui::GetCursorPosY() + 10 * dpi_scale_; std::string window_maximize_button = "##maximize"; // ICON_FA_SQUARE_FULL; if (ImGui::Button(window_maximize_button.c_str(), - ImVec2(BUTTON_PADDING, 30))) { + ImVec2(BUTTON_PADDING, 30.0f * dpi_scale_))) { SDL_MaximizeWindow(stream_window_); window_maximized_ = !window_maximized_; } @@ -210,11 +214,12 @@ int Render::TitleBar(bool main_window) { ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4(1.0f, 0, 0, 1.0f)); ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4(1.0f, 0, 0, 0.5f)); - float xmark_pos_x = ImGui::GetCursorPosX() + 18; - float xmark_pos_y = ImGui::GetCursorPosY() + 16; - float xmark_size = 12.0f; + float xmark_pos_x = ImGui::GetCursorPosX() + 18 * dpi_scale_; + float xmark_pos_y = ImGui::GetCursorPosY() + 16 * dpi_scale_; + float xmark_size = 12.0f * dpi_scale_; std::string close_button = "##xmark"; // ICON_FA_XMARK; - if (ImGui::Button(close_button.c_str(), ImVec2(BUTTON_PADDING, 30))) { + if (ImGui::Button(close_button.c_str(), + ImVec2(BUTTON_PADDING, 30.0f * dpi_scale_))) { #if _WIN32 if (enable_minimize_to_tray_) { tray_->MinimizeToTray(); diff --git a/src/gui/windows/control_window.cpp b/src/gui/windows/control_window.cpp index dc288ce..16198c8 100644 --- a/src/gui/windows/control_window.cpp +++ b/src/gui/windows/control_window.cpp @@ -202,7 +202,6 @@ int Render::ControlWindow(std::shared_ptr& props) { : props->control_window_pos_.x, props->control_window_pos_.y), ImGuiCond_Always); - ImGui::SetWindowFontScale(0.5f); std::string control_child_window_title = props->remote_id_ + "ControlChildWindow"; @@ -210,7 +209,6 @@ int Render::ControlWindow(std::shared_ptr& props) { control_child_window_title.c_str(), ImVec2(props->control_window_width_ * 2, props->control_window_height_), ImGuiChildFlags_Border, ImGuiWindowFlags_NoDecoration); - ImGui::SetWindowFontScale(1.0f); ImGui::PopStyleColor(); ControlBar(props); diff --git a/src/gui/windows/main_settings_window.cpp b/src/gui/windows/main_settings_window.cpp index 57c93fd..c6b00a6 100644 --- a/src/gui/windows/main_settings_window.cpp +++ b/src/gui/windows/main_settings_window.cpp @@ -38,10 +38,9 @@ int Render::SettingWindow() { // Settings { - static int settings_items_padding = 30; + static int settings_items_padding = 30 * dpi_scale_; int settings_items_offset = 0; - 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_FrameRounding, 3.0f); @@ -50,7 +49,6 @@ int Render::SettingWindow() { nullptr, ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoSavedSettings); - ImGui::SetWindowFontScale(1.0f); ImGui::SetWindowFontScale(0.5f); ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 1.0f); { @@ -59,7 +57,7 @@ int Render::SettingWindow() { localization::language_en[localization_language_index_].c_str()}; settings_items_offset += settings_items_padding; - ImGui::SetCursorPosY(settings_items_offset + 4); + ImGui::SetCursorPosY(settings_items_offset + 4 * dpi_scale_); ImGui::Text( "%s", localization::language[localization_language_index_].c_str()); if (ConfigCenter::LANGUAGE::CHINESE == localization_language_) { @@ -70,8 +68,17 @@ int Render::SettingWindow() { ImGui::SetCursorPosY(settings_items_offset); ImGui::SetNextItemWidth(SETTINGS_SELECT_WINDOW_WIDTH); - ImGui::Combo("##language", &language_button_value_, language_items, - IM_ARRAYSIZE(language_items)); + if (ImGui::BeginCombo("##language", + language_items[language_button_value_])) { + ImGui::SetWindowFontScale(0.5f); + for (int i = 0; i < IM_ARRAYSIZE(language_items); i++) { + bool selected = (i == language_button_value_); + if (ImGui::Selectable(language_items[i], selected)) + language_button_value_ = i; + } + + ImGui::EndCombo(); + } } ImGui::Separator(); @@ -90,7 +97,7 @@ int Render::SettingWindow() { .c_str()}; settings_items_offset += settings_items_padding; - ImGui::SetCursorPosY(settings_items_offset + 4); + ImGui::SetCursorPosY(settings_items_offset + 4 * dpi_scale_); ImGui::Text( "%s", localization::video_quality[localization_language_index_].c_str()); @@ -103,8 +110,18 @@ int Render::SettingWindow() { ImGui::SetCursorPosY(settings_items_offset); ImGui::SetNextItemWidth(SETTINGS_SELECT_WINDOW_WIDTH); - ImGui::Combo("##video_quality", &video_quality_button_value_, - video_quality_items, IM_ARRAYSIZE(video_quality_items)); + if (ImGui::BeginCombo( + "##video_quality", + video_quality_items[video_quality_button_value_])) { + ImGui::SetWindowFontScale(0.5f); + for (int i = 0; i < IM_ARRAYSIZE(video_quality_items); i++) { + bool selected = (i == video_quality_button_value_); + if (ImGui::Selectable(video_quality_items[i], selected)) + video_quality_button_value_ = i; + } + + ImGui::EndCombo(); + } } ImGui::Separator(); @@ -126,9 +143,18 @@ int Render::SettingWindow() { ImGui::SetCursorPosY(settings_items_offset); ImGui::SetNextItemWidth(SETTINGS_SELECT_WINDOW_WIDTH); - ImGui::Combo("##video_frame_rate", &video_frame_rate_button_value_, - video_frame_rate_items, - IM_ARRAYSIZE(video_frame_rate_items)); + if (ImGui::BeginCombo( + "##video_frame_rate", + video_frame_rate_items[video_frame_rate_button_value_])) { + ImGui::SetWindowFontScale(0.5f); + for (int i = 0; i < IM_ARRAYSIZE(video_frame_rate_items); i++) { + bool selected = (i == video_frame_rate_button_value_); + if (ImGui::Selectable(video_frame_rate_items[i], selected)) + video_frame_rate_button_value_ = i; + } + + ImGui::EndCombo(); + } } ImGui::Separator(); @@ -153,9 +179,18 @@ int Render::SettingWindow() { ImGui::SetCursorPosY(settings_items_offset); ImGui::SetNextItemWidth(SETTINGS_SELECT_WINDOW_WIDTH); - ImGui::Combo( - "##video_encode_format", &video_encode_format_button_value_, - video_encode_format_items, IM_ARRAYSIZE(video_encode_format_items)); + if (ImGui::BeginCombo( + "##video_encode_format", + video_encode_format_items[video_encode_format_button_value_])) { + ImGui::SetWindowFontScale(0.5f); + for (int i = 0; i < IM_ARRAYSIZE(video_encode_format_items); i++) { + bool selected = (i == video_encode_format_button_value_); + if (ImGui::Selectable(video_encode_format_items[i], selected)) + video_encode_format_button_value_ = i; + } + + ImGui::EndCombo(); + } } #if USE_CUDA && !defined(__aarch64__) && !defined(__arm__) @@ -468,12 +503,10 @@ int Render::SettingWindow() { settings_window_pos_reset_ = true; } - ImGui::SetWindowFontScale(1.0f); ImGui::SetWindowFontScale(0.5f); ImGui::End(); ImGui::PopStyleVar(2); ImGui::PopStyleColor(); - ImGui::SetWindowFontScale(1.0f); } } diff --git a/src/gui/windows/main_window.cpp b/src/gui/windows/main_window.cpp index b0cd3f0..c475491 100644 --- a/src/gui/windows/main_window.cpp +++ b/src/gui/windows/main_window.cpp @@ -9,7 +9,7 @@ int Render::MainWindow() { ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0.0f, 0.0f)); ImGui::PushStyleColor(ImGuiCol_ChildBg, ImVec4(1.0f, 1.0f, 1.0f, 1.0f)); ImGui::BeginChild("DeskWindow", - ImVec2(main_window_width_default_, local_window_height_), + ImVec2(main_window_width_, local_window_height_), ImGuiChildFlags_Border, ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoTitleBar | @@ -21,8 +21,8 @@ int Render::MainWindow() { ImDrawList* draw_list = ImGui::GetWindowDrawList(); draw_list->AddLine( - ImVec2(main_window_width_default_ / 2, title_bar_height_ + 15.0f), - ImVec2(main_window_width_default_ / 2, title_bar_height_ + 225.0f), + ImVec2(main_window_width_ / 2, title_bar_height_ + 15.0f * dpi_scale_), + ImVec2(main_window_width_ / 2, title_bar_height_ + 225.0f * dpi_scale_), IM_COL32(0, 0, 0, 122), 1.0f); RemoteWindow(); diff --git a/src/gui/windows/server_settings_window.cpp b/src/gui/windows/server_settings_window.cpp index 6a00dac..ebf06b1 100644 --- a/src/gui/windows/server_settings_window.cpp +++ b/src/gui/windows/server_settings_window.cpp @@ -54,12 +54,13 @@ int Render::ShowSimpleFileBrowser() { if (show_file_browser_) { ImGui::PushItemFlag(ImGuiItemFlags_AutoClosePopups, false); - float fixed_width = 130.0f; + float fixed_width = 130.0f * dpi_scale_; ImGui::SetNextItemWidth(fixed_width); ImGui::SetNextWindowSizeConstraints(ImVec2(fixed_width, 0), ImVec2(fixed_width, 100.0f)); if (ImGui::BeginCombo("##select_a_file", display_text.c_str(), 0)) { + ImGui::SetWindowFontScale(0.5f); bool file_selected = false; auto roots = GetRootEntries(); @@ -154,7 +155,7 @@ int Render::SelfHostedServerWindow() { // Settings { - static int settings_items_padding = 30; + static int settings_items_padding = 30 * dpi_scale_; int settings_items_offset = 0; ImGui::SetWindowFontScale(0.5f); diff --git a/src/gui/windows/stream_window.cpp b/src/gui/windows/stream_window.cpp index 6f4d084..30f069f 100644 --- a/src/gui/windows/stream_window.cpp +++ b/src/gui/windows/stream_window.cpp @@ -53,20 +53,24 @@ int Render::StreamWindow() { ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0.0f, 0.0f)); ImGui::PushStyleColor(ImGuiCol_WindowBg, ImVec4(0, 0, 0, 0)); ImGui::PushStyleColor(ImGuiCol_Border, ImVec4(0, 0, 0, 0)); - ImGui::Begin("VideoBg", nullptr, - ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoDecoration | - ImGuiWindowFlags_NoBringToFrontOnFocus | - ImGuiWindowFlags_NoDocking); + bool video_bg_opened = ImGui::Begin( + "VideoBg", nullptr, + ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoDecoration | + ImGuiWindowFlags_NoBringToFrontOnFocus | ImGuiWindowFlags_NoDocking); ImGui::PopStyleColor(2); ImGui::PopStyleVar(); + if (!video_bg_opened) { + return 0; + } + ImGuiWindowFlags stream_window_flag = ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoBringToFrontOnFocus | ImGuiWindowFlags_NoMove; if (!fullscreen_button_pressed_) { - ImGui::SetNextWindowPos(ImVec2(20, 0), ImGuiCond_Always); - ImGui::SetNextWindowSize(ImVec2(0, 20), ImGuiCond_Always); + ImGui::SetNextWindowPos(ImVec2(20.0f * dpi_scale_, 0), ImGuiCond_Always); + ImGui::SetNextWindowSize(ImVec2(0, 30.0f * dpi_scale_), ImGuiCond_Always); ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0.0f, 8.0f)); ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0.0f); ImGui::PushStyleColor(ImGuiCol_WindowBg, ImVec4(0, 0, 0, 0.0f)); @@ -101,14 +105,13 @@ int Render::StreamWindow() { continue; } - ImGui::SetWindowFontScale(0.6f); std::string tab_label = enable_srtp_ ? std::string(ICON_FA_SHIELD_HALVED) + " " + props->remote_id_ : props->remote_id_; if (ImGui::BeginTabItem(tab_label.c_str(), &props->tab_opened_)) { props->tab_selected_ = true; - ImGui::SetWindowFontScale(1.0f); + ImGui::SetWindowFontScale(0.6f * dpi_scale_); ImGui::SetNextWindowSize( ImVec2(stream_window_width_, stream_window_height_), @@ -162,7 +165,6 @@ int Render::StreamWindow() { ImGui::EndTabItem(); } else { props->tab_selected_ = false; - ImGui::SetWindowFontScale(1.0f); ++it; } } diff --git a/src/gui/windows/update_notification_window.cpp b/src/gui/windows/update_notification_window.cpp index fe92570..a59cc00 100644 --- a/src/gui/windows/update_notification_window.cpp +++ b/src/gui/windows/update_notification_window.cpp @@ -58,11 +58,14 @@ int Render::UpdateNotificationWindow() { float window_width = update_notification_window_width_; float window_height = update_notification_window_height_; -#ifdef __APPLE__ - float font_scale = 0.3f; -#else - float font_scale = 0.5f; -#endif + // #ifdef __APPLE__ + // float font_scale = 0.3f; + // #else + // float font_scale = 0.5f; + // #endif + + float button_width = 35.0f * dpi_scale_; + float button_height = 25.0f * dpi_scale_; ImGui::SetNextWindowPos( ImVec2( @@ -86,17 +89,16 @@ int Render::UpdateNotificationWindow() { ImGui::PushFont(system_chinese_font_); } - ImGui::SetCursorPosY(ImGui::GetCursorPosY() + ImGui::GetTextLineHeight() + - 5.0f); + ImGui::SetCursorPosY(ImGui::GetCursorPosY() + window_height * 0.05f); // title: new version available ImGui::SetCursorPosX(window_width * 0.1f); - ImGui::SetWindowFontScale(font_scale + 0.2f); + ImGui::SetWindowFontScale(0.6f); std::string title = localization::new_version_available[localization_language_index_] + ": v" + latest_version_; ImGui::Text("%s", title.c_str()); - ImGui::SetWindowFontScale(font_scale); + ImGui::SetWindowFontScale(0.1f); ImGui::Spacing(); @@ -104,7 +106,9 @@ int Render::UpdateNotificationWindow() { std::string download_text = localization::access_website[localization_language_index_] + "https://crossdesk.cn"; + ImGui::SetWindowFontScale(0.5f); Hyperlink(download_text, "https://crossdesk.cn", window_width); + ImGui::SetWindowFontScale(1.0f); ImGui::Spacing(); @@ -116,7 +120,7 @@ int Render::UpdateNotificationWindow() { ImGui::BeginChild("ScrollableContent", ImVec2(window_width * 0.9f, scrollable_height), ImGuiChildFlags_Border, ImGuiWindowFlags_None); - + ImGui::SetWindowFontScale(0.6f); // set text wrap position to current available width (accounts for // scrollbar) float wrap_pos = ImGui::GetContentRegionAvail().x; @@ -167,9 +171,11 @@ int Render::UpdateNotificationWindow() { ImGui::SetCursorPosX(UPDATE_NOTIFICATION_OK_BUTTON_PADDING_EN); } + ImGui::SetWindowFontScale(0.5f); // update button if (ImGui::Button( - localization::update[localization_language_index_].c_str())) { + localization::update[localization_language_index_].c_str(), + ImVec2(button_width, button_height))) { // open download page std::string url = "https://crossdesk.cn"; #if defined(_WIN32) @@ -186,12 +192,12 @@ int Render::UpdateNotificationWindow() { ImGui::SameLine(); if (ImGui::Button( - localization::cancel[localization_language_index_].c_str())) { + localization::cancel[localization_language_index_].c_str(), + ImVec2(button_width, button_height))) { show_update_notification_window_ = false; } ImGui::SetWindowFontScale(1.0f); - ImGui::SetWindowFontScale(font_scale); // pop system font if (system_chinese_font_ != nullptr) { @@ -199,7 +205,6 @@ int Render::UpdateNotificationWindow() { } ImGui::End(); - ImGui::SetWindowFontScale(1.0f); ImGui::PopStyleVar(3); ImGui::PopStyleColor(); } diff --git a/src/thumbnail/thumbnail.cpp b/src/thumbnail/thumbnail.cpp index bb6f32c..362add5 100644 --- a/src/thumbnail/thumbnail.cpp +++ b/src/thumbnail/thumbnail.cpp @@ -156,6 +156,12 @@ Thumbnail::~Thumbnail() { } } +int Thumbnail::SetThumbnailDpiScale(float dpi_scale) { + thumbnail_width_ = static_cast(thumbnail_width_ * dpi_scale); + thumbnail_height_ = static_cast(thumbnail_height_ * dpi_scale); + return 0; +} + int Thumbnail::SaveToThumbnail(const char* yuv420p, int width, int height, const std::string& remote_id, const std::string& host_name, diff --git a/src/thumbnail/thumbnail.h b/src/thumbnail/thumbnail.h index c7a595e..1ede1ab 100644 --- a/src/thumbnail/thumbnail.h +++ b/src/thumbnail/thumbnail.h @@ -33,6 +33,8 @@ class Thumbnail { ~Thumbnail(); public: + int SetThumbnailDpiScale(float dpi_scale); + int SaveToThumbnail(const char* yuv420p, int width, int height, const std::string& remote_id, const std::string& host_name, diff --git a/xmake.lua b/xmake.lua index 7de596a..1fd1ebb 100644 --- a/xmake.lua +++ b/xmake.lua @@ -29,7 +29,7 @@ if is_mode("debug") then end add_requires("spdlog 1.14.1", {system = false}) -add_requires("imgui v1.91.5-docking", {configs = {sdl3 = true, sdl3_renderer = true}}) +add_requires("imgui v1.92.1-docking", {configs = {sdl3 = true, sdl3_renderer = true}}) add_requires("openssl3 3.3.2", {system = false}) add_requires("nlohmann_json 3.11.3") add_requires("cpp-httplib v0.26.0", {configs = {ssl = true}})