diff --git a/plasma-windowed/plasmawindowedcorona.cpp b/plasma-windowed/plasmawindowedcorona.cpp --- a/plasma-windowed/plasmawindowedcorona.cpp +++ b/plasma-windowed/plasmawindowedcorona.cpp @@ -23,7 +23,10 @@ #include "plasmawindowedview.h" #include #include +#include + #include +#include #include #include @@ -108,16 +111,29 @@ return; } + QCommandLineParser parser; + parser.setApplicationDescription(i18n("Plasma Windowed")); + parser.addOption(QCommandLineOption(QStringLiteral("statusnotifier"), i18n("Makes the plasmoid stay alive in the Notification Area, even when the window is closed."))); + parser.addPositionalArgument(QStringLiteral("applet"), i18n("The applet to open.")); + parser.addPositionalArgument(QStringLiteral("args"), i18n("Arguments to pass to the plasmoid."), QStringLiteral("[args...]")); + parser.addVersionOption(); + parser.addHelpOption(); + parser.process(arguments); + + if (parser.positionalArguments().isEmpty()) { + parser.showHelp(1); + } + + const QStringList positionalArguments = parser.positionalArguments(); + QVariantList args; - QStringList::const_iterator constIterator; - constIterator = arguments.constBegin(); - ++constIterator; - for (; constIterator != arguments.constEnd(); + QStringList::const_iterator constIterator = positionalArguments.constBegin() + 1; + for (; constIterator != positionalArguments.constEnd(); ++constIterator) { args << (*constIterator); } - loadApplet(arguments[1], args); + loadApplet(positionalArguments.first(), args); } QRect PlasmaWindowedCorona::screenGeometry(int id) const diff --git a/plasma-windowed/plasmawindowedview.h b/plasma-windowed/plasmawindowedview.h --- a/plasma-windowed/plasmawindowedview.h +++ b/plasma-windowed/plasmawindowedview.h @@ -64,7 +64,7 @@ QPointer m_configView; QPointer m_rootObject; QPointer m_appletInterface; - KStatusNotifierItem* m_statusNotifier; + QPointer m_statusNotifier; bool m_withStatusNotifier; }; diff --git a/plasma-windowed/plasmawindowedview.cpp b/plasma-windowed/plasmawindowedview.cpp --- a/plasma-windowed/plasmawindowedview.cpp +++ b/plasma-windowed/plasmawindowedview.cpp @@ -32,6 +32,7 @@ #include #include #include +#include #include @@ -66,6 +67,7 @@ } m_appletInterface = applet->property("_plasma_graphicObject").value(); + if (!m_appletInterface) { return; } @@ -109,7 +111,7 @@ Q_ASSERT(!m_statusNotifier); if (m_withStatusNotifier) { - m_statusNotifier = new KStatusNotifierItem(this); + m_statusNotifier = new KStatusNotifierItem(applet->pluginMetaData().pluginId(), this); updateSniIcon(); connect(applet, &Plasma::Applet::iconChanged, this, &PlasmaWindowedView::updateSniIcon); @@ -120,12 +122,41 @@ updateSniStatus(); connect(applet, &Plasma::Applet::statusChanged, this, &PlasmaWindowedView::updateSniStatus); - connect(m_statusNotifier, &KStatusNotifierItem::activateRequested, this, [this](bool active, const QPoint& /*pos*/){ - setVisible(active); - if (active) { + //set up actions + for (auto a : applet->contextualActions()) { + m_statusNotifier->contextMenu()->addAction(a); + } + QAction *closeAction = new QAction(QIcon::fromTheme(QStringLiteral("window-close")), i18n("Close %1", applet->title()), this); + connect(closeAction, &QAction::triggered, this, [this]() { + m_statusNotifier->deleteLater(); + close(); + }); + m_statusNotifier->contextMenu()->addAction(closeAction); + + connect(m_statusNotifier.data(), &KStatusNotifierItem::activateRequested, this, [this](bool active, const QPoint& /*pos*/){ + if (isVisible() && isActive()) { + hide(); + } else { + show(); raise(); } }); + auto syncStatus = [this]() { + switch(m_applet->status()) { + case Plasma::Types::AcceptingInputStatus: + case Plasma::Types::RequiresAttentionStatus: + case Plasma::Types::NeedsAttentionStatus: + m_statusNotifier->setStatus(KStatusNotifierItem::NeedsAttention); + break; + case Plasma::Types::ActiveStatus: + m_statusNotifier->setStatus(KStatusNotifierItem::Active); + break; + default: + m_statusNotifier->setStatus(KStatusNotifierItem::Passive); + } + }; + connect(applet, &Plasma::Applet::statusChanged, this, syncStatus); + syncStatus(); } } @@ -186,6 +217,7 @@ void PlasmaWindowedView::keyPressEvent(QKeyEvent *ev) { if (ev->matches(QKeySequence::Quit)) { + m_statusNotifier->deleteLater(); close(); } QQuickView::keyReleaseEvent(ev);