mirror of
https://hubproxy.babadafafafafa.cn/https://github.com/telegramdesktop/tdesktop
synced 2026-09-20 16:13:46 +08:00
Simplify GNotification actions
This commit is contained in:
@@ -139,32 +139,6 @@ bool UseGNotification() {
|
||||
return KSandbox::isFlatpak() && !ServiceRegistered;
|
||||
}
|
||||
|
||||
GLib::Variant AnyVectorToVariant(const std::vector<std::any> &value) {
|
||||
return GLib::Variant::new_array(
|
||||
value | ranges::views::transform([](const std::any &value) {
|
||||
try {
|
||||
return GLib::Variant::new_variant(
|
||||
GLib::Variant::new_uint64(std::any_cast<uint64>(value)));
|
||||
} catch (...) {
|
||||
}
|
||||
|
||||
try {
|
||||
return GLib::Variant::new_variant(
|
||||
GLib::Variant::new_int64(std::any_cast<int64>(value)));
|
||||
} catch (...) {
|
||||
}
|
||||
|
||||
try {
|
||||
return GLib::Variant::new_variant(
|
||||
AnyVectorToVariant(
|
||||
std::any_cast<std::vector<std::any>>(value)));
|
||||
} catch (...) {
|
||||
}
|
||||
|
||||
return GLib::Variant(nullptr);
|
||||
}) | ranges::to_vector);
|
||||
}
|
||||
|
||||
class NotificationData final : public base::has_weak_ptr {
|
||||
public:
|
||||
using NotificationId = Window::Notifications::Manager::NotificationId;
|
||||
@@ -212,6 +186,8 @@ private:
|
||||
ulong _notificationRepliedSignalId = 0;
|
||||
ulong _notificationClosedSignalId = 0;
|
||||
|
||||
rpl::lifetime _lifetime;
|
||||
|
||||
};
|
||||
|
||||
using Notification = std::unique_ptr<NotificationData>;
|
||||
@@ -238,6 +214,57 @@ bool NotificationData::init(const Info &info) {
|
||||
const auto &subtitle = info.subtitle;
|
||||
|
||||
if (_application) {
|
||||
auto actionMap = Gio::ActionMap(_application);
|
||||
|
||||
const auto dictToNotificationId = [](GLib::VariantDict dict) {
|
||||
using ContextId = Window::Notifications::Manager::ContextId;
|
||||
return NotificationId{
|
||||
.contextId = ContextId{
|
||||
.sessionId = dict.lookup_value("session").get_uint64(),
|
||||
.peerId = PeerId(dict.lookup_value("peer").get_uint64()),
|
||||
.topicRootId = dict.lookup_value("topic").get_int64(),
|
||||
},
|
||||
.msgId = dict.lookup_value("msgid").get_int64(),
|
||||
};
|
||||
};
|
||||
|
||||
auto activate = gi::wrap(
|
||||
G_SIMPLE_ACTION(
|
||||
actionMap.lookup_action("notification-activate").gobj_()),
|
||||
gi::transfer_none);
|
||||
|
||||
const auto activateSig = activate.signal_activate().connect([=](
|
||||
Gio::SimpleAction,
|
||||
GLib::Variant parameter) {
|
||||
Core::Sandbox::Instance().customEnterFromEventLoop([&] {
|
||||
_manager->notificationActivated(
|
||||
dictToNotificationId(GLib::VariantDict::new_(parameter)));
|
||||
});
|
||||
});
|
||||
|
||||
_lifetime.add([=]() mutable {
|
||||
activate.disconnect(activateSig);
|
||||
});
|
||||
|
||||
auto markAsRead = gi::wrap(
|
||||
G_SIMPLE_ACTION(
|
||||
actionMap.lookup_action("notification-mark-as-read").gobj_()),
|
||||
gi::transfer_none);
|
||||
|
||||
const auto markAsReadSig = markAsRead.signal_activate().connect([=](
|
||||
Gio::SimpleAction,
|
||||
GLib::Variant parameter) {
|
||||
Core::Sandbox::Instance().customEnterFromEventLoop([&] {
|
||||
_manager->notificationReplied(
|
||||
dictToNotificationId(GLib::VariantDict::new_(parameter)),
|
||||
{});
|
||||
});
|
||||
});
|
||||
|
||||
_lifetime.add([=]() mutable {
|
||||
markAsRead.disconnect(markAsReadSig);
|
||||
});
|
||||
|
||||
_notification = Gio::Notification::new_(
|
||||
subtitle.isEmpty()
|
||||
? title.toStdString()
|
||||
@@ -264,17 +291,40 @@ bool NotificationData::init(const Info &info) {
|
||||
set_category(_notification.gobj_(), "im.received");
|
||||
}
|
||||
|
||||
const auto idVariant = AnyVectorToVariant(_id.toAnyVector());
|
||||
const auto peer = info.peer;
|
||||
|
||||
const auto notificationVariant = GLib::Variant::new_array({
|
||||
GLib::Variant::new_dict_entry(
|
||||
GLib::Variant::new_string("session"),
|
||||
GLib::Variant::new_variant(
|
||||
GLib::Variant::new_uint64(peer->session().uniqueId()))),
|
||||
GLib::Variant::new_dict_entry(
|
||||
GLib::Variant::new_string("peer"),
|
||||
GLib::Variant::new_variant(
|
||||
GLib::Variant::new_uint64(peer->id.value))),
|
||||
GLib::Variant::new_dict_entry(
|
||||
GLib::Variant::new_string("peer"),
|
||||
GLib::Variant::new_variant(
|
||||
GLib::Variant::new_uint64(peer->id.value))),
|
||||
GLib::Variant::new_dict_entry(
|
||||
GLib::Variant::new_string("topic"),
|
||||
GLib::Variant::new_variant(
|
||||
GLib::Variant::new_int64(info.topicRootId.bare))),
|
||||
GLib::Variant::new_dict_entry(
|
||||
GLib::Variant::new_string("msgid"),
|
||||
GLib::Variant::new_variant(
|
||||
GLib::Variant::new_int64(info.itemId.bare))),
|
||||
});
|
||||
|
||||
_notification.set_default_action_and_target(
|
||||
"app.notification-activate",
|
||||
idVariant);
|
||||
notificationVariant);
|
||||
|
||||
if (!info.options.hideMarkAsRead) {
|
||||
_notification.add_button_with_target(
|
||||
tr::lng_context_mark_read(tr::now).toStdString(),
|
||||
"app.notification-mark-as-read",
|
||||
idVariant);
|
||||
notificationVariant);
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
Reference in New Issue
Block a user