Sine Striker
2024-02-25 6f6f96909e7ded6ae3a4e59d9d4b62fa593abb23
src/widgets/widgetwindowagent_win.cpp
@@ -1,3 +1,7 @@
// Copyright (C) 2023-2024 Stdware Collections (https://www.github.com/stdware)
// Copyright (C) 2021-2023 wangwenx190 (Yuhang Zhao)
// SPDX-License-Identifier: Apache-2.0
#include "widgetwindowagent_p.h"
#include <QtCore/QDebug>
@@ -70,7 +74,7 @@
        inline void resumeWidgetEventAndDraw(QWidget *w, QEvent *event) {
            // Let the widget paint first
            Private::ObjectHelper::sendEvent(w, event);
            static_cast<QObject *>(w)->event(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
@@ -80,7 +84,7 @@
        inline void resumeWindowEventAndDraw(QWindow *window, QEvent *event) {
            // Let Qt paint first
            Private::ObjectHelper::sendEvent(window, event);
            static_cast<QObject *>(window)->event(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.
@@ -132,22 +136,31 @@
            Q_UNUSED(obj)
            auto window = widget->windowHandle();
            switch (event->type()) {
                case QEvent::Expose: {
                    // Qt will absolutely send a QExposeEvent or QResizeEvent to the QWindow when it
                    // receives a WM_PAINT message. When the control flow enters the expose handler,
                    // Qt must have already called BeginPaint() and it's the best time for us to
                    // draw the top border.
            // Qt will absolutely send a QExposeEvent or QResizeEvent to the QWindow when it
            // receives a WM_PAINT message. When the control flow enters the expose handler, Qt
            // must have already called BeginPaint() and it's the best time for us to draw the
            // top border.
            // Since a QExposeEvent will be sent immediately after the QResizeEvent, we can simply
            // ignore it.
            if (event->type() == QEvent::Expose) {
                auto ee = static_cast<QExposeEvent *>(event);
                if (window->isExposed() && isNormalWindow() && !ee->region().isNull()) {
                    resumeWindowEventAndDraw(window, event);
                    return true;
                    // Since a QExposeEvent will be sent immediately after the QResizeEvent, we can
                    // simply ignore it.
                    auto ee = static_cast<QExposeEvent *>(event);
                    if (window->isExposed() && isNormalWindow() && !ee->region().isNull()) {
                        resumeWindowEventAndDraw(window, event);
                        return true;
                    }
                    break;
                }
                case QEvent::WinIdChange: {
                    if (auto winId = ctx->windowId()) {
                        updateGeometry();
                    }
                    break;
                }
                default:
                    break;
            }
            return false;
        }