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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
|
/*
SPDX-FileCopyrightText: 2022 Volker Krause <vkrause@kde.org>
SPDX-License-Identifier: LGPL-2.0-or-later
*/
#include "kwindowstatesaver.h"
#include "ksharedconfig.h"
#include "kwindowconfig.h"
#include <QWindow>
class KWindowStateSaverPrivate
{
public:
QWindow *window = nullptr;
KConfigGroup configGroup;
std::function<QWindow *()> windowHandleCallback;
int timerId = 0;
void init(KWindowStateSaver *q);
void initWidget(QObject *widget, KWindowStateSaver *q);
};
void KWindowStateSaverPrivate::init(KWindowStateSaver *q)
{
if (!window) {
return;
}
KWindowConfig::restoreWindowSize(window, configGroup);
KWindowConfig::restoreWindowPosition(window, configGroup);
const auto deferredSave = [q, this]() {
if (!timerId) {
timerId = q->startTimer(250);
}
};
QObject::connect(window, &QWindow::widthChanged, q, deferredSave);
QObject::connect(window, &QWindow::heightChanged, q, deferredSave);
QObject::connect(window, &QWindow::xChanged, q, deferredSave);
QObject::connect(window, &QWindow::yChanged, q, deferredSave);
}
void KWindowStateSaverPrivate::initWidget(QObject *widget, KWindowStateSaver *q)
{
if (!window && windowHandleCallback) {
window = windowHandleCallback();
}
if (window) {
init(q);
} else {
widget->installEventFilter(q);
}
}
KWindowStateSaver::KWindowStateSaver(QWindow *window, const KConfigGroup &configGroup)
: QObject(window)
, d(new KWindowStateSaverPrivate)
{
Q_ASSERT(window);
d->window = window;
d->configGroup = configGroup;
d->init(this);
}
KWindowStateSaver::KWindowStateSaver(QWindow *window, const QString &configGroupName)
: QObject(window)
, d(new KWindowStateSaverPrivate)
{
Q_ASSERT(window);
d->window = window;
d->configGroup = KConfigGroup(KSharedConfig::openStateConfig(), configGroupName);
d->init(this);
}
KWindowStateSaver::KWindowStateSaver(QWindow *window, const char *configGroupName)
: QObject(window)
, d(new KWindowStateSaverPrivate)
{
Q_ASSERT(window);
d->window = window;
d->configGroup = KConfigGroup(KSharedConfig::openStateConfig(), configGroupName);
d->init(this);
}
KWindowStateSaver::~KWindowStateSaver()
{
delete d;
}
void KWindowStateSaver::timerEvent(QTimerEvent *event)
{
killTimer(event->timerId());
KWindowConfig::saveWindowPosition(d->window, d->configGroup);
KWindowConfig::saveWindowSize(d->window, d->configGroup);
d->timerId = 0;
}
bool KWindowStateSaver::eventFilter(QObject *watched, QEvent *event)
{
// QEvent::PlatformSurface would give us a valid window, but if there are
// intial resizings (explicitly or via layout constraints) those would then
// already overwrite our restored values. So wait until all that is done
// and only restore afterwards.
if (event->type() == QEvent::ShowToParent && !d->window) {
watched->removeEventFilter(this);
d->window = d->windowHandleCallback();
d->init(this);
}
return QObject::eventFilter(watched, event);
}
void KWindowStateSaver::initWidget(QObject *widget, const std::function<QWindow *()> &windowHandleCallback, const KConfigGroup &configGroup)
{
d = new KWindowStateSaverPrivate;
d->windowHandleCallback = windowHandleCallback;
d->configGroup = configGroup;
d->initWidget(widget, this);
}
void KWindowStateSaver::initWidget(QObject *widget, const std::function<QWindow *()> &windowHandleCallback, const QString &configGroupName)
{
d = new KWindowStateSaverPrivate;
d->windowHandleCallback = windowHandleCallback;
d->configGroup = KConfigGroup(KSharedConfig::openStateConfig(), configGroupName);
d->initWidget(widget, this);
}
void KWindowStateSaver::initWidget(QObject *widget, const std::function<QWindow *()> &windowHandleCallback, const char *configGroupName)
{
d = new KWindowStateSaverPrivate;
d->windowHandleCallback = windowHandleCallback;
d->configGroup = KConfigGroup(KSharedConfig::openStateConfig(), configGroupName);
d->initWidget(widget, this);
}
|