From 6c0043c1e3d97398828fbd56448f1cd8ee201e66 Mon Sep 17 00:00:00 2001
From: Sine Striker <trueful@163.com>
Date: 周五, 23 2月 2024 01:01:10 +0800
Subject: [PATCH] Fix bug of window closing and reshowing

---
 examples/mainwindow/CMakeLists.txt       |    2 
 examples/mainwindow/main.cpp             |    2 +
 qmsetup                                  |    2 
 examples/mainwindow/mainwindow.cpp       |   30 +++++++++-----
 src/core/contexts/win32windowcontext.cpp |   42 +++++----------------
 5 files changed, 33 insertions(+), 45 deletions(-)

diff --git a/examples/mainwindow/CMakeLists.txt b/examples/mainwindow/CMakeLists.txt
index c29f2b8..c74e902 100644
--- a/examples/mainwindow/CMakeLists.txt
+++ b/examples/mainwindow/CMakeLists.txt
@@ -4,7 +4,7 @@
 
 qwk_add_example(${PROJECT_NAME}
     SOURCES ${_src} mainwindow.qrc ../shared/resources/shared.qrc
-    QT_LINKS Core Gui Widgets
+    QT_LINKS Core Gui Widgets # WebEngineWidgets
     LINKS QWKWidgets WidgetFrame
 )
 
diff --git a/examples/mainwindow/main.cpp b/examples/mainwindow/main.cpp
index d63729f..4118e80 100644
--- a/examples/mainwindow/main.cpp
+++ b/examples/mainwindow/main.cpp
@@ -33,7 +33,9 @@
     MainWindow w;
     w.show();
 
+#if 0
     QMainWindow w2;
     w2.show();
+#endif
     return a.exec();
 }
\ No newline at end of file
diff --git a/examples/mainwindow/mainwindow.cpp b/examples/mainwindow/mainwindow.cpp
index 8d6372a..4021ec3 100644
--- a/examples/mainwindow/mainwindow.cpp
+++ b/examples/mainwindow/mainwindow.cpp
@@ -19,6 +19,8 @@
 #  include <QtWidgets/QActionGroup>
 #endif
 
+// #include <QtWebEngineWidgets/QWebEngineView>
+
 #include <QWKWidgets/widgetwindowagent.h>
 
 #include <widgetframe/windowbar.h>
@@ -40,19 +42,25 @@
 };
 
 MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) {
-    installWindowAgent();
+     installWindowAgent();
 
+#if 1
     auto clockWidget = new ClockWidget();
     clockWidget->setObjectName(QStringLiteral("clock-widget"));
     clockWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
     setCentralWidget(clockWidget);
+#else
+    auto webView = new QWebEngineView();
+    webView->load(QUrl("https://www.baidu.com"));
+    setCentralWidget(webView);
+#endif
 
     loadStyleSheet(Dark);
 
     setWindowTitle(tr("Example MainWindow"));
     resize(800, 600);
 
-    windowAgent->centralize();
+    // windowAgent->centralize();
 }
 
 static inline void emulateLeaveEvent(QWidget *widget) {
@@ -117,9 +125,9 @@
 
 
 void MainWindow::closeEvent(QCloseEvent *event) {
-    if (!(qApp->keyboardModifiers() & Qt::ControlModifier)) {
-        QTimer::singleShot(1000, this, &QWidget::show);
-    }
+    // if (!(qApp->keyboardModifiers() & Qt::ControlModifier)) {
+    //     QTimer::singleShot(1000, this, &QWidget::show);
+    // }
     event->accept();
 }
 
@@ -295,14 +303,14 @@
     windowBar->setTitleLabel(titleLabel);
     windowBar->setHostWidget(this);
 
-    windowAgent->setTitleBar(windowBar);
+   windowAgent->setTitleBar(windowBar);
 #ifndef Q_OS_MAC
-    windowAgent->setSystemButton(QWK::WindowAgentBase::WindowIcon, iconButton);
-    windowAgent->setSystemButton(QWK::WindowAgentBase::Minimize, minButton);
-    windowAgent->setSystemButton(QWK::WindowAgentBase::Maximize, maxButton);
-    windowAgent->setSystemButton(QWK::WindowAgentBase::Close, closeButton);
+   windowAgent->setSystemButton(QWK::WindowAgentBase::WindowIcon, iconButton);
+   windowAgent->setSystemButton(QWK::WindowAgentBase::Minimize, minButton);
+   windowAgent->setSystemButton(QWK::WindowAgentBase::Maximize, maxButton);
+   windowAgent->setSystemButton(QWK::WindowAgentBase::Close, closeButton);
 #endif
-    windowAgent->setHitTestVisible(menuBar, true);
+   windowAgent->setHitTestVisible(menuBar, true);
 
 #ifdef Q_OS_MAC
     windowAgent->setSystemButtonAreaCallback([](const QSize &size) {
diff --git a/qmsetup b/qmsetup
index 10bbb20..d767a85 160000
--- a/qmsetup
+++ b/qmsetup
@@ -1 +1 @@
-Subproject commit 10bbb20ddf57899138dc4e1ab6c0a012cd052eb1
+Subproject commit d767a85676092f6b04d2485143b534141d53aef7
diff --git a/src/core/contexts/win32windowcontext.cpp b/src/core/contexts/win32windowcontext.cpp
index e0db522..e9a6731 100644
--- a/src/core/contexts/win32windowcontext.cpp
+++ b/src/core/contexts/win32windowcontext.cpp
@@ -695,12 +695,16 @@
     }
 
     void Win32WindowContext::winIdChanged(WId winId, WId oldWinId) {
+        // Reset the context data
+        mouseLeaveBlocked = false;
+        lastHitTestResult = WindowPart::Outside;
+
         // If the original window id is valid, remove all resources related
         if (oldWinId) {
             removeManagedWindow(reinterpret_cast<HWND>(oldWinId));
         }
 
-        if (!m_windowHandle || ! winId) {
+        if (!m_windowHandle || !winId) {
             return;
         }
 
@@ -735,15 +739,11 @@
                                         LRESULT *result) {
         *result = FALSE;
 
-        if (message == WM_DESTROY) {
-            qDebug() << "WM_DESTROY";
-        }
-
         // We should skip these messages otherwise we will get crashes.
         // NOTE: WM_QUIT won't be posted to the WindowProc function.
         switch (message) {
-            case WM_CLOSE:
             case WM_DESTROY:
+            case WM_CLOSE:
             case WM_NCDESTROY:
             // Undocumented messages:
             case WM_UAHDESTROYWINDOW:
@@ -755,20 +755,6 @@
 
         if (!isValidWindow(hWnd, false, true)) {
             return false;
-        }
-
-        switch (message) {
-            case WM_NCMOUSELEAVE:
-                qDebug() << "WM_NCMOUSELEAVE" << mouseLeaveBlocked;
-                break;
-            case WM_MOUSEHOVER:
-                qDebug() << "WM_MOUSEHOVER" << mouseLeaveBlocked;
-                break;
-            case WM_NCMOUSEHOVER:
-                qDebug() << "WM_NCMOUSEHOVER" << mouseLeaveBlocked;
-                break;
-            default:
-                break;
         }
 
         // Test snap layout
@@ -1156,8 +1142,6 @@
                     }
                 }
                 mouseLeaveBlocked = false;
-                
-                qDebug() << "WM_MOUSELEAVE";
                 break;
             }
 
@@ -1166,7 +1150,6 @@
                 // we unset `mouseLeaveBlocked` mark and pretend as if Qt has received
                 // WM_MOUSELEAVE.
                 if (lastHitTestResult != WindowPart::ChromeButton && mouseLeaveBlocked) {
-                    qDebug() << lastHitTestResult << "Track";
                     mouseLeaveBlocked = false;
                     requestForMouseLeaveMessage(hWnd, false);
                 }
@@ -1243,19 +1226,14 @@
                         // the above problems would not arise.
 
                         m_delegate->resetQtGrabbedControl(m_host);
+
+                        // If the mouse moves from chrome buttons to other non-client areas, a
+                        // WM_MOUSELEAVE message should be sent.
                         if (mouseLeaveBlocked) {
                             emulateClientAreaMessage(hWnd, message, wParam, lParam,
                                                      WM_NCMOUSELEAVE);
                         }
                     }
-
-                    // We need to make sure we get the right hit-test result when a WM_NCMOUSELEAVE
-                    // comes, so we reset it when we receive a WM_NCMOUSEMOVE.
-
-                    // If the mouse is entering the client area, there must be a WM_NCHITTEST
-                    // setting it to `Client` before the WM_NCMOUSELEAVE comes; if the mouse is
-                    // leaving the window, current window part remains as `Outside`.
-                    // lastHitTestResult = WindowPart::Outside;
                 }
 
                 if (currentWindowPart == WindowPart::ChromeButton) {
@@ -1287,7 +1265,7 @@
                     // pressing area as HTCLIENT which maybe because of our former retransmission of
                     // WM_NCLBUTTONDOWN, as a result, a WM_NCMOUSELEAVE will come immediately and a
                     // lot of WM_MOUSEMOVE will come if we move the mouse, we should track the mouse
-                    // in advance.
+                    // in advance. (May be redundant?)
                     if (mouseLeaveBlocked) {
                         mouseLeaveBlocked = false;
                         requestForMouseLeaveMessage(hWnd, false);

--
Gitblit v1.9.1