You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@mina.apache.org by "Thomas Wolf (Jira)" <ji...@apache.org> on 2021/12/27 08:05:00 UTC
[jira] [Commented] (SSHD-1235) Terminal resizing: with jediterm, when quit from vim, terminal don't resizing any more
[ https://issues.apache.org/jira/browse/SSHD-1235?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17465571#comment-17465571 ]
Thomas Wolf commented on SSHD-1235:
-----------------------------------
Not sure this is a bug in Jediterm or Apache MINA sshd. Shouldn't your code restore the terminal characteristics it changed when closing?
> Terminal resizing: with jediterm, when quit from vim, terminal don't resizing any more
> ---------------------------------------------------------------------------------------
>
> Key: SSHD-1235
> URL: https://issues.apache.org/jira/browse/SSHD-1235
> Project: MINA SSHD
> Issue Type: Bug
> Affects Versions: 2.8.0
> Environment: IDEA
> Reporter: g3g4x5x6
> Priority: Major
>
> h1. Create widget
>
> {code:java}
> ......
> private ClientSession getSession(SshClient client){
> ClientSession session;
> try {
> session = client.connect(this.user, this.host, this.port).verify(5000, TimeUnit.MILLISECONDS).getSession();
> session.addPasswordIdentity(this.pass);
> session.auth().verify(15, TimeUnit.SECONDS);
> session.setSessionHeartbeat(SessionHeartbeatController.HeartbeatType.IGNORE, Duration.ofMinutes(3));
> return session;
> } catch (IOException e) {
> e.printStackTrace();
> DialogUtil.error(e.getMessage());
> return null;
> }
> }
> ......
> private @NotNull JediTermWidget createTerminalWidget() {
> SshSettingsProvider sshSettingsProvider = new SshSettingsProvider();
> JediTermWidget widget = new JediTermWidget(sshSettingsProvider);
> widget.setTtyConnector(new DefaultTtyConnector(session));
> widget.start();
> return widget;
> } {code}
>
>
> h1. DefaultTtyConnector
> {code:java}
> package com.g3g4x5x6.ui.panels.ssh;
> import com.jediterm.terminal.Questioner;
> import com.jediterm.terminal.TtyConnector;
> import lombok.SneakyThrows;
> import lombok.extern.slf4j.Slf4j;
> import org.apache.sshd.client.channel.ChannelShell;
> import org.apache.sshd.client.session.ClientSession;
> import org.jetbrains.annotations.NotNull;
> import java.awt.*;
> import java.io.*;
> import java.nio.charset.StandardCharsets;
> import java.util.concurrent.TimeUnit;
> @Slf4j
> public class DefaultTtyConnector implements TtyConnector {
> private ClientSession session;
> private ChannelShell channel;
> private Dimension myPendingTermSize;
> private PipedOutputStream channelOut;
> private InputStream channelIn;
> private OutputStream outputStream;
> private BufferedReader reader;
> private BufferedWriter writer;
> public DefaultTtyConnector(ClientSession clientSession) {
> this.session = clientSession;
> }
> @Override
> public boolean init(Questioner questioner) {
> try {
> PipedOutputStream out = new PipedOutputStream();
> channelIn = new PipedInputStream(out);
> channelOut = new PipedOutputStream();
> PipedInputStream in = new PipedInputStream(channelOut);
> reader = new BufferedReader(new InputStreamReader(in, StandardCharsets.UTF_8));
> writer = new BufferedWriter(new OutputStreamWriter(out));
> channel = initClientChannel(session, channelIn, channelOut);
> outputStream = channel.getInvertedIn();
> } catch (IOException e) {
> e.printStackTrace();
> }
> return true;
> }
> private ChannelShell initClientChannel(ClientSession session, InputStream input, OutputStream output) throws IOException {
> ChannelShell channel = session.createShellChannel();
> String lang = (String) System.getenv().get("LANG");
> channel.setEnv("LANG", lang != null ? lang : "zh_CN.UTF-8");
> channel.setPtyType("xterm");
> channel.setUsePty(true);
> channel.setIn(input);
> channel.setOut(output);
> channel.setErr(output);
> channel.open().verify(3000, TimeUnit.MILLISECONDS);
> return channel;
> }
> @SneakyThrows
> @Override
> public void close() {
> channel.close();
> }
> @Override
> public String getName() {
> return "SSH";
> }
> @Override
> public int read(char[] chars, int i, int i1) throws IOException {
> return reader.read(chars, i, i1);
> }
> @Override
> public void write(byte[] bytes) throws IOException {
> outputStream.write(bytes);
> outputStream.flush();
> }
> @Override
> public boolean isConnected() {
> return channel.isOpen();
> }
> @Override
> public void write(String s) throws IOException {
> log.debug(">>>>>>>>>>>>>>>>>>>>>>>>>>" + s);
> this.write(s.getBytes(StandardCharsets.UTF_8));
> }
> @Override
> public int waitFor() throws InterruptedException {
> return channel.getExitStatus();
> }
> @Override
> public boolean ready() throws IOException {
> return true;
> }
> @Override
> public void resize(@NotNull Dimension termWinSize) {
> channel.setPtyWidth(termWinSize.width);
> channel.setPtyHeight(termWinSize.height);
> channel.setPtyColumns(termWinSize.width);
> channel.setPtyLines(termWinSize.height);
> }
> private void resizeImmediately() {
> if (this.myPendingTermSize != null) {
> this.setPtySize(this.channel,
> this.myPendingTermSize.width,
> this.myPendingTermSize.height,
> this.myPendingTermSize.width,
> this.myPendingTermSize.height);
> this.myPendingTermSize = null;
> }
> }
> private void setPtySize(ChannelShell channel, int col, int row, int wp, int hp) {
> channel.setPtyColumns(col);
> channel.setPtyLines(row);
> channel.setPtyWidth(wp);
> channel.setPtyHeight(hp);
> }
> } {code}
> h1. Problem
> [info|https://github.com/JetBrains/jediterm/issues/236]
--
This message was sent by Atlassian Jira
(v8.20.1#820001)
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@mina.apache.org
For additional commands, e-mail: dev-help@mina.apache.org