- java.lang.Object
-
- com.googlecode.lanterna.terminal.AbstractTerminal
-
- com.googlecode.lanterna.terminal.ansi.StreamBasedTerminal
-
- com.googlecode.lanterna.terminal.ansi.ANSITerminal
-
- com.googlecode.lanterna.terminal.ansi.UnixLikeTerminal
-
- All Implemented Interfaces:
Scrollable
,InputProvider
,ExtendedTerminal
,Terminal
,java.io.Closeable
,java.lang.AutoCloseable
- Direct Known Subclasses:
UnixLikeTTYTerminal
public abstract class UnixLikeTerminal extends ANSITerminal
Base class for all terminals that generally behave like Unix terminals. This class defined a number of abstract methods that needs to be implemented which are all used to setup the terminal environment (turning off echo, canonical mode, etc) and also a control variable for how to react to CTRL+c keystroke.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static class
UnixLikeTerminal.CtrlCBehaviour
This enum lets you control how Lanterna will handle a ctrl+c keystroke from the user.
-
Field Summary
Fields Modifier and Type Field Description private boolean
acquired
private boolean
catchSpecialCharacters
private java.lang.Thread
shutdownHook
private UnixLikeTerminal.CtrlCBehaviour
terminalCtrlCBehaviour
-
Constructor Summary
Constructors Modifier Constructor Description protected
UnixLikeTerminal(java.io.InputStream terminalInput, java.io.OutputStream terminalOutput, java.nio.charset.Charset terminalCharset, UnixLikeTerminal.CtrlCBehaviour terminalCtrlCBehaviour)
-
Method Summary
All Methods Instance Methods Abstract Methods Concrete Methods Modifier and Type Method Description protected void
acquire()
Effectively taking over the terminal and enabling it for Lanterna to use, by turning off echo and canonical mode, adding resize listeners and optionally trap unix signals.protected abstract void
canonicalMode(boolean enabled)
In canonical mode, data are accumulated in a line editing buffer, and do not become "available for reading" until line editing has been terminated by the user sending a line delimiter character.void
close()
Closes the terminal, if applicable.private void
exitPrivateModeAndRestoreState()
protected UnixLikeTerminal.CtrlCBehaviour
getTerminalCtrlCBehaviour()
private void
isCtrlC(KeyStroke key)
protected abstract void
keyEchoEnabled(boolean enabled)
Enables or disable key echo mode, which means when the user press a key, the terminal will immediately print that key to the terminal.protected abstract void
keyStrokeSignalsEnabled(boolean enabled)
This method causes certain keystrokes (at the moment only ctrl+c) to be passed in to the program as a regularKeyStroke
instead of as a signal to the JVM process.KeyStroke
pollInput()
Returns the nextKey
off the input queue or null if there is no more input events available.KeyStroke
readInput()
Returns the nextKey
off the input queue or blocks until one is available.protected abstract void
registerTerminalResizeListener(java.lang.Runnable onResize)
protected abstract void
restoreTerminalSettings()
Restores the terminal settings from last timesaveTerminalSettings()
was calledprivate void
restoreTerminalSettingsAndKeyStrokeSignals()
protected abstract void
saveTerminalSettings()
Stores the current terminal device settings (the ones that are modified through this interface) so that they can be restored later usingrestoreTerminalSettings()
-
Methods inherited from class com.googlecode.lanterna.terminal.ansi.ANSITerminal
clearScreen, deiconify, disableSGR, enableSGR, enterPrivateMode, exitPrivateMode, findTerminalSize, getCursorPosition, getDefaultKeyDecodingProfile, getTerminalSize, iconify, isInPrivateMode, maximize, popTitle, pushTitle, reportPosition, resetColorAndSGR, restoreCursorPosition, saveCursorPosition, scrollLines, setBackgroundColor, setCursorPosition, setCursorPosition, setCursorVisible, setForegroundColor, setMouseCaptureMode, setTerminalSize, setTitle, unmaximize
-
Methods inherited from class com.googlecode.lanterna.terminal.ansi.StreamBasedTerminal
bell, enquireTerminal, flush, getCharset, getInputDecoder, putCharacter, putString, resetMemorizedCursorPosition, translateCharacter, waitForCursorPositionReport, writeToTerminal
-
Methods inherited from class com.googlecode.lanterna.terminal.AbstractTerminal
addResizeListener, newTextGraphics, onResized, onResized, removeResizeListener
-
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-
Methods inherited from interface com.googlecode.lanterna.terminal.Terminal
addResizeListener, bell, enquireTerminal, flush, newTextGraphics, putCharacter, putString, removeResizeListener
-
-
-
-
Field Detail
-
terminalCtrlCBehaviour
private final UnixLikeTerminal.CtrlCBehaviour terminalCtrlCBehaviour
-
catchSpecialCharacters
private final boolean catchSpecialCharacters
-
shutdownHook
private final java.lang.Thread shutdownHook
-
acquired
private boolean acquired
-
-
Constructor Detail
-
UnixLikeTerminal
protected UnixLikeTerminal(java.io.InputStream terminalInput, java.io.OutputStream terminalOutput, java.nio.charset.Charset terminalCharset, UnixLikeTerminal.CtrlCBehaviour terminalCtrlCBehaviour) throws java.io.IOException
- Throws:
java.io.IOException
-
-
Method Detail
-
acquire
protected void acquire() throws java.io.IOException
Effectively taking over the terminal and enabling it for Lanterna to use, by turning off echo and canonical mode, adding resize listeners and optionally trap unix signals. This should be called automatically by the constructor of any end-user class extending fromUnixLikeTerminal
- Throws:
java.io.IOException
- If there was an I/O error
-
close
public void close() throws java.io.IOException
Description copied from interface:Terminal
Closes the terminal, if applicable. If the implementation doesn't support closing the terminal, this will do nothing. The Swing/AWT emulator implementations will translate this into a dispose() call on the UI resources, the telnet implementation will hang out the connection.- Specified by:
close
in interfacejava.lang.AutoCloseable
- Specified by:
close
in interfacejava.io.Closeable
- Specified by:
close
in interfaceTerminal
- Overrides:
close
in classANSITerminal
- Throws:
java.io.IOException
- If there was an underlying I/O error
-
pollInput
public KeyStroke pollInput() throws java.io.IOException
Description copied from interface:InputProvider
Returns the nextKey
off the input queue or null if there is no more input events available. Note, this method call is not blocking, it returns null immediately if there is nothing on the input stream.- Specified by:
pollInput
in interfaceInputProvider
- Overrides:
pollInput
in classANSITerminal
- Returns:
- Key object which represents a keystroke coming in through the input stream
- Throws:
java.io.IOException
- Propagated error if the underlying stream gave errors
-
readInput
public KeyStroke readInput() throws java.io.IOException
Description copied from interface:InputProvider
Returns the nextKey
off the input queue or blocks until one is available. NOTE: In previous versions of Lanterna, this method was not blocking. From lanterna 3, it is blocking and you can callpollInput()
for the non-blocking version.- Specified by:
readInput
in interfaceInputProvider
- Overrides:
readInput
in classANSITerminal
- Returns:
- Key object which represents a keystroke coming in through the input stream
- Throws:
java.io.IOException
- Propagated error if the underlying stream gave errors
-
getTerminalCtrlCBehaviour
protected UnixLikeTerminal.CtrlCBehaviour getTerminalCtrlCBehaviour()
-
registerTerminalResizeListener
protected abstract void registerTerminalResizeListener(java.lang.Runnable onResize) throws java.io.IOException
- Throws:
java.io.IOException
-
saveTerminalSettings
protected abstract void saveTerminalSettings() throws java.io.IOException
Stores the current terminal device settings (the ones that are modified through this interface) so that they can be restored later usingrestoreTerminalSettings()
- Throws:
java.io.IOException
- If there was an I/O error when altering the terminal environment
-
restoreTerminalSettings
protected abstract void restoreTerminalSettings() throws java.io.IOException
Restores the terminal settings from last timesaveTerminalSettings()
was called- Throws:
java.io.IOException
- If there was an I/O error when altering the terminal environment
-
restoreTerminalSettingsAndKeyStrokeSignals
private void restoreTerminalSettingsAndKeyStrokeSignals() throws java.io.IOException
- Throws:
java.io.IOException
-
keyEchoEnabled
protected abstract void keyEchoEnabled(boolean enabled) throws java.io.IOException
Enables or disable key echo mode, which means when the user press a key, the terminal will immediately print that key to the terminal. Normally for Lanterna, this should be turned off so the software can take the key as an input event, put it on the input queue and then depending on the code decide what to do with it.- Parameters:
enabled
-true
if key echo should be enabled,false
otherwise- Throws:
java.io.IOException
- If there was an I/O error when altering the terminal environment
-
canonicalMode
protected abstract void canonicalMode(boolean enabled) throws java.io.IOException
In canonical mode, data are accumulated in a line editing buffer, and do not become "available for reading" until line editing has been terminated by the user sending a line delimiter character. This is usually the default mode for a terminal. Lanterna wants to read each character as they are typed, without waiting for the final newline, so it will attempt to turn canonical mode off on initialization.- Parameters:
enabled
-true
if canonical input mode should be enabled,false
otherwise- Throws:
java.io.IOException
- If there was an I/O error when altering the terminal environment
-
keyStrokeSignalsEnabled
protected abstract void keyStrokeSignalsEnabled(boolean enabled) throws java.io.IOException
This method causes certain keystrokes (at the moment only ctrl+c) to be passed in to the program as a regularKeyStroke
instead of as a signal to the JVM process. For example, ctrl+c will normally send an interrupt that causes the JVM to shut down, but this method will make it pass in ctrl+c as a regularKeyStroke
instead. You can of course still make ctrl+c kill the application through your own input handling if you like.Please note that this method is called automatically by lanterna to disable signals unless you define a system property "com.googlecode.lanterna.terminal.UnixTerminal.catchSpecialCharacters" and set it to the string "false".
- Parameters:
enabled
- Pass intrue
if you want keystrokes to generate system signals (like process interrupt),false
if you want lanterna to catch and interpret these keystrokes are regular keystrokes- Throws:
java.io.IOException
- If there was an I/O error when attempting to disable special characters- See Also:
UnixLikeTerminal.CtrlCBehaviour
-
isCtrlC
private void isCtrlC(KeyStroke key) throws java.io.IOException
- Throws:
java.io.IOException
-
exitPrivateModeAndRestoreState
private void exitPrivateModeAndRestoreState()
-
-