Skip to content

Commit

Permalink
Support for Windows/ConEMU, #209
Browse files Browse the repository at this point in the history
  • Loading branch information
gnodet committed Jan 25, 2018
1 parent 64629eb commit 3ac6345
Show file tree
Hide file tree
Showing 12 changed files with 68 additions and 20 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -93,9 +93,9 @@ else if (osName.startsWith("FreeBSD")) {
}

@Override
public Terminal winSysTerminal(String name, Charset encoding, int codepage, boolean nativeSignals, Terminal.SignalHandler signalHandler) throws IOException {
public Terminal winSysTerminal(String name, String type, boolean ansiPassThrough, Charset encoding, int codepage, boolean nativeSignals, Terminal.SignalHandler signalHandler) throws IOException {
if (JANSI_MAJOR_VERSION > 1 || JANSI_MAJOR_VERSION == 1 && JANSI_MINOR_VERSION >= 12) {
JansiWinSysTerminal terminal = new JansiWinSysTerminal(name, encoding, codepage, nativeSignals, signalHandler);
JansiWinSysTerminal terminal = new JansiWinSysTerminal(name, type, ansiPassThrough, encoding, codepage, nativeSignals, signalHandler);
if (JANSI_MAJOR_VERSION == 1 && JANSI_MINOR_VERSION < 16) {
terminal.disableScrolling();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,12 +31,19 @@
public class JansiWinSysTerminal extends AbstractWindowsTerminal {

public JansiWinSysTerminal(String name, boolean nativeSignals) throws IOException {
this(name, null, 0, nativeSignals, SignalHandler.SIG_DFL);
this(name, TYPE_WINDOWS, false, null, 0, nativeSignals, SignalHandler.SIG_DFL);
}

public JansiWinSysTerminal(String name, Charset encoding, int codepage, boolean nativeSignals, SignalHandler signalHandler) throws IOException {
super(new WindowsAnsiWriter(new BufferedWriter(new JansiWinConsoleWriter())),
name, encoding, codepage, nativeSignals, signalHandler);
public JansiWinSysTerminal(String name, String type, boolean ansiPassThrough, Charset encoding, int codepage, boolean nativeSignals, SignalHandler signalHandler) throws IOException {
super(ansiPassThrough
? new JansiWinConsoleWriter()
: new WindowsAnsiWriter(new BufferedWriter(new JansiWinConsoleWriter())),
name,
type,
encoding,
codepage,
nativeSignals,
signalHandler);

// Start input pump thread
resume();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ public Pty open(Attributes attributes, Size size) throws IOException {
}

@Override
public Terminal winSysTerminal(String name, Charset encoding, int codepage, boolean nativeSignals, Terminal.SignalHandler signalHandler) throws IOException {
return new JnaWinSysTerminal(name, encoding, codepage, nativeSignals, signalHandler);
public Terminal winSysTerminal(String name, String type, boolean ansiPassThrough, Charset encoding, int codepage, boolean nativeSignals, Terminal.SignalHandler signalHandler) throws IOException {
return new JnaWinSysTerminal(name, type, ansiPassThrough, encoding, codepage, nativeSignals, signalHandler);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,12 +26,14 @@ public class JnaWinSysTerminal extends AbstractWindowsTerminal {
private static final Pointer consoleOut = Kernel32.INSTANCE.GetStdHandle(Kernel32.STD_OUTPUT_HANDLE);

public JnaWinSysTerminal(String name, boolean nativeSignals) throws IOException {
this(name, null, 0, nativeSignals, SignalHandler.SIG_DFL);
this(name, TYPE_WINDOWS, false, null, 0, nativeSignals, SignalHandler.SIG_DFL);
}

public JnaWinSysTerminal(String name, Charset encoding, int codepage, boolean nativeSignals, SignalHandler signalHandler) throws IOException {
super(new WindowsAnsiWriter(new BufferedWriter(new JnaWinConsoleWriter(consoleOut)), consoleOut),
name, encoding, codepage, nativeSignals, signalHandler);
public JnaWinSysTerminal(String name, String type, boolean ansiPassThrough, Charset encoding, int codepage, boolean nativeSignals, SignalHandler signalHandler) throws IOException {
super(ansiPassThrough
? new JnaWinConsoleWriter(consoleOut)
: new WindowsAnsiWriter(new BufferedWriter(new JnaWinConsoleWriter(consoleOut)), consoleOut),
name, type, encoding, codepage, nativeSignals, signalHandler);
strings.put(InfoCmp.Capability.key_mouse, "\\E[M");

// Start input pump thread
Expand Down
11 changes: 9 additions & 2 deletions terminal/src/main/java/org/jline/terminal/TerminalBuilder.java
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,9 @@
import org.jline.utils.Log;
import org.jline.utils.OSUtils;

import static org.jline.terminal.impl.AbstractWindowsTerminal.TYPE_WINDOWS;
import static org.jline.terminal.impl.AbstractWindowsTerminal.TYPE_WINDOWS_256_COLOR;

/**
* Builder class to create terminals.
*/
Expand Down Expand Up @@ -273,6 +276,10 @@ private Terminal doBuild() throws IOException {
IllegalStateException exception = new IllegalStateException("Unable to create a system terminal");
if (OSUtils.IS_WINDOWS) {
boolean cygwinTerm = "cygwin".equals(System.getenv("TERM"));
boolean ansiPassThrough = OSUtils.IS_CONEMU;
if (type == null) {
type = OSUtils.IS_CONEMU ? TYPE_WINDOWS_256_COLOR : TYPE_WINDOWS;
}
//
// Cygwin support
//
Expand All @@ -293,15 +300,15 @@ private Terminal doBuild() throws IOException {
}
if (jna) {
try {
return load(JnaSupport.class).winSysTerminal(name, encoding, codepage, nativeSignals, signalHandler);
return load(JnaSupport.class).winSysTerminal(name, type, ansiPassThrough, encoding, codepage, nativeSignals, signalHandler);
} catch (Throwable t) {
Log.debug("Error creating JNA based terminal: ", t.getMessage(), t);
exception.addSuppressed(t);
}
}
if (jansi) {
try {
return load(JansiSupport.class).winSysTerminal(name, encoding, codepage, nativeSignals, signalHandler);
return load(JansiSupport.class).winSysTerminal(name, type, ansiPassThrough, encoding, codepage, nativeSignals, signalHandler);
} catch (Throwable t) {
Log.debug("Error creating JANSI based terminal: ", t.getMessage(), t);
exception.addSuppressed(t);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@
public abstract class AbstractWindowsTerminal extends AbstractTerminal {

public static final String TYPE_WINDOWS = "windows";
public static final String TYPE_WINDOWS_256_COLOR = "windows-256color";

private static final int UTF8_CODE_PAGE = 65001;

Expand Down Expand Up @@ -77,8 +78,8 @@ public abstract class AbstractWindowsTerminal extends AbstractTerminal {
protected MouseTracking tracking = MouseTracking.Off;
private volatile boolean closing;

public AbstractWindowsTerminal(Writer writer, String name, Charset encoding, int codepage, boolean nativeSignals, SignalHandler signalHandler) throws IOException {
super(name, TYPE_WINDOWS, selectCharset(encoding, codepage), signalHandler);
public AbstractWindowsTerminal(Writer writer, String name, String type, Charset encoding, int codepage, boolean nativeSignals, SignalHandler signalHandler) throws IOException {
super(name, type, selectCharset(encoding, codepage), signalHandler);
NonBlockingPumpReader reader = NonBlocking.nonBlockingPumpReader();
this.slaveInputPipe = reader.getWriter();
this.reader = reader;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,6 @@ public interface JansiSupport {

Pty open(Attributes attributes, Size size) throws IOException;

Terminal winSysTerminal(String name, Charset encoding, int codepage, boolean nativeSignals, Terminal.SignalHandler signalHandler) throws IOException;
Terminal winSysTerminal(String name, String type, boolean ansiPassThrough, Charset encoding, int codepage, boolean nativeSignals, Terminal.SignalHandler signalHandler) throws IOException;

}
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,6 @@ public interface JnaSupport {

Pty open(Attributes attributes, Size size) throws IOException;

Terminal winSysTerminal(String name, Charset encoding, int codepage, boolean nativeSignals, Terminal.SignalHandler signalHandler) throws IOException;
Terminal winSysTerminal(String name, String type, boolean ansiPassThrough, Charset encoding, int codepage, boolean nativeSignals, Terminal.SignalHandler signalHandler) throws IOException;

}
2 changes: 1 addition & 1 deletion terminal/src/main/java/org/jline/utils/InfoCmp.java
Original file line number Diff line number Diff line change
Expand Up @@ -615,7 +615,7 @@ static String loadDefaultInfoCmp(String name) {

static {
for (String s : Arrays.asList("dumb", "ansi", "xterm", "xterm-256color",
"windows", "screen", "screen-256color")) {
"windows", "windows-256color", "screen", "screen-256color")) {
setDefaultInfoCmp(s, () -> loadDefaultInfoCmp(s));
}
}
Expand Down
3 changes: 3 additions & 0 deletions terminal/src/main/java/org/jline/utils/OSUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,9 @@ public class OSUtils {
&& System.getenv("MSYSTEM") != null
&& System.getenv("MSYSTEM").startsWith("MINGW");

public static final boolean IS_CONEMU = IS_WINDOWS
&& System.getenv("ConEmuPID") != null;

public static final boolean IS_OSX = System.getProperty("os.name").toLowerCase().contains("mac");

public static String TTY_COMMAND;
Expand Down
27 changes: 27 additions & 0 deletions terminal/src/main/resources/org/jline/utils/windows-256color.caps
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
windows-256color|windows with 256 colors terminal compatibility,
am, mc5i, mir, msgr,
colors#256, cols#80, it#8, lines#24, ncv#3, pairs#64,
bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z, clear=\E[H\E[J,
cr=^M, cub=\E[%p1%dD, cub1=\E[D, cud=\E[%p1%dB, cud1=\E[B,
cuf=\E[%p1%dC, cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH,
cuu=\E[%p1%dA, cuu1=\E[A,
il=\E[%p1%dL, il1=\E[L,
dl=\E[%p1%dM, dl1=\E[M,
ech=\E[%p1%dX,
el=\E[K, ed=\E[2K,
el1=\E[1K, home=\E[H, hpa=\E[%i%p1%dG,
ind=^J,
invis=\E[8m, kbs=^H, kcbt=\E[Z,
kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA,
khome=\E[H,
op=\E[39;49m,
rev=\E[7m,
rmacs=\E[10m, rmpch=\E[10m, rmso=\E[m, rmul=\E[m,
setab=\E[4%p1%dm, setaf=\E[3%p1%dm,
sgr=\E[0;10%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p6%t;1%;%?%p7%t;8%;%?%p9%t;11%;m,
sgr0=\E[0;10m,
smso=\E[7m,
smul=\E[4m,
kdch1=\E[3~, kich1=\E[2~, kend=\E[4~, knp=\E[6~, kpp=\E[5~,
kf1=\EOP, kf2=\EOQ, kf3=\EOR, kf4=\EOS, kf5=\E[15~, kf6=\E[17~,
kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, kf10=\E[21~, kf11=\E[23~, kf12=\E[24~,
Original file line number Diff line number Diff line change
Expand Up @@ -20,14 +20,15 @@
import java.io.StringWriter;
import java.nio.charset.Charset;

import static org.jline.terminal.impl.AbstractWindowsTerminal.TYPE_WINDOWS;
import static org.junit.Assert.assertEquals;

public class AbstractWindowsTerminalTest {

@Test
public void testWriterBuffering() throws Exception {
StringWriter sw = new StringWriter();
Terminal terminal = new AbstractWindowsTerminal(new AnsiWriter(new BufferedWriter(sw)), "name", Charset.defaultCharset(),0,
Terminal terminal = new AbstractWindowsTerminal(new AnsiWriter(new BufferedWriter(sw)), "name", TYPE_WINDOWS, Charset.defaultCharset(),0,
false, Terminal.SignalHandler.SIG_DFL) {
@Override
protected int getConsoleOutputCP() {
Expand Down

0 comments on commit 3ac6345

Please sign in to comment.