Formatted code to GoogleCodeStyle. Fixed misc warnings

This commit is contained in:
nathan 2014-11-16 21:07:03 +01:00
parent d647d23829
commit 90ee355958
11 changed files with 1137 additions and 1162 deletions

View File

@ -14,9 +14,10 @@ package dorkbox.util.input;
import java.nio.charset.Charset;
public class Encoding {
/**
* Get the default encoding. Will first look at the LC_CTYPE environment variable, then the input.encoding
* system property, then the default charset according to the JVM.
* Get the default encoding. Will first look at the LC_CTYPE environment variable, then the input.encoding system
* property, then the default charset according to the JVM.
*
* @return The default encoding to use when none is specified.
*/

View File

@ -15,6 +15,10 @@
*/
package dorkbox.util.input;
import org.fusesource.jansi.Ansi;
import org.fusesource.jansi.AnsiConsole;
import org.slf4j.Logger;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
@ -25,10 +29,6 @@ import java.security.ProtectionDomain;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import org.fusesource.jansi.Ansi;
import org.fusesource.jansi.AnsiConsole;
import org.slf4j.Logger;
import dorkbox.util.OS;
import dorkbox.util.bytes.ByteBuffer2;
import dorkbox.util.bytes.ByteBuffer2Poolable;
@ -40,18 +40,13 @@ import dorkbox.util.objectPool.ObjectPoolFactory;
import dorkbox.util.objectPool.ObjectPoolHolder;
public class InputConsole {
private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(InputConsole.class);
private static final InputConsole consoleProxyReader = new InputConsole();
private static final char[] emptyLine = new char[0];
/**
* empty method to allow code to initialize the input console.
*/
public static void init() {
}
// this is run by our init...
{
static {
AnsiConsole.systemInstall();
Thread consoleThread = new Thread(new Runnable() {
@ -81,8 +76,21 @@ public class InputConsole {
Runtime.getRuntime().addShutdownHook(shutdownThread);
}
/** return null if no data */
public static final String readLine() {
/**
* Permit our InputConsole to be initialized
*/
public static void init() {
if (logger.isDebugEnabled()) {
logger.debug("Created Terminal: {} ({}w x {}h)", consoleProxyReader.terminal.getClass().getSimpleName(),
consoleProxyReader.terminal.getWidth(),
consoleProxyReader.terminal.getHeight());
}
}
/**
* return null if no data
*/
public static String readLine() {
char[] line = consoleProxyReader.readLine0();
return new String(line);
}
@ -100,13 +108,17 @@ public class InputConsole {
};
/** return -1 if no data */
public static final int read() {
/**
* return -1 if no data
*/
public static int read() {
return consoleProxyReader.read0();
}
/** return null if no data */
public static final char[] readLinePassword() {
/**
* return null if no data
*/
public static char[] readLinePassword() {
return consoleProxyReader.readLinePassword0();
}
@ -133,7 +145,9 @@ public class InputConsole {
private ThreadLocal<Integer> threadBufferCounter = new ThreadLocal<Integer>();
private ThreadLocal<ObjectPoolHolder<ByteBuffer2>> readLineBuff = new ThreadLocal<ObjectPoolHolder<ByteBuffer2>>();
private List<ObjectPoolHolder<ByteBuffer2>> readLineBuffers = new CopyOnWriteArrayList<ObjectPoolHolder<ByteBuffer2>>();
private List<ObjectPoolHolder<ByteBuffer2>>
readLineBuffers =
new CopyOnWriteArrayList<ObjectPoolHolder<ByteBuffer2>>();
private final Terminal terminal;
private final Boolean enableBackspace;
@ -147,11 +161,11 @@ public class InputConsole {
try {
readers2 = Integer.parseInt(readers);
} catch (Exception e) {
e.printStackTrace();
}
}
this.pool = ObjectPoolFactory.create(new ByteBuffer2Poolable(), readers2);
String type = System.getProperty(TerminalType.TYPE, TerminalType.AUTO).toLowerCase();
if ("dumb".equals(System.getenv("TERM"))) {
type = TerminalType.NONE;
@ -164,20 +178,18 @@ public class InputConsole {
}
}
Terminal t;
try {
if (type.equals(TerminalType.UNIX)) {
t = new UnixTerminal();
}
else if (type.equals(TerminalType.WIN) || type.equals(TerminalType.WINDOWS)) {
} else if (type.equals(TerminalType.WIN) || type.equals(TerminalType.WINDOWS)) {
t = new WindowsTerminal();
}
else if (type.equals(TerminalType.NONE) || type.equals(TerminalType.OFF) || type.equals(TerminalType.FALSE)) {
} else if (type.equals(TerminalType.NONE) || type.equals(TerminalType.OFF) || type.equals(TerminalType.FALSE)) {
t = new UnsupportedTerminal();
} else {
if (isIDEAutoDetect()) {
logger.debug("Terminal is in UNSUPPORTED (best guess). Unable to support single key input. Only line input available.");
logger.debug(
"Terminal is in UNSUPPORTED (best guess). Unable to support single key input. Only line input available.");
t = new UnsupportedTerminal();
} else {
if (OS.isWindows()) {
@ -187,16 +199,14 @@ public class InputConsole {
}
}
}
}
catch (Exception e) {
} catch (Exception e) {
logger.error("Failed to construct terminal, falling back to unsupported");
t = new UnsupportedTerminal();
}
try {
t.init();
}
catch (Throwable e) {
} catch (Throwable e) {
logger.error("Terminal initialization failed, falling back to unsupported");
t = new UnsupportedTerminal();
@ -211,7 +221,6 @@ public class InputConsole {
this.terminal = t;
this.enableBackspace = Boolean.parseBoolean(System.getProperty(TerminalType.ENABLE_BACKSPACE, "true"));
logger.debug("Created Terminal: {} ({}x{})", t.getClass().getSimpleName(), t.getWidth(), t.getHeight());
}
// called when the JVM is shutting down.
@ -243,11 +252,13 @@ public class InputConsole {
return this.terminal.isEchoEnabled();
}
/** return -1 if no data or bunged-up */
private final int read0() {
/**
* return -1 if no data or bunged-up
*/
private int read0() {
Integer bufferCounter = this.threadBufferCounter.get();
ObjectPoolHolder<ByteBuffer2> objectPoolHolder = this.readBuff.get();
ByteBuffer2 buffer = null;
ByteBuffer2 buffer;
if (objectPoolHolder == null) {
bufferCounter = 0;
@ -283,8 +294,10 @@ public class InputConsole {
return c;
}
/** return empty char[] if no data */
private final char[] readLinePassword0() {
/**
* return empty char[] if no data
*/
private char[] readLinePassword0() {
// don't bother in an IDE. it won't work.
boolean echoEnabled = this.terminal.isEchoEnabled();
this.terminal.setEchoEnabled(false);
@ -294,8 +307,10 @@ public class InputConsole {
return readLine0;
}
/** return empty char[] if no data */
private final char[] readLine0() {
/**
* return empty char[] if no data
*/
private char[] readLine0() {
synchronized (this.inputLock) {
// empty here, because we don't want to register a readLine WHILE we are still processing
// the current line info.
@ -326,7 +341,7 @@ public class InputConsole {
}
buffer.rewind();
char[] readChars = buffer.readChars(len/2); // java always stores chars in 2 bytes
char[] readChars = buffer.readChars(len / 2); // java always stores chars in 2 bytes
// dump the chars in the buffer (safer for passwords, etc)
buffer.clearSecure();
@ -351,7 +366,7 @@ public class InputConsole {
}
}
private final void run() {
private void run() {
Logger logger2 = logger;
final boolean ansiEnabled = Ansi.isEnabled();
@ -383,7 +398,6 @@ public class InputConsole {
this.inputLockSingle.notifyAll();
}
// now to handle readLine stuff
// if we type a backspace key, swallow it + previous in READLINE. READCHAR will have it passed.
@ -399,7 +413,7 @@ public class InputConsole {
int amtToOverwrite = 2 * 2; // backspace is always 2 chars (^?) * 2 because it's bytes
if (length > 1) {
char charAt = buffer.readChar(length-2);
char charAt = buffer.readChar(length - 2);
amtToOverwrite += getPrintableCharacters(charAt);
// delete last item in our buffer
@ -408,7 +422,7 @@ public class InputConsole {
// now figure out where the cursor is really at.
// this is more memory friendly than buf.toString.length
for (int i=0;i<length;i+=2) {
for (int i = 0; i < length; i += 2) {
charAt = buffer.readChar(i);
position += getPrintableCharacters(charAt);
}
@ -418,7 +432,7 @@ public class InputConsole {
char[] overwrite = new char[amtToOverwrite];
char c = ' ';
for (int i=0;i<amtToOverwrite;i++) {
for (int i = 0; i < amtToOverwrite; i++) {
overwrite[i] = c;
}
@ -429,14 +443,12 @@ public class InputConsole {
out.flush();
}
}
}
else if (asChar == '\n') {
} else if (asChar == '\n') {
// ignoring \r, because \n is ALWAYS the last character in a new line sequence. (even for windows)
synchronized (this.inputLockLine) {
this.inputLockLine.notifyAll();
}
}
else {
} else {
// only append if we are not a new line.
// our windows console PREVENTS us from returning '\r' (it truncates '\r\n', and returns just '\n')
for (ObjectPoolHolder<ByteBuffer2> objectPoolHolder : this.readLineBuffers) {
@ -462,7 +474,7 @@ public class InputConsole {
File locFile = new File(loc.getFile());
return locFile.isDirectory();
} catch (Exception e) {
} catch (Exception ignored) {
}
// fall-back to unsupported
@ -471,25 +483,22 @@ public class InputConsole {
/**
* Return the number of characters that will be printed when the specified
* character is echoed to the screen
* Return the number of characters that will be printed when the specified character is echoed to the screen
*
* Adapted from cat by Torbjorn Granlund, as repeated in stty by David MacKenzie.
*/
public static int getPrintableCharacters(final int ch) {
private static int getPrintableCharacters(final int ch) {
// StringBuilder sbuff = new StringBuilder();
if (ch >= 32) {
if (ch < 127) {
// sbuff.append((char) ch);
return 1;
}
else if (ch == 127) {
} else if (ch == 127) {
// sbuff.append('^');
// sbuff.append('?');
return 2;
}
else {
} else {
// sbuff.append('M');
// sbuff.append('-');
int count = 2;
@ -498,22 +507,19 @@ public class InputConsole {
if (ch < 128 + 127) {
// sbuff.append((char) (ch - 128));
count++;
}
else {
} else {
// sbuff.append('^');
// sbuff.append('?');
count += 2;
}
}
else {
} else {
// sbuff.append('^');
// sbuff.append((char) (ch - 128 + 64));
count += 2;
}
return count;
}
}
else {
} else {
// sbuff.append('^');
// sbuff.append((char) (ch + 64));
return 2;

View File

@ -18,15 +18,16 @@ package dorkbox.util.input;
import java.io.IOException;
public abstract class Terminal {
protected final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(getClass());
public static final int DEFAULT_WIDTH = 80;
public static final int DEFAULT_HEIGHT = 24;
protected static final int DEFAULT_WIDTH = 80;
protected static final int DEFAULT_HEIGHT = 24;
private volatile boolean echoEnabled;
public Terminal() {
protected Terminal() {
}
public abstract void init() throws IOException;
@ -42,6 +43,7 @@ public abstract class Terminal {
}
public abstract int getWidth();
public abstract int getHeight();
/**

View File

@ -16,6 +16,7 @@
package dorkbox.util.input;
public class TerminalType {
public static final String TYPE = "input.terminal";
public static final String READERS = "input.terminal.readers";
public static final String ENABLE_BACKSPACE = "input.enableBackspace";

View File

@ -32,25 +32,22 @@ import java.nio.charset.UnmappableCharacterException;
/**
*
* NOTE for JLine: the default InputStreamReader that comes from the JRE
* usually read more bytes than needed from the input stream, which
* is not usable in a character per character model used in the console.
* We thus use the harmony code which only reads the minimal number of bytes,
* with a modification to ensure we can read larger characters (UTF-16 has
* up to 4 bytes, and UTF-32, rare as it is, may have up to 8).
* NOTE for JLine: the default InputStreamReader that comes from the JRE usually read more bytes than needed from the
* input stream, which is not usable in a character per character model used in the console. We thus use the harmony
* code which only reads the minimal number of bytes, with a modification to ensure we can read larger characters
* (UTF-16 has up to 4 bytes, and UTF-32, rare as it is, may have up to 8).
*
*
* A class for turning a byte stream into a character stream. Data read from the
* source input stream is converted into characters by either a default or a
* provided character converter. The default encoding is taken from the
* "file.encoding" system property. {@code InputStreamReader} contains a buffer
* of bytes read from the source stream and converts these into characters as
* needed. The buffer size is 8K.
* A class for turning a byte stream into a character stream. Data read from the source input stream is converted into
* characters by either a default or a provided character converter. The default encoding is taken from the
* "file.encoding" system property. {@code InputStreamReader} contains a buffer of bytes read from the source stream and
* converts these into characters as needed. The buffer size is 8K.
*
* @see OutputStreamWriter
*/
public class InputStreamReader extends Reader {
@SuppressWarnings("ALL")
class InputStreamReader extends Reader {
private InputStream in;
private static final int BUFFER_SIZE = 8192;
@ -64,13 +61,11 @@ public class InputStreamReader extends Reader {
ByteBuffer bytes = ByteBuffer.allocate(BUFFER_SIZE);
/**
* Constructs a new {@code InputStreamReader} on the {@link InputStream}
* {@code in}. This constructor sets the character converter to the encoding
* specified in the "file.encoding" property and falls back to ISO 8859_1
* Constructs a new {@code InputStreamReader} on the {@link InputStream} {@code in}. This constructor sets the
* character converter to the encoding specified in the "file.encoding" property and falls back to ISO 8859_1
* (ISO-Latin-1) if the property doesn't exist.
*
* @param in
* the input stream from which to read characters.
* @param in the input stream from which to read characters.
*/
public InputStreamReader(InputStream in) {
super(in);
@ -84,19 +79,14 @@ public class InputStreamReader extends Reader {
}
/**
* Constructs a new InputStreamReader on the InputStream {@code in}. The
* character converter that is used to decode bytes into characters is
* identified by name by {@code enc}. If the encoding cannot be found, an
* Constructs a new InputStreamReader on the InputStream {@code in}. The character converter that is used to decode
* bytes into characters is identified by name by {@code enc}. If the encoding cannot be found, an
* UnsupportedEncodingException error is thrown.
*
* @param in
* the InputStream from which to read characters.
* @param enc
* identifies the character converter to use.
* @throws NullPointerException
* if {@code enc} is {@code null}.
* @throws UnsupportedEncodingException
* if the encoding specified by {@code enc} cannot be found.
* @param in the InputStream from which to read characters.
* @param enc identifies the character converter to use.
* @throws NullPointerException if {@code enc} is {@code null}.
* @throws UnsupportedEncodingException if the encoding specified by {@code enc} cannot be found.
*/
public InputStreamReader(InputStream in, final String enc)
// throws UnsupportedEncodingException
@ -121,13 +111,10 @@ public class InputStreamReader extends Reader {
}
/**
* Constructs a new InputStreamReader on the InputStream {@code in} and
* CharsetDecoder {@code dec}.
* Constructs a new InputStreamReader on the InputStream {@code in} and CharsetDecoder {@code dec}.
*
* @param in
* the source InputStream from which to read characters.
* @param dec
* the CharsetDecoder used by the character conversion.
* @param in the source InputStream from which to read characters.
* @param dec the CharsetDecoder used by the character conversion.
*/
public InputStreamReader(InputStream in, CharsetDecoder dec) {
super(in);
@ -138,13 +125,10 @@ public class InputStreamReader extends Reader {
}
/**
* Constructs a new InputStreamReader on the InputStream {@code in} and
* Charset {@code charset}.
* Constructs a new InputStreamReader on the InputStream {@code in} and Charset {@code charset}.
*
* @param in
* the source InputStream from which to read characters.
* @param charset
* the Charset that defines the character converter
* @param in the source InputStream from which to read characters.
* @param charset the Charset that defines the character converter
*/
public InputStreamReader(InputStream in, Charset charset) {
super(in);
@ -156,11 +140,9 @@ public class InputStreamReader extends Reader {
}
/**
* Closes this reader. This implementation closes the source InputStream and
* releases all local storage.
* Closes this reader. This implementation closes the source InputStream and releases all local storage.
*
* @throws IOException
* if an error occurs attempting to close this reader.
* @throws IOException if an error occurs attempting to close this reader.
*/
@Override
public void close() throws IOException {
@ -174,11 +156,10 @@ public class InputStreamReader extends Reader {
}
/**
* Returns the name of the encoding used to convert bytes into characters.
* The value {@code null} is returned if this reader has been closed.
* Returns the name of the encoding used to convert bytes into characters. The value {@code null} is returned if this
* reader has been closed.
*
* @return the name of the character converter or {@code null} if this
* reader is closed.
* @return the name of the character converter or {@code null} if this reader is closed.
*/
public String getEncoding() {
if (!isOpen()) {
@ -188,16 +169,12 @@ public class InputStreamReader extends Reader {
}
/**
* Reads a single character from this reader and returns it as an integer
* with the two higher-order bytes set to 0. Returns -1 if the end of the
* reader has been reached. The byte value is either obtained from
* converting bytes in this reader's buffer or by first filling the buffer
* from the source InputStream and then reading from the buffer.
* Reads a single character from this reader and returns it as an integer with the two higher-order bytes set to 0.
* Returns -1 if the end of the reader has been reached. The byte value is either obtained from converting bytes in
* this reader's buffer or by first filling the buffer from the source InputStream and then reading from the buffer.
*
* @return the character read or -1 if the end of the reader has been
* reached.
* @throws IOException
* if this reader is closed or some other I/O error occurs.
* @return the character read or -1 if the end of the reader has been reached.
* @throws IOException if this reader is closed or some other I/O error occurs.
*/
@Override
public int read() throws IOException {
@ -212,28 +189,18 @@ public class InputStreamReader extends Reader {
}
/**
* Reads at most {@code length} characters from this reader and stores them
* at position {@code offset} in the character array {@code buf}. Returns
* the number of characters actually read or -1 if the end of the reader has
* been reached. The bytes are either obtained from converting bytes in this
* reader's buffer or by first filling the buffer from the source
* InputStream and then reading from the buffer.
* Reads at most {@code length} characters from this reader and stores them at position {@code offset} in the
* character array {@code buf}. Returns the number of characters actually read or -1 if the end of the reader has been
* reached. The bytes are either obtained from converting bytes in this reader's buffer or by first filling the buffer
* from the source InputStream and then reading from the buffer.
*
* @param buf
* the array to store the characters read.
* @param offset
* the initial position in {@code buf} to store the characters
* read from this reader.
* @param length
* the maximum number of characters to read.
* @return the number of characters read or -1 if the end of the reader has
* been reached.
* @throws IndexOutOfBoundsException
* if {@code offset < 0} or {@code length < 0}, or if
* {@code offset + length} is greater than the length of
* {@code buf}.
* @throws IOException
* if this reader is closed or some other I/O error occurs.
* @param buf the array to store the characters read.
* @param offset the initial position in {@code buf} to store the characters read from this reader.
* @param length the maximum number of characters to read.
* @return the number of characters read or -1 if the end of the reader has been reached.
* @throws IndexOutOfBoundsException if {@code offset < 0} or {@code length < 0}, or if {@code offset + length} is
* greater than the length of {@code buf}.
* @throws IOException if this reader is closed or some other I/O error occurs.
*/
@Override
public int read(char[] buf, int offset, int length) throws IOException {
@ -322,17 +289,14 @@ public class InputStreamReader extends Reader {
}
/**
* Indicates whether this reader is ready to be read without blocking. If
* the result is {@code true}, the next {@code read()} will not block. If
* the result is {@code false} then this reader may or may not block when
* {@code read()} is called. This implementation returns {@code true} if
* there are bytes available in the buffer or the source stream has bytes
* available.
* Indicates whether this reader is ready to be read without blocking. If the result is {@code true}, the next {@code
* read()} will not block. If the result is {@code false} then this reader may or may not block when {@code read()} is
* called. This implementation returns {@code true} if there are bytes available in the buffer or the source stream
* has bytes available.
*
* @return {@code true} if the receiver will not block when {@code read()}
* is called, {@code false} if unknown or blocking will occur.
* @throws IOException
* if this reader is closed or some other I/O error occurs.
* @return {@code true} if the receiver will not block when {@code read()} is called, {@code false} if unknown or
* blocking will occur.
* @throws IOException if this reader is closed or some other I/O error occurs.
*/
@Override
public boolean ready() throws IOException {

View File

@ -15,11 +15,13 @@
*/
package dorkbox.util.input.posix;
import java.nio.ByteBuffer;
import com.sun.jna.Library;
public interface PosixTerminalControl extends Library {
import java.nio.ByteBuffer;
@SuppressWarnings("ALL")
interface PosixTerminalControl extends Library {
public static final int TCSANOW = 0;
public static final int TBUFLEN = 124;

View File

@ -15,29 +15,47 @@
*/
package dorkbox.util.input.posix;
import com.sun.jna.Structure;
import java.util.Arrays;
import java.util.List;
import com.sun.jna.Structure;
@SuppressWarnings("ALL")
class TermiosStruct extends Structure {
public class TermiosStruct extends Structure {
/** input mode flags */
/**
* input mode flags
*/
public int c_iflag;
/** output mode flags */
/**
* output mode flags
*/
public int c_oflag;
/** control mode flags */
/**
* control mode flags
*/
public int c_cflag;
/** local mode flags */
/**
* local mode flags
*/
public int c_lflag;
/** line discipline */
/**
* line discipline
*/
public byte c_line;
/** control characters */
/**
* control characters
*/
public byte[] c_cc = new byte[32];
/** input speed */
/**
* input speed
*/
public int c_ispeed;
/** output speed */
/**
* output speed
*/
public int c_ospeed;
public TermiosStruct() {

View File

@ -15,18 +15,18 @@
*/
package dorkbox.util.input.posix;
import com.sun.jna.Native;
import java.io.IOException;
import java.io.Reader;
import java.nio.ByteBuffer;
import com.sun.jna.Native;
import dorkbox.util.input.Encoding;
import dorkbox.util.input.Terminal;
/**
* Terminal that is used for unix platforms. Terminal initialization
* is handled via JNA and ioctl/tcgetattr/tcsetattr/cfmakeraw.
* Terminal that is used for unix platforms. Terminal initialization is handled via JNA and
* ioctl/tcgetattr/tcsetattr/cfmakeraw.
*
* This implementation should work for an reasonable POSIX system.
*/
@ -35,9 +35,9 @@ public class UnixTerminal extends Terminal {
private volatile TermiosStruct termInfoDefault = new TermiosStruct();
private volatile TermiosStruct termInfo = new TermiosStruct();
private Reader reader;
private final Reader reader;
private PosixTerminalControl term;
private final PosixTerminalControl term;
private ByteBuffer windowSizeBuffer = ByteBuffer.allocate(8);
@ -48,7 +48,7 @@ public class UnixTerminal extends Terminal {
this.term = (PosixTerminalControl) Native.loadLibrary("c", PosixTerminalControl.class);
// save off the defaults
if (this.term.tcgetattr(0, this.termInfoDefault) !=0) {
if (this.term.tcgetattr(0, this.termInfoDefault) != 0) {
throw new IOException("Failed to get terminal info");
}
}
@ -77,17 +77,17 @@ public class UnixTerminal extends Terminal {
// t->c_cc[VMIN] = 1;
// t->c_cc[VTIME] = 0;
if (this.term.tcgetattr(0, this.termInfo) !=0) {
if (this.term.tcgetattr(0, this.termInfo) != 0) {
throw new IOException("Failed to get terminal info");
}
this.termInfo.c_iflag &= ~PosixTerminalControl.IXON; // DISABLE - flow control mediated by ^S and ^Q
// struct.c_iflag |= PosixTerminalControl.IUTF8; // DISABLE - flow control mediated by ^S and ^Q
this.termInfo.c_lflag &= ~PosixTerminalControl.ICANON; // DISABLE - canonical mode (pass chars straight through to terminal)
this.termInfo.c_lflag &=
~PosixTerminalControl.ICANON; // DISABLE - canonical mode (pass chars straight through to terminal)
// struct.c_lflag &= ~PosixTerminalControl.ISIG; // DISABLE - When any of the characters INTR, QUIT, SUSP, or DSUSP are received, generate the corresponding signal.
// If MIN > 0 and TIME = 0, MIN sets the number of characters to receive before the read is satisfied. As TIME is zero, the timer is not used.
this.termInfo.c_cc[PosixTerminalControl.VMIN] = 1; // Minimum number of characters for noncanonical read (MIN).
this.termInfo.c_cc[PosixTerminalControl.VTIME] = 0; // Timeout in deciseconds for noncanonical read (TIME).
@ -96,16 +96,14 @@ public class UnixTerminal extends Terminal {
this.termInfo.c_cc[PosixTerminalControl.VEOF] = 0; // eof disabled
this.termInfo.c_cc[PosixTerminalControl.VEOL] = 0; // eol disabled
if (this.term.tcsetattr(0, PosixTerminalControl.TCSANOW, this.termInfo) != 0) {
throw new IOException("Can not set terminal flags");
}
}
/**
* 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 final void restore() throws IOException {
@ -123,8 +121,7 @@ public class UnixTerminal extends Terminal {
return DEFAULT_WIDTH;
}
short columns = (short)(0x000000FF &this.windowSizeBuffer.get(2) + (0x000000FF & this.windowSizeBuffer.get(3)) * 256);
return columns;
return (short) (0x000000FF & this.windowSizeBuffer.get(2) + (0x000000FF & this.windowSizeBuffer.get(3)) * 256);
}
/**
@ -136,21 +133,20 @@ public class UnixTerminal extends Terminal {
return DEFAULT_HEIGHT;
}
short rows = (short)(0x000000FF &this.windowSizeBuffer.get(0) + (0x000000FF & this.windowSizeBuffer.get(1)) * 256);
return rows;
return
(short) (0x000000FF & this.windowSizeBuffer.get(0) + (0x000000FF & this.windowSizeBuffer.get(1)) * 256);
}
@Override
public final synchronized void setEchoEnabled(final boolean enabled) {
// have to reget them, since flags change everything
if (this.term.tcgetattr(0, this.termInfo) !=0) {
if (this.term.tcgetattr(0, this.termInfo) != 0) {
this.logger.error("Failed to get terminal info");
}
if (enabled) {
this.termInfo.c_lflag |= PosixTerminalControl.ECHO; // ENABLE Echo input characters.
}
else {
} else {
this.termInfo.c_lflag &= ~PosixTerminalControl.ECHO; // DISABLE Echo input characters.
}

View File

@ -23,10 +23,10 @@ import dorkbox.util.input.Terminal;
public class UnsupportedTerminal extends Terminal {
private ByteBuffer2 buffer = new ByteBuffer2(8, -1);
private final ByteBuffer2 buffer = new ByteBuffer2(8, -1);
private int readerCount = -1;
private InputStream in;
private final InputStream in;
public UnsupportedTerminal() {
this.in = System.in;
@ -64,7 +64,7 @@ public class UnsupportedTerminal extends Terminal {
this.buffer.clearSecure();
while ((read = sysIn.read()) != -1) {
asChar = (char)read;
asChar = (char) read;
if (asChar == '\n') {
this.readerCount = this.buffer.position();
this.buffer.rewind();
@ -73,18 +73,16 @@ public class UnsupportedTerminal extends Terminal {
this.buffer.writeChar(asChar);
}
}
} catch (IOException e1) {
} catch (IOException ignored) {
}
}
// EACH thread will have it's own count!
if (this.readerCount == this.buffer.position()) {
this.readerCount = -1;
return '\n';
} else {
char c = this.buffer.readChar();
return c;
return this.buffer.readChar();
}
}
}

View File

@ -12,52 +12,42 @@
package dorkbox.util.input.windows;
/**
* Console mode
* <p/>
* Constants copied <tt>wincon.h</tt>.
* Console mode <p/> Constants copied <tt>wincon.h</tt>.
*/
public enum ConsoleMode {
/**
* The ReadFile or ReadConsole function returns only when a carriage return
* character is read. If this mode is disable, the functions return when one
* or more characters are available.
* The ReadFile or ReadConsole function returns only when a carriage return character is read. If this mode is
* disable, the functions return when one or more characters are available.
*/
ENABLE_LINE_INPUT(2),
/**
* Characters read by the ReadFile or ReadConsole function are written to
* the active screen buffer as they are read. This mode can be used only if
* the ENABLE_LINE_INPUT mode is also enabled.
* Characters read by the ReadFile or ReadConsole function are written to the active screen buffer as they are read.
* This mode can be used only if the ENABLE_LINE_INPUT mode is also enabled.
*/
ENABLE_ECHO_INPUT(4),
/**
* CTRL+C is processed by the system and is not placed in the input buffer.
* If the input buffer is being read by ReadFile or ReadConsole, other
* control keys are processed by the system and are not returned in the
* ReadFile or ReadConsole buffer. If the ENABLE_LINE_INPUT mode is also
* enabled, backspace, carriage return, and linefeed characters are handled
* by the system.
* CTRL+C is processed by the system and is not placed in the input buffer. If the input buffer is being read by
* ReadFile or ReadConsole, other control keys are processed by the system and are not returned in the ReadFile or
* ReadConsole buffer. If the ENABLE_LINE_INPUT mode is also enabled, backspace, carriage return, and linefeed
* characters are handled by the system.
*/
ENABLE_PROCESSED_INPUT(1),
/**
* User interactions that change the size of the console screen buffer are
* reported in the console's input buffee. Information about these events
* can be read from the input buffer by applications using
* theReadConsoleInput function, but not by those using ReadFile
* orReadConsole.
* User interactions that change the size of the console screen buffer are reported in the console's input buffee.
* Information about these events can be read from the input buffer by applications using theReadConsoleInput
* function, but not by those using ReadFile orReadConsole.
*/
ENABLE_WINDOW_INPUT(8),
/**
* If the mouse pointer is within the borders of the console window and the
* window has the keyboard focus, mouse events generated by mouse movement
* and button presses are placed in the input buffer. These events are
* discarded by ReadFile or ReadConsole, even when this mode is enabled.
* If the mouse pointer is within the borders of the console window and the window has the keyboard focus, mouse
* events generated by mouse movement and button presses are placed in the input buffer. These events are discarded by
* ReadFile or ReadConsole, even when this mode is enabled.
*/
ENABLE_MOUSE_INPUT(16),
;
ENABLE_MOUSE_INPUT(16),;
public final int code;

View File

@ -11,27 +11,25 @@
*/
package dorkbox.util.input.windows;
import java.io.IOException;
import java.io.PrintStream;
import org.fusesource.jansi.internal.Kernel32.INPUT_RECORD;
import org.fusesource.jansi.internal.Kernel32.KEY_EVENT_RECORD;
import org.fusesource.jansi.internal.WindowsSupport;
import java.io.IOException;
import java.io.PrintStream;
import dorkbox.util.input.Terminal;
/**
* Terminal implementation for Microsoft Windows. Terminal initialization in
* {@link #init} is accomplished by calling the Win32 APIs <a
* href="http://msdn.microsoft.com/library/default.asp?
* url=/library/en-us/dllproc/base/setconsolemode.asp">SetConsoleMode</a> and
* <a href="http://msdn.microsoft.com/library/default.asp?
* url=/library/en-us/dllproc/base/getconsolemode.asp">GetConsoleMode</a> to
* disable character echoing.
* <p/>
* Terminal implementation for Microsoft Windows. Terminal initialization in {@link #init} is accomplished by calling
* the Win32 APIs <a href="http://msdn.microsoft.com/library/default.asp? url=/library/en-us/dllproc/base/setconsolemode.asp">SetConsoleMode</a>
* and <a href="http://msdn.microsoft.com/library/default.asp? url=/library/en-us/dllproc/base/getconsolemode.asp">GetConsoleMode</a>
* to disable character echoing. <p/>
*
* @since 2.0 (customized)
*/
public class WindowsTerminal extends Terminal {
private volatile int originalMode;
private final PrintStream out;
@ -52,9 +50,8 @@ public class WindowsTerminal extends Terminal {
}
/**
* 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 final void restore() throws IOException {
@ -92,16 +89,16 @@ public class WindowsTerminal extends Terminal {
return input;
}
private final int readInput() {
private int readInput() {
// this HOOKS the input event, and prevents it from going to the console "proper"
try {
INPUT_RECORD[] events = null;
INPUT_RECORD[] events;
while (true) {
// we ALWAYS read until we have an event we care about!
events = WindowsSupport.readConsoleInput(1);
if (events != null) {
for (int i = 0; i < events.length; i++ ) {
for (int i = 0; i < events.length; i++) {
KEY_EVENT_RECORD keyEvent = events[i].keyEvent;
//Log.trace(keyEvent.keyDown? "KEY_DOWN" : "KEY_UP", "key code:", keyEvent.keyCode, "char:", (long)keyEvent.uchar);
if (keyEvent.keyDown) {