From 5caecf2e69cc2c217a0f901977a845ee983a252a Mon Sep 17 00:00:00 2001 From: Kevin Krammer Date: Mon, 5 Feb 2007 00:15:18 +0000 Subject: Adding implementation for the SuspendScreenSaver call. Updating the generated adapter files --- kde3/configure.in.in | 7 +++ kde3/src/dapi.cpp | 119 ++++++++++++++++++++++++++++++++++++++++++++++++-- kde3/src/dapi.h | 7 +-- kde3/src/dapiimpl.cpp | 88 ++++++++++++++++++++++++++++++++++--- kde3/src/dapiimpl.h | 30 ++++++++++--- 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 ]) + ########### 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 #include #include #include @@ -25,6 +26,7 @@ // Qt D-Bus includes #include #include +#include #include // DAPI common includes @@ -34,6 +36,11 @@ #include "dapiimpl.h" #include "kabchandler.h" +#ifdef HAVE_DPMS +#include +#include +#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) @@ -361,6 +402,43 @@ KABCHandler* DAPIImpl::addressBook() return m_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 #include // Qt D-Bus includes #include +#include // local includes #include "dapi.h" // forward declarations class KABCHandler; +class QDBusProxy; -class DAPIImpl : public org::freedesktop::dapi +typedef QMap 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 -- cgit v1.2.3