void NotificationLayout::removeNotification(uint key, uint reason) { Notification *n = m_notifications.take(key); if (!n) { qDebug() << "Oooook! Expecting instance of notification, got:" << key; return; } int ix = m_layout->indexOf(n); if (ix == -1) { qDebug() << "Qooook! Widget not in layout. Impossible!" << n; return; } delete m_layout->takeAt(ix); n->deleteLater(); emit notificationClosed(key, reason); if (m_notifications.count() == 0) emit allNotificationsClosed(); checkHeight(); }
/* * Close the notification that has id. * * reasons: * -1 -> notification is a replacement, no NotificationClosed signal emitted * 1 -> the notification expired * 2 -> the notification was dismissed by the user_data * 3 -> The notification was closed by a call to CloseNotification */ int notification_close_by_id(int id, int reason) { notification *target = NULL; for (GList * iter = g_queue_peek_head_link(displayed); iter; iter = iter->next) { notification *n = iter->data; if (n->id == id) { g_queue_remove(displayed, n); g_queue_push_tail(history, n); target = n; break; } } for (GList * iter = g_queue_peek_head_link(queue); iter; iter = iter->next) { notification *n = iter->data; if (n->id == id) { g_queue_remove(queue, n); g_queue_push_tail(history, n); target = n; break; } } if (reason > 0 && reason < 4 && target != NULL) { notificationClosed(target, reason); } wake_up(); return reason; }
Notifyd::Notifyd(QObject* parent) : QObject(parent), mId(0) { m_area = new NotificationArea(); ReloadSettings(); connect(this, SIGNAL(notificationAdded(uint,QString,QString,QString,QString,int,QStringList,QVariantMap)), m_area->layout(), SLOT(addNotification(uint,QString,QString,QString,QString,int,QStringList,QVariantMap))); connect(this, SIGNAL(notificationClosed(uint, uint)), m_area->layout(), SLOT(removeNotification(uint, uint))); // feedback for original caller connect(m_area->layout(), SIGNAL(notificationClosed(uint,uint)), this, SIGNAL(NotificationClosed(uint,uint))); connect(m_area->layout(), SIGNAL(actionInvoked(uint, QString)), this, SIGNAL(ActionInvoked(uint,QString))); }
RazorNotificationPrivate::RazorNotificationPrivate(const QString& summary, RazorNotification* parent) : mId(0), mSummary(summary), mTimeout(-1), q_ptr(parent) { mInterface = new OrgFreedesktopNotificationsInterface("org.freedesktop.Notifications", "/org/freedesktop/Notifications", QDBusConnection::sessionBus(), this); connect(mInterface, SIGNAL(NotificationClosed(uint, uint)), this, SLOT(notificationClosed(uint,uint))); connect(mInterface, SIGNAL(ActionInvoked(uint,QString)), this, SLOT(handleAction(uint,QString))); }
void NotificationPresenterClientQt::displayNotification(Notification* notification, const QByteArray& bytes) { NotificationWrapper* wrapper = new NotificationWrapper(); m_notifications.insert(notification, wrapper); QString title; QString message; // FIXME: download & display HTML notifications if (notification->isHTML()) message = notification->url().string(); else { title = notification->contents().title(); message = notification->contents().body(); } if (m_platformPlugin.plugin() && m_platformPlugin.plugin()->supportsExtension(QWebKitPlatformPlugin::Notifications)) wrapper->m_presenter = m_platformPlugin.createNotificationPresenter(); if (!wrapper->m_presenter) { #ifndef QT_NO_SYSTEMTRAYICON if (!dumpNotification) wrapper->m_closeTimer.startOneShot(notificationTimeout); QPixmap pixmap; if (bytes.length() && pixmap.loadFromData(bytes)) { QIcon icon(pixmap); wrapper->m_notificationIcon = new QSystemTrayIcon(icon); } else wrapper->m_notificationIcon = new QSystemTrayIcon(); #endif } sendEvent(notification, "display"); // Make sure the notification was not cancelled during handling the display event if (m_notifications.find(notification) == m_notifications.end()) return; if (wrapper->m_presenter) { wrapper->connect(wrapper->m_presenter.get(), SIGNAL(notificationClosed()), wrapper, SLOT(notificationClosed()), Qt::QueuedConnection); wrapper->connect(wrapper->m_presenter.get(), SIGNAL(notificationClicked()), wrapper, SLOT(notificationClicked())); wrapper->m_presenter->showNotification(wrapper); return; } #ifndef QT_NO_SYSTEMTRAYICON wrapper->connect(wrapper->m_notificationIcon.get(), SIGNAL(messageClicked()), wrapper, SLOT(notificationClicked())); wrapper->m_notificationIcon->show(); wrapper->m_notificationIcon->showMessage(notification->contents().title(), notification->contents().body()); #endif }
void NotificationPresenterClientQt::displayNotification(Notification* notification) { NotificationWrapper* wrapper = new NotificationWrapper(); m_notifications.insert(notification, wrapper); QString title; QString message; // FIXME: download & display HTML notifications if (notification->isHTML()) message = notification->url().string(); else { title = notification->title(); message = notification->body(); } if (m_platformPlugin.plugin() && m_platformPlugin.plugin()->supportsExtension(QWebKitPlatformPlugin::Notifications)) wrapper->m_presenter = m_platformPlugin.createNotificationPresenter(); if (!wrapper->m_presenter) { #ifndef QT_NO_SYSTEMTRAYICON if (!dumpNotification) wrapper->m_closeTimer.startOneShot(notificationTimeout); #endif } wrapper->m_displayEventTimer.startOneShot(0); // Make sure the notification was not cancelled during handling the display event if (m_notifications.find(notification) == m_notifications.end()) return; if (wrapper->m_presenter) { wrapper->connect(wrapper->m_presenter.get(), SIGNAL(notificationClosed()), wrapper, SLOT(notificationClosed()), Qt::QueuedConnection); wrapper->connect(wrapper->m_presenter.get(), SIGNAL(notificationClicked()), wrapper, SLOT(notificationClicked())); wrapper->m_presenter->showNotification(wrapper); return; } #ifndef QT_NO_SYSTEMTRAYICON wrapper->connect(m_systemTrayIcon.data(), SIGNAL(messageClicked()), wrapper, SLOT(notificationClicked())); QMetaObject::invokeMethod(m_systemTrayIcon.data(), "show"); QMetaObject::invokeMethod(m_systemTrayIcon.data(), "showMessage", Q_ARG(QString, notification->title()), Q_ARG(QString, notification->body())); #endif }
/* * Close the notification that has id. * * reasons: * -1 -> notification is a replacement, no NotificationClosed signal emitted * 1 -> the notification expired * 2 -> the notification was dismissed by the user_data * 3 -> The notification was closed by a call to CloseNotification */ int notification_close_by_id(int id, int reason) { int free = 0; notification *target = NULL; for (GList * iter = g_queue_peek_head_link(displayed); iter; iter = iter->next) { notification *n = iter->data; if (n->id == id) { g_queue_remove(displayed, n); if(reason != 4) { history_push(n); } else free =1 ; target = n; break; } } for (GList * iter = g_queue_peek_head_link(queue); iter; iter = iter->next) { notification *n = iter->data; if (n->id == id) { g_queue_remove(queue, n); if(reason != 4) { history_push(n); } else free =1 ; target = n; break; } } if (reason > 0 && reason < 5 && target != NULL) { notificationClosed(target, reason); } if(free) { notification_free(target); } wake_up(); return reason; }
void IdlenessWatcher::screenUnlocked(int exitCode, QProcess::ExitStatus exitStatus) { mIsLocked = false; emit ActiveChanged(false); if (exitCode == 0) { restartTimer(); } else { mErrorNotification.setSummary(tr("ERROR: Screen unlocked")); if (exitStatus == QProcess::NormalExit) mErrorNotification.setBody(tr("Locking program \"%1\" exited with error code %2").arg(mLockCommand).arg(exitCode)); else mErrorNotification.setBody(tr("Locking program \"%1\" crashed with error code %2").arg(mLockCommand).arg(exitCode)); mErrorNotification.update(); mTimer.stop(); connect(&mErrorNotification, SIGNAL(notificationClosed(CloseReason)), SLOT(idleTimeout())); } }
void Notifyd::CloseNotification(uint id) { emit notificationClosed(id, 3); }
/////////////////////////////////////// PUBLIC FUNCTIONS //////////////////////////////// // // Function to connect to a notification server. void NotifyClient::connectToServer() { // return now if we already have a valid connection if (b_validconnection) return; notifyclient = new QDBusInterface(DBUS_NOTIFY_SERVICE, DBUS_NOTIFY_PATH, DBUS_NOTIFY_INTERFACE, QDBusConnection::sessionBus(), this); if (notifyclient->isValid() ) { b_validconnection = true; getServerInformation(); getCapabilities(); QDBusConnection::sessionBus().connect(DBUS_NOTIFY_SERVICE, DBUS_NOTIFY_PATH, DBUS_NOTIFY_INTERFACE, "NotificationClosed", this, SLOT(notificationClosed(quint32, quint32))); QDBusConnection::sessionBus().connect(DBUS_NOTIFY_SERVICE, DBUS_NOTIFY_PATH, DBUS_NOTIFY_INTERFACE, "ActionInvoked", this, SLOT(actionInvoked(quint32, QString))); } // if connection is valid else { notifyclient->deleteLater(); b_validconnection = false; } // else connection not valid }
AsemanLinuxNativeNotification::AsemanLinuxNativeNotification(QObject *parent) : QObject(parent) { p = new AsemanLinuxNativeNotificationPrivate; p->connection = new QDBusConnection( QDBusConnection::sessionBus() ); p->connection->connect( DBUS_SERVICE , DBUS_PATH , DBUS_OBJECT , DBUS_CLOSED , this , SLOT(notificationClosed(QDBusMessage)) ); p->connection->connect( DBUS_SERVICE , DBUS_PATH , DBUS_OBJECT , DBUS_ACTION , this , SLOT(actionInvoked(QDBusMessage)) ); }
StatusNotifierItem::StatusNotifierItem(QWidget *parent) : StatusNotifierItemParent(parent) #if QT_VERSION >= 0x050000 , _iconThemeDir{QDir::tempPath() + QLatin1String{"/quassel-sni-XXXXXX"}} #endif { static bool registered = []() -> bool { qDBusRegisterMetaType<DBusImageStruct>(); qDBusRegisterMetaType<DBusImageVector>(); qDBusRegisterMetaType<DBusToolTipStruct>(); return true; }(); Q_UNUSED(registered) setMode(Mode::StatusNotifier); connect(this, SIGNAL(visibilityChanged(bool)), this, SLOT(onVisibilityChanged(bool))); connect(this, SIGNAL(modeChanged(Mode)), this, SLOT(onModeChanged(Mode))); connect(this, SIGNAL(stateChanged(State)), this, SLOT(onStateChanged(State))); trayMenu()->installEventFilter(this); // Create a temporary directory that holds copies of the tray icons. That way, visualizers can find our icons. // For Qt4 the relevant icons are installed in hicolor already, so nothing to be done. #if QT_VERSION >= 0x050000 if (_iconThemeDir.isValid()) { _iconThemePath = _iconThemeDir.path(); } else { qWarning() << "Could not create temporary directory for themed tray icons!"; } #endif connect(this, SIGNAL(iconsChanged()), this, SLOT(refreshIcons())); refreshIcons(); // Our own SNI service _statusNotifierItemDBus = new StatusNotifierItemDBus(this); connect(this, SIGNAL(currentIconNameChanged()), _statusNotifierItemDBus, SIGNAL(NewIcon())); connect(this, SIGNAL(currentIconNameChanged()), _statusNotifierItemDBus, SIGNAL(NewAttentionIcon())); connect(this, SIGNAL(toolTipChanged(QString, QString)), _statusNotifierItemDBus, SIGNAL(NewToolTip())); // Service watcher to keep track of the StatusNotifierWatcher service QDBusServiceWatcher *watcher = new QDBusServiceWatcher(kSniWatcherService, QDBusConnection::sessionBus(), QDBusServiceWatcher::WatchForOwnerChange, this); connect(watcher, SIGNAL(serviceOwnerChanged(QString, QString, QString)), SLOT(serviceChange(QString, QString, QString))); // Client instance for StatusNotifierWatcher _statusNotifierWatcher = new org::kde::StatusNotifierWatcher(kSniWatcherService, kSniWatcherPath, QDBusConnection::sessionBus(), this); connect(_statusNotifierWatcher, SIGNAL(StatusNotifierHostRegistered()), SLOT(checkForRegisteredHosts())); connect(_statusNotifierWatcher, SIGNAL(StatusNotifierHostUnregistered()), SLOT(checkForRegisteredHosts())); // Client instance for notifications _notificationsClient = new org::freedesktop::Notifications(kXdgNotificationsService, kXdgNotificationsPath, QDBusConnection::sessionBus(), this); connect(_notificationsClient, SIGNAL(NotificationClosed(uint, uint)), SLOT(notificationClosed(uint, uint))); connect(_notificationsClient, SIGNAL(ActionInvoked(uint, QString)), SLOT(notificationInvoked(uint, QString))); if (_notificationsClient->isValid()) { QStringList desktopCapabilities = _notificationsClient->GetCapabilities(); _notificationsClientSupportsMarkup = desktopCapabilities.contains("body-markup"); _notificationsClientSupportsActions = desktopCapabilities.contains("actions"); } #ifdef HAVE_DBUSMENU new QuasselDBusMenuExporter(menuObjectPath(), trayMenu(), _statusNotifierItemDBus->dbusConnection()); // will be added as menu child #endif }