/*
 * Copyright (c) 2002-2012, the original author or authors.
 *
 * This software is distributable under the BSD license. See the terms of the
 * BSD license in the documentation provided with this software.
 *
 * http://www.opensource.org/licenses/bsd-license.php
 */
package jdk.internal.jline;

import jdk.internal.jline.internal.Log;
import jdk.internal.jline.internal.TerminalLineSettings;

Terminal that is used for unix platforms. Terminal initialization is handled by issuing the stty command against the /dev/tty file to disable character echoing and enable character input. All known unix systems (including Linux and Macintosh OS X) support the stty), so this implementation should work for an reasonable POSIX system.
Author:Marc Prud'hommeaux, Dale Kemp, Jason Dillon, Jean-Baptiste Onofr\u00E9
Since:2.0
/** * Terminal that is used for unix platforms. Terminal initialization * is handled by issuing the <em>stty</em> command against the * <em>/dev/tty</em> file to disable character echoing and enable * character input. All known unix systems (including * Linux and Macintosh OS X) support the <em>stty</em>), so this * implementation should work for an reasonable POSIX system. * * @author <a href="mailto:mwp1@cornell.edu">Marc Prud'hommeaux</a> * @author <a href="mailto:dwkemp@gmail.com">Dale Kemp</a> * @author <a href="mailto:jason@planet57.com">Jason Dillon</a> * @author <a href="mailto:jbonofre@apache.org">Jean-Baptiste Onofr\u00E9</a> * @since 2.0 */
public class UnixTerminal extends TerminalSupport { private final TerminalLineSettings settings = new TerminalLineSettings(); public UnixTerminal() throws Exception { super(true); } protected TerminalLineSettings getSettings() { return settings; }
Remove line-buffered input by invoking "stty -icanon min 1" against the current terminal.
/** * Remove line-buffered input by invoking "stty -icanon min 1" * against the current terminal. */
@Override public void init() throws Exception { super.init(); setAnsiSupported(true); // Set the console to be character-buffered instead of line-buffered. // Make sure we're distinguishing carriage return from newline. // Allow ctrl-s keypress to be used (as forward search) settings.set("-icanon min 1 -icrnl -inlcr -ixon"); settings.set("dsusp undef"); setEchoEnabled(false); }
Restore the original terminal configuration, which can be used when shutting down the console reader. The ConsoleReader cannot be used after calling this method.
/** * Restore the original terminal configuration, which can be used when * shutting down the console reader. The ConsoleReader cannot be * used after calling this method. */
@Override public void restore() throws Exception { settings.restore(); super.restore(); }
Returns the value of stty columns param.
/** * Returns the value of <tt>stty columns</tt> param. */
@Override public int getWidth() { int w = settings.getProperty("columns"); return w < 1 ? DEFAULT_WIDTH : w; }
Returns the value of stty rows>/tt> param.
/** * Returns the value of <tt>stty rows>/tt> param. */
@Override public int getHeight() { int h = settings.getProperty("rows"); return h < 1 ? DEFAULT_HEIGHT : h; } @Override public synchronized void setEchoEnabled(final boolean enabled) { try { if (enabled) { settings.set("echo"); } else { settings.set("-echo"); } super.setEchoEnabled(enabled); } catch (Exception e) { if (e instanceof InterruptedException) { Thread.currentThread().interrupt(); } Log.error("Failed to ", (enabled ? "enable" : "disable"), " echo", e); } } public void disableInterruptCharacter() { try { settings.set("intr undef"); } catch (Exception e) { if (e instanceof InterruptedException) { Thread.currentThread().interrupt(); } Log.error("Failed to disable interrupt character", e); } } public void enableInterruptCharacter() { try { settings.set("intr ^C"); } catch (Exception e) { if (e instanceof InterruptedException) { Thread.currentThread().interrupt(); } Log.error("Failed to enable interrupt character", e); } } }