Fixed for TJ
authorKevin Lamonte <kevin.lamonte@gmail.com>
Fri, 25 Aug 2017 13:59:32 +0000 (09:59 -0400)
committerKevin Lamonte <kevin.lamonte@gmail.com>
Fri, 25 Aug 2017 13:59:32 +0000 (09:59 -0400)
src/jexer/TApplication.java
src/jexer/TTerminalWindow.java
src/jexer/bits/CellAttributes.java
src/jexer/bits/ColorTheme.java

index e319a4df410dba7ae7c7ab552dfa1d5e824fb47d..cfa81f4bab05f6508cdbefe7acb53ed096a1df1e 100644 (file)
@@ -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"));
     }
 
     /**
index af319c92d92ea3308037a998463a6c3f777e9a12..828a35310c6f6a78cac64594438e8911f1a9e7f6 100644 (file)
@@ -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<String, String> 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"));
         }
     }
 
index 28dbe31d95637e97a00c0231d7ab7abeefebf13a..c14557679ee4ff28298021d492b502661ebd0e2a 100644 (file)
@@ -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);
     }
 
 }
index caf7b434d59e16912025113754817dcdb4f8e96a..baf7685b4ef2331a2cb07a41e67700bc745a4c00 100644 (file)
@@ -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:
+     * <code>[ bold ] [ blink ] { foreground on background }</code>
+     *
+     * @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();
+    }
+
 }