Zhao Yuhang
2024-01-01 b54e368f16e8bd977fe57fcc738fc6804af076e4
src/widgets/widgetwindowagent_win.cpp
@@ -1,3 +1,6 @@
// Copyright (C) 2023-2024 Stdware Collections
// SPDX-License-Identifier: Apache-2.0
#include "widgetwindowagent_p.h"
#include <QtCore/QDebug>
@@ -5,6 +8,7 @@
#include <QtGui/QPainter>
#include <QWKCore/qwindowkit_windows.h>
#include <QWKCore/private/qwkglobal_p.h>
namespace QWK {
@@ -44,7 +48,7 @@
            static QVariant defaultMargins = QVariant::fromValue(QMargins(0, 1, 0, 0));
            ctx->setWindowAttribute(QStringLiteral("extra-margins"), defaultMargins);
            // Enable dark mode by default, otherwise the frame borders are white
            // Enable dark mode by default, otherwise the system borders are white
            ctx->setWindowAttribute(QStringLiteral("dark-mode"), true);
            ctx->installNativeEventFilter(this);
@@ -68,14 +72,8 @@
        }
        inline void resumeWidgetEventAndDraw(QWidget *w, QEvent *event) {
            // Friend class helping to call `event`
            class HackedWidget : public QWidget {
            public:
                friend class QWK::WidgetBorderHandler;
            };
            // Let the widget paint first
            static_cast<HackedWidget *>(w)->event(event);
            Private::ObjectHelper::sendEvent(w, event);
            // Due to the timer or user action, Qt will repaint some regions spontaneously,
            // even if there is no WM_PAINT message, we must wait for it to finish painting
@@ -84,14 +82,8 @@
        }
        inline void resumeWindowEventAndDraw(QWindow *window, QEvent *event) {
            // Friend class helping to call `event`
            class HackedWindow : public QWindow {
            public:
                friend class QWK::WidgetBorderHandler;
            };
            // Let Qt paint first
            static_cast<HackedWindow *>(window)->event(event);
            Private::ObjectHelper::sendEvent(window, event);
            // Upon receiving the WM_PAINT message, Qt will repaint the entire view, and we
            // must wait for it to finish painting before drawing this top border area.
@@ -110,7 +102,7 @@
            // When the window is inactive, there is a transparency bug in the top
            // border, and we need to extend the non-client area to the whole title
            // bar.
            QRect frame = ctx->windowAttribute(QStringLiteral("title-bar-rect")).toRect();
            QRect frame = ctx->windowAttribute(QStringLiteral("window-rect")).toRect();
            QMargins margins{0, -frame.top(), 0, 0};
            ctx->setWindowAttribute(QStringLiteral("extra-margins"), QVariant::fromValue(margins));
        }
@@ -119,6 +111,7 @@
        bool nativeEventFilter(const QByteArray &eventType, void *message,
                               QT_NATIVE_EVENT_RESULT_TYPE *result) override {
            Q_UNUSED(eventType)
            const auto msg = static_cast<const MSG *>(message);
            switch (msg->message) {
                case WM_DPICHANGED: {
@@ -163,6 +156,7 @@
        bool eventFilter(QObject *obj, QEvent *event) override {
            Q_UNUSED(obj)
            switch (event->type()) {
                case QEvent::UpdateRequest: {
                    if (!isNormalWindow())