private void restoreTerminal(Tuple2<Attributes, Map<Signal, SignalHandler>> prev) { final Terminal terminal = client.getTerminal(); terminal.setAttributes(prev.f0); prev.f1.forEach(terminal::handle); }
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); }
@Override public void setAttributes(Attributes attr) { terminal.setAttributes(attr); }
@Override public void setAttributes(Attributes attr) { terminal.setAttributes(attr); }
@Override public void setAttributes(Attributes attributes) { delegate().setAttributes(attributes); }
@Override public void setAttributes(Attributes attributes) { delegate().setAttributes(attributes); }
private Terminal buildTerminal (InputStream in, OutputStream out) throws IOException { TerminalBuilder builder = TerminalBuilder.builder(); builder.streams(in,out).system(System.in == in); Terminal t = builder.build(); Attributes attr = t.getAttributes(); attr.getOutputFlags().addAll( EnumSet.of(Attributes.OutputFlag.ONLCR, Attributes.OutputFlag.OPOST) ); t.setAttributes(attr); return t; }
@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; }
@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; }
Attributes attr = terminal.enterRawMode(); terminal.reader().read(); terminal.setAttributes(attr); } finally { executorService.shutdownNow();
terminal.setAttributes(attr); if (prevHandler != null) { terminal.handle(Terminal.Signal.WINCH, prevHandler);
terminal.setAttributes(attr); if (prevHandler != null) { terminal.handle(Terminal.Signal.WINCH, prevHandler);
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); }
term.setAttributes(termAttrs);
terminal.puts(Capability.exit_ca_mode); terminal.flush(); terminal.setAttributes(attributes); terminal.handle(Signal.WINCH, prevWinchHandler); terminal.handle(Signal.INT, prevIntHandler);
terminal.puts(Capability.exit_ca_mode); terminal.flush(); terminal.setAttributes(attributes); terminal.handle(Signal.WINCH, prevWinchHandler); terminal.handle(Signal.INT, prevIntHandler);
terminal.setAttributes(newAttributes);
terminal.setAttributes(attr); terminal.setAttributes(originalAttributes);
newAttr.setControlChar(ControlChar.VTIME, 0); newAttr.setControlChar(ControlChar.VINTR, 0); terminal.setAttributes(newAttr); terminal.puts(Capability.enter_ca_mode); terminal.puts(Capability.keypad_xmit); terminal.puts(Capability.keypad_local); terminal.flush(); terminal.setAttributes(attributes); terminal.handle(Signal.WINCH, prevHandler);