86 lines
2.1 KiB
C++
86 lines
2.1 KiB
C++
/*
|
|
This file is part of Telegram Desktop,
|
|
the official desktop application for the Telegram messaging service.
|
|
|
|
For license and copyright information please follow this link:
|
|
https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
|
*/
|
|
#include "platform/linux/linux_notification_service_watcher.h"
|
|
|
|
#include "core/application.h"
|
|
#include "main/main_domain.h"
|
|
#include "window/notifications_manager.h"
|
|
#include "base/platform/linux/base_linux_glibmm_helper.h"
|
|
#include "base/platform/linux/base_linux_dbus_utilities.h"
|
|
|
|
#include <glibmm.h>
|
|
#include <giomm.h>
|
|
|
|
namespace Platform {
|
|
namespace internal {
|
|
namespace {
|
|
|
|
constexpr auto kNotificationService = "org.freedesktop.Notifications"_cs;
|
|
|
|
bool IsNotificationServiceActivatable() {
|
|
static const auto Result = [] {
|
|
try {
|
|
const auto connection = Gio::DBus::Connection::get_sync(
|
|
Gio::DBus::BusType::BUS_TYPE_SESSION);
|
|
|
|
return ranges::contains(
|
|
base::Platform::DBus::ListActivatableNames(connection),
|
|
Glib::ustring(std::string(kNotificationService)));
|
|
} catch (...) {
|
|
}
|
|
|
|
return false;
|
|
}();
|
|
|
|
return Result;
|
|
}
|
|
|
|
} // namespace
|
|
|
|
class NotificationServiceWatcher::Private {
|
|
public:
|
|
Glib::RefPtr<Gio::DBus::Connection> dbusConnection;
|
|
uint signalId = 0;
|
|
};
|
|
|
|
NotificationServiceWatcher::NotificationServiceWatcher()
|
|
: _private(std::make_unique<Private>()) {
|
|
try {
|
|
_private->dbusConnection = Gio::DBus::Connection::get_sync(
|
|
Gio::DBus::BusType::BUS_TYPE_SESSION);
|
|
|
|
_private->signalId = base::Platform::DBus::RegisterServiceWatcher(
|
|
_private->dbusConnection,
|
|
std::string(kNotificationService),
|
|
[](
|
|
const Glib::ustring &service,
|
|
const Glib::ustring &oldOwner,
|
|
const Glib::ustring &newOwner) {
|
|
if (!Core::App().domain().started()
|
|
|| (IsNotificationServiceActivatable()
|
|
&& newOwner.empty())) {
|
|
return;
|
|
}
|
|
|
|
crl::on_main([] {
|
|
Core::App().notifications().createManager();
|
|
});
|
|
});
|
|
} catch (...) {
|
|
}
|
|
}
|
|
|
|
NotificationServiceWatcher::~NotificationServiceWatcher() {
|
|
if (_private->dbusConnection && _private->signalId != 0) {
|
|
_private->dbusConnection->signal_unsubscribe(_private->signalId);
|
|
}
|
|
}
|
|
|
|
} // namespace internal
|
|
} // namespace Platform
|