diff --git a/CMakeLists.txt b/CMakeLists.txt --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -82,7 +82,7 @@ endif() set(HAVE_KWINDOWSYSTEM FALSE) -if(NOT ANDROID AND NOT WIN32) +if(NOT ANDROID) find_package(KF5WindowSystem ${KF5_DEP_VERSION} REQUIRED) set(HAVE_KWINDOWSYSTEM TRUE) endif() diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -21,9 +21,13 @@ ${knotifications_QM_LOADER} ) +if (NOT ANDROID) + list(APPEND knotifications_SRCS + kstatusnotifieritem.cpp) +endif() + if (TARGET Qt5::DBus) list(APPEND knotifications_SRCS - kstatusnotifieritem.cpp kstatusnotifieritemdbus_p.cpp knotificationrestrictions.cpp diff --git a/src/kstatusnotifieritem.cpp b/src/kstatusnotifieritem.cpp --- a/src/kstatusnotifieritem.cpp +++ b/src/kstatusnotifieritem.cpp @@ -20,10 +20,8 @@ #include "kstatusnotifieritem.h" #include "kstatusnotifieritemprivate_p.h" -#include "kstatusnotifieritemdbus_p.h" #include "debug_p.h" -#include #include #include #include @@ -37,6 +35,17 @@ #include #endif +#ifdef QT_DBUS_LIB +#include "kstatusnotifieritemdbus_p.h" + +#include + +#if HAVE_DBUSMENUQT +#include +#endif //HAVE_DBUSMENUQT +#endif + +#include #include #include @@ -47,10 +56,6 @@ static const char s_statusNotifierWatcherServiceName[] = "org.kde.StatusNotifierWatcher"; static const int s_legacyTrayIconSize = 24; -#if HAVE_DBUSMENUQT -#include -#endif //HAVE_DBUSMENUQT - KStatusNotifierItem::KStatusNotifierItem(QObject *parent) : QObject(parent), d(new KStatusNotifierItemPrivate(this)) @@ -67,8 +72,10 @@ KStatusNotifierItem::~KStatusNotifierItem() { +#ifdef QT_DBUS_LIB delete d->statusNotifierWatcher; delete d->notificationsClient; +#endif delete d->systemTrayIcon; if (!qApp->closingDown()) { delete d->menu; @@ -112,8 +119,10 @@ } d->status = status; - emit d->statusNotifierItemDBus->NewStatus(QString::fromLatin1(metaObject()->enumerator(metaObject()->indexOfEnumerator("ItemStatus")).valueToKey(d->status))); +#ifdef QT_DBUS_LIB + emit d->statusNotifierItemDBus->NewStatus(QString::fromLatin1(metaObject()->enumerator(metaObject()->indexOfEnumerator("ItemStatus")).valueToKey(d->status))); +#endif if (d->systemTrayIcon) { d->syncLegacySystemTrayIcon(); } @@ -127,9 +136,14 @@ return; } - d->serializedIcon = KDbusImageVector(); + d->iconName = name; + +#ifdef QT_DBUS_LIB + d->serializedIcon = KDbusImageVector(); emit d->statusNotifierItemDBus->NewIcon(); +#endif + if (d->systemTrayIcon) { d->systemTrayIcon->setIcon(QIcon::fromTheme(name)); } @@ -147,8 +161,11 @@ } d->iconName.clear(); + +#ifdef QT_DBUS_LIB d->serializedIcon = d->iconToVector(icon); emit d->statusNotifierItemDBus->NewIcon(); +#endif d->icon = icon; if (d->systemTrayIcon) { @@ -168,7 +185,9 @@ } d->overlayIconName = name; +#ifdef QT_DBUS_LIB emit d->statusNotifierItemDBus->NewOverlayIcon(); +#endif if (d->systemTrayIcon) { QPixmap iconPixmap = QIcon::fromTheme(d->iconName).pixmap(s_legacyTrayIconSize, s_legacyTrayIconSize); if (!name.isEmpty()) { @@ -193,8 +212,11 @@ } d->overlayIconName.clear(); + +#ifdef QT_DBUS_LIB d->serializedOverlayIcon = d->iconToVector(icon); emit d->statusNotifierItemDBus->NewOverlayIcon(); +#endif d->overlayIcon = icon; if (d->systemTrayIcon) { @@ -221,9 +243,12 @@ return; } - d->serializedAttentionIcon = KDbusImageVector(); d->attentionIconName = name; + +#ifdef QT_DBUS_LIB + d->serializedAttentionIcon = KDbusImageVector(); emit d->statusNotifierItemDBus->NewAttentionIcon(); +#endif } QString KStatusNotifierItem::attentionIconName() const @@ -238,9 +263,12 @@ } d->attentionIconName.clear(); - d->serializedAttentionIcon = d->iconToVector(icon); d->attentionIcon = icon; + +#ifdef QT_DBUS_LIB + d->serializedAttentionIcon = d->iconToVector(icon); emit d->statusNotifierItemDBus->NewAttentionIcon(); +#endif } QIcon KStatusNotifierItem::attentionIconPixmap() const @@ -259,7 +287,9 @@ delete d->movie; d->movie = nullptr; +#ifdef QT_DBUS_LIB emit d->statusNotifierItemDBus->NewAttentionIcon(); +#endif if (d->systemTrayIcon) { d->movie = new QMovie(d->movieName); @@ -312,16 +342,19 @@ return; } - d->serializedToolTipIcon = KDbusImageVector(); d->toolTipIconName = iconName; d->toolTipTitle = title; // if (d->systemTrayIcon) { // d->systemTrayIcon->setToolTip(title); // } setTrayToolTip(d->systemTrayIcon, title, subTitle); d->toolTipSubTitle = subTitle; + +#ifdef QT_DBUS_LIB + d->serializedToolTipIcon = KDbusImageVector(); emit d->statusNotifierItemDBus->NewToolTip(); +#endif } void KStatusNotifierItem::setToolTip(const QIcon &icon, const QString &title, const QString &subTitle) @@ -333,7 +366,6 @@ } d->toolTipIconName.clear(); - d->serializedToolTipIcon = d->iconToVector(icon); d->toolTipIcon = icon; d->toolTipTitle = title; @@ -343,18 +375,23 @@ setTrayToolTip(d->systemTrayIcon, title, subTitle); d->toolTipSubTitle = subTitle; +#ifdef QT_DBUS_LIB + d->serializedToolTipIcon = d->iconToVector(icon); emit d->statusNotifierItemDBus->NewToolTip(); +#endif } void KStatusNotifierItem::setToolTipIconByName(const QString &name) { if (d->toolTipIconName == name) { return; } - d->serializedToolTipIcon = KDbusImageVector(); d->toolTipIconName = name; +#ifdef QT_DBUS_LIB + d->serializedToolTipIcon = KDbusImageVector(); emit d->statusNotifierItemDBus->NewToolTip(); +#endif } QString KStatusNotifierItem::toolTipIconName() const @@ -369,9 +406,12 @@ } d->toolTipIconName.clear(); - d->serializedToolTipIcon = d->iconToVector(icon); d->toolTipIcon = icon; + +#ifdef QT_DBUS_LIB + d->serializedToolTipIcon = d->iconToVector(icon); emit d->statusNotifierItemDBus->NewToolTip(); +#endif } QIcon KStatusNotifierItem::toolTipIconPixmap() const @@ -386,7 +426,10 @@ } d->toolTipTitle = title; + +#ifdef QT_DBUS_LIB emit d->statusNotifierItemDBus->NewToolTip(); +#endif // if (d->systemTrayIcon) { // d->systemTrayIcon->setToolTip(title); // } @@ -408,7 +451,9 @@ #ifdef Q_OS_MACOS setTrayToolTip(d->systemTrayIcon, d->toolTipTitle, subTitle); #endif +#ifdef QT_DBUS_LIB emit d->statusNotifierItemDBus->NewToolTip(); +#endif } QString KStatusNotifierItem::toolTipSubTitle() const @@ -570,19 +615,20 @@ void KStatusNotifierItem::showMessage(const QString &title, const QString &message, const QString &icon, int timeout) { - if (!d->notificationsClient) { - d->notificationsClient = new org::freedesktop::Notifications(QStringLiteral("org.freedesktop.Notifications"), QStringLiteral("/org/freedesktop/Notifications"), - QDBusConnection::sessionBus()); - } - - uint id = 0; #ifdef Q_OS_MACOS if (d->systemTrayIcon) { // Growl is not needed anymore for QSystemTrayIcon::showMessage() since OS X 10.8 d->systemTrayIcon->showMessage(title, message, QSystemTrayIcon::Information, timeout); } else #endif { +#ifdef QT_DBUS_LIB + if (!d->notificationsClient) { + d->notificationsClient = new org::freedesktop::Notifications(QStringLiteral("org.freedesktop.Notifications"), QStringLiteral("/org/freedesktop/Notifications"), + QDBusConnection::sessionBus()); + } + + uint id = 0; QVariantMap hints; QString desktopFileName = QGuiApplication::desktopFileName(); @@ -596,6 +642,7 @@ } d->notificationsClient->Notify(d->title, id, icon, title, message, QStringList(), hints, timeout); +#endif } } @@ -613,13 +660,17 @@ #ifdef Q_OS_MACOS QtMac::setBadgeLabelText(QString()); #endif +#ifdef QT_DBUS_LIB emit d->statusNotifierItemDBus->NewStatus(QString::fromLatin1(metaObject()->enumerator(metaObject()->indexOfEnumerator("ItemStatus")).valueToKey(d->status))); +#endif } +#ifdef QT_DBUS_LIB if (d->associatedWidget && d->associatedWidget == d->menu) { d->statusNotifierItemDBus->ContextMenu(pos.x(), pos.y()); return; } +#endif if (d->menu && d->menu->isVisible()) { d->menu->hide(); @@ -759,8 +810,6 @@ menu(nullptr), associatedWidget(nullptr), titleAction(nullptr), - statusNotifierWatcher(nullptr), - notificationsClient(nullptr), systemTrayIcon(nullptr), hasQuit(false), onAllDesktops(false), @@ -770,19 +819,21 @@ void KStatusNotifierItemPrivate::init(const QString &extraId) { + q->setAssociatedWidget(qobject_cast(q->parent())); +#ifdef QT_DBUS_LIB qDBusRegisterMetaType(); qDBusRegisterMetaType(); qDBusRegisterMetaType(); statusNotifierItemDBus = new KStatusNotifierItemDBus(q); - q->setAssociatedWidget(qobject_cast(q->parent())); QDBusServiceWatcher *watcher = new QDBusServiceWatcher(QString::fromLatin1(s_statusNotifierWatcherServiceName), QDBusConnection::sessionBus(), QDBusServiceWatcher::WatchForOwnerChange, q); QObject::connect(watcher, SIGNAL(serviceOwnerChanged(QString,QString,QString)), q, SLOT(serviceChange(QString,QString,QString))); +#endif //create a default menu, just like in KSystemtrayIcon QMenu *m = new QMenu(associatedWidget); @@ -834,6 +885,8 @@ void KStatusNotifierItemPrivate::registerToDaemon() { + bool useLegacy = false; +#ifdef QT_DBUS_LIB qCDebug(LOG_KNOTIFICATIONS) << "Registering a client interface to the KStatusNotifierWatcher"; if (!statusNotifierWatcher) { statusNotifierWatcher = new org::kde::StatusNotifierWatcher(QString::fromLatin1(s_statusNotifierWatcherServiceName), QStringLiteral("/StatusNotifierWatcher"), @@ -871,8 +924,10 @@ ); } else { qCDebug(LOG_KNOTIFICATIONS) << "KStatusNotifierWatcher not reachable"; - setLegacySystemTrayEnabled(true); + useLegacy = true; } +#endif + setLegacySystemTrayEnabled(useLegacy); } void KStatusNotifierItemPrivate::serviceChange(const QString &name, const QString &oldOwner, const QString &newOwner) @@ -882,8 +937,10 @@ //unregistered qCDebug(LOG_KNOTIFICATIONS) << "Connection to the KStatusNotifierWatcher lost"; setLegacyMode(true); +#ifdef QT_DBUS_LIB delete statusNotifierWatcher; statusNotifierWatcher = nullptr; +#endif } else if (oldOwner.isEmpty()) { //registered setLegacyMode(false); @@ -903,7 +960,9 @@ void KStatusNotifierItemPrivate::legacyWheelEvent(int delta) { +#ifdef QT_DBUS_LIB statusNotifierItemDBus->Scroll(delta, QStringLiteral("vertical")); +#endif } void KStatusNotifierItemPrivate::legacyActivated(QSystemTrayIcon::ActivationReason reason) @@ -1114,6 +1173,7 @@ } } +#ifdef QT_DBUS_LIB KDbusImageStruct KStatusNotifierItemPrivate::imageToStruct(const QImage &image) { KDbusImageStruct icon; @@ -1153,6 +1213,7 @@ return iconVector; } +#endif #include "moc_kstatusnotifieritem.cpp" #include "moc_kstatusnotifieritemprivate_p.cpp" diff --git a/src/kstatusnotifieritemprivate_p.h b/src/kstatusnotifieritemprivate_p.h --- a/src/kstatusnotifieritemprivate_p.h +++ b/src/kstatusnotifieritemprivate_p.h @@ -29,10 +29,14 @@ #include #include "kstatusnotifieritem.h" + +#ifdef QT_DBUS_LIB #include "kstatusnotifieritemdbus_p.h" #include "statusnotifierwatcher_interface.h" #include "notifications_interface.h" +#endif + class KSystemTrayIcon; class QMenu; @@ -120,51 +124,58 @@ void legacyWheelEvent(int delta); void legacyActivated(QSystemTrayIcon::ActivationReason reason); - KDbusImageStruct imageToStruct(const QImage &image); - KDbusImageVector iconToVector(const QIcon &icon); bool checkVisibility(QPoint pos, bool perform = true); static const int s_protocolVersion; KStatusNotifierItem *q; +#ifdef QT_DBUS_LIB + KDbusImageStruct imageToStruct(const QImage &image); + KDbusImageVector iconToVector(const QIcon &icon); + + KDbusImageVector serializedIcon; + KDbusImageVector serializedAttentionIcon; + KDbusImageVector serializedOverlayIcon; + KDbusImageVector serializedToolTipIcon; + + + org::kde::StatusNotifierWatcher *statusNotifierWatcher = nullptr; + org::freedesktop::Notifications *notificationsClient = nullptr; + + KStatusNotifierItemDBus *statusNotifierItemDBus; +#endif + KStatusNotifierItem::ItemCategory category; QString id; QString title; KStatusNotifierItem::ItemStatus status; QString iconName; - KDbusImageVector serializedIcon; QIcon icon; QString overlayIconName; - KDbusImageVector serializedOverlayIcon; QIcon overlayIcon; QString attentionIconName; QIcon attentionIcon; - KDbusImageVector serializedAttentionIcon; QString movieName; QPointer movie; QString toolTipIconName; - KDbusImageVector serializedToolTipIcon; QIcon toolTipIcon; QString toolTipTitle; QString toolTipSubTitle; QString iconThemePath; QString menuObjectPath; + KStatusNotifierLegacyIcon *systemTrayIcon; QMenu *menu; QHash actionCollection; QWidget *associatedWidget; QPoint associatedWidgetPos; QAction *titleAction; - org::kde::StatusNotifierWatcher *statusNotifierWatcher; - org::freedesktop::Notifications *notificationsClient; - KStatusNotifierLegacyIcon *systemTrayIcon; - KStatusNotifierItemDBus *statusNotifierItemDBus; // Ensure that closing the last KMainWindow doesn't exit the application // if a system tray icon is still present.