https://bugs.documentfoundation.org/show_bug.cgi?id=127138
--- Comment #32 from [email protected] --- I can reproduce this on Arch Linux with Sway/Wayland and LibreOffice’s GTK backend. Environment: - Arch Linux - Sway / Wayland - darkman - VCL: gtk3 - LibreOffice master at e954521c0364 - Appearance: System - Icon theme: Automatic - GTK icon theme: breeze darkman applies: # Dark gsettings set org.gnome.desktop.interface color-scheme prefer-dark gsettings set org.gnome.desktop.interface gtk-theme Adwaita-dark # Light gsettings set org.gnome.desktop.interface color-scheme prefer-light gsettings set org.gnome.desktop.interface gtk-theme Adwaita The XDG portal works correctly. org.freedesktop.portal.Settings.Read returns 1 for dark and 2 for light. Monitoring D-Bus also confirms that SettingChanged is emitted for both transitions. LibreOffice receives the color-scheme change, but automatic icon selection is asymmetric: switching to light selects breeze, while switching back to dark leaves breeze selected instead of breeze_dark. The cause is in IconThemeSelector::SelectIconThemeForDesktopEnvironment(). GTK supplies the icon theme name (breeze) and dark preference separately. Because breeze is installed, the selector returns it before considering mPreferDarkIconTheme. The attached patch first checks for an installed <preferred-theme>_dark variant when dark mode is preferred. If no such variant exists, existing behavior is preserved. Explicitly selected icon themes are unaffected because this only changes automatic desktop-theme selection. A focused IconThemeSelector regression test is included. make CppunitTest_vcl_app_test passes. I also tested the resulting build under Sway; automatic switching now works in both directions. This is related to Bug 148764, but the patch is intentionally limited to the existing _dark naming convention. My patch: diff --git a/vcl/qa/cppunit/app/test_IconThemeSelector.cxx b/vcl/qa/cppunit/app/test_IconThemeSelector.cxx index d11ab3d9722b..222e2d10d6c4 100644 --- a/vcl/qa/cppunit/app/test_IconThemeSelector.cxx +++ b/vcl/qa/cppunit/app/test_IconThemeSelector.cxx @@ -23,6 +23,7 @@ class IconThemeSelectorTest : public CppUnit::TestFixture void BreezeIsReturnedForKde5Desktop(); void ElementaryIsReturnedForGnomeDesktop(); void ThemeIsOverriddenByPreferredTheme(); + void DarkVariantOfPreferredThemeIsUsedInDarkMode(); void ThemeIsOverriddenByHighContrastMode(); void NotInstalledThemeDoesNotOverride(); void InstalledThemeIsFound(); @@ -40,6 +41,7 @@ class IconThemeSelectorTest : public CppUnit::TestFixture CPPUNIT_TEST(BreezeIsReturnedForKde5Desktop); CPPUNIT_TEST(ElementaryIsReturnedForGnomeDesktop); CPPUNIT_TEST(ThemeIsOverriddenByPreferredTheme); + CPPUNIT_TEST(DarkVariantOfPreferredThemeIsUsedInDarkMode); CPPUNIT_TEST(ThemeIsOverriddenByHighContrastMode); CPPUNIT_TEST(NotInstalledThemeDoesNotOverride); CPPUNIT_TEST(InstalledThemeIsFound); @@ -62,6 +64,8 @@ IconThemeSelectorTest::GetFakeInstalledThemes() vcl::IconThemeInfo a; a.mThemeId = "breeze"; r.push_back(a); + a.mThemeId = "breeze_dark"; + r.push_back(a); a.mThemeId = "elementary"; r.push_back(a); a.mThemeId = "colibre"; @@ -100,6 +104,16 @@ IconThemeSelectorTest::ThemeIsOverriddenByPreferredTheme() CPPUNIT_ASSERT_EQUAL_MESSAGE("'elementary' theme is overridden by breeze", preferred, selected); } +void IconThemeSelectorTest::DarkVariantOfPreferredThemeIsUsedInDarkMode() +{ + vcl::IconThemeSelector s; + s.SetPreferredIconTheme(u"breeze"_ustr, true); + std::vector<vcl::IconThemeInfo> themes = GetFakeInstalledThemes(); + OUString selected = s.SelectIconThemeForDesktopEnvironment(themes, DesktopType::GNOME); + CPPUNIT_ASSERT_EQUAL_MESSAGE("'breeze_dark' is used for dark mode", u"breeze_dark"_ustr, + selected); +} + void IconThemeSelectorTest::ThemeIsOverriddenByHighContrastMode() { diff --git a/vcl/source/app/IconThemeSelector.cxx b/vcl/source/app/IconThemeSelector.cxx index 0a8f0faf3ffc..24b8fea8c136 100644 --- a/vcl/source/app/IconThemeSelector.cxx +++ b/vcl/source/app/IconThemeSelector.cxx @@ -108,6 +108,12 @@ OUString IconThemeSelector::SelectIconThemeForDesktopEnvironment( const std::vector<IconThemeInfo>& installedThemes, DesktopType eDesktop) const { if (!mPreferredIconTheme.isEmpty()) { + if (mPreferDarkIconTheme) { + OUString darkTheme = mPreferredIconTheme + "_dark"; + if (icon_theme_is_in_installed_themes(darkTheme, installedThemes)) { + return darkTheme; + } + } if (icon_theme_is_in_installed_themes(mPreferredIconTheme, installedThemes)) { return mPreferredIconTheme; } -- You are receiving this mail because: You are the assignee for the bug.
