3636import org .glavo .monetfx .beans .property .ReadOnlyColorSchemeProperty ;
3737import org .glavo .monetfx .beans .property .SimpleColorSchemeProperty ;
3838import org .jackhuang .hmcl .ui .FXUtils ;
39+ import org .jackhuang .hmcl .util .io .FileUtils ;
3940import org .jackhuang .hmcl .ui .WindowsNativeUtils ;
4041import org .jackhuang .hmcl .util .platform .NativeUtils ;
4142import org .jackhuang .hmcl .util .platform .OSVersion ;
4647import org .jackhuang .hmcl .util .platform .windows .WinReg ;
4748import org .jackhuang .hmcl .util .platform .windows .WinTypes ;
4849
50+ import java .nio .file .Path ;
51+ import java .time .Duration ;
4952import java .util .*;
5053
5154import static org .jackhuang .hmcl .setting .ConfigHolder .config ;
55+ import static org .jackhuang .hmcl .util .logging .Logger .LOG ;
5256
5357/// @author Glavo
5458public final class Themes {
@@ -113,6 +117,7 @@ private static Brightness getDefaultBrightness() {
113117 if (defaultBrightness != null )
114118 return defaultBrightness ;
115119
120+ LOG .info ("Detecting system theme brightness" );
116121 Brightness brightness = Brightness .DEFAULT ;
117122 if (OperatingSystem .CURRENT_OS == OperatingSystem .WINDOWS ) {
118123 WinReg reg = WinReg .INSTANCE ;
@@ -130,7 +135,38 @@ private static Brightness getDefaultBrightness() {
130135 // If the key does not exist, it means Light mode is used
131136 brightness = Brightness .LIGHT ;
132137 }
138+ } else if (OperatingSystem .CURRENT_OS == OperatingSystem .LINUX ) {
139+ Path dbusSend = SystemUtils .which ("dbus-send" );
140+ if (dbusSend != null ) {
141+ try {
142+ String [] result = SystemUtils .run (List .of (
143+ FileUtils .getAbsolutePath (dbusSend ),
144+ "--session" ,
145+ "--print-reply=literal" ,
146+ "--reply-timeout=1000" ,
147+ "--dest=org.freedesktop.portal.Desktop" ,
148+ "/org/freedesktop/portal/desktop" ,
149+ "org.freedesktop.portal.Settings.Read" ,
150+ "string:org.freedesktop.appearance" ,
151+ "string:color-scheme"
152+ ), Duration .ofSeconds (2 )).trim ().split (" " );
153+
154+ if (result .length > 0 ) {
155+ String value = result [result .length - 1 ];
156+ // 1: prefer dark
157+ // 2: prefer light
158+ if ("1" .equals (value )) {
159+ brightness = Brightness .DARK ;
160+ } else if ("2" .equals (value )) {
161+ brightness = Brightness .LIGHT ;
162+ }
163+ }
164+ } catch (Exception e ) {
165+ LOG .warning ("Failed to get system theme from D-Bus" , e );
166+ }
167+ }
133168 }
169+ LOG .info ("Detected system theme brightness: " + brightness );
134170
135171 return defaultBrightness = brightness ;
136172 }
0 commit comments