From c29ed5f97214d022322345f5de11dac2cad6cf8b Mon Sep 17 00:00:00 2001 From: Alex Date: Sat, 4 Jul 2026 03:13:30 +0200 Subject: [PATCH] fix(client): don't exit when the desktop portal fails to start The Portal constructor synchronously auto-starts org.freedesktop.portal.Desktop via a Gio::DBus::Proxy. If that service fails or crashes on start it throws a Glib::Error, which was previously uncaught and terminated Waybar. Wrap the construction in a try/catch, log a warning and leave portal as nullptr on failure, and null-guard every dereference so a missing portal simply disables light/dark appearance detection instead of crashing. Fixes #3140, #3601. --- src/client.cpp | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/src/client.cpp b/src/client.cpp index 57e0fe5c..511e35af 100644 --- a/src/client.cpp +++ b/src/client.cpp @@ -211,7 +211,7 @@ const std::string waybar::Client::getStyle(const std::string& style, if (style.empty()) { std::vector search_files; - switch (appearance.value_or(portal->getAppearance())) { + switch (appearance.value_or(portal ? portal->getAppearance() : waybar::Appearance::UNKNOWN)) { case waybar::Appearance::LIGHT: search_files.emplace_back("style-light.css"); gtk_settings->property_gtk_application_prefer_dark_theme() = false; @@ -344,16 +344,26 @@ int waybar::Client::main(int argc, char* argv[]) { wl_display = gdk_wayland_display_get_wl_display(gdk_display->gobj()); config.load(config_opt); if (!portal) { - portal = std::make_unique(); + try { + portal = std::make_unique(); + } catch (const Glib::Error& e) { + spdlog::warn( + "Failed to connect to the desktop portal, light/dark theme detection disabled: {}", + std::string(e.what())); + } catch (...) { + spdlog::warn("Failed to connect to the desktop portal, light/dark theme detection disabled"); + } } m_cssFile = getStyle(style_opt); setupCss(m_cssFile); m_cssReloadHelper = std::make_unique(m_cssFile, [&](const std::string& css_file) { setupCss(css_file); }); - portal->signal_appearance_changed().connect([&](waybar::Appearance appearance) { - auto css_file = getStyle(style_opt, appearance); - m_cssReloadHelper->changeCssFile(css_file); - setupCss(css_file); - }); + if (portal) { + portal->signal_appearance_changed().connect([&](waybar::Appearance appearance) { + auto css_file = getStyle(style_opt, appearance); + m_cssReloadHelper->changeCssFile(css_file); + setupCss(css_file); + }); + } auto m_config = config.getConfig(); if (m_config.isObject() && m_config["reload_style_on_change"].asBool()) { @@ -378,5 +388,7 @@ int waybar::Client::main(int argc, char* argv[]) { void waybar::Client::reset() { gtk_app->quit(); // delete signal handler for css changes - portal->signal_appearance_changed().clear(); + if (portal) { + portal->signal_appearance_changed().clear(); + } }