159 lines
5.5 KiB
Java
Executable File
159 lines
5.5 KiB
Java
Executable File
package net.rubygrapefruit.platform.internal;
|
|
|
|
import net.rubygrapefruit.platform.NativeException;
|
|
import net.rubygrapefruit.platform.Terminal;
|
|
import net.rubygrapefruit.platform.TerminalSize;
|
|
import net.rubygrapefruit.platform.Terminals;
|
|
import net.rubygrapefruit.platform.internal.jni.PosixTerminalFunctions;
|
|
import net.rubygrapefruit.platform.internal.jni.TerminfoFunctions;
|
|
|
|
public class TerminfoTerminal extends AbstractTerminal {
|
|
private final Terminals.Output output;
|
|
private final TerminalCapabilities capabilities = new TerminalCapabilities();
|
|
private Color foreground;
|
|
|
|
public TerminfoTerminal(Terminals.Output output) {
|
|
this.output = output;
|
|
}
|
|
|
|
@Override
|
|
public String toString() {
|
|
return String.format("Curses terminal on %s", getOutputDisplay());
|
|
}
|
|
|
|
private String getOutputDisplay() {
|
|
return output.toString().toLowerCase();
|
|
}
|
|
|
|
@Override
|
|
protected void init() {
|
|
FunctionResult result = new FunctionResult();
|
|
TerminfoFunctions.initTerminal(output.ordinal(), capabilities, result);
|
|
if (result.isFailed()) {
|
|
throw new NativeException(String.format("Could not open terminal for %s: %s", getOutputDisplay(), result.getMessage()));
|
|
}
|
|
}
|
|
|
|
public TerminalSize getTerminalSize() {
|
|
MutableTerminalSize terminalSize = new MutableTerminalSize();
|
|
FunctionResult result = new FunctionResult();
|
|
PosixTerminalFunctions.getTerminalSize(output.ordinal(), terminalSize, result);
|
|
if (result.isFailed()) {
|
|
throw new NativeException(String.format("Could not get terminal size for %s: %s", getOutputDisplay(), result.getMessage()));
|
|
}
|
|
return terminalSize;
|
|
}
|
|
|
|
public boolean supportsColor() {
|
|
return capabilities.colors;
|
|
}
|
|
|
|
public boolean supportsCursorMotion() {
|
|
return capabilities.cursorMotion;
|
|
}
|
|
|
|
public boolean supportsTextAttributes() {
|
|
return capabilities.textAttributes;
|
|
}
|
|
|
|
public Terminal foreground(Color color) {
|
|
if (!capabilities.colors) {
|
|
return this;
|
|
}
|
|
|
|
FunctionResult result = new FunctionResult();
|
|
TerminfoFunctions.foreground(color.ordinal(), result);
|
|
if (result.isFailed()) {
|
|
throw new NativeException(String.format("Could not switch foreground color for %s: %s", getOutputDisplay(),
|
|
result.getMessage()));
|
|
}
|
|
foreground = color;
|
|
return this;
|
|
}
|
|
|
|
public Terminal bold() {
|
|
if (!capabilities.textAttributes) {
|
|
return this;
|
|
}
|
|
|
|
FunctionResult result = new FunctionResult();
|
|
TerminfoFunctions.bold(result);
|
|
if (result.isFailed()) {
|
|
throw new NativeException(String.format("Could not switch to bold mode for %s: %s", getOutputDisplay(),
|
|
result.getMessage()));
|
|
}
|
|
return this;
|
|
}
|
|
|
|
public Terminal normal() {
|
|
reset();
|
|
if (foreground != null) {
|
|
foreground(foreground);
|
|
}
|
|
return this;
|
|
}
|
|
|
|
public Terminal reset() {
|
|
FunctionResult result = new FunctionResult();
|
|
TerminfoFunctions.reset(result);
|
|
if (result.isFailed()) {
|
|
throw new NativeException(String.format("Could not reset terminal for %s: %s", getOutputDisplay(), result.getMessage()));
|
|
}
|
|
return this;
|
|
}
|
|
|
|
public Terminal cursorDown(int count) {
|
|
FunctionResult result = new FunctionResult();
|
|
TerminfoFunctions.down(count, result);
|
|
if (result.isFailed()) {
|
|
throw new NativeException(String.format("Could not move cursor down for %s: %s", getOutputDisplay(), result.getMessage()));
|
|
}
|
|
return this;
|
|
}
|
|
|
|
public Terminal cursorUp(int count) {
|
|
FunctionResult result = new FunctionResult();
|
|
TerminfoFunctions.up(count, result);
|
|
if (result.isFailed()) {
|
|
throw new NativeException(String.format("Could not move cursor up for %s: %s", getOutputDisplay(), result.getMessage()));
|
|
}
|
|
return this;
|
|
}
|
|
|
|
public Terminal cursorLeft(int count) {
|
|
FunctionResult result = new FunctionResult();
|
|
TerminfoFunctions.left(count, result);
|
|
if (result.isFailed()) {
|
|
throw new NativeException(String.format("Could not move cursor left for %s: %s", getOutputDisplay(), result.getMessage()));
|
|
}
|
|
return this;
|
|
}
|
|
|
|
public Terminal cursorRight(int count) {
|
|
FunctionResult result = new FunctionResult();
|
|
TerminfoFunctions.right(count, result);
|
|
if (result.isFailed()) {
|
|
throw new NativeException(String.format("Could not move cursor right for %s: %s", getOutputDisplay(), result.getMessage()));
|
|
}
|
|
return this;
|
|
}
|
|
|
|
public Terminal cursorStartOfLine() throws NativeException {
|
|
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", getOutputDisplay(), result.getMessage()));
|
|
}
|
|
return this;
|
|
}
|
|
|
|
public Terminal clearToEndOfLine() throws NativeException {
|
|
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", getOutputDisplay(), result.getMessage()));
|
|
}
|
|
return this;
|
|
}
|
|
}
|