Allow inline replies from notifications on linux

This commit is contained in:
Nicolas Werner 2021-01-07 10:44:59 +01:00
parent 236bf09a0e
commit 4b4c321397
6 changed files with 58 additions and 11 deletions

View File

@ -282,6 +282,14 @@ ChatPage::ChatPage(QSharedPointer<UserSettings> userSettings, QWidget *parent)
room_list_->highlightSelectedRoom(roomid); room_list_->highlightSelectedRoom(roomid);
activateWindow(); activateWindow();
}); });
connect(&notificationsManager,
&NotificationsManager::sendNotificationReply,
this,
[this](const QString &roomid, const QString &eventid, const QString &body) {
view_manager_->queueReply(roomid, eventid, body);
room_list_->highlightSelectedRoom(roomid);
activateWindow();
});
setGroupViewState(userSettings_->groupView()); setGroupViewState(userSettings_->groupView());

View File

@ -36,6 +36,7 @@ public:
signals: signals:
void notificationClicked(const QString roomId, const QString eventId); void notificationClicked(const QString roomId, const QString eventId);
void sendNotificationReply(const QString roomId, const QString eventId, const QString body);
public slots: public slots:
void removeNotification(const QString &roomId, const QString &eventId); void removeNotification(const QString &roomId, const QString &eventId);
@ -58,6 +59,7 @@ private:
private slots: private slots:
void actionInvoked(uint id, QString action); void actionInvoked(uint id, QString action);
void notificationClosed(uint id, uint reason); void notificationClosed(uint id, uint reason);
void notificationReplied(uint id, QString reply);
}; };
#if defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD) #if defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD)

View File

@ -28,6 +28,12 @@ NotificationsManager::NotificationsManager(QObject *parent)
"NotificationClosed", "NotificationClosed",
this, this,
SLOT(notificationClosed(uint, uint))); SLOT(notificationClosed(uint, uint)));
QDBusConnection::sessionBus().connect("org.freedesktop.Notifications",
"/org/freedesktop/Notifications",
"org.freedesktop.Notifications",
"NotificationReplied",
this,
SLOT(notificationReplied(uint, QString)));
} }
void void
@ -56,14 +62,19 @@ NotificationsManager::showNotification(const QString summary,
hints["image-data"] = image; hints["image-data"] = image;
hints["sound-name"] = "message-new-instant"; hints["sound-name"] = "message-new-instant";
QList<QVariant> argumentList; QList<QVariant> argumentList;
argumentList << "nheko"; // app_name argumentList << "nheko"; // app_name
argumentList << (uint)0; // replace_id argumentList << (uint)0; // replace_id
argumentList << ""; // app_icon argumentList << ""; // app_icon
argumentList << summary; // summary argumentList << summary; // summary
argumentList << text; // body argumentList << text; // body
argumentList << (QStringList("default") << "reply"); // actions // The list of actions has always the action name and then a localized version of that
argumentList << hints; // hints // action. Currently we just use an empty string for that.
argumentList << (int)-1; // timeout in ms // TODO(Nico): Look into what to actually put there.
argumentList << (QStringList("default") << ""
<< "inline-reply"
<< ""); // actions
argumentList << hints; // hints
argumentList << (int)-1; // timeout in ms
static QDBusInterface notifyApp("org.freedesktop.Notifications", static QDBusInterface notifyApp("org.freedesktop.Notifications",
"/org/freedesktop/Notifications", "/org/freedesktop/Notifications",
@ -121,9 +132,20 @@ NotificationsManager::removeNotification(const QString &roomId, const QString &e
void void
NotificationsManager::actionInvoked(uint id, QString action) NotificationsManager::actionInvoked(uint id, QString action)
{ {
if (action == "default" && notificationIds.contains(id)) { if (notificationIds.contains(id)) {
roomEventId idEntry = notificationIds[id]; roomEventId idEntry = notificationIds[id];
emit notificationClicked(idEntry.roomId, idEntry.eventId); if (action == "default") {
emit notificationClicked(idEntry.roomId, idEntry.eventId);
}
}
}
void
NotificationsManager::notificationReplied(uint id, QString reply)
{
if (notificationIds.contains(id)) {
roomEventId idEntry = notificationIds[id];
emit sendNotificationReply(idEntry.roomId, idEntry.eventId, reply);
} }
} }

View File

@ -42,6 +42,7 @@ public slots:
void openFileSelection(); void openFileSelection();
bool uploading() const { return uploading_; } bool uploading() const { return uploading_; }
void callButton(); void callButton();
void message(QString body);
QObject *completerFor(QString completerName); QObject *completerFor(QString completerName);
@ -54,7 +55,6 @@ signals:
void uploadingChanged(bool value); void uploadingChanged(bool value);
private: private:
void message(QString body);
void emote(QString body); void emote(QString body);
void command(QString name, QString args); void command(QString name, QString args);
void image(const QString &filename, void image(const QString &filename,

View File

@ -508,6 +508,18 @@ TimelineViewManager::initWithMessages(const std::vector<QString> &roomIds)
addRoom(roomId); addRoom(roomId);
} }
void
TimelineViewManager::queueReply(const QString &roomid,
const QString &repliedToEvent,
const QString &replyBody)
{
auto room = models.find(roomid);
if (room != models.end()) {
room.value()->setReply(repliedToEvent);
room.value()->input()->message(replyBody);
}
}
void void
TimelineViewManager::queueReactionMessage(const QString &reactedEvent, const QString &reactionKey) TimelineViewManager::queueReactionMessage(const QString &reactedEvent, const QString &reactionKey)
{ {

View File

@ -120,6 +120,9 @@ public slots:
} }
void updateColorPalette(); void updateColorPalette();
void queueReply(const QString &roomid,
const QString &repliedToEvent,
const QString &replyBody);
void queueReactionMessage(const QString &reactedEvent, const QString &reactionKey); void queueReactionMessage(const QString &reactedEvent, const QString &reactionKey);
void queueCallMessage(const QString &roomid, const mtx::events::msg::CallInvite &); void queueCallMessage(const QString &roomid, const mtx::events::msg::CallInvite &);
void queueCallMessage(const QString &roomid, const mtx::events::msg::CallCandidates &); void queueCallMessage(const QString &roomid, const mtx::events::msg::CallCandidates &);