xtermjs/xterm.js

fit addon resizes irratically moving up and down

開放

#3,584 建立於 2021年12月22日

 (3 則留言) (1 個反應) (0 位負責人)TypeScript (1,574 個分叉)batch import
area/addon/fithelp wantedtype/bug

倉庫指標

星標
 (16,196 顆星)
PR 合併指標
 (平均合併 2天 10小時) (30 天內合併 16 個 PR)

描述

Upon a resize event, calling fit(), the width does not remain constant when resizing vertically. This results in strange scroll bar positioning, sometimes obstructed, and incomplete fill of the parent control.

Details

  • Browser and browser version: Chrome 1.63.2
  • OS version: Ubuntu 20.04
  • xterm.js version: 4.15.0 / fit 0.5.0

Steps to reproduce

  1. See below for page script
  2. Load the page in Chrome. Make the browser resizable and grab the window edge and shrink or expand the vertical size

Result: the width of the terminal changes, when only the height is supposed to change

The problem appears to be in what xterm resize is doing.

Page script

<!DOCTYPE HTML>
<html>
  <head>
    <title>Example</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <link rel="stylesheet" href="node_modules/xterm/css/xterm.css" />
    <script type="text/javascript" src="node_modules/xterm/lib/xterm.js"></script>
    <script type="text/javascript" src="node_modules/xterm-addon-fit/lib/xterm-addon-fit.js"></script>
  </head>

<body>
  <div id="panes" class="panes">
    <div id="terminal-pane" class="terminal-pane"></div>
    <div id="sidebar-pane" class="sidebar-pane"></div>
  </div>

  <script>
    var pane = document.getElementById('terminal-pane');
    var fitAddon = new FitAddon.FitAddon();
    var term = new Terminal();
    term.loadAddon(fitAddon);
    term.open(pane);

    function onSize() {
      fitAddon.fit(); // note: fitAddon.proposeDimensions() only will produce the correct result
    }
    onSize();

    window.addEventListener('resize', onSize, false);
  </script>
  
  <style>
    html, body {
      height: 100%;
      margin: 0;
    }

    div.panes {
      width: 100%;
      height: 100%;
      display: flex;
    }

    div.terminal-pane {
      flex: 70%;
      overflow: visible;
      background-color: red;
    }

    div.sidebar-pane {
      flex: 30%;
    }
  </style>
</body>
</html>

貢獻者指南