Krita Source Code Documentation
Loading...
Searching...
No Matches
KisScreenMigrationTracker.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2023 Dmitry Kazakov <dimula73@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
8
9#include <QGuiApplication>
10#include <QWidget>
11#include <QWindow>
12#include <QScreen>
13#include <kis_assert.h>
15
16namespace {
17QWindow *findNearestParentWithNativeWindow(QWidget *widget)
18{
19 do {
20 QWindow *nativeWindow = widget->windowHandle();
21
22 if (nativeWindow) {
23 return nativeWindow;
24 }
25
26 } while ((widget = widget->parentWidget()));
27
28 return nullptr;
29}
30}
31
32KisScreenMigrationTracker::KisScreenMigrationTracker(QWidget *trackedWidget, QObject *parent)
33 : QObject(parent)
34 , m_trackedWidget(trackedWidget)
35 , m_resolutionChangeCompressor(new KisSignalCompressor(100, KisSignalCompressor::POSTPONE, this))
36{
37 KIS_SAFE_ASSERT_RECOVER_RETURN(trackedWidget);
38
44 m_trackedTopLevelWindow = findNearestParentWithNativeWindow(trackedWidget);
47 } else {
48 trackedWidget->installEventFilter(this);
49 }
50
53}
54
60
62{
63 return m_trackedTopLevelWindow ? m_trackedTopLevelWindow->screen() : qApp->screens().first();
64}
65
74
76{
78 connect(window, &QWindow::screenChanged, this, &KisScreenMigrationTracker::slotScreenChanged);
79 connectScreenSignals(window->screen());
80
81 Q_EMIT sigScreenChanged(window->screen());
82 Q_EMIT sigScreenOrResolutionChanged(window->screen());
83}
84
85bool KisScreenMigrationTracker::eventFilter(QObject *watched, QEvent *event)
86{
87 if (watched == m_trackedWidget && event->type() == QEvent::Show) {
88 m_trackedTopLevelWindow = findNearestParentWithNativeWindow(m_trackedWidget);
91 m_trackedWidget->removeEventFilter(this);
92 }
93 }
94
95 return QObject::eventFilter(watched, event);
96}
97
99{
100 connectScreenSignals(screen);
101
102 Q_EMIT sigScreenChanged(screen);
103 Q_EMIT sigScreenOrResolutionChanged(screen);
104}
105
111
117
float value(const T *src, size_t ch)
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
KisScreenMigrationTracker(QWidget *trackedWidget, QObject *parent=nullptr)
KisSignalAutoConnectionsStore m_screenConnections
void connectScreenSignals(QScreen *screen)
QPointer< QWindow > m_trackedTopLevelWindow
bool eventFilter(QObject *watched, QEvent *event) override
void slotScreenLogicalResolutionChanged(qreal value)
KisSignalCompressor * m_resolutionChangeCompressor
void connectTopLevelWindow(QWindow *window)
void sigScreenChanged(QScreen *screen)
void sigScreenOrResolutionChanged(QScreen *screen)
void addConnection(Sender sender, Signal signal, Receiver receiver, Method method, Qt::ConnectionType type=Qt::AutoConnection)
#define KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(cond, val)
Definition kis_assert.h:129
#define KIS_SAFE_ASSERT_RECOVER_RETURN(cond)
Definition kis_assert.h:128