- Bundle native library in jar and extract at runtime.

- Don't reinitialise terminal in TerminalAccess.getTerminal() if already initialised.
This commit is contained in:
Adam Murdoch
2012-08-10 08:50:40 +10:00
parent 3c9720f9ab
commit 8621ef80e9
6 changed files with 189 additions and 125 deletions

View File

@@ -1,27 +1,29 @@
package net.rubygrapefruit.platform.internal;
import net.rubygrapefruit.platform.Terminal;
import net.rubygrapefruit.platform.TerminalAccess;
import net.rubygrapefruit.platform.internal.jni.PosixTerminalFunctions;
public class TerminfoTerminalAccess implements TerminalAccess {
private static Output currentlyOpen;
@Override
public boolean isTerminal(Output output) {
return PosixTerminalFunctions.isatty(output.ordinal());
}
@Override
public Terminal getTerminal(Output output) {
if (currentlyOpen != null) {
throw new UnsupportedOperationException("Currently only one output can be used as a terminal.");
}
TerminfoTerminal terminal = new TerminfoTerminal(output);
terminal.init();
currentlyOpen = output;
return terminal;
}
}
package net.rubygrapefruit.platform.internal;
import net.rubygrapefruit.platform.Terminal;
import net.rubygrapefruit.platform.TerminalAccess;
import net.rubygrapefruit.platform.internal.jni.PosixTerminalFunctions;
public class TerminfoTerminalAccess implements TerminalAccess {
private static Output currentlyOpen;
private static TerminfoTerminal current;
@Override
public boolean isTerminal(Output output) {
return PosixTerminalFunctions.isatty(output.ordinal());
}
@Override
public Terminal getTerminal(Output output) {
if (currentlyOpen != null && currentlyOpen != output) {
throw new UnsupportedOperationException("Currently only one output can be used as a terminal.");
}
if (current == null) {
current = new TerminfoTerminal(output);
current.init();
}
currentlyOpen = output;
return current;
}
}

View File

@@ -1,34 +1,37 @@
package net.rubygrapefruit.platform.internal;
import net.rubygrapefruit.platform.NativeException;
import net.rubygrapefruit.platform.Terminal;
import net.rubygrapefruit.platform.TerminalAccess;
import net.rubygrapefruit.platform.internal.jni.WindowsConsoleFunctions;
public class WindowsTerminalAccess implements TerminalAccess {
private static Output currentlyOpen;
@Override
public boolean isTerminal(Output output) {
FunctionResult result = new FunctionResult();
boolean console = WindowsConsoleFunctions.isConsole(output.ordinal(), result);
if (result.isFailed()) {
throw new NativeException(String.format("Could not determine if %s is a console: %s", output,
result.getMessage()));
}
return console;
}
@Override
public Terminal getTerminal(Output output) {
if (currentlyOpen != null) {
throw new UnsupportedOperationException("Currently only one output can be used as a terminal.");
}
WindowsTerminal terminal = new WindowsTerminal(output);
terminal.init();
currentlyOpen = output;
return terminal;
}
}
package net.rubygrapefruit.platform.internal;
import net.rubygrapefruit.platform.NativeException;
import net.rubygrapefruit.platform.Terminal;
import net.rubygrapefruit.platform.TerminalAccess;
import net.rubygrapefruit.platform.internal.jni.WindowsConsoleFunctions;
public class WindowsTerminalAccess implements TerminalAccess {
private static Output currentlyOpen;
private static WindowsTerminal current;
@Override
public boolean isTerminal(Output output) {
FunctionResult result = new FunctionResult();
boolean console = WindowsConsoleFunctions.isConsole(output.ordinal(), result);
if (result.isFailed()) {
throw new NativeException(String.format("Could not determine if %s is a console: %s", output,
result.getMessage()));
}
return console;
}
@Override
public Terminal getTerminal(Output output) {
if (currentlyOpen !=null && currentlyOpen != output) {
throw new UnsupportedOperationException("Currently only one output can be used as a terminal.");
}
if (current == null) {
current = new WindowsTerminal(output);
current.init();
}
currentlyOpen = output;
return current;
}
}