X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fjexer%2FTTerminalWindow.java;h=3dc6a4c19e11322f22d4d20126721cb01f4b7209;hb=499fdccfad144aa58869d839d50edb898670626a;hp=4b8bec494071c4f88b504382319817ef90ac9771;hpb=be72cb5ccbd42fe304c0acafc380c5636f0d03a2;p=fanfix.git diff --git a/src/jexer/TTerminalWindow.java b/src/jexer/TTerminalWindow.java index 4b8bec4..3dc6a4c 100644 --- a/src/jexer/TTerminalWindow.java +++ b/src/jexer/TTerminalWindow.java @@ -30,9 +30,11 @@ package jexer; import java.io.IOException; import java.lang.reflect.Field; +import java.text.MessageFormat; import java.util.LinkedList; import java.util.List; import java.util.Map; +import java.util.ResourceBundle; import jexer.bits.Cell; import jexer.bits.CellAttributes; @@ -50,6 +52,12 @@ import static jexer.TKeypress.*; public class TTerminalWindow extends TScrollableWindow implements DisplayListener { + + /** + * Translated strings. + */ + private static final ResourceBundle i18n = ResourceBundle.getBundle(TTerminalWindow.class.getName()); + /** * The emulator. */ @@ -60,6 +68,13 @@ public class TTerminalWindow extends TScrollableWindow */ private Process shell; + /** + * If true, we are using the ptypipe utility to support dynamic window + * resizing. ptypipe is available at + * https://github.com/klamonte/ptypipe . + */ + private boolean ptypipe = false; + /** * Claim the keystrokes the emulator will need. */ @@ -141,7 +156,8 @@ public class TTerminalWindow extends TScrollableWindow public TTerminalWindow(final TApplication application, final int x, final int y, final int flags) { - super(application, "Terminal", x, y, 80 + 2, 24 + 2, flags); + super(application, i18n.getString("windowTitle"), x, y, + 80 + 2, 24 + 2, flags); vScroller = new TVScroller(this, getWidth() - 2, 0, getHeight() - 2); setBottomValue(0); @@ -165,10 +181,19 @@ public class TTerminalWindow extends TScrollableWindow String [] cmdShellBSD = { "script", "-q", "-F", "/dev/null" }; + String [] cmdShellPtypipe = { + "ptypipe", "/bin/bash", "--login" + }; // Spawn a shell and pass its I/O to the other constructor. ProcessBuilder pb; - if (System.getProperty("os.name").startsWith("Windows")) { + if ((System.getProperty("jexer.TTerminal.ptypipe") != null) + && (System.getProperty("jexer.TTerminal.ptypipe"). + equals("true")) + ) { + pb = new ProcessBuilder(cmdShellPtypipe); + ptypipe = true; + } else if (System.getProperty("os.name").startsWith("Windows")) { pb = new ProcessBuilder(cmdShellWindows); } else if (System.getProperty("os.name").startsWith("Mac")) { pb = new ProcessBuilder(cmdShellBSD); @@ -186,10 +211,11 @@ public class TTerminalWindow extends TScrollableWindow pb.redirectErrorStream(true); shell = pb.start(); emulator = new ECMA48(deviceType, shell.getInputStream(), - shell.getOutputStream()); - emulator.setListener(this); + shell.getOutputStream(), this); } catch (IOException e) { - messageBox("Error", "Error launching shell: " + e.getMessage()); + messageBox(i18n.getString("errorLaunchingShellTitle"), + MessageFormat.format(i18n.getString("errorLaunchingShellText"), + e.getMessage())); } // Setup the scroll bars @@ -200,7 +226,7 @@ public class TTerminalWindow extends TScrollableWindow addShortcutKeys(); // Add shortcut text - newStatusBar("Terminal session executing..."); + newStatusBar(i18n.getString("statusBarRunning")); } /** @@ -333,6 +359,30 @@ public class TTerminalWindow extends TScrollableWindow doRepaint(); } + /** + * Function to call to obtain the display width. + * + * @return the number of columns in the display + */ + public int getDisplayWidth() { + if (ptypipe) { + return getWidth() - 2; + } + return 80; + } + + /** + * Function to call to obtain the display height. + * + * @return the number of rows in the display + */ + public int getDisplayHeight() { + if (ptypipe) { + return getHeight() - 2; + } + return 24; + } + /** * Handle window close. */ @@ -378,13 +428,13 @@ public class TTerminalWindow extends TScrollableWindow try { int rc = shell.exitValue(); // The emulator exited on its own, all is fine - setTitle(String.format("%s [Completed - %d]", - getTitle(), rc)); + setTitle(MessageFormat.format(i18n. + getString("windowTitleCompleted"), getTitle(), rc)); shell = null; emulator.close(); clearShortcutKeypresses(); - statusBar.setText("Terminal session completed, exit " + - "code " + rc + "."); + statusBar.setText(MessageFormat.format(i18n. + getString("statusBarCompleted"), rc)); } catch (IllegalThreadStateException e) { // The emulator thread has exited, but the shell Process // hasn't figured that out yet. Do nothing, we will see @@ -395,13 +445,13 @@ public class TTerminalWindow extends TScrollableWindow try { int rc = shell.exitValue(); // If we got here, the shell died. - setTitle(String.format("%s [Completed - %d]", - getTitle(), rc)); + setTitle(MessageFormat.format(i18n. + getString("windowTitleCompleted"), getTitle(), rc)); shell = null; emulator.close(); clearShortcutKeypresses(); - statusBar.setText("Terminal session completed, exit " + - "code " + rc + "."); + statusBar.setText(MessageFormat.format(i18n. + getString("statusBarCompleted"), rc)); } catch (IllegalThreadStateException e) { // The shell is still running, do nothing. } @@ -429,6 +479,14 @@ public class TTerminalWindow extends TScrollableWindow // Get out of scrollback setVerticalValue(0); + + if (ptypipe) { + emulator.setWidth(getWidth() - 2); + emulator.setHeight(getHeight() - 2); + + emulator.writeRemote("\033[8;" + (getHeight() - 2) + ";" + + (getWidth() - 2) + "t"); + } } return;