Added a plugin to inhibit the screensaver when a device is connected.

The inhibition is lifted when the plugin disconnects.

REVIEW: 121692
This commit is contained in:
Pramod Dematagoda 2014-12-29 00:03:41 -08:00 committed by Albert Vaca
parent 917104ff99
commit 0779377337
6 changed files with 152 additions and 0 deletions

View file

@ -11,6 +11,7 @@ add_subdirectory(mousepad)
add_subdirectory(share)
add_subdirectory(notifications)
add_subdirectory(sftp)
add_subdirectory(screensaver-inhibit)
#FIXME: If we split notifications in several files, they won't appear in the same group in the Notifications KCM
install(FILES kdeconnect.notifyrc DESTINATION ${DATA_INSTALL_DIR}/kdeconnect)

View file

@ -0,0 +1,10 @@
set(kdeconnect_screensaver_inhibit_SRCS
screensaverinhibitplugin.cpp
)
kde4_add_plugin(kdeconnect_screensaver_inhibit ${kdeconnect_screensaver_inhibit_SRCS})
target_link_libraries(kdeconnect_screensaver_inhibit kdeconnectcore ${KDE4_KDEUI_LIBS})
install(TARGETS kdeconnect_screensaver_inhibit DESTINATION ${PLUGIN_INSTALL_DIR} )
install(FILES kdeconnect_screensaver_inhibit.desktop DESTINATION ${SERVICES_INSTALL_DIR} )

View file

@ -0,0 +1,3 @@
This plugin inhibits the screensaver from kicking in when the device is connected
to kdeconnect, it then uninhibits the screensaver if the device was to go out of
range or be disconnected.

View file

@ -0,0 +1,15 @@
[Desktop Entry]
Encoding=UTF-8
Type=Service
ServiceTypes=KdeConnect/Plugin
X-KDE-Library=kdeconnect_screensaver_inhibit
X-KDE-PluginInfo-Author=Pramod Dematagoda
X-KDE-PluginInfo-Email=pmdematagoda@mykolab.ch
X-KDE-PluginInfo-Name=kdeconnect_screensaver_inhibit
X-KDE-PluginInfo-Version=0.1
X-KDE-PluginInfo-Website=http://albertvaka.wordpress.com
X-KDE-PluginInfo-License=GPL
X-KDE-PluginInfo-EnabledByDefault=false
Icon=preferences-desktop-screensaver
Name=Inhibit screensaver
Comment=Inhibit the screensaver when the device is connected

View file

@ -0,0 +1,78 @@
/**
* Copyright 2014 Pramod Dematagoda <pmdematagoda@mykolab.ch>
*
* 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) version 3 or any later version
* accepted by the membership of KDE e.V. (or its successor approved
* by the membership of KDE e.V.), which shall act as a proxy
* defined in Section 14 of version 3 of the license.
*
* 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, see <http://www.gnu.org/licenses/>.
*/
#include "screensaverinhibitplugin.h"
#include <KNotification>
#include <KIcon>
#include <KLocalizedString>
#include <core/kdebugnamespace.h>
#include <core/device.h>
#include <QDBusConnection>
#include <QDBusInterface>
K_PLUGIN_FACTORY( KdeConnectPluginFactory, registerPlugin< ScreensaverInhibitPlugin >(); )
K_EXPORT_PLUGIN( KdeConnectPluginFactory("kdeconnect_screensaver_inhibit", "kdeconnect-plugins") )
const QString INHIBIT_SERVICE = "org.freedesktop.ScreenSaver";
const QString INHIBIT_INTERFACE = INHIBIT_SERVICE;
const QString INHIBIT_PATH = "/ScreenSaver";
const QString INHIBIT_METHOD = "Inhibit";
const QString UNINHIBIT_METHOD = "UnInhibit";
const QString SIMULATE_ACTIVITY_METHOD = "SimulateUserActivity";
ScreensaverInhibitPlugin::ScreensaverInhibitPlugin(QObject* parent, const QVariantList& args)
: KdeConnectPlugin(parent, args)
{
QDBusInterface inhibitInterface(INHIBIT_SERVICE, INHIBIT_PATH, INHIBIT_INTERFACE);
QDBusMessage reply = inhibitInterface.call(INHIBIT_METHOD, "kdeconnect", "Phone is connected");
if (reply.errorMessage() != NULL) {
kDebug(debugArea()) << "Unable to inhibit the screensaver: " << reply.errorMessage();
} else {
// Store the cookie we receive, this will be sent back when sending the uninhibit call.
this->inhibitCookie = reply.arguments().first().toUInt();
}
}
ScreensaverInhibitPlugin::~ScreensaverInhibitPlugin()
{
QDBusInterface inhibitInterface(INHIBIT_SERVICE, INHIBIT_PATH, INHIBIT_INTERFACE);
inhibitInterface.call(UNINHIBIT_METHOD, this->inhibitCookie);
/*
* Simulate user activity because what ever manages the screensaver does not seem to start the timer
* automatically when all inhibitions are lifted and the user does nothing which results in an
* unlocked desktop which would be dangerous. Ideally we should not be doing this and the screen should
* be locked anyway.
*/
inhibitInterface.call(SIMULATE_ACTIVITY_METHOD);
}
void ScreensaverInhibitPlugin::connected()
{}
bool ScreensaverInhibitPlugin::receivePackage(const NetworkPackage& np)
{
return false;
}

View file

@ -0,0 +1,45 @@
/**
* Copyright 2014 Pramod Dematagoda <pmdematagoda@mykolab.ch>
*
* 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) version 3 or any later version
* accepted by the membership of KDE e.V. (or its successor approved
* by the membership of KDE e.V.), which shall act as a proxy
* defined in Section 14 of version 3 of the license.
*
* 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, see <http://www.gnu.org/licenses/>.
*/
#ifndef SCREENSAVERINHIBITPLUGIN_H
#define SCREENSAVERINHIBITPLUGIN_H
#include <QObject>
#include <core/kdeconnectplugin.h>
class KDE_EXPORT ScreensaverInhibitPlugin
: public KdeConnectPlugin
{
Q_OBJECT
public:
explicit ScreensaverInhibitPlugin(QObject *parent, const QVariantList &args);
virtual ~ScreensaverInhibitPlugin();
public Q_SLOTS:
virtual bool receivePackage(const NetworkPackage& np);
virtual void connected();
private:
uint inhibitCookie;
};
#endif