Fix race condition between GApplication and GNotification

This commit is contained in:
Ilya Fedin
2022-11-26 02:36:28 +04:00
committed by John Preston
parent 51cd07945b
commit d6ed23b3dd
2 changed files with 22 additions and 2 deletions
@@ -821,6 +821,8 @@ bool ByDefault() {
}
void Create(Window::Notifications::System *system) {
static auto ServiceWatcher = CreateServiceWatcher();
const auto managerSetter = [=] {
using ManagerType = Window::Notifications::ManagerType;
if ((Core::App().settings().nativeNotifications() || Enforced())
@@ -839,21 +841,34 @@ void Create(Window::Notifications::System *system) {
};
if (Gio::Application::get_default()) {
ServiceWatcher = nullptr;
ServiceRegistered = false;
CurrentServerInformation = std::nullopt;
CurrentCapabilities = QStringList{};
managerSetter();
return;
}
static const auto ServiceWatcher = CreateServiceWatcher();
const auto counter = std::make_shared<int>(2);
const auto oneReady = [=] {
if (!--*counter) {
// GApplication may be created while the reply is received
if (Gio::Application::get_default()) {
Core::App().notifications().createManager();
return;
}
managerSetter();
}
};
// snap doesn't allow access when the daemon is not running :(
StartServiceAsync([=] {
// GApplication may be created while the reply is received
if (Gio::Application::get_default()) {
Core::App().notifications().createManager();
return;
}
ServiceRegistered = GetServiceRegistered();
if (!ServiceRegistered) {