Skip to content

Commit 61d9025

Browse files
authored
Merge pull request #33 from Koitharu/feature/gnome_fix
Improve dark mode detection in Gnome
2 parents fcc9bd8 + 9a3824c commit 61d9025

1 file changed

Lines changed: 16 additions & 7 deletions

File tree

src/main/java/com/jthemedetecor/GnomeThemeDetector.java

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,11 @@ class GnomeThemeDetector extends OsThemeDetector {
3838

3939
private static final Logger logger = LoggerFactory.getLogger(GnomeThemeDetector.class);
4040

41-
private static final String MONITORING_CMD = "gsettings monitor org.gnome.desktop.interface gtk-theme";
42-
private static final String GET_CMD = "gsettings get org.gnome.desktop.interface gtk-theme";
41+
private static final String MONITORING_CMD = "gsettings monitor org.gnome.desktop.interface";
42+
private static final String[] GET_CMD = new String[]{
43+
"gsettings get org.gnome.desktop.interface gtk-theme",
44+
"gsettings get org.gnome.desktop.interface color-scheme"
45+
};
4346

4447
private final Set<Consumer<Boolean>> listeners = new ConcurrentHashSet<>();
4548
private final Pattern darkThemeNamePattern = Pattern.compile(".*dark.*", Pattern.CASE_INSENSITIVE);
@@ -50,11 +53,13 @@ class GnomeThemeDetector extends OsThemeDetector {
5053
public boolean isDark() {
5154
try {
5255
Runtime runtime = Runtime.getRuntime();
53-
Process process = runtime.exec(GET_CMD);
54-
try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
55-
String readLine = reader.readLine();
56-
if (readLine != null) {
57-
return isDarkTheme(readLine);
56+
for (String cmd : GET_CMD) {
57+
Process process = runtime.exec(cmd);
58+
try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
59+
String readLine = reader.readLine();
60+
if (readLine != null && isDarkTheme(readLine)) {
61+
return true;
62+
}
5863
}
5964
}
6065
} catch (IOException e) {
@@ -98,6 +103,7 @@ public synchronized void removeListener(@Nullable Consumer<Boolean> darkThemeLis
98103
private static final class DetectorThread extends Thread {
99104

100105
private final GnomeThemeDetector detector;
106+
private final Pattern outputPattern = Pattern.compile("(gtk-theme|color-scheme).*", Pattern.CASE_INSENSITIVE);
101107
private boolean lastValue;
102108

103109
DetectorThread(@NotNull GnomeThemeDetector detector) {
@@ -117,6 +123,9 @@ public void run() {
117123
while (!this.isInterrupted()) {
118124
//Expected input = gtk-theme: '$GtkThemeName'
119125
String readLine = reader.readLine();
126+
if (!outputPattern.matcher(readLine).matches()) {
127+
continue;
128+
}
120129
String[] keyValue = readLine.split("\\s");
121130
String value = keyValue[1];
122131
boolean currentDetection = detector.isDarkTheme(value);

0 commit comments

Comments
 (0)