From 44c08f3cc456155b960ca5a115df93109d2202ce Mon Sep 17 00:00:00 2001
From: Sine Striker <trueful@163.com>
Date: 周三, 13 12月 2023 23:22:25 +0800
Subject: [PATCH] Remove event observer

---
 src/core/contexts/win32windowcontext.cpp |  151 +++++++++++++++++++------------------------------
 1 files changed, 59 insertions(+), 92 deletions(-)

diff --git a/src/core/contexts/win32windowcontext.cpp b/src/core/contexts/win32windowcontext.cpp
index 372d0c5..86ec6bd 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,10 +27,7 @@
 #include <dwmapi.h>
 #include <timeapi.h>
 
-#include "nativeeventfilter.h"
 #include "qwkglobal_p.h"
-
-#include "win10borderhandler_p.h"
 
 #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
 Q_DECLARE_METATYPE(QMargins)
@@ -85,7 +83,7 @@
     // ### FIXME: Tell the user to call in the documentation, instead of automatically
     // calling it directly.
     // ### FIXME FIXME FIXME
-    static struct QWK_Hook {
+    static const struct QWK_Hook {
         QWK_Hook() {
             qApp->setAttribute(Qt::AA_DontCreateNativeWidgetSiblings);
         }
@@ -636,7 +634,7 @@
     // DefWindowProc(). Consequently, we have to add a global native filter that forwards the result
     // of the hook function, telling Qt whether we have filtered the events before. Since Qt only
     // handles Windows window messages in the main thread, it is safe to do so.
-    class WindowsNativeEventFilter : public NativeEventFilter {
+    class WindowsNativeEventFilter : public AppNativeEventFilter {
     public:
         bool nativeEventFilter(const QByteArray &eventType, void *message,
                                QT_NATIVE_EVENT_RESULT_TYPE *result) override {
@@ -814,6 +812,45 @@
                 return;
             }
 
+            case DrawWindows10BorderHook: {
+                auto args = static_cast<void **>(data);
+                auto &painter = *static_cast<QPainter *>(args[0]);
+                const auto &rect = *static_cast<const QRect *>(args[1]);
+                const auto &region = *static_cast<const QRegion *>(args[2]);
+                const auto hwnd = reinterpret_cast<HWND>(m_windowHandle->winId());
+
+                QPen pen;
+                pen.setWidth(getWindowFrameBorderThickness(hwnd) * 2);
+
+                const bool dark = isDarkThemeActive() && isDarkWindowFrameEnabled(hwnd);
+                if (m_delegate->isWindowActive(m_host)) {
+                    if (isWindowFrameBorderColorized()) {
+                        pen.setColor(getAccentColor());
+                    } else {
+                        static QColor frameBorderActiveColorLight(kWindowsColorSet.activeLight);
+                        static QColor frameBorderActiveColorDark(kWindowsColorSet.activeDark);
+                        pen.setColor(dark ? frameBorderActiveColorDark
+                                          : frameBorderActiveColorLight);
+                    }
+                } else {
+                    static QColor frameBorderInactiveColorLight(kWindowsColorSet.inactiveLight);
+                    static QColor frameBorderInactiveColorDark(kWindowsColorSet.inactiveDark);
+                    pen.setColor(dark ? frameBorderInactiveColorDark
+                                      : frameBorderInactiveColorLight);
+                }
+                painter.save();
+
+                // ### TODO: do we need to enable or disable it?
+                painter.setRenderHint(QPainter::Antialiasing);
+
+                painter.setPen(pen);
+                painter.drawLine(QLine{
+                    QPoint{0,                       0},
+                    QPoint{m_windowHandle->width(), 0}
+                });
+                painter.restore();
+            }
+
             default: {
                 // unreachable
                 break;
@@ -822,14 +859,12 @@
         AbstractWindowContext::virtual_hook(id, data);
     }
 
-    bool Win32WindowContext::needWin10BorderHandler() const {
+    bool Win32WindowContext::needBorderPainter() const {
         return isWin10OrGreater() && !isWin11OrGreater();
     }
 
-    void Win32WindowContext::setWin10BorderHandler(Win10BorderHandler *handler) {
-        win10BorderHandler.reset(handler);
-        handler->setBorderThickness(
-            int(getWindowFrameBorderThickness(reinterpret_cast<HWND>(windowId))));
+    int Win32WindowContext::borderThickness() const {
+        return getWindowFrameBorderThickness(reinterpret_cast<HWND>(windowId));
     }
 
     bool Win32WindowContext::setupHost() {
@@ -897,16 +932,25 @@
             return true;
         }
 
-        if (themeStuffHandler(hWnd, message, wParam, lParam, result)) {
-            return true;
+        // Forward to native event filter subscribers
+        if (!m_nativeEventFilters.isEmpty()) {
+            MSG msg;
+            msg.hwnd = hWnd;
+            msg.message = message;
+            msg.wParam = wParam;
+            msg.lParam = lParam;
+            QT_NATIVE_EVENT_RESULT_TYPE res = 0;
+            if (dispatch(QByteArrayLiteral("windows_generic_MSG"), &msg, &res)) {
+                *result = LRESULT(res);
+                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() {
@@ -1885,83 +1929,6 @@
             return true;
         }
         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));
-                break;
-            }
-            case WM_THEMECHANGED:
-            case WM_SYSCOLORCHANGE: {
-                break;
-            }
-            case WM_DWMCOLORIZATIONCOLORCHANGED: {
-                const QColor color = QColor::fromRgba(wParam);
-                const auto blendWithOpacity = *reinterpret_cast<LPBOOL>(lParam);
-                break;
-            }
-            case WM_SETTINGCHANGE: {
-                if (!wParam && lParam && std::wcscmp(reinterpret_cast<LPCWSTR>(lParam), L"ImmersiveColorSet") == 0) {
-                    const QColor color = getAccentColor();
-                }
-                break;
-            }
-            case WM_SIZE: {
-                const bool max = wParam == SIZE_MAXIMIZED;
-                const bool min = wParam == SIZE_MINIMIZED;
-                const bool full = isFullScreen(hWnd);
-                break;
-            }
-            case WM_ACTIVATE: {
-                const auto state = LOWORD(wParam);
-                const bool active = state == WA_ACTIVE || state == WA_CLICKACTIVE;
-                break;
-            }
-            default:
-                break;
-        }
-        return false;
-    }
-
-    void Win10BorderHandler::paintBorder(QPainter &painter, const QRect &rect,
-                                         const QRegion &region) {
-        Q_UNUSED(rect)
-        Q_UNUSED(region)
-
-        QPen pen;
-        pen.setWidth(m_borderThickness * 2);
-
-        const bool dark = isDarkThemeActive() &&
-                          isDarkWindowFrameEnabled(reinterpret_cast<HWND>(m_window->winId()));
-        if (isActive()) {
-            if (isWindowFrameBorderColorized()) {
-                pen.setColor(getAccentColor());
-            } else {
-                static QColor frameBorderActiveColorLight(kWindowsColorSet.activeLight);
-                static QColor frameBorderActiveColorDark(kWindowsColorSet.activeDark);
-                pen.setColor(dark ? frameBorderActiveColorDark : frameBorderActiveColorLight);
-            }
-        } else {
-            static QColor frameBorderInactiveColorLight(kWindowsColorSet.inactiveLight);
-            static QColor frameBorderInactiveColorDark(kWindowsColorSet.inactiveDark);
-            pen.setColor(dark ? frameBorderInactiveColorDark : frameBorderInactiveColorLight);
-        }
-        painter.save();
-
-        // ### TODO: do we need to enable or disable it?
-        painter.setRenderHint(QPainter::Antialiasing);
-
-        painter.setPen(pen);
-        painter.drawLine(QLine{
-            QPoint{0,                 0},
-            QPoint{m_window->width(), 0}
-        });
-        painter.restore();
     }
 
 }

--
Gitblit v1.9.1