From c837319767bb609c6ec806336e49a347c77b11d3 Mon Sep 17 00:00:00 2001 From: Sine Striker <trueful@163.com> Date: 周五, 22 12月 2023 21:30:53 +0800 Subject: [PATCH] Add non-system-border option on Windows --- src/widgets/widgetwindowagent_win.cpp | 7 +++ src/core/style/styleagent_win.cpp | 4 - src/core/CMakeLists.txt | 2 src/CMakeLists.txt | 10 ++++ src/core/style/styleagent_p.h | 4 +- CMakeLists.txt | 3 + src/core/windowagentbase.cpp | 8 ++-- src/core/style/styleagent.cpp | 12 +++-- src/core/contexts/win32windowcontext.cpp | 26 +++++++++++-- 9 files changed, 55 insertions(+), 21 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9cd6266..cf38ca6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -12,8 +12,9 @@ option(QWINDOWKIT_BUILD_DOCUMENTATIONS "Build documentations" OFF) option(QWINDOWKIT_INSTALL "Install library" ON) -option(QWINDOWKIT_FORCE_QT_WINDOW_CONTEXT "Enable Qt Window Context anyway" OFF) +option(QWINDOWKIT_ENABLE_QT_WINDOW_CONTEXT "Enable Qt Window Context anyway" OFF) option(QWINDOWKIT_ENABLE_STYLE_AGENT "Enable building style agent" ON) +option(QWINDOWKIT_ENABLE_WINDOWS_SYSTEM_BORDER "Disable system border on Windows" ON) # ---------------------------------- # CMake Settings diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 739c9f8..572cb88 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -14,7 +14,15 @@ set(QMSETUP_DEFINITION_SCOPE DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) set(QMSETUP_DEFINITION_NUMERICAL on) -qm_add_definition(QWINDOWKIT_FORCE_QT_WINDOW_CONTEXT CONDITION QWINDOWKIT_FORCE_QT_WINDOW_CONTEXT) +qm_add_definition(QWINDOWKIT_ENABLE_QT_WINDOW_CONTEXT + CONDITION QWINDOWKIT_ENABLE_QT_WINDOW_CONTEXT +) +qm_add_definition(QWINDOWKIT_ENABLE_STYLE_AGENT + CONDITION QWINDOWKIT_ENABLE_STYLE_AGENT +) +qm_add_definition(QWINDOWKIT_ENABLE_WINDOWS_SYSTEM_BORDER + CONDITION QWINDOWKIT_ENABLE_WINDOWS_SYSTEM_BORDER +) qm_generate_config(${QWINDOWKIT_BUILD_INCLUDE_DIR}/QWKCore/qwkconfig.h) diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index 711937c..6e20cf1 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -33,7 +33,7 @@ ) endif() -if(QWINDOWKIT_FORCE_QT_WINDOW_CONTEXT) +if(QWINDOWKIT_ENABLE_QT_WINDOW_CONTEXT) list(APPEND _src contexts/qtwindowcontext_p.h contexts/qtwindowcontext.cpp diff --git a/src/core/contexts/win32windowcontext.cpp b/src/core/contexts/win32windowcontext.cpp index bcf91f3..ea572fb 100644 --- a/src/core/contexts/win32windowcontext.cpp +++ b/src/core/contexts/win32windowcontext.cpp @@ -21,6 +21,8 @@ # include <QtGui/qpa/qplatformwindow_p.h> #endif +#include <QWKCore/qwkconfig.h> + #include "qwkglobal_p.h" #include "qwkwindowsextra_p.h" @@ -55,7 +57,7 @@ static inline quint32 getDpiForWindow(HWND hwnd) { const DynamicApis &apis = DynamicApis::instance(); - if (apis.pGetDpiForWindow) { // Win10 + if (apis.pGetDpiForWindow) { // Win10 return apis.pGetDpiForWindow(hwnd); } else if (apis.pGetDpiForMonitor) { // Win8.1 HMONITOR monitor = ::MonitorFromWindow(hwnd, MONITOR_DEFAULTTONEAREST); @@ -712,10 +714,20 @@ auto winId = m_windowHandle->winId(); auto hWnd = reinterpret_cast<HWND>(winId); - if (!isWin10OrGreater()) { +#if QWINDOWKIT_CONFIG(ENABLE_WINDOWS_SYSTEM_BORDER) + if (!isWin10OrGreater()) +#endif + { static constexpr const MARGINS margins = {1, 1, 1, 1}; DynamicApis::instance().pDwmExtendFrameIntoClientArea(hWnd, &margins); } + +#if !QWINDOWKIT_CONFIG(ENABLE_WINDOWS_SYSTEM_BORDER) + { + DWORD style = ::GetWindowLongW(hWnd, GWL_STYLE); + ::SetWindowLongW(hWnd, GWL_STYLE, style | WS_THICKFRAME | WS_CAPTION); + } +#endif #if QT_VERSION < QT_VERSION_CHECK(6, 5, 0) for (const auto attr : { @@ -792,7 +804,8 @@ const auto hwnd = reinterpret_cast<HWND>(m_windowHandle->winId()); const DynamicApis &apis = DynamicApis::instance(); static constexpr const MARGINS extendMargins = {-1, -1, -1, -1}; - static const auto defaultMargins = isWin10OrGreater() ? MARGINS{0, 0, 0, 0} : MARGINS{1, 1, 1, 1}; + static const auto defaultMargins = + isWin10OrGreater() ? MARGINS{0, 0, 0, 0} : MARGINS{1, 1, 1, 1}; if (key == QStringLiteral("mica")) { if (!isWin11OrGreater()) { return false; @@ -1459,6 +1472,7 @@ int frameSize = getResizeBorderThickness(hWnd); bool isTop = (nativeLocalPos.y < frameSize); +#if QWINDOWKIT_CONFIG(ENABLE_WINDOWS_SYSTEM_BORDER) if (isWin10OrGreater()) { // This will handle the left, right and bottom parts of the frame // because we didn't change them. @@ -1501,7 +1515,9 @@ } *result = HTCLIENT; return true; - } else { + } else +#endif + { if (full) { *result = HTCLIENT; return true; @@ -1651,6 +1667,7 @@ Q_UNUSED(message) Q_UNUSED(this) +#if QWINDOWKIT_CONFIG(ENABLE_WINDOWS_SYSTEM_BORDER) // Windows鏄牴鎹繖涓秷鎭殑杩斿洖鍊兼潵璁剧疆绐楀彛鐨勫鎴峰尯锛堢獥鍙d腑鐪熸鏄剧ず鐨勫唴瀹癸級 // 鍜岄潪瀹㈡埛鍖猴紙鏍囬鏍忋�佺獥鍙h竟妗嗐�佽彍鍗曟爮鍜岀姸鎬佹爮绛塛indows绯荤粺鑷鎻愪緵鐨勯儴鍒� // 锛屼笉杩囧浜嶲t鏉ヨ锛岄櫎浜嗘爣棰樻爮鍜岀獥鍙h竟妗嗭紝闈炲鎴峰尯鍩烘湰涔熼兘鏄嚜缁樼殑锛夌殑鑼� @@ -1858,6 +1875,7 @@ } } } +#endif // We should call this function only before the function returns. syncPaintEventWithDwm(); // By returning WVR_REDRAW we can make the window resizing look diff --git a/src/core/style/styleagent.cpp b/src/core/style/styleagent.cpp index 6c0e740..9e6206d 100644 --- a/src/core/style/styleagent.cpp +++ b/src/core/style/styleagent.cpp @@ -8,7 +8,13 @@ StyleAgentPrivate::StyleAgentPrivate() { } - StyleAgentPrivate::~StyleAgentPrivate() = default; + StyleAgentPrivate::~StyleAgentPrivate() { + removeSystemThemeHook(); + } + + void StyleAgentPrivate::init() { + setupSystemThemeHook(); + } void StyleAgentPrivate::notifyThemeChanged(StyleAgent::SystemTheme theme) { if (theme == systemTheme) @@ -20,13 +26,9 @@ } StyleAgent::StyleAgent(QObject *parent) : StyleAgent(*new StyleAgentPrivate(), parent) { - Q_D(StyleAgent); - d->setupSystemThemeHook(); } StyleAgent::~StyleAgent() { - Q_D(StyleAgent); - d->removeSystemThemeHook(); } StyleAgent::SystemTheme StyleAgent::systemTheme() const { diff --git a/src/core/style/styleagent_p.h b/src/core/style/styleagent_p.h index 966e507..3595a9f 100644 --- a/src/core/style/styleagent_p.h +++ b/src/core/style/styleagent_p.h @@ -28,8 +28,8 @@ StyleAgent::SystemTheme systemTheme = StyleAgent::Unknown; - virtual void setupSystemThemeHook(); - virtual void removeSystemThemeHook(); + void setupSystemThemeHook(); + void removeSystemThemeHook(); void notifyThemeChanged(StyleAgent::SystemTheme theme); }; diff --git a/src/core/style/styleagent_win.cpp b/src/core/style/styleagent_win.cpp index 663b632..bee647a 100644 --- a/src/core/style/styleagent_win.cpp +++ b/src/core/style/styleagent_win.cpp @@ -85,7 +85,7 @@ SystemSettingEventFilter *SystemSettingEventFilter::instance = nullptr; - void StyleAgentPrivate::init() { + void StyleAgentPrivate::setupSystemThemeHook() { if (isHighContrastModeEnabled()) { systemTheme = StyleAgent::HighContrast; } else if (isDarkThemeActive()) { @@ -93,9 +93,7 @@ } else { systemTheme = StyleAgent::Light; } - } - void StyleAgentPrivate::setupSystemThemeHook() { g_styleAgentSet->insert(this); SystemSettingEventFilter::install(); } diff --git a/src/core/windowagentbase.cpp b/src/core/windowagentbase.cpp index 819dfb2..0131a60 100644 --- a/src/core/windowagentbase.cpp +++ b/src/core/windowagentbase.cpp @@ -5,9 +5,9 @@ #include "qwkglobal_p.h" -#if defined(Q_OS_WINDOWS) && !QWINDOWKIT_CONFIG(FORCE_QT_WINDOW_CONTEXT) +#if defined(Q_OS_WINDOWS) && !QWINDOWKIT_CONFIG(ENABLE_QT_WINDOW_CONTEXT) # include "win32windowcontext_p.h" -#elif defined(Q_OS_MAC) && !QWINDOWKIT_CONFIG(FORCE_QT_WINDOW_CONTEXT) +#elif defined(Q_OS_MAC) && !QWINDOWKIT_CONFIG(ENABLE_QT_WINDOW_CONTEXT) # include "cocoawindowcontext_p.h" #else # include "qtwindowcontext_p.h" @@ -33,9 +33,9 @@ return windowContextFactoryMethod(); } -#if defined(Q_OS_WINDOWS) && !QWINDOWKIT_CONFIG(FORCE_QT_WINDOW_CONTEXT) +#if defined(Q_OS_WINDOWS) && !QWINDOWKIT_CONFIG(ENABLE_QT_WINDOW_CONTEXT) return new Win32WindowContext(); -#elif defined(Q_OS_MAC) && !QWINDOWKIT_CONFIG(FORCE_QT_WINDOW_CONTEXT) +#elif defined(Q_OS_MAC) && !QWINDOWKIT_CONFIG(ENABLE_QT_WINDOW_CONTEXT) return new CocoaWindowContext(); #else return new QtWindowContext(); diff --git a/src/widgets/widgetwindowagent_win.cpp b/src/widgets/widgetwindowagent_win.cpp index 1305ba7..52b1a8c 100644 --- a/src/widgets/widgetwindowagent_win.cpp +++ b/src/widgets/widgetwindowagent_win.cpp @@ -1,5 +1,8 @@ #include "widgetwindowagent_p.h" +#include <QWKCore/qwkconfig.h> +#include <QWKCore/qwkglobal.h> + #include <QtGui/QPainter> #include <QWKCore/qwindowkit_windows.h> @@ -7,6 +10,7 @@ namespace QWK { +#if QWINDOWKIT_CONFIG(ENABLE_WINDOWS_SYSTEM_BORDER) class WidgetBorderHandler : public QObject, public NativeEventFilter { public: explicit WidgetBorderHandler(QWidget *widget, AbstractWindowContext *ctx) @@ -105,13 +109,16 @@ QWidget *widget; AbstractWindowContext *ctx; }; +#endif void WidgetWindowAgentPrivate::setupWindows10BorderWorkaround() { +#if QWINDOWKIT_CONFIG(ENABLE_WINDOWS_SYSTEM_BORDER) // Install painting hook auto ctx = context.get(); if (ctx->property("needBorderPainter").toBool()) { std::ignore = new WidgetBorderHandler(hostWidget, ctx); } +#endif } } -- Gitblit v1.9.1