On linux, don't reuse the notification if it's already probably closed. Fixes nastyness on KDE4. Fixes issue #118.
Also merge the two ShowMessageNative functions to cut down on copypasta.
This commit is contained in:
parent
3a33d220f6
commit
4e5218a189
12
src/osd.cpp
12
src/osd.cpp
@ -26,7 +26,7 @@ const char* OSD::kSettingsGroup = "OSD";
|
|||||||
OSD::OSD(QSystemTrayIcon* tray_icon, QObject* parent)
|
OSD::OSD(QSystemTrayIcon* tray_icon, QObject* parent)
|
||||||
: QObject(parent),
|
: QObject(parent),
|
||||||
tray_icon_(tray_icon),
|
tray_icon_(tray_icon),
|
||||||
timeout_(5000),
|
timeout_msec_(5000),
|
||||||
behaviour_(Native),
|
behaviour_(Native),
|
||||||
show_on_volume_change_(false),
|
show_on_volume_change_(false),
|
||||||
show_art_(true),
|
show_art_(true),
|
||||||
@ -44,7 +44,7 @@ void OSD::ReloadSettings() {
|
|||||||
QSettings s;
|
QSettings s;
|
||||||
s.beginGroup(kSettingsGroup);
|
s.beginGroup(kSettingsGroup);
|
||||||
behaviour_ = OSD::Behaviour(s.value("Behaviour", Native).toInt());
|
behaviour_ = OSD::Behaviour(s.value("Behaviour", Native).toInt());
|
||||||
timeout_ = s.value("Timeout", 5000).toInt();
|
timeout_msec_ = s.value("Timeout", 5000).toInt();
|
||||||
show_on_volume_change_ = s.value("ShowOnVolumeChange", false).toBool();
|
show_on_volume_change_ = s.value("ShowOnVolumeChange", false).toBool();
|
||||||
show_art_ = s.value("ShowArt", true).toBool();
|
show_art_ = s.value("ShowArt", true).toBool();
|
||||||
|
|
||||||
@ -53,7 +53,7 @@ void OSD::ReloadSettings() {
|
|||||||
if (!SupportsTrayPopups() && behaviour_ == TrayPopup)
|
if (!SupportsTrayPopups() && behaviour_ == TrayPopup)
|
||||||
behaviour_ = Disabled;
|
behaviour_ = Disabled;
|
||||||
|
|
||||||
pretty_popup_->set_popup_duration(timeout_);
|
pretty_popup_->set_popup_duration(timeout_msec_);
|
||||||
pretty_popup_->ReloadSettings();
|
pretty_popup_->ReloadSettings();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -96,14 +96,14 @@ void OSD::ShowMessage(const QString& summary,
|
|||||||
switch (behaviour_) {
|
switch (behaviour_) {
|
||||||
case Native:
|
case Native:
|
||||||
if (image.isNull()) {
|
if (image.isNull()) {
|
||||||
ShowMessageNative(summary, message, icon);
|
ShowMessageNative(summary, message, icon, QImage());
|
||||||
} else {
|
} else {
|
||||||
ShowMessageNative(summary, message, image);
|
ShowMessageNative(summary, message, QString(), image);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TrayPopup:
|
case TrayPopup:
|
||||||
tray_icon_->showMessage(summary, message, QSystemTrayIcon::NoIcon, timeout_);
|
tray_icon_->showMessage(summary, message, QSystemTrayIcon::NoIcon, timeout_msec_);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Pretty:
|
case Pretty:
|
||||||
|
@ -73,16 +73,14 @@ class OSD : public QObject {
|
|||||||
|
|
||||||
// These are implemented in the OS-specific files
|
// These are implemented in the OS-specific files
|
||||||
void Init();
|
void Init();
|
||||||
void ShowMessageNative(const QString& summary,
|
|
||||||
const QString& message = QString(),
|
|
||||||
const QString& icon = QString());
|
|
||||||
void ShowMessageNative(const QString& summary,
|
void ShowMessageNative(const QString& summary,
|
||||||
const QString& message,
|
const QString& message,
|
||||||
const QImage& image);
|
const QString& icon = QString(),
|
||||||
|
const QImage& image = QImage());
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QSystemTrayIcon* tray_icon_;
|
QSystemTrayIcon* tray_icon_;
|
||||||
int timeout_;
|
int timeout_msec_;
|
||||||
Behaviour behaviour_;
|
Behaviour behaviour_;
|
||||||
bool show_on_volume_change_;
|
bool show_on_volume_change_;
|
||||||
bool show_art_;
|
bool show_art_;
|
||||||
@ -97,6 +95,7 @@ class OSD : public QObject {
|
|||||||
#ifdef Q_WS_X11
|
#ifdef Q_WS_X11
|
||||||
boost::scoped_ptr<org::freedesktop::Notifications> interface_;
|
boost::scoped_ptr<org::freedesktop::Notifications> interface_;
|
||||||
uint notification_id_;
|
uint notification_id_;
|
||||||
|
QDateTime last_notification_time_;
|
||||||
#endif
|
#endif
|
||||||
private slots:
|
private slots:
|
||||||
void CallFinished(QDBusPendingCallWatcher* watcher);
|
void CallFinished(QDBusPendingCallWatcher* watcher);
|
||||||
|
@ -119,15 +119,7 @@ bool OSD::SupportsTrayPopups() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void OSD::ShowMessageNative(const QString& summary, const QString& message,
|
void OSD::ShowMessageNative(const QString& summary, const QString& message,
|
||||||
const QString& icon) {
|
const QString& icon, const QImage& image) {
|
||||||
Q_UNUSED(icon);
|
Q_UNUSED(icon);
|
||||||
wrapper_->ShowMessage(summary, message, QImage());
|
|
||||||
}
|
|
||||||
|
|
||||||
void OSD::ShowMessageNative(const QString& summary,
|
|
||||||
const QString& message,
|
|
||||||
const QImage& image) {
|
|
||||||
wrapper_->ShowMessage(summary, message, image);
|
wrapper_->ShowMessage(summary, message, image);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -30,11 +30,6 @@ bool OSD::SupportsTrayPopups() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void OSD::ShowMessageNative(const QString&, const QString&,
|
void OSD::ShowMessageNative(const QString&, const QString&,
|
||||||
const QString&) {
|
const QString&, const QImage&) {
|
||||||
qWarning() << __PRETTY_FUNCTION__ << ": NOT IMPLEMENTED";
|
|
||||||
}
|
|
||||||
|
|
||||||
void OSD::ShowMessageNative(const QString& summary, const QString& message,
|
|
||||||
const QImage& image) {
|
|
||||||
qWarning() << __PRETTY_FUNCTION__ << ": NOT IMPLEMENTED";
|
qWarning() << __PRETTY_FUNCTION__ << ": NOT IMPLEMENTED";
|
||||||
}
|
}
|
||||||
|
@ -72,36 +72,30 @@ bool OSD::SupportsTrayPopups() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void OSD::ShowMessageNative(const QString& summary, const QString& message,
|
void OSD::ShowMessageNative(const QString& summary, const QString& message,
|
||||||
const QString& icon) {
|
const QString& icon, const QImage& image) {
|
||||||
QDBusPendingReply<uint> reply = interface_->Notify(
|
|
||||||
QCoreApplication::applicationName(),
|
|
||||||
notification_id_,
|
|
||||||
icon,
|
|
||||||
summary,
|
|
||||||
message,
|
|
||||||
QStringList(),
|
|
||||||
QVariantMap(),
|
|
||||||
timeout_);
|
|
||||||
QDBusPendingCallWatcher* watcher = new QDBusPendingCallWatcher(reply, this);
|
|
||||||
connect(watcher, SIGNAL(finished(QDBusPendingCallWatcher*)),
|
|
||||||
SLOT(CallFinished(QDBusPendingCallWatcher*)));
|
|
||||||
}
|
|
||||||
|
|
||||||
void OSD::ShowMessageNative(const QString& summary, const QString& message,
|
|
||||||
const QImage& image) {
|
|
||||||
QVariantMap hints;
|
QVariantMap hints;
|
||||||
if (!image.isNull()) {
|
if (!image.isNull()) {
|
||||||
hints["image_data"] = QVariant(image);
|
hints["image_data"] = QVariant(image);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int id = 0;
|
||||||
|
if (last_notification_time_.secsTo(QDateTime::currentDateTime()) * 1000
|
||||||
|
< timeout_msec_) {
|
||||||
|
// Reuse the existing popup if it's still open. The reason we don't always
|
||||||
|
// reuse the popup is because the notification daemon on KDE4 won't re-show
|
||||||
|
// the bubble if it's already gone to the tray. See issue #118
|
||||||
|
id = notification_id_;
|
||||||
|
}
|
||||||
|
|
||||||
QDBusPendingReply<uint> reply = interface_->Notify(
|
QDBusPendingReply<uint> reply = interface_->Notify(
|
||||||
QCoreApplication::applicationName(),
|
QCoreApplication::applicationName(),
|
||||||
notification_id_,
|
id,
|
||||||
QString(),
|
icon,
|
||||||
summary,
|
summary,
|
||||||
message,
|
message,
|
||||||
QStringList(),
|
QStringList(),
|
||||||
hints,
|
hints,
|
||||||
timeout_);
|
timeout_msec_);
|
||||||
QDBusPendingCallWatcher* watcher = new QDBusPendingCallWatcher(reply, this);
|
QDBusPendingCallWatcher* watcher = new QDBusPendingCallWatcher(reply, this);
|
||||||
connect(watcher, SIGNAL(finished(QDBusPendingCallWatcher*)),
|
connect(watcher, SIGNAL(finished(QDBusPendingCallWatcher*)),
|
||||||
SLOT(CallFinished(QDBusPendingCallWatcher*)));
|
SLOT(CallFinished(QDBusPendingCallWatcher*)));
|
||||||
@ -119,5 +113,6 @@ void OSD::CallFinished(QDBusPendingCallWatcher* watcher) {
|
|||||||
uint id = reply.value();
|
uint id = reply.value();
|
||||||
if (id != 0) {
|
if (id != 0) {
|
||||||
notification_id_ = id;
|
notification_id_ = id;
|
||||||
|
last_notification_time_ = QDateTime::currentDateTime();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user