File indexing completed on 2024-05-12 05:37:08

0001 /*
0002     SPDX-FileCopyrightText: 2018 Kai Uwe Broulik <kde@privat.broulik.de>
0003 
0004     SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0005 */
0006 
0007 #include "notificationapplet.h"
0008 
0009 #include <QGuiApplication>
0010 #include <QJSEngine>
0011 #include <QJSValue>
0012 #include <QQuickItem>
0013 #include <QQuickWindow>
0014 #include <QScreen>
0015 
0016 #include <KX11Extras>
0017 
0018 #include <Plasma/Containment>
0019 #include <PlasmaQuick/AppletQuickItem>
0020 #include <PlasmaQuick/Dialog>
0021 #include <PlasmaQuick/PlasmaWindow>
0022 
0023 #include "fileinfo.h"
0024 #include "filemenu.h"
0025 #include "globalshortcuts.h"
0026 #include "jobaggregator.h"
0027 #include "thumbnailer.h"
0028 #include "wheelforwarder.h"
0029 
0030 class InputDisabler
0031 {
0032     Q_GADGET
0033 
0034 public:
0035     Q_INVOKABLE void makeTransparentForInput(QQuickItem *item)
0036     {
0037         if (item) {
0038             item->setAcceptedMouseButtons(Qt::NoButton);
0039             item->setAcceptHoverEvents(false);
0040             item->setAcceptTouchEvents(false);
0041             item->unsetCursor();
0042         }
0043     }
0044 };
0045 
0046 NotificationApplet::NotificationApplet(QObject *parent, const KPluginMetaData &data, const QVariantList &args)
0047     : Plasma::Applet(parent, data, args)
0048 {
0049     static bool s_typesRegistered = false;
0050     if (!s_typesRegistered) {
0051         const char uri[] = "org.kde.plasma.private.notifications";
0052         qmlRegisterType<FileInfo>(uri, 2, 0, "FileInfo");
0053         qmlRegisterType<FileMenu>(uri, 2, 0, "FileMenu");
0054         qmlRegisterType<GlobalShortcuts>(uri, 2, 0, "GlobalShortcuts");
0055         qmlRegisterType<JobAggregator>(uri, 2, 0, "JobAggregator");
0056         qmlRegisterType<Thumbnailer>(uri, 2, 0, "Thumbnailer");
0057         qmlRegisterType<WheelForwarder>(uri, 2, 0, "WheelForwarder");
0058         qmlRegisterSingletonType(uri, 2, 0, "InputDisabler", [](QQmlEngine *, QJSEngine *jsEngine) -> QJSValue {
0059             return jsEngine->toScriptValue(InputDisabler());
0060         });
0061         qmlProtectModule(uri, 2);
0062         s_typesRegistered = true;
0063     }
0064 
0065     connect(qApp, &QGuiApplication::focusWindowChanged, this, &NotificationApplet::focussedPlasmaDialogChanged);
0066 }
0067 
0068 NotificationApplet::~NotificationApplet() = default;
0069 
0070 void NotificationApplet::init()
0071 {
0072 }
0073 
0074 void NotificationApplet::configChanged()
0075 {
0076 }
0077 
0078 static bool isPlasmaWindow(QWindow *window)
0079 {
0080     if (qobject_cast<PlasmaQuick::Dialog *>(window) || qobject_cast<PlasmaQuick::PlasmaWindow *>(window)) {
0081         return true;
0082     }
0083     return false;
0084 }
0085 
0086 QWindow *NotificationApplet::focussedPlasmaDialog() const
0087 {
0088     auto *focusWindow = qApp->focusWindow();
0089     if (isPlasmaWindow(focusWindow)) {
0090         return focusWindow;
0091     }
0092     if (focusWindow) {
0093         if (isPlasmaWindow(focusWindow->transientParent())) {
0094             return focusWindow->transientParent();
0095         }
0096     }
0097 
0098     return nullptr;
0099 }
0100 
0101 QQuickItem *NotificationApplet::systemTrayRepresentation() const
0102 {
0103     auto *c = containment();
0104     if (!c) {
0105         return nullptr;
0106     }
0107 
0108     if (strcmp(c->metaObject()->className(), "SystemTray") != 0) {
0109         return nullptr;
0110     }
0111 
0112     return PlasmaQuick::AppletQuickItem::itemForApplet(c);
0113 }
0114 
0115 bool NotificationApplet::isPrimaryScreen(const QRect &rect) const
0116 {
0117     QScreen *screen = QGuiApplication::primaryScreen();
0118     if (!screen) {
0119         return false;
0120     }
0121 
0122     // HACK
0123     return rect == screen->geometry();
0124 }
0125 
0126 void NotificationApplet::forceActivateWindow(QWindow *window)
0127 {
0128     if (window && window->winId()) {
0129         KX11Extras::forceActiveWindow(window->winId());
0130     }
0131 }
0132 
0133 K_PLUGIN_CLASS(NotificationApplet)
0134 
0135 #include "notificationapplet.moc"