X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fjexer%2FTTerminalWindow.java;h=96043e85af96849dc2ceaea5b09d83b1387e0c0d;hb=f6d9020703931f645f553b59426e085a81e90c60;hp=c0af74bafa12ce9046277f0eab0746c7571bee43;hpb=55d2b2c2b29ce51f4f910448a115073371deeae8;p=fanfix.git diff --git a/src/jexer/TTerminalWindow.java b/src/jexer/TTerminalWindow.java index c0af74b..96043e8 100644 --- a/src/jexer/TTerminalWindow.java +++ b/src/jexer/TTerminalWindow.java @@ -3,7 +3,7 @@ * * The MIT License (MIT) * - * Copyright (C) 2016 Kevin Lamonte + * Copyright (C) 2017 Kevin Lamonte * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), @@ -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; @@ -49,7 +46,7 @@ import static jexer.TKeypress.*; /** * TTerminalWindow exposes a ECMA-48 / ANSI X3.64 style terminal in a window. */ -public class TTerminalWindow extends TWindow { +public class TTerminalWindow extends TScrollableWindow { /** * The emulator. @@ -61,11 +58,6 @@ public class TTerminalWindow extends TWindow { */ private Process shell; - /** - * Vertical scrollbar. - */ - private TVScroller vScroller; - /** * Claim the keystrokes the emulator will need. */ @@ -149,6 +141,9 @@ public class TTerminalWindow extends TWindow { super(application, "Terminal", x, y, 80 + 2, 24 + 2, flags); + vScroller = new TVScroller(this, getWidth() - 2, 0, getHeight() - 2); + setBottomValue(0); + // Assume XTERM ECMA48.DeviceType deviceType = ECMA48.DeviceType.XTERM; @@ -166,7 +161,7 @@ public class TTerminalWindow extends TWindow { "script", "-fqe", "/dev/null" }; String [] cmdShellBSD = { - "script", "-qe", "-F", "/dev/null" + "script", "-q", "-F", "/dev/null" }; // Spawn a shell and pass its I/O to the other constructor. @@ -191,7 +186,7 @@ public class TTerminalWindow extends TWindow { emulator = new ECMA48(deviceType, shell.getInputStream(), shell.getOutputStream()); } catch (IOException e) { - e.printStackTrace(); + messageBox("Error", "Error launching shell: " + e.getMessage()); } // Setup the scroll bars @@ -200,6 +195,9 @@ public class TTerminalWindow extends TWindow { // Claim the keystrokes the emulator will need. addShortcutKeys(); + + // Add shortcut text + newStatusBar("Terminal session executing..."); } /** @@ -235,36 +233,6 @@ public class TTerminalWindow extends TWindow { } } - /** - * 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(); - } - /** * Draw the display buffer. */ @@ -275,7 +243,7 @@ public class TTerminalWindow extends TWindow { synchronized (emulator) { // Update the scroll bars - reflow(); + reflowData(); // Draw the box using my superclass super.draw(); @@ -286,7 +254,7 @@ public class TTerminalWindow extends TWindow { // Put together the visible rows int visibleHeight = getHeight() - 2; int visibleBottom = scrollback.size() + display.size() - + vScroller.getValue(); + + getVerticalValue(); assert (visibleBottom >= 0); List preceedingBlankLines = new LinkedList(); @@ -358,7 +326,8 @@ public class TTerminalWindow extends TWindow { /** * Handle window close. */ - @Override public void onClose() { + @Override + public void onClose() { emulator.close(); if (shell != null) { terminateShellChildProcess(); @@ -378,10 +347,8 @@ public class TTerminalWindow extends TWindow { setCursorX(emulator.getCursorX() + 1); setCursorY(emulator.getCursorY() + 1 - + (getHeight() - 2 - emulator.getHeight())); - if (vScroller != null) { - setCursorY(getCursorY() - vScroller.getValue()); - } + + (getHeight() - 2 - emulator.getHeight()) + - getVerticalValue()); setCursorVisible(emulator.isCursorVisible()); if (getCursorX() > getWidth() - 2) { setCursorVisible(false); @@ -406,6 +373,8 @@ public class TTerminalWindow extends TWindow { shell = null; emulator.close(); clearShortcutKeypresses(); + statusBar.setText("Terminal session completed, exit " + + "code " + rc + "."); } catch (IllegalThreadStateException e) { // The emulator thread has exited, but the shell Process // hasn't figured that out yet. Do nothing, we will see @@ -421,6 +390,8 @@ public class TTerminalWindow extends TWindow { shell = null; emulator.close(); clearShortcutKeypresses(); + statusBar.setText("Terminal session completed, exit " + + "code " + rc + "."); } catch (IllegalThreadStateException e) { // The shell is still running, do nothing. } @@ -443,10 +414,11 @@ public class TTerminalWindow extends TWindow { if (resize.getType() == TResizeEvent.Type.WIDGET) { // Resize the scroll bars - reflow(); + reflowData(); + placeScrollbars(); // Get out of scrollback - vScroller.setValue(0); + setVerticalValue(0); } return; @@ -456,7 +428,8 @@ public class TTerminalWindow extends TWindow { /** * Resize scrollbars for a new width/height. */ - private void reflow() { + @Override + public void reflowData() { // Synchronize against the emulator so we don't stomp on its reader // thread. @@ -466,19 +439,10 @@ public class TTerminalWindow extends TWindow { readEmulatorState(); // Vertical scrollbar - if (vScroller == null) { - vScroller = new TVScroller(this, getWidth() - 2, 0, - getHeight() - 2); - vScroller.setBottomValue(0); - vScroller.setValue(0); - } else { - vScroller.setX(getWidth() - 2); - vScroller.setHeight(getHeight() - 2); - } - vScroller.setTopValue(getHeight() - 2 + setTopValue(getHeight() - 2 - (emulator.getScrollbackBuffer().size() + emulator.getDisplayBuffer().size())); - vScroller.setBigChange(getHeight() - 2); + setVerticalBigChange(getHeight() - 2); } // synchronized (emulator) } @@ -521,14 +485,14 @@ public class TTerminalWindow extends TWindow { || keypress.equals(kbCtrlPgUp) || keypress.equals(kbAltPgUp) ) { - vScroller.bigDecrement(); + bigVerticalDecrement(); return; } if (keypress.equals(kbShiftPgDn) || keypress.equals(kbCtrlPgDn) || keypress.equals(kbAltPgDn) ) { - vScroller.bigIncrement(); + bigVerticalIncrement(); return; } @@ -537,7 +501,7 @@ public class TTerminalWindow extends TWindow { synchronized (emulator) { if (emulator.isReading()) { // Get out of scrollback - vScroller.setValue(0); + setVerticalValue(0); emulator.keypress(keypress.getKey()); // UGLY HACK TIME! cmd.exe needs CRLF, not just CR, so if @@ -571,11 +535,11 @@ public class TTerminalWindow extends TWindow { } if (mouse.isMouseWheelUp()) { - vScroller.decrement(); + verticalDecrement(); return; } if (mouse.isMouseWheelDown()) { - vScroller.increment(); + verticalIncrement(); return; } if (mouseOnEmulator(mouse)) {