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.

Reply via email to