From 59207cbc449e2e69e6b794115f8aeae168dba405 Mon Sep 17 00:00:00 2001 From: Zhao Yuhang <2546789017@qq.com> Date: 周三, 13 12月 2023 20:08:19 +0800 Subject: [PATCH] minor tweaks --- src/core/contexts/win32windowcontext.cpp | 111 ++++++++++++++++++++++++++++++++++++------------------- 1 files changed, 73 insertions(+), 38 deletions(-) diff --git a/src/core/contexts/win32windowcontext.cpp b/src/core/contexts/win32windowcontext.cpp index d6e361a..2fc72b0 100644 --- a/src/core/contexts/win32windowcontext.cpp +++ b/src/core/contexts/win32windowcontext.cpp @@ -4,6 +4,7 @@ #include <QtCore/QHash> #include <QtCore/QScopeGuard> +#include <QtCore/QTimer> #include <QtGui/QGuiApplication> #include <QtGui/QPainter> #include <QtGui/QPalette> @@ -26,7 +27,7 @@ #include <dwmapi.h> #include <timeapi.h> -#include "nativeeventfilter.h" +#include "nativeeventfilter_p.h" #include "qwkglobal_p.h" #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) @@ -802,35 +803,17 @@ return; } - case NeedsDrawBordersHook: { - auto &result = *static_cast<bool *>(data); - result = isWin10OrGreater() && !isWin11OrGreater(); + case DefaultColorsHook: { + auto &map = *static_cast<QMap<QString, QColor> *>(data); + map.clear(); + map.insert(QStringLiteral("activeLight"), kWindowsColorSet.activeLight); + map.insert(QStringLiteral("activeDark"), kWindowsColorSet.activeDark); + map.insert(QStringLiteral("inactiveLight"), kWindowsColorSet.inactiveLight); + map.insert(QStringLiteral("inactiveDark"), kWindowsColorSet.inactiveDark); return; } - case BorderThicknessHook: { - auto args = static_cast<void **>(data); - const bool requireNative = *static_cast<const bool *>(args[0]); - quint32 &thickness = *static_cast<quint32 *>(args[1]); - const auto hwnd = reinterpret_cast<HWND>(m_windowHandle->winId()); - const auto nativeThickness = getWindowFrameBorderThickness(hwnd); - thickness = requireNative - ? nativeThickness - : QHighDpi::fromNativePixels(nativeThickness, m_windowHandle); - return; - } - - case BorderColorsHook: { - auto arr = *reinterpret_cast<QList<QColor> *>(data); - arr.clear(); - arr.push_back(kWindowsColorSet.activeLight); - arr.push_back(kWindowsColorSet.activeDark); - arr.push_back(kWindowsColorSet.inactiveLight); - arr.push_back(kWindowsColorSet.inactiveDark); - return; - } - - case DrawBordersHook: { + case DrawWindows10BorderHook: { auto args = static_cast<void **>(data); auto &painter = *static_cast<QPainter *>(args[0]); const auto &rect = *static_cast<const QRect *>(args[1]); @@ -838,13 +821,10 @@ const auto hwnd = reinterpret_cast<HWND>(m_windowHandle->winId()); QPen pen; - const auto borderThickness = int(QHighDpi::fromNativePixels( - getWindowFrameBorderThickness(hwnd), m_windowHandle)); - pen.setWidth(borderThickness * 2); - const bool active = m_delegate->isWindowActive(m_host); - const bool dark = isDarkThemeActive() && isDarkWindowFrameEnabled(hwnd); + pen.setWidth(getWindowFrameBorderThickness(hwnd) * 2); - if (active) { + const bool dark = isDarkThemeActive() && isDarkWindowFrameEnabled(hwnd); + if (m_delegate->isWindowActive(m_host)) { if (isWindowFrameBorderColorized()) { pen.setColor(getAccentColor()); } else { @@ -866,11 +846,10 @@ painter.setPen(pen); painter.drawLine(QLine{ - QPoint{0, 0}, - QPoint{rect.width(), 0} + QPoint{0, 0}, + QPoint{m_windowHandle->width(), 0} }); painter.restore(); - return; } default: { @@ -879,6 +858,14 @@ } } AbstractWindowContext::virtual_hook(id, data); + } + + bool Win32WindowContext::needBorderPainter() const { + return isWin10OrGreater() && !isWin11OrGreater(); + } + + int Win32WindowContext::borderThickness() const { + return getWindowFrameBorderThickness(reinterpret_cast<HWND>(windowId)); } bool Win32WindowContext::setupHost() { @@ -946,12 +933,16 @@ return true; } + if (themeStuffHandler(hWnd, message, wParam, lParam, result)) { + return true; + } + return false; // Not handled } QWK_USED static constexpr const struct { - const WPARAM wParam = 0xF1C9ADD4; - const LPARAM lParam = 0xAFB6F4C6; + const WPARAM wParam = MAKEWPARAM(44500, 61897); + const LPARAM lParam = MAKELPARAM(62662, 44982); // Not used. Reserve for future use. } kMessageTag; static inline quint64 getKeyState() { @@ -1932,4 +1923,48 @@ return false; } + bool Win32WindowContext::themeStuffHandler(HWND hWnd, UINT message, WPARAM wParam, + LPARAM lParam, LRESULT *resul) { + switch (message) { + case WM_DPICHANGED: { + const auto dpiX = UINT(LOWORD(wParam)); + const auto dpiY = UINT(HIWORD(wParam)); + + QEvent e(QEvent::ScreenChangeInternal); + dispatch(&e); + break; + } + + case WM_THEMECHANGED: + case WM_SYSCOLORCHANGE: { + QEvent e(QEvent::UpdateLater); + dispatch(&e); + break; + } + + case WM_DWMCOLORIZATIONCOLORCHANGED: { + const QColor color = QColor::fromRgba(wParam); + const auto blendedWithOpacity = *reinterpret_cast<LPBOOL>(lParam); + + QEvent e(QEvent::UpdateLater); + dispatch(&e); + break; + } + + case WM_SETTINGCHANGE: { + if (!wParam && lParam && + std::wcscmp(reinterpret_cast<LPCWSTR>(lParam), L"ImmersiveColorSet") == 0) { + const QColor color = getAccentColor(); + + QEvent e(QEvent::UpdateLater); + dispatch(&e); + } + break; + } + + default: + break; + } + return false; + } } -- Gitblit v1.9.1