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 }