summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKevin Krammer <kevin.krammer@gmx.at>2007-02-05 00:15:18 +0000
committerKevin Krammer <kevin.krammer@gmx.at>2007-02-05 00:15:18 +0000
commit5caecf2e69cc2c217a0f901977a845ee983a252a (patch)
tree91467b70423702cc0b13682dd1b3c255374d5876
parent1ae9b0791009928d33fa70fdd24539f81865b873 (diff)
Adding implementation for the SuspendScreenSaver call.
Updating the generated adapter files
-rw-r--r--kde3/configure.in.in7
-rw-r--r--kde3/src/dapi.cpp119
-rw-r--r--kde3/src/dapi.h7
-rw-r--r--kde3/src/dapiimpl.cpp88
-rw-r--r--kde3/src/dapiimpl.h30
5 files changed, 234 insertions, 17 deletions
diff --git a/kde3/configure.in.in b/kde3/configure.in.in
index 6419032..e42a0cc 100644
--- a/kde3/configure.in.in
+++ b/kde3/configure.in.in
@@ -7,6 +7,13 @@ AC_CHECK_KDEMAXPATHLEN
AC_PATH_QT
AC_PATH_QT_MOC_UIC
+
+########### Check for availability of DPMS
+
+KDE_CHECK_HEADERS(X11/extensions/dpms.h,
+ AC_DEFINE(HAVE_DPMS, 1, [Set if DPMS is available]),,
+ [#include <X11/Xlib.h>])
+
########### Check for D-Bus Qt3 bindings
AC_MSG_CHECKING(for D-Bus Qt3 bindings)
diff --git a/kde3/src/dapi.cpp b/kde3/src/dapi.cpp
index b5f3dd0..bf94a80 100644
--- a/kde3/src/dapi.cpp
+++ b/kde3/src/dapi.cpp
@@ -32,6 +32,13 @@ QDBusMessage dapi::callCapabilities(const QDBusMessage& message)
}
else
{
+ if (!error.isValid())
+ {
+ qWarning("Call to implementation of org::freedesktop::dapi::Capabilities returned 'false' but error object is not valid!");
+
+ error = QDBusError("org.freedesktop.DBus.Error.Failed", "org.freedesktop.dapi.Capabilities execution failed");
+ }
+
reply = QDBusMessage::methodError(message, error);
}
@@ -52,6 +59,13 @@ QDBusMessage dapi::callOpenUrl(const QDBusMessage& message)
}
else
{
+ if (!error.isValid())
+ {
+ qWarning("Call to implementation of org::freedesktop::dapi::OpenUrl returned 'false' but error object is not valid!");
+
+ error = QDBusError("org.freedesktop.DBus.Error.Failed", "org.freedesktop.dapi.OpenUrl execution failed");
+ }
+
reply = QDBusMessage::methodError(message, error);
}
@@ -72,6 +86,13 @@ QDBusMessage dapi::callExecuteUrl(const QDBusMessage& message)
}
else
{
+ if (!error.isValid())
+ {
+ qWarning("Call to implementation of org::freedesktop::dapi::ExecuteUrl returned 'false' but error object is not valid!");
+
+ error = QDBusError("org.freedesktop.DBus.Error.Failed", "org.freedesktop.dapi.ExecuteUrl execution failed");
+ }
+
reply = QDBusMessage::methodError(message, error);
}
@@ -92,6 +113,13 @@ QDBusMessage dapi::callButtonOrder(const QDBusMessage& message)
}
else
{
+ if (!error.isValid())
+ {
+ qWarning("Call to implementation of org::freedesktop::dapi::ButtonOrder returned 'false' but error object is not valid!");
+
+ error = QDBusError("org.freedesktop.DBus.Error.Failed", "org.freedesktop.dapi.ButtonOrder execution failed");
+ }
+
reply = QDBusMessage::methodError(message, error);
}
@@ -113,6 +141,13 @@ QDBusMessage dapi::callRunAsUser(const QDBusMessage& message)
}
else
{
+ if (!error.isValid())
+ {
+ qWarning("Call to implementation of org::freedesktop::dapi::RunAsUser returned 'false' but error object is not valid!");
+
+ error = QDBusError("org.freedesktop.DBus.Error.Failed", "org.freedesktop.dapi.RunAsUser execution failed");
+ }
+
reply = QDBusMessage::methodError(message, error);
}
@@ -133,6 +168,13 @@ QDBusMessage dapi::callSuspendScreenSaving(const QDBusMessage& message)
}
else
{
+ if (!error.isValid())
+ {
+ qWarning("Call to implementation of org::freedesktop::dapi::SuspendScreenSaving returned 'false' but error object is not valid!");
+
+ error = QDBusError("org.freedesktop.DBus.Error.Failed", "org.freedesktop.dapi.SuspendScreenSaving execution failed");
+ }
+
reply = QDBusMessage::methodError(message, error);
}
@@ -158,6 +200,13 @@ QDBusMessage dapi::callMailTo(const QDBusMessage& message)
}
else
{
+ if (!error.isValid())
+ {
+ qWarning("Call to implementation of org::freedesktop::dapi::MailTo returned 'false' but error object is not valid!");
+
+ error = QDBusError("org.freedesktop.DBus.Error.Failed", "org.freedesktop.dapi.MailTo execution failed");
+ }
+
reply = QDBusMessage::methodError(message, error);
}
@@ -182,6 +231,13 @@ QDBusMessage dapi::callLocalFile(const QDBusMessage& message)
}
else
{
+ if (!error.isValid())
+ {
+ qWarning("Call to implementation of org::freedesktop::dapi::LocalFile returned 'false' but error object is not valid!");
+
+ error = QDBusError("org.freedesktop.DBus.Error.Failed", "org.freedesktop.dapi.LocalFile execution failed");
+ }
+
reply = QDBusMessage::methodError(message, error);
}
@@ -204,6 +260,13 @@ QDBusMessage dapi::callUploadFile(const QDBusMessage& message)
}
else
{
+ if (!error.isValid())
+ {
+ qWarning("Call to implementation of org::freedesktop::dapi::UploadFile returned 'false' but error object is not valid!");
+
+ error = QDBusError("org.freedesktop.DBus.Error.Failed", "org.freedesktop.dapi.UploadFile execution failed");
+ }
+
reply = QDBusMessage::methodError(message, error);
}
@@ -223,6 +286,13 @@ QDBusMessage dapi::callRemoveTemporaryLocalFile(const QDBusMessage& message)
}
else
{
+ if (!error.isValid())
+ {
+ qWarning("Call to implementation of org::freedesktop::dapi::RemoveTemporaryLocalFile returned 'false' but error object is not valid!");
+
+ error = QDBusError("org.freedesktop.DBus.Error.Failed", "org.freedesktop.dapi.RemoveTemporaryLocalFile execution failed");
+ }
+
reply = QDBusMessage::methodError(message, error);
}
@@ -239,10 +309,17 @@ QDBusMessage dapi::callAddressBookList(const QDBusMessage& message)
if (AddressBookList(_contact_ids, error))
{
reply = QDBusMessage::methodReply(message);
- reply << QDBusData::fromList(QDBusDataList(_contact_ids));
+ reply << QDBusData::fromList((_contact_ids));
}
else
{
+ if (!error.isValid())
+ {
+ qWarning("Call to implementation of org::freedesktop::dapi::AddressBookList returned 'false' but error object is not valid!");
+
+ error = QDBusError("org.freedesktop.DBus.Error.Failed", "org.freedesktop.dapi.AddressBookList execution failed");
+ }
+
reply = QDBusMessage::methodError(message, error);
}
@@ -263,6 +340,13 @@ QDBusMessage dapi::callAddressBookOwner(const QDBusMessage& message)
}
else
{
+ if (!error.isValid())
+ {
+ qWarning("Call to implementation of org::freedesktop::dapi::AddressBookOwner returned 'false' but error object is not valid!");
+
+ error = QDBusError("org.freedesktop.DBus.Error.Failed", "org.freedesktop.dapi.AddressBookOwner execution failed");
+ }
+
reply = QDBusMessage::methodError(message, error);
}
@@ -280,10 +364,17 @@ QDBusMessage dapi::callAddressBookFindByName(const QDBusMessage& message)
if (AddressBookFindByName(_name, _contact_ids, error))
{
reply = QDBusMessage::methodReply(message);
- reply << QDBusData::fromList(QDBusDataList(_contact_ids));
+ reply << QDBusData::fromList((_contact_ids));
}
else
{
+ if (!error.isValid())
+ {
+ qWarning("Call to implementation of org::freedesktop::dapi::AddressBookFindByName returned 'false' but error object is not valid!");
+
+ error = QDBusError("org.freedesktop.DBus.Error.Failed", "org.freedesktop.dapi.AddressBookFindByName execution failed");
+ }
+
reply = QDBusMessage::methodError(message, error);
}
@@ -309,6 +400,13 @@ QDBusMessage dapi::callAddressBookGetName(const QDBusMessage& message)
}
else
{
+ if (!error.isValid())
+ {
+ qWarning("Call to implementation of org::freedesktop::dapi::AddressBookGetName returned 'false' but error object is not valid!");
+
+ error = QDBusError("org.freedesktop.DBus.Error.Failed", "org.freedesktop.dapi.AddressBookGetName execution failed");
+ }
+
reply = QDBusMessage::methodError(message, error);
}
@@ -326,10 +424,17 @@ QDBusMessage dapi::callAddressBookGetEmails(const QDBusMessage& message)
if (AddressBookGetEmails(_contact_id, _email_addresses, error))
{
reply = QDBusMessage::methodReply(message);
- reply << QDBusData::fromList(QDBusDataList(_email_addresses));
+ reply << QDBusData::fromList((_email_addresses));
}
else
{
+ if (!error.isValid())
+ {
+ qWarning("Call to implementation of org::freedesktop::dapi::AddressBookGetEmails returned 'false' but error object is not valid!");
+
+ error = QDBusError("org.freedesktop.DBus.Error.Failed", "org.freedesktop.dapi.AddressBookGetEmails execution failed");
+ }
+
reply = QDBusMessage::methodError(message, error);
}
@@ -351,6 +456,13 @@ QDBusMessage dapi::callAddressBookGetVCard30(const QDBusMessage& message)
}
else
{
+ if (!error.isValid())
+ {
+ qWarning("Call to implementation of org::freedesktop::dapi::AddressBookGetVCard30 returned 'false' but error object is not valid!");
+
+ error = QDBusError("org.freedesktop.DBus.Error.Failed", "org.freedesktop.dapi.AddressBookGetVCard30 execution failed");
+ }
+
reply = QDBusMessage::methodError(message, error);
}
@@ -491,6 +603,7 @@ bool dapi::handleMethodCall(const QDBusMessage& message)
return false;
}
+
}; // namespace freedesktop
}; // namespace org
diff --git a/kde3/src/dapi.h b/kde3/src/dapi.h
index da5296e..4359a98 100644
--- a/kde3/src/dapi.h
+++ b/kde3/src/dapi.h
@@ -23,7 +23,6 @@ public:
virtual ~dapi() {}
protected:
-
virtual bool Capabilities(Q_INT32& capabilities, QDBusError& error) = 0;
virtual bool OpenUrl(const QString& url, const QDBusVariant& windowinfo, QDBusError& error) = 0;
@@ -56,9 +55,12 @@ protected:
virtual bool AddressBookGetVCard30(const QString& contact_id, QString& vcard, QDBusError& error) = 0;
+protected: // implement sending replies
virtual void handleMethodReply(const QDBusMessage& reply) = 0;
-private:
+protected: // usually no need to reimplement
+ virtual bool handleMethodCall(const QDBusMessage& message);
+
QDBusMessage callCapabilities(const QDBusMessage& mesage);
QDBusMessage callOpenUrl(const QDBusMessage& mesage);
@@ -91,7 +93,6 @@ private:
QDBusMessage callAddressBookGetVCard30(const QDBusMessage& mesage);
- virtual bool handleMethodCall(const QDBusMessage& message);
}; // class dapi
}; // namespace freedesktop
diff --git a/kde3/src/dapiimpl.cpp b/kde3/src/dapiimpl.cpp
index 9db6842..a08a4a8 100644
--- a/kde3/src/dapiimpl.cpp
+++ b/kde3/src/dapiimpl.cpp
@@ -17,6 +17,7 @@
//
// KDE includes
+#include <dcopref.h>
#include <kapplication.h>
#include <kglobalsettings.h>
#include <kprocess.h>
@@ -25,6 +26,7 @@
// Qt D-Bus includes
#include <dbus/qdbusdata.h>
#include <dbus/qdbuserror.h>
+#include <dbus/qdbusproxy.h>
#include <dbus/qdbusvariant.h>
// DAPI common includes
@@ -34,6 +36,11 @@
#include "dapiimpl.h"
#include "kabchandler.h"
+#ifdef HAVE_DPMS
+#include <X11/Xlib.h>
+#include <X11/extensions/dpms.h>
+#endif
+
static WId dapiWindowID(const QDBusVariant& windowInfo)
{
#if defined(Q_WS_X11)
@@ -74,8 +81,16 @@ static QCString dapiMakeStartupInfo( const QDBusVariant& windowInfo )
///////////////////////////////////////////////////////////////////////////////
DAPIImpl::DAPIImpl() : org::freedesktop::dapi(),
- m_addressBook(0)
+ m_addressBook(0), m_proxyForBus(0)
{
+ m_proxyForBus = new QDBusProxy(this, "ProxyForBus");
+
+ m_proxyForBus->setService("org.freedesktop.DBus");
+ m_proxyForBus->setInterface("org.freedesktop.DBus");
+ m_proxyForBus->setPath("/org/freedesktop/DBus");
+
+ QObject::connect(m_proxyForBus, SIGNAL(dbusSignal(const QDBusMessage&)),
+ this, SLOT(slotDBusSignal(const QDBusMessage&)));
}
///////////////////////////////////////////////////////////////////////////////
@@ -87,6 +102,15 @@ DAPIImpl::~DAPIImpl()
///////////////////////////////////////////////////////////////////////////////
+void DAPIImpl::setConnection(const QDBusConnection& connection)
+{
+ m_connection = connection;
+
+ m_proxyForBus->setConnection(connection);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
bool DAPIImpl::Capabilities(Q_INT32& capabilities, QDBusError& error)
{
Q_UNUSED(error);
@@ -97,7 +121,7 @@ bool DAPIImpl::Capabilities(Q_INT32& capabilities, QDBusError& error)
capabilities |= DAPI_CAP_EXECUTEURL;
capabilities |= DAPI_CAP_BUTTONORDER;
capabilities |= DAPI_CAP_RUNASUSER;
- //capabilities |= DAPI_CAP_SUSPENDSCREENSAVING;
+ capabilities |= DAPI_CAP_SUSPENDSCREENSAVING;
capabilities |= DAPI_CAP_MAILTO;
//capabilities |= DAPI_CAP_LOCALFILE;
//capabilities |= DAPI_CAP_UPLOADFILE;
@@ -194,11 +218,16 @@ bool DAPIImpl::SuspendScreenSaving(Q_UINT32 client_id, bool suspend,
QDBusError& error)
{
Q_UNUSED(client_id);
- Q_UNUSED(suspend);
+ Q_UNUSED(error);
- error = QDBusError("org.freedesktop.dapi.Error", "NotImplementedYet");
+ if (suspend)
+ m_screenSaverSuspendConnections.insert(m_currentMethodCall.sender(), true);
+ else
+ m_screenSaverSuspendConnections.remove(m_currentMethodCall.sender());
- return false;
+ updateScreenSaverSuspend();
+
+ return true;
}
///////////////////////////////////////////////////////////////////////////////
@@ -353,6 +382,18 @@ void DAPIImpl::handleMethodReply(const QDBusMessage& reply)
///////////////////////////////////////////////////////////////////////////////
+bool DAPIImpl::handleMethodCall(const QDBusMessage& message)
+{
+ // some method calls need the context data from the call, e.g.
+ // SuspendScreenSaving needs the sender name, so we store the the
+ // message before calling the generated method handler
+ m_currentMethodCall = message;
+
+ return org::freedesktop::dapi::handleMethodCall(message);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
KABCHandler* DAPIImpl::addressBook()
{
if (m_addressBook == 0)
@@ -362,6 +403,43 @@ KABCHandler* DAPIImpl::addressBook()
}
///////////////////////////////////////////////////////////////////////////////
+
+void DAPIImpl::updateScreenSaverSuspend()
+{
+ // as long as there are connections left which have requested suspend
+ bool suspend = !m_screenSaverSuspendConnections.isEmpty();
+
+ // TODO get default state from KDE config
+#ifdef HAVE_DPMS
+ if( suspend )
+ DPMSDisable(qt_xdisplay());
+ else
+ DPMSEnable(qt_xdisplay());
+#endif
+ DCOPRef ref( "kdesktop", "KScreensaverIface" );
+ ref.call( "enable", !suspend );
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+void DAPIImpl::slotDBusSignal(const QDBusMessage& message)
+{
+ if (message.sender() != m_proxyForBus->service()) return;
+ if (message.member() != "NameOwnerChanged") return;
+
+ QString name = message[0].toString();
+ QString oldOwner = message[1].toString();
+ QString newOwner = message[2].toString();
+
+ // if a unique name "gets lost" it means the connection has been closed
+ if (newOwner.isEmpty() && name.startsWith(":") && name == oldOwner)
+ {
+ m_screenSaverSuspendConnections.remove(oldOwner);
+ updateScreenSaverSuspend();
+ }
+}
+
+///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
// some KDE APIs accept only QWidget* instead of WId
diff --git a/kde3/src/dapiimpl.h b/kde3/src/dapiimpl.h
index bf574c4..424d7fd 100644
--- a/kde3/src/dapiimpl.h
+++ b/kde3/src/dapiimpl.h
@@ -20,29 +20,31 @@
#define DAPIIMPL_H_INCLUDED
// Qt includes
+#include <qmap.h>
#include <qwidget.h>
// Qt D-Bus includes
#include <dbus/qdbusconnection.h>
+#include <dbus/qdbusmessage.h>
// local includes
#include "dapi.h"
// forward declarations
class KABCHandler;
+class QDBusProxy;
-class DAPIImpl : public org::freedesktop::dapi
+typedef QMap<QString, bool> StringSet;
+
+class DAPIImpl : public QObject, public org::freedesktop::dapi
{
+ Q_OBJECT
public:
DAPIImpl();
virtual ~DAPIImpl();
- void setConnection(const QDBusConnection& connection)
- {
- m_connection = connection;
- }
-
+ void setConnection(const QDBusConnection& connection);
protected:
QDBusConnection m_connection;
@@ -84,7 +86,23 @@ protected:
virtual void handleMethodReply(const QDBusMessage& reply);
+ virtual bool handleMethodCall(const QDBusMessage& message);
+
+protected:
KABCHandler* addressBook();
+
+private:
+ QDBusProxy* m_proxyForBus;
+
+ StringSet m_screenSaverSuspendConnections;
+
+ QDBusMessage m_currentMethodCall;
+
+private:
+ void updateScreenSaverSuspend();
+
+private slots:
+ void slotDBusSignal(const QDBusMessage& message);
};
class KDapiFakeWidget : public QWidget