private Tuple2<Attributes, Map<Signal, SignalHandler>> prepareTerminal() { final Terminal terminal = client.getTerminal(); final Attributes prevAttributes = terminal.getAttributes(); // adopted from org.jline.builtins.Nano // see also https://en.wikibooks.org/wiki/Serial_Programming/termios#Basic_Configuration_of_a_Serial_Interface // no line processing // canonical mode off, echo off, echo newline off, extended input processing off Attributes newAttr = new Attributes(prevAttributes); newAttr.setLocalFlags(EnumSet.of(LocalFlag.ICANON, LocalFlag.ECHO, LocalFlag.IEXTEN), false); // turn off input processing newAttr.setInputFlags(EnumSet.of(Attributes.InputFlag.IXON, Attributes.InputFlag.ICRNL, Attributes.InputFlag.INLCR), false); // one input byte is enough to return from read, inter-character timer off newAttr.setControlChar(Attributes.ControlChar.VMIN, 1); newAttr.setControlChar(Attributes.ControlChar.VTIME, 0); newAttr.setControlChar(Attributes.ControlChar.VINTR, 0); terminal.setAttributes(newAttr); final Map<Signal, SignalHandler> prevSignals = new HashMap<>(); prevSignals.put(Signal.WINCH, terminal.handle(Signal.WINCH, this::handleSignal)); prevSignals.put(Signal.INT, terminal.handle(Signal.INT, this::handleSignal)); prevSignals.put(Signal.QUIT, terminal.handle(Signal.QUIT, this::handleSignal)); return Tuple2.of(prevAttributes, prevSignals); }
public void run() throws IOException { SignalHandler prevWinchHandler = terminal.handle(Signal.WINCH, this::resize); SignalHandler prevIntHandler = terminal.handle(Signal.INT, this::interrupt); SignalHandler prevSuspHandler = terminal.handle(Signal.TSTP, this::suspend); Attributes attributes = terminal.enterRawMode(); terminal.puts(Capability.enter_ca_mode); terminal.puts(Capability.keypad_xmit); terminal.trackMouse(Terminal.MouseTracking.Any); terminal.flush(); executor = Executors.newSingleThreadScheduledExecutor(); try { size.copy(terminal.getSize()); layout = new Layout(); layout.sx = size.getColumns(); active = new VirtualConsole(paneId.incrementAndGet(), term, 0, 0, size.getColumns(), size.getRows() - 1, this::setDirty, this::close, layout); active.active = lastActive++; active.getConsole().setAttributes(terminal.getAttributes()); panes.add(active); runner.accept(active.getConsole()); } finally { executor.shutdown(); terminal.trackMouse(Terminal.MouseTracking.Off); terminal.puts(Capability.keypad_local); terminal.puts(Capability.exit_ca_mode); terminal.flush(); terminal.setAttributes(attributes); terminal.handle(Signal.WINCH, prevWinchHandler);
size.copy(terminal.getSize()); Terminal.SignalHandler prevHandler = terminal.handle(Terminal.Signal.WINCH, this::handle); Attributes attr = terminal.enterRawMode(); try { terminal.puts(InfoCmp.Capability.enter_ca_mode); terminal.puts(InfoCmp.Capability.keypad_xmit); terminal.puts(InfoCmp.Capability.cursor_invisible); terminal.writer().flush(); terminal.setAttributes(attr); if (prevHandler != null) { terminal.handle(Terminal.Signal.WINCH, prevHandler); terminal.puts(InfoCmp.Capability.exit_ca_mode); terminal.puts(InfoCmp.Capability.keypad_local); terminal.puts(InfoCmp.Capability.cursor_visible); terminal.writer().flush();
PrintStream os = new PrintStream(baos); InputStream is = new ByteArrayInputStream(new byte[0]); if (opt.isSet("append") || !terminal.puts(Capability.clear_screen)) { terminal.writer().println(); terminal.writer().print(baos.toString()); terminal.writer().flush(); }; executorService.scheduleAtFixedRate(task, 0, interval, TimeUnit.SECONDS); Attributes attr = terminal.enterRawMode(); terminal.reader().read(); terminal.setAttributes(attr); } finally { executorService.shutdownNow();
@Override public Object execute() throws Exception { if (arguments == null || arguments.length() == 0) { System.err.println("Argument expected"); } else { WatchTask watchTask = new WatchTask(); executorService.scheduleAtFixedRate(watchTask, 0, interval, TimeUnit.SECONDS); try { Terminal terminal = (Terminal) session.get(".jline.terminal"); Terminal.SignalHandler prev = terminal.handle(Terminal.Signal.INT, this::abort); Attributes attr = terminal.enterRawMode(); try { reading = Thread.currentThread(); while (terminal.reader().read(1) == NonBlockingReader.READ_EXPIRED); } finally { reading = null; terminal.setAttributes(attr); terminal.handle(Terminal.Signal.INT, prev); } } catch (InterruptedIOException e) { // Ignore } finally { abort = true; executorService.shutdownNow(); } } return null; }
prevStatus.handler_INT = terminal.handle(Terminal.Signal.INT, this::handleSignal); prevStatus.handler_QUIT = terminal.handle(Terminal.Signal.QUIT, this::handleSignal); prevStatus.handler_TSTP = terminal.handle(Terminal.Signal.TSTP, this::handleSignal); prevStatus.handler_CONT = terminal.handle(Terminal.Signal.CONT, this::handleSignal); prevStatus.handler_WINCH = terminal.handle(Terminal.Signal.WINCH, this::handleSignal); prevStatus.attributes = terminal.getAttributes(); Attributes newAttributes = new Attributes(prevStatus.attributes); terminal.setAttributes(newAttributes); terminal.puts(InfoCmp.Capability.enter_ca_mode); terminal.puts(InfoCmp.Capability.cursor_invisible); terminal.puts(InfoCmp.Capability.cursor_home); terminal.flush();
Attributes termAttrs= term.getAttributes(); termAttrs.setLocalFlag(Attributes.LocalFlag.ECHO, false); term.setAttributes(termAttrs); InputStream in= term.input(); OutputStream out= term.output(); OutputStream err= out;
private void restoreTerminal(TerminalStatus status) { // Signal handlers terminal.handle(Terminal.Signal.INT, status.handler_INT); terminal.handle(Terminal.Signal.QUIT, status.handler_QUIT); terminal.handle(Terminal.Signal.TSTP, status.handler_TSTP); terminal.handle(Terminal.Signal.CONT, status.handler_CONT); terminal.handle(Terminal.Signal.WINCH, status.handler_WINCH); // Attributes terminal.setAttributes(status.attributes); // Capability terminal.puts(InfoCmp.Capability.exit_ca_mode); terminal.puts(InfoCmp.Capability.cursor_visible); }
@Override public int getWidth() { return terminal.getWidth(); }
public CliView(CliClient client) { this.client = client; keyReader = new BindingReader(client.getTerminal().reader()); }
.signalHandler(Terminal.SignalHandler.SIG_IGN) .build(); final PrintStream output = new PrintStream(terminal.output(), true)) {
@Override public void clearScreen() { terminal.puts(InfoCmp.Capability.clear_screen); }
@Override public void handle( final Terminal.Signal signal, final Terminal.SignalHandler signalHandler ) { terminal.handle(signal, signalHandler); }
private int getUserAnswer(String question, int... allowedAnswers) throws IOException { final Set<Integer> allowedAnswerSet = IntStream.of(allowedAnswers).boxed().collect(Collectors.toSet()); final Terminal terminal = sqlLine.getLineReader().getTerminal(); final PrintWriter writer = terminal.writer(); writer.write(question); int c; // The logic to prevent reaction of SqlLineParser here do { c = terminal.reader().read(100); } while (c != -1 && !allowedAnswerSet.contains(c)); return c; }
protected void handleSignal(Signal signal) { if (signal == Signal.WINCH) { size.copy(terminal.getSize()); display.resize(size.getRows(), size.getColumns()); redisplay(); } else if (signal == Signal.CONT) { terminal.enterRawMode(); size.copy(terminal.getSize()); display.resize(size.getRows(), size.getColumns()); terminal.puts(Capability.keypad_xmit); redrawLine(); redisplay(); } }