/* * 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 <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. */ @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. */ @Override public void restore() throws Exception { settings.restore(); super.restore(); } /** * 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 <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); } } }