mirror of
https://bitbucket.org/smil3y/kde-workspace.git
synced 2025-02-24 10:52:51 +00:00
186 lines
6.2 KiB
C++
186 lines
6.2 KiB
C++
/***************************************************************************
|
|
* Copyright (C) 2010 by Dario Freddi <drf@kde.org> *
|
|
* *
|
|
* This program is free software; you can redistribute it and/or modify *
|
|
* it under the terms of the GNU General Public License as published by *
|
|
* the Free Software Foundation; either version 2 of the License, or *
|
|
* (at your option) any later version. *
|
|
* *
|
|
* This program 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 General Public License for more details. *
|
|
* *
|
|
* You should have received a copy of the GNU General Public License *
|
|
* along with this program; if not, write to the *
|
|
* Free Software Foundation, Inc., *
|
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . *
|
|
***************************************************************************/
|
|
|
|
|
|
#include "powerdevilactionpool.h"
|
|
|
|
#include "powerdevilaction.h"
|
|
#include "powerdevilcore.h"
|
|
|
|
#include <KConfigGroup>
|
|
#include <KDebug>
|
|
#include <KGlobal>
|
|
#include <KServiceTypeTrader>
|
|
#include <KPluginInfo>
|
|
|
|
#include <QtDBus/QDBusConnection>
|
|
|
|
// Bundled actions:
|
|
#include "actions/bundled/suspendsession.h"
|
|
#include "actions/bundled/brightnesscontrol.h"
|
|
#include "actions/bundled/keyboardbrightnesscontrol.h"
|
|
#include "actions/bundled/dimdisplay.h"
|
|
#include "actions/bundled/runscript.h"
|
|
#include "actions/bundled/handlebuttonevents.h"
|
|
|
|
namespace PowerDevil
|
|
{
|
|
|
|
class ActionPoolHelper
|
|
{
|
|
public:
|
|
ActionPoolHelper() : q(0) {}
|
|
~ActionPoolHelper() {
|
|
delete q;
|
|
}
|
|
ActionPool *q;
|
|
};
|
|
|
|
K_GLOBAL_STATIC(ActionPoolHelper, s_globalActionPool)
|
|
|
|
ActionPool *ActionPool::instance()
|
|
{
|
|
if (!s_globalActionPool->q) {
|
|
new ActionPool;
|
|
}
|
|
|
|
return s_globalActionPool->q;
|
|
}
|
|
|
|
ActionPool::ActionPool()
|
|
{
|
|
Q_ASSERT(!s_globalActionPool->q);
|
|
s_globalActionPool->q = this;
|
|
}
|
|
|
|
ActionPool::~ActionPool()
|
|
{
|
|
clearCache();
|
|
}
|
|
|
|
void ActionPool::clearCache()
|
|
{
|
|
QHash< QString, Action* >::iterator i = m_actionPool.begin();
|
|
while (i != m_actionPool.end()) {
|
|
// Delete the associated action and erase
|
|
i.value()->deleteLater();
|
|
i = m_actionPool.erase(i);
|
|
}
|
|
}
|
|
|
|
void ActionPool::init(PowerDevil::Core *parent)
|
|
{
|
|
// Load all the actions
|
|
KService::List offers = KServiceTypeTrader::self()->query("PowerDevil/Action",
|
|
"[X-KDE-PowerDevil-Action-IsBundled] == FALSE");
|
|
foreach (KService::Ptr offer, offers) {
|
|
QString actionId = offer->property("X-KDE-PowerDevil-Action-ID", QVariant::String).toString();
|
|
|
|
kDebug() << "Got a valid offer for " << actionId;
|
|
//try to load the specified library
|
|
PowerDevil::Action *retaction = offer->createInstance< PowerDevil::Action >(parent);
|
|
|
|
if (!retaction) {
|
|
// Troubles...
|
|
kWarning() << "failed to load" << offer->desktopEntryName();
|
|
continue;
|
|
}
|
|
|
|
// Is the action available and supported?
|
|
if (!retaction->isSupported()) {
|
|
// Skip that
|
|
retaction->deleteLater();
|
|
continue;
|
|
}
|
|
|
|
// Insert
|
|
m_actionPool.insert(actionId, retaction);
|
|
}
|
|
|
|
// Load bundled actions now
|
|
m_actionPool.insert("SuspendSession", new BundledActions::SuspendSession(parent));
|
|
m_actionPool.insert("BrightnessControl", new BundledActions::BrightnessControl(parent));
|
|
m_actionPool.insert("KeyboardBrightnessControl", new BundledActions::KeyboardBrightnessControl(parent));
|
|
m_actionPool.insert("DimDisplay", new BundledActions::DimDisplay(parent));
|
|
m_actionPool.insert("RunScript", new BundledActions::RunScript(parent));
|
|
m_actionPool.insert("HandleButtonEvents", new BundledActions::HandleButtonEvents(parent));
|
|
|
|
// Verify support
|
|
QHash<QString,Action*>::iterator i = m_actionPool.begin();
|
|
while (i != m_actionPool.end()) {
|
|
Action *action = i.value();
|
|
if (!action->isSupported()) {
|
|
i = m_actionPool.erase(i);
|
|
action->deleteLater();
|
|
} else {
|
|
++i;
|
|
}
|
|
}
|
|
|
|
// Register DBus objects
|
|
{
|
|
KService::List offers = KServiceTypeTrader::self()->query("PowerDevil/Action",
|
|
"[X-KDE-PowerDevil-Action-RegistersDBusInterface] == TRUE");
|
|
foreach (KService::Ptr offer, offers) {
|
|
QString actionId = offer->property("X-KDE-PowerDevil-Action-ID", QVariant::String).toString();
|
|
|
|
if (m_actionPool.contains(actionId)) {
|
|
QDBusConnection::sessionBus().registerObject("/org/kde/Solid/PowerManagement/Actions/" + actionId, m_actionPool[actionId]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
Action* ActionPool::loadAction(const QString& actionId, const KConfigGroup& group, PowerDevil::Core *parent)
|
|
{
|
|
Q_UNUSED(parent);
|
|
// Let's retrieve the action
|
|
if (m_actionPool.contains(actionId)) {
|
|
Action *retaction = m_actionPool[actionId];
|
|
|
|
if (group.isValid()) {
|
|
|
|
if (m_activeActions.contains(actionId)) {
|
|
// We are reloading the action: let's unload it first then.
|
|
retaction->onProfileUnload();
|
|
retaction->unloadAction();
|
|
m_activeActions.removeOne(actionId);
|
|
}
|
|
|
|
retaction->loadAction(group);
|
|
m_activeActions.append(actionId);
|
|
}
|
|
|
|
return retaction;
|
|
} else {
|
|
// Hmm... troubles in configuration. Np, let's just return 0 and let the core handle this
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
void ActionPool::unloadAllActiveActions()
|
|
{
|
|
foreach (const QString &action, m_activeActions) {
|
|
m_actionPool[action]->onProfileUnload();
|
|
m_actionPool[action]->unloadAction();
|
|
}
|
|
m_activeActions.clear();
|
|
}
|
|
|
|
}
|