diff --git a/dataengines/mpris2/multiplexedservice.cpp b/dataengines/mpris2/multiplexedservice.cpp index 9a026b67a..131a079ca 100644 --- a/dataengines/mpris2/multiplexedservice.cpp +++ b/dataengines/mpris2/multiplexedservice.cpp @@ -1,130 +1,150 @@ /* * Copyright 2012 Alex Merry * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, * Boston, MA 02110-1301 USA */ #include "multiplexedservice.h" #include "multiplexer.h" #include "playercontrol.h" #include #include #include #include MultiplexedService::MultiplexedService(Multiplexer *multiplexer, QObject *parent) : Plasma::Service(parent) { setObjectName(Multiplexer::sourceName + QLatin1String(" controller")); setName(QStringLiteral("mpris2")); setDestination(Multiplexer::sourceName); connect(multiplexer, &Multiplexer::activePlayerChanged, this, &MultiplexedService::activePlayerChanged); activePlayerChanged(multiplexer->activePlayer()); } Plasma::ServiceJob* MultiplexedService::createJob(const QString& operation, QMap& parameters) { if (m_control) { return m_control.data()->createJob(operation, parameters); } return 0; } void MultiplexedService::updateEnabledOperations() { if (m_control) { foreach (const QString &op, operationNames()) { setOperationEnabled(op, m_control.data()->isOperationEnabled(op)); } } else { foreach (const QString &op, operationNames()) { setOperationEnabled(op, false); } } } void MultiplexedService::activePlayerChanged(PlayerContainer *container) { delete m_control.data(); if (container) { m_control = new PlayerControl(container, container->getDataEngine()); connect(m_control.data(), &PlayerControl::enabledOperationsChanged, this, &MultiplexedService::updateEnabledOperations); } updateEnabledOperations(); } void MultiplexedService::enableGlobalShortcuts() { if (m_actionCollection) { return; } m_actionCollection = new KActionCollection(this, QStringLiteral("mediacontrol")); m_actionCollection->setComponentDisplayName(i18nc("Name for global shortcuts category", "Media Controller")); QAction *playPauseAction = m_actionCollection->addAction(QStringLiteral("playpausemedia")); playPauseAction->setText(i18n("Play/Pause media playback")); KGlobalAccel::setGlobalShortcut(playPauseAction, Qt::Key_MediaPlay); connect(playPauseAction, &QAction::triggered, this, [this] { if (m_control) { - m_control->playerInterface()->PlayPause(); + auto playerInterface = m_control->playerInterface(); + if (playerInterface->canControl()) { + if (playerInterface->playbackStatus() == QLatin1String("Playing")) { + if (playerInterface->canPause()) { + playerInterface->Pause(); + } + } else { + if (playerInterface->canPlay()) { + playerInterface->Play(); + } + } + } } } ); QAction *nextAction = m_actionCollection->addAction(QStringLiteral("nextmedia")); nextAction->setText(i18n("Media playback next")); KGlobalAccel::setGlobalShortcut(nextAction, Qt::Key_MediaNext); connect(nextAction, &QAction::triggered, this, [this] { if (m_control) { - m_control->playerInterface()->Next(); + auto playerInterface = m_control->playerInterface(); + if (playerInterface->canControl() && playerInterface->canGoNext()) { + playerInterface->Next(); + } } } ); QAction *previousAction = m_actionCollection->addAction(QStringLiteral("previousmedia")); previousAction->setText(i18n("Media playback previous")); KGlobalAccel::setGlobalShortcut(previousAction, Qt::Key_MediaPrevious); connect(previousAction, &QAction::triggered, this, [this] { if (m_control) { - m_control->playerInterface()->Previous(); + auto playerInterface = m_control->playerInterface(); + if (playerInterface->canControl() && playerInterface->canGoPrevious()) { + playerInterface->Previous(); + } } } ); QAction *stopAction = m_actionCollection->addAction(QStringLiteral("stopmedia")); stopAction->setText(i18n("Stop media playback")); KGlobalAccel::setGlobalShortcut(stopAction, Qt::Key_MediaStop); connect(stopAction, &QAction::triggered, this, [this] { if (m_control) { - m_control->playerInterface()->Stop(); + auto playerInterface = m_control->playerInterface(); + if (playerInterface->canControl()) { + playerInterface->Stop(); + } } } ); }