From 3312286f425c19406f2eb87e01e622a8e380886c Mon Sep 17 00:00:00 2001 From: stransky Date: Mon, 6 Nov 2023 09:40:32 +0000 Subject: [PATCH] Bug 1762816 [Linux] Watch org.freedesktop.portal.Desktop DBus name and get session data only if it's running r=emilio Don't autostart org.freedesktop.portal.Desktop by g_dbus_proxy_new_for_bus_sync(), that may block Firefox start for 30~ seconds after desktop start. Use g_bus_watch_name() and get session data only if org.freedesktop.portal.Desktop is available. Differential Revision: https://phabricator.services.mozilla.com/D192335 --- widget/gtk/nsLookAndFeel.cpp | 61 +++++++++++++++++++++++++++--------- widget/gtk/nsLookAndFeel.h | 4 +++ 2 files changed, 50 insertions(+), 15 deletions(-) diff --git a/widget/gtk/nsLookAndFeel.cpp b/widget/gtk/nsLookAndFeel.cpp index d1d86ef519bd..0b7a5d93c055 100644 --- a/widget/gtk/nsLookAndFeel.cpp +++ b/widget/gtk/nsLookAndFeel.cpp @@ -134,6 +134,35 @@ static void settings_changed_signal_cb(GDBusProxy* proxy, gchar* sender_name, } } +void nsLookAndFeel::WatchDBus() { + GUniquePtr error; + mDBusSettingsProxy = dont_AddRef(g_dbus_proxy_new_for_bus_sync( + G_BUS_TYPE_SESSION, G_DBUS_PROXY_FLAGS_NONE, nullptr, + "org.freedesktop.portal.Desktop", "/org/freedesktop/portal/desktop", + "org.freedesktop.portal.Settings", nullptr, getter_Transfers(error))); + if (mDBusSettingsProxy) { + g_signal_connect(mDBusSettingsProxy, "g-signal", + G_CALLBACK(settings_changed_signal_cb), this); + } else { + LOGLNF("Can't create DBus proxy for settings: %s\n", error->message); + return; + } + + // DBus interface was started after L&F init so we need to load + // our settings from DBus explicitly. + if (!sIgnoreChangedSettings) { + OnColorSchemeSettingChanged(); + } +} + +void nsLookAndFeel::UnwatchDBus() { + if (mDBusSettingsProxy) { + g_signal_handlers_disconnect_by_func( + mDBusSettingsProxy, FuncToGpointer(settings_changed_signal_cb), this); + mDBusSettingsProxy = nullptr; + } +} + nsLookAndFeel::nsLookAndFeel() { static constexpr nsLiteralCString kObservedSettings[] = { // Affects system font sizes. @@ -172,27 +201,29 @@ nsLookAndFeel::nsLookAndFeel() { nsWindow::GetSystemGtkWindowDecoration() != nsWindow::GTK_DECORATION_NONE; if (ShouldUsePortal(PortalKind::Settings)) { - GUniquePtr error; - mDBusSettingsProxy = dont_AddRef(g_dbus_proxy_new_for_bus_sync( - G_BUS_TYPE_SESSION, G_DBUS_PROXY_FLAGS_NONE, nullptr, - "org.freedesktop.portal.Desktop", "/org/freedesktop/portal/desktop", - "org.freedesktop.portal.Settings", nullptr, getter_Transfers(error))); - if (mDBusSettingsProxy) { - g_signal_connect(mDBusSettingsProxy, "g-signal", - G_CALLBACK(settings_changed_signal_cb), this); - } else { - LOGLNF("Can't create DBus proxy for settings: %s\n", error->message); - } + mDBusID = g_bus_watch_name( + G_BUS_TYPE_SESSION, "org.freedesktop.portal.Desktop", + G_BUS_NAME_WATCHER_FLAGS_AUTO_START, + [](GDBusConnection*, const gchar*, const gchar*, + gpointer data) -> void { + auto* lnf = static_cast(data); + lnf->WatchDBus(); + }, + [](GDBusConnection*, const gchar*, gpointer data) -> void { + auto* lnf = static_cast(data); + lnf->UnwatchDBus(); + }, + this, nullptr); } } nsLookAndFeel::~nsLookAndFeel() { ClearRoundedCornerProvider(); - if (mDBusSettingsProxy) { - g_signal_handlers_disconnect_by_func( - mDBusSettingsProxy, FuncToGpointer(settings_changed_signal_cb), this); - mDBusSettingsProxy = nullptr; + if (mDBusID) { + g_bus_unwatch_name(mDBusID); + mDBusID = 0; } + UnwatchDBus(); g_signal_handlers_disconnect_by_func( gtk_settings_get_default(), FuncToGpointer(settings_changed_cb), nullptr); } diff --git a/widget/gtk/nsLookAndFeel.h b/widget/gtk/nsLookAndFeel.h index e13c619e6634..48400b31c042 100644 --- a/widget/gtk/nsLookAndFeel.h +++ b/widget/gtk/nsLookAndFeel.h @@ -53,6 +53,9 @@ class nsLookAndFeel final : public nsXPLookAndFeel { static bool ShouldHonorThemeScrollbarColors(); mozilla::Maybe ComputeColorSchemeSetting(); + void WatchDBus(); + void UnwatchDBus(); + enum class ThemeFamily : uint8_t { // Adwaita, the default GTK theme. Adwaita, @@ -160,6 +163,7 @@ class nsLookAndFeel final : public nsXPLookAndFeel { return mSystemThemeOverridden ? mAltTheme : mSystemTheme; } + uint32_t mDBusID = 0; RefPtr mDBusSettingsProxy; mozilla::Maybe mColorSchemePreference; int32_t mCaretBlinkTime = 0;