From a0d734e68fc28e441d74075e4d8d0166bbcde180 Mon Sep 17 00:00:00 2001 From: Kevin Lamonte Date: Fri, 25 Aug 2017 09:59:32 -0400 Subject: [PATCH] Fixed for TJ --- src/jexer/TApplication.java | 18 ++++- src/jexer/TTerminalWindow.java | 77 +++++++++++++++------ src/jexer/bits/CellAttributes.java | 8 +-- src/jexer/bits/ColorTheme.java | 105 +++++++++++++++++------------ 4 files changed, 137 insertions(+), 71 deletions(-) diff --git a/src/jexer/TApplication.java b/src/jexer/TApplication.java index e319a4df..cfa81f4b 100644 --- a/src/jexer/TApplication.java +++ b/src/jexer/TApplication.java @@ -2836,6 +2836,22 @@ public class TApplication implements Runnable { return openTerminal(x, y, TWindow.RESIZABLE, commandLine); } + /** + * Convenience function to open a terminal window and execute a custom + * command line inside it. + * + * @param x column relative to parent + * @param y row relative to parent + * @param flags mask of CENTERED, MODAL, or RESIZABLE + * @param command the command line to execute + * @return the terminal new window + */ + public final TTerminalWindow openTerminal(final int x, final int y, + final int flags, final String [] command) { + + return new TTerminalWindow(this, x, y, flags, command); + } + /** * Convenience function to open a terminal window and execute a custom * command line inside it. @@ -2849,7 +2865,7 @@ public class TApplication implements Runnable { public final TTerminalWindow openTerminal(final int x, final int y, final int flags, final String commandLine) { - return new TTerminalWindow(this, x, y, flags, commandLine); + return new TTerminalWindow(this, x, y, flags, commandLine.split("\\s")); } /** diff --git a/src/jexer/TTerminalWindow.java b/src/jexer/TTerminalWindow.java index af319c92..828a3531 100644 --- a/src/jexer/TTerminalWindow.java +++ b/src/jexer/TTerminalWindow.java @@ -147,12 +147,34 @@ public class TTerminalWindow extends TScrollableWindow addShortcutKeypress(kbAltZ); } + /** + * Convert a string array to a whitespace-separated string. + * + * @param array the string array + * @return a single string + */ + private String stringArrayToString(final String [] array) { + StringBuilder sb = new StringBuilder(array[0].length()); + for (int i = 0; i < array.length; i++) { + sb.append(array[i]); + if (i < array.length - 1) { + sb.append(' '); + } + } + return sb.toString(); + } + /** * Spawn the shell. * - * @param commandLine the command line to execute + * @param command the command line to execute */ - private void spawnShell(final String commandLine) { + private void spawnShell(final String [] command) { + + /* + System.err.printf("spawnShell(): '%s'\n", + stringArrayToString(command)); + */ vScroller = new TVScroller(this, getWidth() - 2, 0, getHeight() - 2); setBottomValue(0); @@ -161,7 +183,6 @@ public class TTerminalWindow extends TScrollableWindow ECMA48.DeviceType deviceType = ECMA48.DeviceType.XTERM; try { - String [] command = commandLine.split("\\s"); ProcessBuilder pb = new ProcessBuilder(command); Map env = pb.environment(); env.put("TERM", ECMA48.deviceTypeTerm(deviceType)); @@ -200,7 +221,7 @@ public class TTerminalWindow extends TScrollableWindow public TTerminalWindow(final TApplication application, final int x, final int y, final String commandLine) { - this(application, x, y, RESIZABLE, commandLine); + this(application, x, y, RESIZABLE, commandLine.split("\\s")); } /** @@ -210,18 +231,15 @@ public class TTerminalWindow extends TScrollableWindow * @param x column relative to parent * @param y row relative to parent * @param flags mask of CENTERED, MODAL, or RESIZABLE - * @param commandLine the command line to execute + * @param command the command line to execute */ public TTerminalWindow(final TApplication application, final int x, - final int y, final int flags, final String commandLine) { + final int y, final int flags, final String [] command) { super(application, i18n.getString("windowTitle"), x, y, 80 + 2, 24 + 2, flags); - String cmdShellWindows = "cmd.exe /c" + commandLine; - String cmdShellGNU = "script -fqe /dev/null -c " + commandLine; - String cmdShellBSD = "script -q -F /dev/null -c " + commandLine; - String cmdShellPtypipe = "ptypipe " + commandLine; + String [] fullCommand; // Spawn a shell and pass its I/O to the other constructor. if ((System.getProperty("jexer.TTerminal.ptypipe") != null) @@ -229,17 +247,32 @@ public class TTerminalWindow extends TScrollableWindow equals("true")) ) { ptypipe = true; - spawnShell(cmdShellPtypipe); + fullCommand = new String[command.length + 1]; + fullCommand[0] = "ptypipe"; + System.arraycopy(command, 0, fullCommand, 1, command.length); } else if (System.getProperty("os.name").startsWith("Windows")) { - spawnShell(cmdShellWindows); + fullCommand = new String[3]; + fullCommand[0] = "cmd"; + fullCommand[1] = "/c"; + fullCommand[2] = stringArrayToString(command); } else if (System.getProperty("os.name").startsWith("Mac")) { - spawnShell(cmdShellBSD); - } else if (System.getProperty("os.name").startsWith("Linux")) { - spawnShell(cmdShellGNU); + fullCommand = new String[6]; + fullCommand[0] = "script"; + fullCommand[1] = "-q"; + fullCommand[2] = "-F"; + fullCommand[3] = "/dev/null"; + fullCommand[4] = "-c"; + fullCommand[5] = stringArrayToString(command); } else { - // When all else fails, assume GNU. - spawnShell(cmdShellGNU); + // Default: behave like Linux + fullCommand = new String[5]; + fullCommand[0] = "script"; + fullCommand[1] = "-fqe"; + fullCommand[2] = "/dev/null"; + fullCommand[3] = "-c"; + fullCommand[4] = stringArrayToString(command); } + spawnShell(fullCommand); } /** @@ -275,16 +308,16 @@ public class TTerminalWindow extends TScrollableWindow equals("true")) ) { ptypipe = true; - spawnShell(cmdShellPtypipe); + spawnShell(cmdShellPtypipe.split("\\s")); } else if (System.getProperty("os.name").startsWith("Windows")) { - spawnShell(cmdShellWindows); + spawnShell(cmdShellWindows.split("\\s")); } else if (System.getProperty("os.name").startsWith("Mac")) { - spawnShell(cmdShellBSD); + spawnShell(cmdShellBSD.split("\\s")); } else if (System.getProperty("os.name").startsWith("Linux")) { - spawnShell(cmdShellGNU); + spawnShell(cmdShellGNU.split("\\s")); } else { // When all else fails, assume GNU. - spawnShell(cmdShellGNU); + spawnShell(cmdShellGNU.split("\\s")); } } diff --git a/src/jexer/bits/CellAttributes.java b/src/jexer/bits/CellAttributes.java index 28dbe31d..c1455767 100644 --- a/src/jexer/bits/CellAttributes.java +++ b/src/jexer/bits/CellAttributes.java @@ -294,12 +294,8 @@ public class CellAttributes { */ @Override public String toString() { - if (bold) { - return String.format("bold %s on %s", - foreColor, backColor); - } else { - return String.format("%s on %s", foreColor, backColor); - } + return String.format("%s%s%s on %s", (bold == true ? "bold " : ""), + (blink == true ? "blink " : ""), foreColor, backColor); } } diff --git a/src/jexer/bits/ColorTheme.java b/src/jexer/bits/ColorTheme.java index caf7b434..baf7685b 100644 --- a/src/jexer/bits/ColorTheme.java +++ b/src/jexer/bits/ColorTheme.java @@ -118,6 +118,54 @@ public final class ColorTheme { load(new FileReader(filename)); } + /** + * Set a color based on a text string. Color text string is of the form: + * [ bold ] [ blink ] { foreground on background } + * + * @param key the color key string + * @param text the text string + */ + public void setColorFromString(final String key, final String text) { + boolean bold = false; + boolean blink = false; + String foreColor; + String backColor; + String token; + + StringTokenizer tokenizer = new StringTokenizer(text); + token = tokenizer.nextToken(); + while (token.equals("bold") || token.equals("blink")) { + if (token.equals("bold")) { + bold = true; + token = tokenizer.nextToken(); + } + if (token.equals("blink")) { + blink = true; + token = tokenizer.nextToken(); + } + } + + // What's left is "blah on blah" + foreColor = token.toLowerCase(); + + if (!tokenizer.nextToken().toLowerCase().equals("on")) { + // Invalid line. + return; + } + backColor = tokenizer.nextToken().toLowerCase(); + + CellAttributes color = new CellAttributes(); + if (bold) { + color.setBold(true); + } + if (blink) { + color.setBlink(true); + } + color.setForeColor(Color.getColor(foreColor)); + color.setBackColor(Color.getColor(backColor)); + colors.put(key, color); + } + /** * Read color theme mappings from a Reader. The reader is closed at the * end. @@ -129,56 +177,19 @@ public final class ColorTheme { BufferedReader bufferedReader = new BufferedReader(reader); String line = bufferedReader.readLine(); for (; line != null; line = bufferedReader.readLine()) { - String key; - boolean bold = false; - boolean blink = false; - String foreColor; - String backColor; - String token; - // Look for lines that resemble: // "key = blah on blah" // "key = bold blah on blah" // "key = blink bold blah on blah" // "key = bold blink blah on blah" // "key = blink blah on blah" - StringTokenizer tokenizer = new StringTokenizer(line); - key = tokenizer.nextToken(); - if (!tokenizer.nextToken().equals("=")) { - // Skip this line + if (line.indexOf('=') == -1) { + // Invalid line. continue; } - token = tokenizer.nextToken(); - while (token.equals("bold") || token.equals("blink")) { - if (token.equals("bold")) { - bold = true; - token = tokenizer.nextToken(); - } - if (token.equals("blink")) { - blink = true; - token = tokenizer.nextToken(); - } - } - - // What's left is "blah on blah" or "blah" - foreColor = token.toLowerCase(); - - if (!tokenizer.nextToken().toLowerCase().equals("on")) { - // Skip this line - continue; - } - backColor = tokenizer.nextToken().toLowerCase(); - - CellAttributes color = new CellAttributes(); - if (bold) { - color.setBold(true); - } - if (blink) { - color.setBlink(true); - } - color.setForeColor(Color.getColor(foreColor)); - color.setBackColor(Color.getColor(backColor)); - colors.put(key, color); + String key = line.substring(0, line.indexOf(':')).trim(); + String text = line.substring(line.indexOf(':') + 1); + setColorFromString(key, text); } // All done. bufferedReader.close(); @@ -495,4 +506,14 @@ public final class ColorTheme { } + /** + * Make human-readable description of this Cell. + * + * @return displayable String + */ + @Override + public String toString() { + return colors.toString(); + } + } -- 2.27.0