Class UnixLikeTTYTerminal

  • All Implemented Interfaces:
    Scrollable, InputProvider, ExtendedTerminal, Terminal, java.io.Closeable, java.lang.AutoCloseable
    Direct Known Subclasses:
    CygwinTerminal, UnixTerminal

    public abstract class UnixLikeTTYTerminal
    extends UnixLikeTerminal
    UnixLikeTerminal extends from ANSITerminal and defines functionality that is common to UnixTerminal and CygwinTerminal, like setting tty modes; echo, cbreak and minimum characters for reading as well as a shutdown hook to set the tty back to original state at the end.

    If requested, it handles Control-C input to terminate the program, and hooks into Unix WINCH signal to detect when the user has resized the terminal, if supported by the JVM.

    • Field Detail

      • ttyDev

        private final java.io.File ttyDev
      • sttyStatusToRestore

        private java.lang.String sttyStatusToRestore
    • Constructor Detail

      • UnixLikeTTYTerminal

        protected UnixLikeTTYTerminal​(java.io.File ttyDev,
                                      java.io.InputStream terminalInput,
                                      java.io.OutputStream terminalOutput,
                                      java.nio.charset.Charset terminalCharset,
                                      UnixLikeTerminal.CtrlCBehaviour terminalCtrlCBehaviour)
                               throws java.io.IOException
        Creates a UnixTerminal using a specified input stream, output stream and character set, with a custom size querier instead of using the default one. This way you can override size detection (if you want to force the terminal to a fixed size, for example). You also choose how you want ctrl+c key strokes to be handled.
        Parameters:
        ttyDev - TTY device file that is representing this terminal session, will be used when calling stty to make it operate on this session
        terminalInput - Input stream to read terminal input from
        terminalOutput - Output stream to write terminal output to
        terminalCharset - Character set to use when converting characters to bytes
        terminalCtrlCBehaviour - Special settings on how the terminal will behave, see UnixTerminalMode for more details
        Throws:
        java.io.IOException - If there was an I/O error while setting up the terminal
    • Method Detail

      • acquire

        protected void acquire()
                        throws java.io.IOException
        Description copied from class: UnixLikeTerminal
        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 from UnixLikeTerminal
        Overrides:
        acquire in class UnixLikeTerminal
        Throws:
        java.io.IOException - If there was an I/O error
      • realAcquire

        private void realAcquire()
                          throws java.io.IOException
        Throws:
        java.io.IOException
      • registerTerminalResizeListener

        protected void registerTerminalResizeListener​(java.lang.Runnable onResize)
                                               throws java.io.IOException
        Specified by:
        registerTerminalResizeListener in class UnixLikeTerminal
        Throws:
        java.io.IOException
      • saveTerminalSettings

        protected void saveTerminalSettings()
                                     throws java.io.IOException
        Description copied from class: UnixLikeTerminal
        Stores the current terminal device settings (the ones that are modified through this interface) so that they can be restored later using UnixLikeTerminal.restoreTerminalSettings()
        Specified by:
        saveTerminalSettings in class UnixLikeTerminal
        Throws:
        java.io.IOException - If there was an I/O error when altering the terminal environment
      • keyEchoEnabled

        protected void keyEchoEnabled​(boolean enabled)
                               throws java.io.IOException
        Description copied from class: UnixLikeTerminal
        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.
        Specified by:
        keyEchoEnabled in class UnixLikeTerminal
        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 void canonicalMode​(boolean enabled)
                              throws java.io.IOException
        Description copied from class: UnixLikeTerminal
        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.
        Specified by:
        canonicalMode in class UnixLikeTerminal
        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 void keyStrokeSignalsEnabled​(boolean enabled)
                                        throws java.io.IOException
        Description copied from class: UnixLikeTerminal
        This method causes certain keystrokes (at the moment only ctrl+c) to be passed in to the program as a regular KeyStroke 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 regular KeyStroke 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".

        Specified by:
        keyStrokeSignalsEnabled in class UnixLikeTerminal
        Parameters:
        enabled - Pass in true 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
      • runSTTYCommand

        protected java.lang.String runSTTYCommand​(java.lang.String... parameters)
                                           throws java.io.IOException
        Throws:
        java.io.IOException
      • exec

        protected java.lang.String exec​(java.lang.String... cmd)
                                 throws java.io.IOException
        Throws:
        java.io.IOException
      • getSTTYCommand

        private java.lang.String getSTTYCommand()