Skip to content

Commit c6dbf20

Browse files
committed
Improve dumb terminal detection
1 parent 81f9e69 commit c6dbf20

3 files changed

Lines changed: 78 additions & 25 deletions

File tree

src/main/java/xyz/jpenilla/betterfabricconsole/console/ConsoleThread.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,19 +23,19 @@
2323
*/
2424
package xyz.jpenilla.betterfabricconsole.console;
2525

26+
import java.io.BufferedReader;
27+
import java.io.IOException;
28+
import java.io.InputStream;
29+
import java.io.InputStreamReader;
30+
import java.io.UncheckedIOException;
2631
import net.minecraft.server.MinecraftServer;
2732
import net.minecraft.server.dedicated.DedicatedServer;
2833
import org.jline.reader.EndOfFileException;
2934
import org.jline.reader.LineReader;
3035
import org.jline.reader.UserInterruptException;
3136
import org.jspecify.annotations.NullMarked;
3237
import xyz.jpenilla.betterfabricconsole.BetterFabricConsole;
33-
import xyz.jpenilla.betterfabricconsole.util.TerminalDetection;
34-
import java.io.BufferedReader;
35-
import java.io.IOException;
36-
import java.io.InputStream;
37-
import java.io.InputStreamReader;
38-
import java.io.UncheckedIOException;
38+
import xyz.jpenilla.betterfabricconsole.util.TerminalModeDetection;
3939

4040
@NullMarked
4141
public final class ConsoleThread extends Thread {
@@ -57,7 +57,7 @@ public ConsoleThread(
5757
@Override
5858
public void run() {
5959
BetterFabricConsole.LOGGER.info("Initialized Better Fabric Console console thread.");
60-
if (TerminalDetection.isDumb()) {
60+
if (TerminalModeDetection.isDumb()) {
6161
this.acceptInput(System.in);
6262
} else {
6363
this.acceptTerminalInput();

src/main/java/xyz/jpenilla/betterfabricconsole/util/TerminalDetection.java renamed to src/main/java/xyz/jpenilla/betterfabricconsole/util/TerminalMode.java

Lines changed: 5 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -23,23 +23,10 @@
2323
*/
2424
package xyz.jpenilla.betterfabricconsole.util;
2525

26-
import org.checkerframework.checker.nullness.qual.Nullable;
27-
import org.jline.terminal.Terminal;
28-
import org.jline.terminal.TerminalBuilder;
29-
import java.io.IOException;
26+
import org.jspecify.annotations.NullMarked;
3027

31-
public final class TerminalDetection {
32-
private static final @Nullable Terminal TERMINAL = detectTerminal();
33-
34-
private static @Nullable Terminal detectTerminal() {
35-
try {
36-
return TerminalBuilder.builder().dumb(false).build();
37-
} catch (final IOException | IllegalStateException e) {
38-
return null;
39-
}
40-
}
41-
42-
public static boolean isDumb() {
43-
return TERMINAL == null;
44-
}
28+
@NullMarked
29+
public enum TerminalMode {
30+
DUMB,
31+
INTERACTIVE
4532
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
/*
2+
* This file is part of Better Fabric Console, licensed under the MIT License.
3+
*
4+
* Copyright (c) 2021-2024 Jason Penilla
5+
*
6+
* Permission is hereby granted, free of charge, to any person obtaining a copy
7+
* of this software and associated documentation files (the "Software"), to deal
8+
* in the Software without restriction, including without limitation the rights
9+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10+
* copies of the Software, and to permit persons to whom the Software is
11+
* furnished to do so, subject to the following conditions:
12+
*
13+
* The above copyright notice and this permission notice shall be included in all
14+
* copies or substantial portions of the Software.
15+
*
16+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22+
* SOFTWARE.
23+
*/
24+
package xyz.jpenilla.betterfabricconsole.util;
25+
26+
import java.io.IOException;
27+
import org.jline.terminal.Terminal;
28+
import org.jline.terminal.TerminalBuilder;
29+
import org.jspecify.annotations.NullMarked;
30+
31+
@NullMarked
32+
public final class TerminalModeDetection {
33+
private static final boolean CONSOLE_INPUT_AVAILABLE = System.console() != null;
34+
private static final TerminalMode MODE = detectMode();
35+
36+
private TerminalModeDetection() {
37+
}
38+
39+
private static TerminalMode detectMode() {
40+
if (!CONSOLE_INPUT_AVAILABLE) {
41+
return TerminalMode.DUMB;
42+
}
43+
44+
try (Terminal terminal = TerminalBuilder.builder().system(true).dumb(false).build()) {
45+
return Terminal.TYPE_DUMB.equals(terminal.getType()) ? TerminalMode.DUMB : TerminalMode.INTERACTIVE;
46+
} catch (final IOException | IllegalStateException e) {
47+
return TerminalMode.DUMB;
48+
}
49+
}
50+
51+
public static TerminalMode mode() {
52+
return MODE;
53+
}
54+
55+
public static boolean isDumb() {
56+
return MODE == TerminalMode.DUMB;
57+
}
58+
59+
public static boolean isInteractive() {
60+
return MODE == TerminalMode.INTERACTIVE;
61+
}
62+
63+
public static boolean hasConsoleInput() {
64+
return CONSOLE_INPUT_AVAILABLE;
65+
}
66+
}

0 commit comments

Comments
 (0)