File indexing completed on 2024-04-28 16:54:47
0001 /* 0002 SPDX-FileCopyrightText: 2014 Bhushan Shah <bhush94@gmail.com> 0003 SPDX-FileCopyrightText: 2014 Marco Martin <notmart@gmail.com> 0004 0005 SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL 0006 */ 0007 0008 #include "plasmawindowedcorona.h" 0009 #include "plasmawindowedview.h" 0010 #include <QAction> 0011 #include <QCommandLineParser> 0012 #include <QDebug> 0013 0014 #include <KActionCollection> 0015 #include <KLocalizedString> 0016 0017 #include <KPackage/Package> 0018 #include <KPackage/PackageLoader> 0019 #include <Plasma/PluginLoader> 0020 0021 PlasmaWindowedCorona::PlasmaWindowedCorona(const QString &shell, QObject *parent) 0022 : Plasma::Corona(parent) 0023 { 0024 KPackage::Package package = KPackage::PackageLoader::self()->loadPackage(QStringLiteral("Plasma/Shell")); 0025 package.setPath(shell); 0026 setKPackage(package); 0027 // QMetaObject::invokeMethod(this, "load", Qt::QueuedConnection); 0028 load(); 0029 } 0030 0031 void PlasmaWindowedCorona::loadApplet(const QString &applet, const QVariantList &arguments) 0032 { 0033 if (containments().isEmpty()) { 0034 return; 0035 } 0036 0037 Plasma::Containment *cont = containments().first(); 0038 0039 // forbid more instances per applet (todo: activate the corresponding already loaded applet) 0040 for (Plasma::Applet *a : cont->applets()) { 0041 if (a->pluginMetaData().pluginId() == applet) { 0042 return; 0043 } 0044 } 0045 PlasmaWindowedView *v = new PlasmaWindowedView(); 0046 v->setHasStatusNotifier(m_hasStatusNotifier); 0047 v->show(); 0048 0049 KConfigGroup appletsGroup(KSharedConfig::openConfig(), "Applets"); 0050 QString plugin; 0051 for (const QString &group : appletsGroup.groupList()) { 0052 KConfigGroup cg(&appletsGroup, group); 0053 plugin = cg.readEntry("plugin", QString()); 0054 0055 if (plugin == applet) { 0056 Plasma::Applet *a = Plasma::PluginLoader::self()->loadApplet(applet, group.toInt(), arguments); 0057 if (!a) { 0058 qWarning() << "Unable to load applet" << applet << "with arguments" << arguments; 0059 v->deleteLater(); 0060 return; 0061 } 0062 a->restore(cg); 0063 0064 // Access a->config() before adding to containment 0065 // will cause applets to be saved in palsmawindowedrc 0066 // so applets will only be created on demand 0067 KConfigGroup cg2 = a->config(); 0068 cont->addApplet(a); 0069 0070 v->setApplet(a); 0071 return; 0072 } 0073 } 0074 0075 Plasma::Applet *a = Plasma::PluginLoader::self()->loadApplet(applet, 0, arguments); 0076 if (!a) { 0077 qWarning() << "Unable to load applet" << applet << "with arguments" << arguments; 0078 v->deleteLater(); 0079 return; 0080 } 0081 0082 // Access a->config() before adding to containment 0083 // will cause applets to be saved in palsmawindowedrc 0084 // so applets will only be created on demand 0085 KConfigGroup cg2 = a->config(); 0086 cont->addApplet(a); 0087 0088 v->setApplet(a); 0089 } 0090 0091 void PlasmaWindowedCorona::activateRequested(const QStringList &arguments, const QString &workingDirectory) 0092 { 0093 Q_UNUSED(workingDirectory) 0094 if (arguments.count() <= 1) { 0095 return; 0096 } 0097 0098 QCommandLineParser parser; 0099 parser.setApplicationDescription(i18n("Plasma Windowed")); 0100 parser.addOption( 0101 QCommandLineOption(QStringLiteral("statusnotifier"), i18n("Makes the plasmoid stay alive in the Notification Area, even when the window is closed."))); 0102 parser.addPositionalArgument(QStringLiteral("applet"), i18n("The applet to open.")); 0103 parser.addPositionalArgument(QStringLiteral("args"), i18n("Arguments to pass to the plasmoid."), QStringLiteral("[args...]")); 0104 parser.addVersionOption(); 0105 parser.addHelpOption(); 0106 parser.process(arguments); 0107 0108 if (parser.positionalArguments().isEmpty()) { 0109 parser.showHelp(1); 0110 } 0111 0112 const QStringList positionalArguments = parser.positionalArguments(); 0113 0114 QVariantList args; 0115 QStringList::const_iterator constIterator = positionalArguments.constBegin() + 1; 0116 for (; constIterator != positionalArguments.constEnd(); ++constIterator) { 0117 args << (*constIterator); 0118 } 0119 0120 loadApplet(positionalArguments.first(), args); 0121 } 0122 0123 QRect PlasmaWindowedCorona::screenGeometry(int id) const 0124 { 0125 Q_UNUSED(id); 0126 // TODO? 0127 return QRect(); 0128 } 0129 0130 void PlasmaWindowedCorona::load() 0131 { 0132 /*this won't load applets, since applets are in plasmawindowedrc*/ 0133 loadLayout(QStringLiteral("plasmawindowed-appletsrc")); 0134 0135 bool found = false; 0136 for (auto c : containments()) { 0137 if (c->containmentType() == Plasma::Types::DesktopContainment) { 0138 found = true; 0139 break; 0140 } 0141 } 0142 0143 if (!found) { 0144 qDebug() << "Loading default layout"; 0145 createContainment(QStringLiteral("empty")); 0146 saveLayout(QStringLiteral("plasmawindowed-appletsrc")); 0147 } 0148 0149 for (auto c : containments()) { 0150 if (c->containmentType() == Plasma::Types::DesktopContainment) { 0151 m_containment = c; 0152 m_containment->setFormFactor(Plasma::Types::Application); 0153 QAction *removeAction = c->actions()->action(QStringLiteral("remove")); 0154 if (removeAction) { 0155 removeAction->deleteLater(); 0156 } 0157 break; 0158 } 0159 } 0160 } 0161 0162 void PlasmaWindowedCorona::setHasStatusNotifier(bool stay) 0163 { 0164 m_hasStatusNotifier = stay; 0165 }