diff --git a/readme.md b/readme.md index a50f0d4..18cc5a9 100755 --- a/readme.md +++ b/readme.md @@ -17,7 +17,8 @@ These bindings work for both the UNIX terminal and Windows console: * Query the terminal size. * Switch between bold and normal mode on the terminal. * Change foreground color on the terminal. -* Move terminal cursor up, down, left, right. +* Move terminal cursor up, down, left, right, start of line. +* Clear to end of line. Currently ported to OS X, Linux and Windows. Tested on: @@ -37,7 +38,7 @@ You need to install Visual studio, and build from a Visual studio command prompt # TODO -* Fix TERM=dumb on linux +* Fix TERM=dumb * Split out separate native library for terminal handling. * String names for errno values. * Split into multiple projects. diff --git a/src/main/cpp/posix.cpp b/src/main/cpp/posix.cpp index acf3241..bdab833 100755 --- a/src/main/cpp/posix.cpp +++ b/src/main/cpp/posix.cpp @@ -190,5 +190,15 @@ Java_net_rubygrapefruit_platform_internal_jni_TerminfoFunctions_right(JNIEnv *en } } +JNIEXPORT void JNICALL +Java_net_rubygrapefruit_platform_internal_jni_TerminfoFunctions_startLine(JNIEnv *env, jclass target, jobject result) { + write_capability(env, "cr", result); +} + +JNIEXPORT void JNICALL +Java_net_rubygrapefruit_platform_internal_jni_TerminfoFunctions_clearToEndOfLine(JNIEnv *env, jclass target, jobject result) { + write_capability(env, "ce", result); +} + #endif diff --git a/src/main/java/net/rubygrapefruit/platform/Main.java b/src/main/java/net/rubygrapefruit/platform/Main.java index 5105354..deb7c7c 100755 --- a/src/main/java/net/rubygrapefruit/platform/Main.java +++ b/src/main/java/net/rubygrapefruit/platform/Main.java @@ -25,7 +25,8 @@ public class Main { terminal.normal(); System.out.println(" [normal]"); - System.out.println("here are the colors:"); + System.out.println(); + System.out.println("COLORS"); for (Terminal.Color color : Terminal.Color.values()) { terminal.foreground(color); System.out.print(String.format("[%s] ", color.toString().toLowerCase())); @@ -42,9 +43,9 @@ public class Main { System.out.println(" "); System.out.println(" "); System.out.println(" "); - System.out.print("draw "); + System.out.print("[delete me]"); - terminal.cursorLeft(10); + terminal.cursorLeft(11); terminal.cursorUp(1); terminal.cursorRight(10); System.out.print("[4]"); @@ -57,7 +58,8 @@ public class Main { terminal.cursorDown(1); System.out.print("[3]"); terminal.cursorDown(1); - terminal.cursorRight(10); + terminal.cursorStartOfLine(); + terminal.clearToEndOfLine(); System.out.println("done!"); } diff --git a/src/main/java/net/rubygrapefruit/platform/Terminal.java b/src/main/java/net/rubygrapefruit/platform/Terminal.java index e2901e0..b8172dc 100644 --- a/src/main/java/net/rubygrapefruit/platform/Terminal.java +++ b/src/main/java/net/rubygrapefruit/platform/Terminal.java @@ -72,4 +72,18 @@ public interface Terminal { * @throws NativeException On failure. */ Terminal cursorDown(int count) throws NativeException; + + /** + * Moves the cursor to the start of the current line. + * + * @throws NativeException On failure. + */ + Terminal cursorStartOfLine() throws NativeException; + + /** + * Clears characters from the cursor position to the end of the current line. + * + * @throws NativeException On failure. + */ + Terminal clearToEndOfLine() throws NativeException; } diff --git a/src/main/java/net/rubygrapefruit/platform/internal/TerminfoTerminal.java b/src/main/java/net/rubygrapefruit/platform/internal/TerminfoTerminal.java index d4ec154..b6f10d4 100755 --- a/src/main/java/net/rubygrapefruit/platform/internal/TerminfoTerminal.java +++ b/src/main/java/net/rubygrapefruit/platform/internal/TerminfoTerminal.java @@ -131,4 +131,26 @@ public class TerminfoTerminal extends AbstractTerminal { } return this; } + + @Override + public Terminal cursorStartOfLine() throws NativeException { + stream.flush(); + FunctionResult result = new FunctionResult(); + TerminfoFunctions.startLine(result); + if (result.isFailed()) { + throw new NativeException(String.format("Could not move cursor to start of line for %s: %s", this, result.getMessage())); + } + return this; + } + + @Override + public Terminal clearToEndOfLine() throws NativeException { + stream.flush(); + FunctionResult result = new FunctionResult(); + TerminfoFunctions.clearToEndOfLine(result); + if (result.isFailed()) { + throw new NativeException(String.format("Could not clear to end of line for %s: %s", this, result.getMessage())); + } + return this; + } } diff --git a/src/main/java/net/rubygrapefruit/platform/internal/WindowsTerminal.java b/src/main/java/net/rubygrapefruit/platform/internal/WindowsTerminal.java index 4e01573..da24fae 100755 --- a/src/main/java/net/rubygrapefruit/platform/internal/WindowsTerminal.java +++ b/src/main/java/net/rubygrapefruit/platform/internal/WindowsTerminal.java @@ -97,4 +97,14 @@ public class WindowsTerminal extends AbstractTerminal { public Terminal cursorRight(int count) throws NativeException { throw new UnsupportedOperationException(); } + + @Override + public Terminal cursorStartOfLine() throws NativeException { + throw new UnsupportedOperationException(); + } + + @Override + public Terminal clearToEndOfLine() throws NativeException { + throw new UnsupportedOperationException(); + } } diff --git a/src/main/java/net/rubygrapefruit/platform/internal/jni/TerminfoFunctions.java b/src/main/java/net/rubygrapefruit/platform/internal/jni/TerminfoFunctions.java index 92dcd25..099cc1b 100755 --- a/src/main/java/net/rubygrapefruit/platform/internal/jni/TerminfoFunctions.java +++ b/src/main/java/net/rubygrapefruit/platform/internal/jni/TerminfoFunctions.java @@ -21,4 +21,8 @@ public class TerminfoFunctions { public static native void up(int count, FunctionResult result); public static native void down(int count, FunctionResult result); + + public static native void startLine(FunctionResult result); + + public static native void clearToEndOfLine(FunctionResult result); }