From baa3b95af82db71e2017d967b6ffd08c9e2f74c1 Mon Sep 17 00:00:00 2001 From: Diogo Nunes Date: Mon, 30 Dec 2019 14:54:57 +0000 Subject: [PATCH] fix: if Win10, then enable Ansi support more info about this at https://stackoverflow.com/a/51681675/675577 --- pom.xml | 12 +++++++ .../diogonunes/jcdp/color/ColoredPrinter.java | 31 +++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/pom.xml b/pom.xml index bb72308..df1e034 100644 --- a/pom.xml +++ b/pom.xml @@ -151,6 +151,18 @@ + + + net.java.dev.jna + jna + 5.5.0 + + + net.java.dev.jna + jna-platform + 5.5.0 + + org.hamcrest hamcrest-library diff --git a/src/main/java/com/diogonunes/jcdp/color/ColoredPrinter.java b/src/main/java/com/diogonunes/jcdp/color/ColoredPrinter.java index 4a3c7d5..e940e02 100644 --- a/src/main/java/com/diogonunes/jcdp/color/ColoredPrinter.java +++ b/src/main/java/com/diogonunes/jcdp/color/ColoredPrinter.java @@ -7,6 +7,11 @@ import com.diogonunes.jcdp.color.api.Ansi.BColor; import com.diogonunes.jcdp.color.api.Ansi.FColor; import com.diogonunes.jcdp.color.api.IColoredPrinter; +import com.sun.jna.Function; +import com.sun.jna.platform.win32.WinDef.BOOL; +import com.sun.jna.platform.win32.WinDef.DWORD; +import com.sun.jna.platform.win32.WinDef.DWORDByReference; +import com.sun.jna.platform.win32.WinNT.HANDLE; import java.text.DateFormat; import java.text.SimpleDateFormat; @@ -41,6 +46,9 @@ public ColoredPrinter(Builder builder) { setAttribute(builder._attribute); setForegroundColor(builder._foregroundColor); setBackgroundColor(builder._backgroundColor); + + if (System.getProperty("os.name").startsWith("Windows")) + enableWindows10AnsiSupport(); } // ========= @@ -313,4 +321,27 @@ private void formattedPrint(Object msg, String ansiFormatCode, boolean appendNew String formattedMsg = Ansi.formatMessage(output.toString(), ansiFormatCode); System.out.print(formattedMsg); } + + /* Windows 10 supports Ansi codes. However, it's still experimental and not enabled by default. + * This method enables the necessary Windows 10 feature. + * + * More info: https://stackoverflow.com/a/51681675/675577 + * Code source: https://stackoverflow.com/a/52767586/675577 + * Reported issue: https://github.com/PowerShell/PowerShell/issues/11449#issuecomment-569531747 + */ + private void enableWindows10AnsiSupport() { + Function GetStdHandleFunc = Function.getFunction("kernel32", "GetStdHandle"); + DWORD STD_OUTPUT_HANDLE = new DWORD(-11); + HANDLE hOut = (HANDLE) GetStdHandleFunc.invoke(HANDLE.class, new Object[]{STD_OUTPUT_HANDLE}); + + DWORDByReference p_dwMode = new DWORDByReference(new DWORD(0)); + Function GetConsoleModeFunc = Function.getFunction("kernel32", "GetConsoleMode"); + GetConsoleModeFunc.invoke(BOOL.class, new Object[]{hOut, p_dwMode}); + + int ENABLE_VIRTUAL_TERMINAL_PROCESSING = 4; + DWORD dwMode = p_dwMode.getValue(); + dwMode.setValue(dwMode.intValue() | ENABLE_VIRTUAL_TERMINAL_PROCESSING); + Function SetConsoleModeFunc = Function.getFunction("kernel32", "SetConsoleMode"); + SetConsoleModeFunc.invoke(BOOL.class, new Object[]{hOut, dwMode}); + } }