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

View file

@ -821,6 +821,8 @@ bool ByDefault() {
} }
void Create(Window::Notifications::System *system) { void Create(Window::Notifications::System *system) {
static auto ServiceWatcher = CreateServiceWatcher();
const auto managerSetter = [=] { const auto managerSetter = [=] {
using ManagerType = Window::Notifications::ManagerType; using ManagerType = Window::Notifications::ManagerType;
if ((Core::App().settings().nativeNotifications() || Enforced()) if ((Core::App().settings().nativeNotifications() || Enforced())
@ -839,21 +841,34 @@ void Create(Window::Notifications::System *system) {
}; };
if (Gio::Application::get_default()) { if (Gio::Application::get_default()) {
ServiceWatcher = nullptr;
ServiceRegistered = false;
CurrentServerInformation = std::nullopt;
CurrentCapabilities = QStringList{};
managerSetter(); managerSetter();
return; return;
} }
static const auto ServiceWatcher = CreateServiceWatcher();
const auto counter = std::make_shared<int>(2); const auto counter = std::make_shared<int>(2);
const auto oneReady = [=] { const auto oneReady = [=] {
if (!--*counter) { if (!--*counter) {
// GApplication may be created while the reply is received
if (Gio::Application::get_default()) {
Core::App().notifications().createManager();
return;
}
managerSetter(); managerSetter();
} }
}; };
// snap doesn't allow access when the daemon is not running :( // snap doesn't allow access when the daemon is not running :(
StartServiceAsync([=] { StartServiceAsync([=] {
// GApplication may be created while the reply is received
if (Gio::Application::get_default()) {
Core::App().notifications().createManager();
return;
}
ServiceRegistered = GetServiceRegistered(); ServiceRegistered = GetServiceRegistered();
if (!ServiceRegistered) { if (!ServiceRegistered) {

View file

@ -291,6 +291,11 @@ void LaunchGApplication() {
nullptr))); nullptr)));
app->signal_startup().connect([=] { app->signal_startup().connect([=] {
// GNotification
InvokeQueued(qApp, [] {
Core::App().notifications().createManager();
});
QEventLoop loop; QEventLoop loop;
loop.exec(QEventLoop::ApplicationExec); loop.exec(QEventLoop::ApplicationExec);
app->quit(); app->quit();