File indexing completed on 2024-05-05 05:38:28

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 }