[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    KDE/kdebase/apps
From:       Jakob Petsovits <jpetso () gmx ! at>
Date:       2009-01-18 23:44:48
Message-ID: 1232322288.363860.2989.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 913253 by jpetso:

Make kdialog use Plasma's notification bling (via D-Bus) if possible,
keeping KPassivePopup as fallback in case the D-Bus invocation fails.
The invocation code is a heavily simplified version of dimsuz's code
in NotifyByPopup of KNotify, therefore his copyright instead of mine.

Ok to backport to 4.2, or rather not?


 M  +3 -0      config-apps.h.cmake  
 M  +3 -0      kdialog/CMakeLists.txt  
 M  +70 -0     kdialog/kdialog.cpp  


--- trunk/KDE/kdebase/apps/config-apps.h.cmake #913252:913253
@@ -69,6 +69,9 @@
 /* Define to 1 if you have the `vsnprintf' function. */
 #cmakedefine HAVE_VSNPRINTF 1
 
+/* Define to 1 if the QtDBus module is present. */
+#cmakedefine QT_QTDBUS_FOUND 1
+
 /* KDE's binaries directory */
 #define KDE_BINDIR "${BIN_INSTALL_DIR}"
 
--- trunk/KDE/kdebase/apps/kdialog/CMakeLists.txt #913252:913253
@@ -12,6 +12,9 @@
 target_link_libraries(kdialog ${KDE4_KFILE_LIBS} ${KDE4_KIO_LIBS})
 if (Q_WS_X11)
   target_link_libraries(kdialog ${X11_X11_LIB})
+  if (QT_QTDBUS_FOUND)
+    target_link_libraries(kdialog ${QT_QTDBUS_LIBRARY})
+  endif (QT_QTDBUS_FOUND)
 endif (Q_WS_X11)
 
 install(TARGETS kdialog ${INSTALL_TARGETS_DEFAULT_ARGS})
--- trunk/KDE/kdebase/apps/kdialog/kdialog.cpp #913252:913253
@@ -2,6 +2,7 @@
 //  Copyright (C) 1998 Matthias Hoelzer <hoelzer@kde.org>
 //  Copyright (C) 2002 David Faure <faure@kde.org>
 //  Copyright (C) 2005 Brad Hards <bradh@frogmouth.net>
+//  Copyright (C) 2008 by Dmitry Suzdalev <dimsuz@gmail.com>
 //
 //  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
@@ -43,6 +44,12 @@
 #include <netwm.h>
 #endif
 
+#include "../config-apps.h"
+#ifdef QT_QTDBUS_FOUND
+#include <QtDBus/QDBusConnection>
+#include <QtDBus/QDBusConnectionInterface>
+#endif
+
 #ifdef Q_WS_WIN
 #include <QtGui/QFileDialog>
 #endif
@@ -85,6 +92,63 @@
     return QObject::eventFilter(o, e);
 }
 
+/**
+ * Display a passive notification popup using the D-Bus interface, if possible.
+ * @return true if the notification was successfully sent, false otherwise.
+ */
+bool sendVisualNotification(QString text, QString title, int timeout)
+{
+#ifdef QT_QTDBUS_FOUND
+  const QString dbusServiceName = "org.kde.VisualNotifications";
+  const QString dbusInterfaceName = "org.kde.VisualNotifications";
+  const QString dbusPath = "/VisualNotifications";
+
+  // check if service already exists on plugin instantiation
+  QDBusConnectionInterface* interface = QDBusConnection::sessionBus().interface();
+
+  if (!interface || !interface->isServiceRegistered(dbusServiceName)) {
+    //kDebug() << dbusServiceName << "D-Bus service not registered";
+    return false;
+  }
+
+  if (timeout == 0)
+    timeout = 10 * 1000;
+
+  QDBusMessage m = QDBusMessage::createMethodCall(dbusServiceName, dbusPath, \
dbusInterfaceName, "Notify"); +  QList<QVariant> args;
+
+  args.append("kdialog"); // app_name
+  args.append(0U); // replaces_id
+  args.append("kdialogPassivePopup"); // event_id
+  args.append("dialog-information"); // app_icon
+  args.append(title); // summary
+  args.append(text); // body
+  args.append(QStringList()); // actions - unused for plain passive popups
+  args.append(QVariantMap()); // hints - unused atm
+  args.append(timeout); // expire timout
+
+  m.setArguments(args);
+
+  QDBusMessage replyMsg = QDBusConnection::sessionBus().call(m);
+  if(replyMsg.type() == QDBusMessage::ReplyMessage) {
+    if (!replyMsg.arguments().isEmpty()) {
+      return true;
+    }
+    // Not displaying any error messages as this is optional for kdialog
+    // and KPassivePopup is a perfectly valid fallback.
+    //else {
+    //  kDebug() << "Error: received reply with no arguments.";
+    //}
+  } else if (replyMsg.type() == QDBusMessage::ErrorMessage) {
+    //kDebug() << "Error: failed to send D-Bus message";
+    //kDebug() << replyMsg;
+  } else {
+    //kDebug() << "Unexpected reply type";
+  }
+#endif
+  return false;
+}
+
 static void outputStringList(const QStringList &list, bool separateOutput)
 {
     if ( separateOutput) {
@@ -252,6 +316,12 @@
             duration = 1000 * args->arg(0).toInt();
         if (duration == 0)
             duration = 10000;
+
+        // try to use more stylish notifications
+        if (sendVisualNotification(args->getOption("passivepopup"), title, \
duration)) +          return 0;
+
+        // ...did not work, use KPassivePopup as fallback
     KPassivePopup *popup = KPassivePopup::message( KPassivePopup::Boxed, // style
                                                    title,
                                                    args->getOption("passivepopup"),


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic