From db6647093d199ce4d90d081a6f423ea3812cad59 Mon Sep 17 00:00:00 2001 From: SimplestStudio Date: Fri, 13 Sep 2024 10:50:21 +0300 Subject: [PATCH 1/2] [win] fix top border width for win10 --- win-linux/src/windows/cwindowbase.cpp | 4 +++- win-linux/src/windows/platform_win/cwindowplatform.cpp | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/win-linux/src/windows/cwindowbase.cpp b/win-linux/src/windows/cwindowbase.cpp index 88e653f23..9306b5319 100644 --- a/win-linux/src/windows/cwindowbase.cpp +++ b/win-linux/src/windows/cwindowbase.cpp @@ -140,7 +140,9 @@ void CWindowBase::setWindowColors(const QColor& background, const QColor& border } else if (Utils::getWinVersion() == Utils::WinVer::Win10) { int brdWidth = 0; - SystemParametersInfo(SPI_GETBORDER, 0, &brdWidth, 0); + HDC hdc = GetDC(NULL); + brdWidth = GetSystemMetrics(SM_CXBORDER) * GetDeviceCaps(hdc, LOGPIXELSX)/96; + ReleaseDC(NULL, hdc); QColor brdColor = WindowHelper::getColorizationColor(isActive, background); css = QString("QMainWindow{border-top: %1px solid %2; background-color: %3;}").arg(QString::number(brdWidth), brdColor.name(), background.name()); } else { diff --git a/win-linux/src/windows/platform_win/cwindowplatform.cpp b/win-linux/src/windows/platform_win/cwindowplatform.cpp index f5e020d25..d1ae48711 100644 --- a/win-linux/src/windows/platform_win/cwindowplatform.cpp +++ b/win-linux/src/windows/platform_win/cwindowplatform.cpp @@ -247,7 +247,9 @@ void CWindowPlatform::adjustGeometry() } else if (Utils::getWinVersion() == WinVer::Win10) { int brdWidth = 0; - SystemParametersInfo(SPI_GETBORDER, 0, &brdWidth, 0); + HDC hdc = GetDC(NULL); + brdWidth = GetSystemMetrics(SM_CXBORDER) * GetDeviceCaps(hdc, LOGPIXELSX)/96; + ReleaseDC(NULL, hdc); mrg = QMargins(0, brdWidth, 0, 0); } m_resAreaWidth = mrg.top(); From f88884257d39b126e9ab4e2ca0cb04ccea3face5 Mon Sep 17 00:00:00 2001 From: SimplestStudio Date: Fri, 13 Sep 2024 11:26:38 +0300 Subject: [PATCH 2/2] [win] fix top border color for win10 --- win-linux/src/utils.cpp | 77 ++++++++++++++++++++++++++++++----------- 1 file changed, 56 insertions(+), 21 deletions(-) diff --git a/win-linux/src/utils.cpp b/win-linux/src/utils.cpp index 4eb2de7fc..872d61cc5 100644 --- a/win-linux/src/utils.cpp +++ b/win-linux/src/utils.cpp @@ -55,6 +55,7 @@ #ifdef _WIN32 # include #include +# include #include "shlobj.h" #include "lmcons.h" #else @@ -1012,6 +1013,33 @@ namespace WindowHelper { // } else AdjustWindowRectEx(rect, (GetWindowStyle(handle) & ~WS_DLGFRAME), FALSE, 0); // } + QString user_sid; + + auto GetCurrentUserSID() -> QString + { + if (user_sid.isEmpty()) { + HANDLE hToken = NULL; + if (OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken)) { + DWORD tokenLen = 0; + GetTokenInformation(hToken, TokenUser, NULL, 0, &tokenLen); + if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) { + if (PTOKEN_USER pTokenUser = (PTOKEN_USER)malloc(tokenLen)) { + if (GetTokenInformation(hToken, TokenUser, pTokenUser, tokenLen, &tokenLen)) { + LPWSTR sid = NULL; + if (ConvertSidToStringSid(pTokenUser->User.Sid, &sid)) { + user_sid = QString::fromWCharArray(sid); + LocalFree(sid); + } + } + free(pTokenUser); + } + } + CloseHandle(hToken); + } + } + return user_sid; + } + auto bringToTop(HWND hwnd) -> void { DWORD appID = ::GetCurrentThreadId(); @@ -1027,29 +1055,36 @@ namespace WindowHelper { auto getColorizationColor(bool isActive, const QColor &bkgColor) -> QColor { - QSettings reg("HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Windows\\DWM", QSettings::NativeFormat); - if (isActive && reg.value("ColorPrevalence", 0).toInt() != 0) { - DWORD dwcolor = 0; - BOOL opaque = TRUE; - static HRESULT(WINAPI *DwmGetColorizationColor)(DWORD*, BOOL*) = NULL; - if (!DwmGetColorizationColor) { - if (HMODULE module = GetModuleHandleA("dwmapi")) - *(FARPROC*)&DwmGetColorizationColor = GetProcAddress(module, "DwmGetColorizationColor"); - } - if (DwmGetColorizationColor && SUCCEEDED(DwmGetColorizationColor(&dwcolor, &opaque))) { - return QColor((dwcolor & 0xff0000) >> 16, (dwcolor & 0xff00) >> 8, dwcolor & 0xff); + int lum = int(0.299 * bkgColor.red() + 0.587 * bkgColor.green() + 0.114 * bkgColor.blue()); + if (isActive) { + QSettings reg("HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Windows\\DWM", QSettings::NativeFormat); + if (reg.value("ColorPrevalence", 0).toInt() != 0) { + DWORD dwcolor = 0; + BOOL opaque = TRUE; + static HRESULT(WINAPI *DwmGetColorizationColor)(DWORD*, BOOL*) = NULL; + if (!DwmGetColorizationColor) { + if (HMODULE module = GetModuleHandleA("dwmapi")) + *(FARPROC*)&DwmGetColorizationColor = GetProcAddress(module, "DwmGetColorizationColor"); + } + if (DwmGetColorizationColor && SUCCEEDED(DwmGetColorizationColor(&dwcolor, &opaque))) { + return QColor((dwcolor & 0xff0000) >> 16, (dwcolor & 0xff00) >> 8, dwcolor & 0xff); + } + } else { + QSettings reg_lt("HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize", QSettings::NativeFormat); + if (reg_lt.value("SystemUsesLightTheme", 0).toInt() != 0) { + QString userSid = GetCurrentUserSID(); + if (!userSid.isEmpty()) { + QSettings reg_ac("HKEY_USERS\\" + userSid + "\\Control Panel\\Desktop", QSettings::NativeFormat); + if (reg_ac.value("AutoColorization", 0).toInt() != 0) + return bkgColor.lighter(95); + } + } } + int res = -0.002*lum*lum + 0.93*lum + 6; + return QColor(res, res, res); } -#define BORDER_ACTIVE_DARK "#2f2f2f" // Dark theme -#define BORDER_INACTIVE_DARK "#3a3a3a" -#define BORDER_ACTIVE_LIGHT_V1 "#585858" // Light theme and colored background -#define BORDER_ACTIVE_LIGHT_V2 "#777777" // Light theme and white background -#define BORDER_INACTIVE_LIGHT_V1 "#606060" -#define BORDER_INACTIVE_LIGHT_V2 "#aaaaaa" - int lum = int(0.299 * bkgColor.red() + 0.587 * bkgColor.green() + 0.114 * bkgColor.blue()); - return QColor(lum < 85 ? (isActive ? BORDER_ACTIVE_DARK : BORDER_INACTIVE_DARK) : - lum < 170 ? (isActive ? BORDER_ACTIVE_LIGHT_V1 : BORDER_INACTIVE_LIGHT_V1) : - (isActive ? BORDER_ACTIVE_LIGHT_V2 : BORDER_INACTIVE_LIGHT_V2)); + int res = -0.0007*lum*lum + 0.78*lum + 25; + return QColor(res, res, res); } auto toggleLayoutDirection(HWND hwnd) -> void