[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