X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fjexer%2FTTerminalWindow.java;h=17f32e0772db527b54fadc59378263a4e517f340;hb=e8a11f986bfe2556e450d7b8ad6ef0059b369bbc;hp=c0af74bafa12ce9046277f0eab0746c7571bee43;hpb=55d2b2c2b29ce51f4f910448a115073371deeae8;p=fanfix.git diff --git a/src/jexer/TTerminalWindow.java b/src/jexer/TTerminalWindow.java index c0af74b..17f32e0 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"), @@ -49,7 +49,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 +61,6 @@ public class TTerminalWindow extends TWindow { */ private Process shell; - /** - * Vertical scrollbar. - */ - private TVScroller vScroller; - /** * Claim the keystrokes the emulator will need. */ @@ -149,6 +144,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 +164,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. @@ -200,6 +198,9 @@ public class TTerminalWindow extends TWindow { // Claim the keystrokes the emulator will need. addShortcutKeys(); + + // Add shortcut text + newStatusBar("Terminal session executing..."); } /** @@ -263,6 +264,9 @@ public class TTerminalWindow extends TWindow { // Claim the keystrokes the emulator will need. addShortcutKeys(); + + // Add shortcut text + newStatusBar("Terminal session executing..."); } /** @@ -275,7 +279,7 @@ public class TTerminalWindow extends TWindow { synchronized (emulator) { // Update the scroll bars - reflow(); + reflowData(); // Draw the box using my superclass super.draw(); @@ -286,7 +290,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 +362,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 +383,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 +409,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 +426,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 +450,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 +464,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 +475,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 +521,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 +537,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 +571,11 @@ public class TTerminalWindow extends TWindow { } if (mouse.isMouseWheelUp()) { - vScroller.decrement(); + verticalDecrement(); return; } if (mouse.isMouseWheelDown()) { - vScroller.increment(); + verticalIncrement(); return; } if (mouseOnEmulator(mouse)) {