File indexing completed on 2024-05-12 09:40:44
0001 /* 0002 SPDX-FileCopyrightText: 2019 Kai Uwe Broulik <kde@privat.broulik.de> 0003 0004 SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL 0005 */ 0006 0007 #include "mirroredscreenstracker_p.h" 0008 0009 #include <QGuiApplication> 0010 #include <QRect> 0011 #include <QScreen> 0012 0013 #include "debug.h" 0014 0015 using namespace NotificationManager; 0016 0017 MirroredScreensTracker::MirroredScreensTracker() 0018 : QObject(nullptr) 0019 { 0020 checkScreensMirrored(); 0021 const QList<QScreen *> screens = qApp->screens(); 0022 for (const QScreen *screen : screens) { 0023 connect(screen, &QScreen::geometryChanged, this, &MirroredScreensTracker::checkScreensMirrored); 0024 } 0025 0026 connect(qApp, &QGuiApplication::screenAdded, this, [this](QScreen *screen) { 0027 connect(screen, &QScreen::geometryChanged, this, &MirroredScreensTracker::checkScreensMirrored); 0028 checkScreensMirrored(); 0029 }); 0030 connect(qApp, &QGuiApplication::screenRemoved, this, &MirroredScreensTracker::checkScreensMirrored); 0031 } 0032 0033 MirroredScreensTracker::~MirroredScreensTracker() = default; 0034 0035 MirroredScreensTracker::Ptr MirroredScreensTracker::createTracker() 0036 { 0037 static std::weak_ptr<MirroredScreensTracker> s_instance; 0038 if (s_instance.expired()) { 0039 std::shared_ptr<MirroredScreensTracker> ptr(new MirroredScreensTracker()); 0040 s_instance = ptr; 0041 return ptr; 0042 } 0043 return s_instance.lock(); 0044 } 0045 0046 bool MirroredScreensTracker::screensMirrored() const 0047 { 0048 return m_screensMirrored; 0049 } 0050 0051 void MirroredScreensTracker::setScreensMirrored(bool mirrored) 0052 { 0053 if (m_screensMirrored != mirrored) { 0054 m_screensMirrored = mirrored; 0055 Q_EMIT screensMirroredChanged(mirrored); 0056 } 0057 } 0058 0059 void MirroredScreensTracker::checkScreensMirrored() 0060 { 0061 const QList<QScreen *> screens = qApp->screens(); 0062 0063 for (const QScreen *screen : screens) { 0064 for (const QScreen *checkScreen : screens) { 0065 if (screen == checkScreen) { 0066 continue; 0067 } 0068 if (screen->geometry().contains(checkScreen->geometry()) || checkScreen->geometry().contains(screen->geometry())) { 0069 qCDebug(NOTIFICATIONMANAGER) << "Screen geometry" << checkScreen->geometry() << "and" << screen->geometry() 0070 << "are completely overlapping - considering them to be mirrored"; 0071 setScreensMirrored(true); 0072 return; 0073 } 0074 } 0075 } 0076 0077 setScreensMirrored(false); 0078 }