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"