85 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			85 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
 | 
