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) {
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) {

View file

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