summaryrefslogtreecommitdiff
blob: f49999eb6490ac1c7df001c48e88ff73cee94e82 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
From 7cefdcf3d04669978aa28481d8ea274402935374 Mon Sep 17 00:00:00 2001
From: Allan Sandfeld Jensen <allan.jensen@qt.io>
Date: Mon, 10 Aug 2020 09:54:14 +0200
Subject: [PATCH] Handle double close in main window

After a bug fix in Qt 5.14 we now get real close events for unclosed windows
when the application closes, so we would be getting two close events breaking
our logic when when to suppress on-close dialogs.

Suppress the real close event after we have handled our own simulated one. Also
works if there is no real close event.

BUG: 416728

* Fixup after git merged the wrong commit
---
 src/kmainwindow.cpp | 8 ++++++++
 src/kmainwindow_p.h | 1 +
 2 files changed, 9 insertions(+)

diff --git a/src/kmainwindow.cpp b/src/kmainwindow.cpp
index b9bc2b6..33babb9 100644
--- a/src/kmainwindow.cpp
+++ b/src/kmainwindow.cpp
@@ -269,6 +269,7 @@ void KMainWindowPrivate::init(KMainWindow *_q)
     letDirtySettings = true;
 
     sizeApplied = false;
+    suppressCloseEvent = false;
 }
 
 static bool endsWithHashNumber(const QString &s)
@@ -532,6 +533,10 @@ void KMainWindow::appHelpActivated()
 void KMainWindow::closeEvent(QCloseEvent *e)
 {
     K_D(KMainWindow);
+    if (d->suppressCloseEvent) {
+        e->accept();
+        return;
+    }
 
     // Save settings if auto-save is enabled, and settings have changed
     if (d->settingsTimer && d->settingsTimer->isActive()) {
@@ -556,6 +561,9 @@ void KMainWindow::closeEvent(QCloseEvent *e)
     } else {
         e->ignore();    //if the window should not be closed, don't close it
     }
+    // If saving session, we are processing a fake close event, and might get the real one later.
+    if (e->isAccepted() && qApp->isSavingSession())
+        d->suppressCloseEvent = true;
 }
 
 bool KMainWindow::queryClose()
diff --git a/src/kmainwindow_p.h b/src/kmainwindow_p.h
index 13f6f19..bdd1eb4 100644
--- a/src/kmainwindow_p.h
+++ b/src/kmainwindow_p.h
@@ -33,6 +33,7 @@ public:
     bool settingsDirty: 1;
     bool autoSaveWindowSize: 1;
     bool sizeApplied: 1;
+    bool suppressCloseEvent: 1;
     KConfigGroup autoSaveGroup;
     QTimer *settingsTimer;
     QTimer *sizeTimer;
-- 
2.28.0