File indexing completed on 2024-05-19 04:29:53

0001 /*
0002  *  SPDX-FileCopyrightText: 2023 Dmitry Kazakov <dimula73@gmail.com>
0003  *
0004  *  SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 #include "KisScreenMigrationTracker.h"
0008 
0009 #include <QGuiApplication>
0010 #include <QWidget>
0011 #include <QWindow>
0012 #include <QScreen>
0013 #include <kis_assert.h>
0014 #include <kis_signal_compressor.h>
0015 
0016 KisScreenMigrationTracker::KisScreenMigrationTracker(QWidget *trackedWidget, QObject *parent)
0017     : QObject(parent)
0018     , m_trackedWidget(trackedWidget)
0019     , m_resolutionChangeCompressor(new KisSignalCompressor(100, KisSignalCompressor::POSTPONE, this))
0020 {
0021     KIS_SAFE_ASSERT_RECOVER_RETURN(trackedWidget);
0022 
0023     QWindow *window = trackedWidget->topLevelWidget()->windowHandle();
0024     KIS_SAFE_ASSERT_RECOVER_RETURN(window);
0025 
0026     connect(window, &QWindow::screenChanged, this, &KisScreenMigrationTracker::slotScreenChanged);
0027     connectScreenSignals(window->screen());
0028 
0029     connect(m_resolutionChangeCompressor, &KisSignalCompressor::timeout,
0030             this, &KisScreenMigrationTracker::slotResolutionCompressorTriggered);
0031 }
0032 
0033 QScreen* KisScreenMigrationTracker::currentScreen() const
0034 {
0035     QWindow *window = m_trackedWidget->topLevelWidget()->windowHandle();
0036     KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(window, qApp->screens().first());
0037 
0038     return window->screen();
0039 }
0040 
0041 void KisScreenMigrationTracker::connectScreenSignals(QScreen *screen)
0042 {
0043     m_screenConnections.clear();
0044     m_screenConnections.addConnection(screen, &QScreen::physicalDotsPerInchChanged,
0045                                       this, &KisScreenMigrationTracker::slotScreenResolutionChanged);
0046     m_screenConnections.addConnection(screen, &QScreen::logicalDotsPerInchChanged,
0047                                       this, &KisScreenMigrationTracker::slotScreenLogicalResolutionChanged);
0048 }
0049 
0050 void KisScreenMigrationTracker::slotScreenChanged(QScreen *screen)
0051 {
0052     connectScreenSignals(screen);
0053 
0054     emit sigScreenChanged(screen);
0055     emit sigScreenOrResolutionChanged(screen);
0056 }
0057 
0058 void KisScreenMigrationTracker::slotScreenResolutionChanged(qreal value)
0059 {
0060     Q_UNUSED(value)
0061     m_resolutionChangeCompressor->start();
0062 }
0063 
0064 
0065 void KisScreenMigrationTracker::slotScreenLogicalResolutionChanged(qreal value)
0066 {
0067     Q_UNUSED(value)
0068     m_resolutionChangeCompressor->start();
0069 }
0070 
0071 void KisScreenMigrationTracker::slotResolutionCompressorTriggered()
0072 {
0073     QWindow *window = m_trackedWidget->topLevelWidget()->windowHandle();
0074     KIS_SAFE_ASSERT_RECOVER_RETURN(window);
0075 
0076     Q_EMIT sigScreenOrResolutionChanged(window->screen());
0077 }