[fix] fix DPI scaling issues

This commit is contained in:
dijunkun
2025-12-01 04:54:30 +08:00
parent 91d42b6561
commit 37797bf873
20 changed files with 427 additions and 305 deletions

View File

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