X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fjexer%2FTTerminalWindow.java;h=165ab713119dfdf3cb81b6e9e03a2f7a590ebcf7;hb=aa77d68274fff56c0ceca162a687ea70795624ea;hp=17f32e0772db527b54fadc59378263a4e517f340;hpb=56661844475522242093c8858ceb20fb15589da5;p=fanfix.git diff --git a/src/jexer/TTerminalWindow.java b/src/jexer/TTerminalWindow.java index 17f32e0..165ab71 100644 --- a/src/jexer/TTerminalWindow.java +++ b/src/jexer/TTerminalWindow.java @@ -28,10 +28,7 @@ */ package jexer; -import java.io.InputStream; import java.io.IOException; -import java.io.OutputStream; -import java.io.UnsupportedEncodingException; import java.lang.reflect.Field; import java.util.LinkedList; import java.util.List; @@ -43,13 +40,15 @@ import jexer.event.TKeypressEvent; import jexer.event.TMouseEvent; import jexer.event.TResizeEvent; import jexer.tterminal.DisplayLine; +import jexer.tterminal.DisplayListener; import jexer.tterminal.ECMA48; import static jexer.TKeypress.*; /** * TTerminalWindow exposes a ECMA-48 / ANSI X3.64 style terminal in a window. */ -public class TTerminalWindow extends TScrollableWindow { +public class TTerminalWindow extends TScrollableWindow + implements DisplayListener { /** * The emulator. @@ -61,6 +60,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. */ @@ -166,10 +172,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); @@ -187,9 +202,9 @@ public class TTerminalWindow extends TScrollableWindow { pb.redirectErrorStream(true); shell = pb.start(); emulator = new ECMA48(deviceType, shell.getInputStream(), - shell.getOutputStream()); + shell.getOutputStream(), this); } catch (IOException e) { - e.printStackTrace(); + messageBox("Error", "Error launching shell: " + e.getMessage()); } // Setup the scroll bars @@ -236,39 +251,6 @@ public class TTerminalWindow extends TScrollableWindow { } } - /** - * Public constructor. - * - * @param application TApplication that manages this window - * @param x column relative to parent - * @param y row relative to parent - * @param flags mask of CENTERED, MODAL, or RESIZABLE - * @param input an InputStream connected to the remote side. For type == - * XTERM, input is converted to a Reader with UTF-8 encoding. - * @param output an OutputStream connected to the remote user. For type - * == XTERM, output is converted to a Writer with UTF-8 encoding. - * @throws UnsupportedEncodingException if an exception is thrown when - * creating the InputStreamReader - */ - public TTerminalWindow(final TApplication application, final int x, - final int y, final int flags, final InputStream input, - final OutputStream output) throws UnsupportedEncodingException { - - super(application, "Terminal", x, y, 80 + 2, 24 + 2, flags); - - emulator = new ECMA48(ECMA48.DeviceType.XTERM, input, output); - - // Setup the scroll bars - onResize(new TResizeEvent(TResizeEvent.Type.WIDGET, getWidth(), - getHeight())); - - // Claim the keystrokes the emulator will need. - addShortcutKeys(); - - // Add shortcut text - newStatusBar("Terminal session executing..."); - } - /** * Draw the display buffer. */ @@ -359,6 +341,31 @@ public class TTerminalWindow extends TScrollableWindow { } + /** + * Called by emulator when fresh data has come in. + */ + public void displayChanged() { + doRepaint(); + } + + /** + * Function to call to obtain the display width. + * + * @return the number of columns in the display + */ + public int getDisplayWidth() { + return getWidth() - 2; + } + + /** + * Function to call to obtain the display height. + * + * @return the number of rows in the display + */ + public int getDisplayHeight() { + return getHeight() - 2; + } + /** * Handle window close. */ @@ -455,6 +462,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;