Prechádzať zdrojové kódy

implement ListBufferLine

xuty 4 rokov pred
rodič
commit
e21bdea4ea

+ 1 - 1
lib/buffer/buffer.dart

@@ -1,6 +1,6 @@
 import 'dart:math' show max, min;
 
-import 'package:xterm/buffer/buffer_line.dart';
+import 'package:xterm/buffer/line/line.dart';
 import 'package:xterm/buffer/reflow_strategy_narrower.dart';
 import 'package:xterm/buffer/reflow_strategy_wider.dart';
 import 'package:xterm/terminal/charset.dart';

+ 100 - 0
lib/buffer/line/line.dart

@@ -0,0 +1,100 @@
+import 'dart:math';
+
+import 'package:xterm/buffer/line/line_bytedata.dart';
+import 'package:xterm/buffer/line/line_list.dart';
+import 'package:xterm/terminal/cursor.dart';
+import 'package:xterm/util/constants.dart';
+
+abstract class BufferLine {
+  factory BufferLine({int length = 64, bool isWrapped = false}) {
+    if (kIsWeb) {
+      return ListBufferLine(length, isWrapped);
+    }
+
+    return ByteDataBufferLine(length, isWrapped);
+  }
+
+  bool get isWrapped;
+
+  set isWrapped(bool value);
+
+  void ensure(int length);
+
+  void insert(int index) {
+    insertN(index, 1);
+  }
+
+  void removeN(int index, int count);
+
+  void insertN(int index, int count);
+
+  void clear();
+
+  void erase(Cursor cursor, int start, int end, [bool resetIsWrapped = false]);
+
+  void cellClear(int index);
+
+  void cellInitialize(
+    int index, {
+    required int content,
+    required int width,
+    required Cursor cursor,
+  });
+
+  bool cellHasContent(int index);
+
+  int cellGetContent(int index);
+
+  void cellSetContent(int index, int content);
+
+  int cellGetFgColor(int index);
+
+  void cellSetFgColor(int index, int color);
+
+  int cellGetBgColor(int index);
+
+  void cellSetBgColor(int index, int color);
+
+  int cellGetFlags(int index);
+
+  void cellSetFlags(int index, int flags);
+
+  int cellGetWidth(int index);
+
+  void cellSetWidth(int index, int width);
+
+  void cellClearFlags(int index);
+
+  bool cellHasFlag(int index, int flag);
+
+  void cellSetFlag(int index, int flag);
+
+  void cellErase(int index, Cursor cursor);
+
+  int getTrimmedLength([int? cols]);
+
+  void copyCellsFrom(covariant BufferLine src, int srcCol, int dstCol, int len);
+
+  // int cellGetHash(int index);
+
+  void removeRange(int start, int end);
+
+  void clearRange(int start, int end);
+
+  String toDebugString(int cols) {
+    final result = StringBuffer();
+    final length = getTrimmedLength();
+    for (int i = 0; i < max(cols, length); i++) {
+      var code = cellGetContent(i);
+      if (code == 0) {
+        if (cellGetWidth(i) == 0) {
+          code = '_'.runes.first;
+        } else {
+          code = cellGetWidth(i).toString().runes.first;
+        }
+      }
+      result.writeCharCode(code);
+    }
+    return result.toString();
+  }
+}

+ 6 - 20
lib/buffer/buffer_line.dart → lib/buffer/line/line_bytedata.dart

@@ -1,6 +1,7 @@
 import 'dart:math';
 import 'dart:typed_data';
 
+import 'package:xterm/buffer/line/line.dart';
 import 'package:xterm/terminal/cursor.dart';
 
 /// Line layout:
@@ -34,8 +35,10 @@ int _nextLength(int lengthRequirement) {
   return nextLength;
 }
 
-class BufferLine {
-  BufferLine({int length = 64, this.isWrapped = false}) {
+/// [ByteData] based [BufferLine], used in non-web platforms to minimize memory
+/// footprint,
+class ByteDataBufferLine with BufferLine {
+  ByteDataBufferLine(int length, this.isWrapped) {
     _maxCols = _nextLength(length);
     _cells = ByteData(_maxCols * _cellSize);
   }
@@ -241,7 +244,7 @@ class BufferLine {
     return 0;
   }
 
-  void copyCellsFrom(BufferLine src, int srcCol, int dstCol, int len) {
+  void copyCellsFrom(ByteDataBufferLine src, int srcCol, int dstCol, int len) {
     ensure(dstCol + len);
 
     final intsToCopy = len * _cellSize64Bit;
@@ -286,21 +289,4 @@ class BufferLine {
     }
     return result.toString();
   }
-
-  String toDebugString(int cols) {
-    final result = StringBuffer();
-    final length = getTrimmedLength();
-    for (int i = 0; i < max(cols, length); i++) {
-      var code = cellGetContent(i);
-      if (code == 0) {
-        if (cellGetWidth(i) == 0) {
-          code = '_'.runes.first;
-        } else {
-          code = cellGetWidth(i).toString().runes.first;
-        }
-      }
-      result.writeCharCode(code);
-    }
-    return result.toString();
-  }
 }

+ 267 - 0
lib/buffer/line/line_list.dart

@@ -0,0 +1,267 @@
+import 'dart:math';
+
+import 'package:xterm/buffer/line/line.dart';
+import 'package:xterm/terminal/cursor.dart';
+
+/// Line layout:
+///   |  cell  |  cell  |  cell  |  cell  | ...
+///   (4 ints per cell)
+///
+/// Cell layout:
+///   | code point |  fg color  |  bg color  | attributes |
+///       1 int        1 int        1 int        1 int
+///
+/// Attributes layout:
+///   |  width  |  flags  | reserved | reserved |
+///      1byte     1byte     1byte      1byte
+
+const _cellSize = 4;
+
+const _cellContent = 0;
+const _cellFgColor = 1;
+const _cellBgColor = 2;
+const _cellAttributes = 3;
+
+const _cellWidth = 0;
+const _cellFlags = 8;
+
+int _nextLength(int lengthRequirement) {
+  var nextLength = 2;
+  while (nextLength < lengthRequirement) {
+    nextLength *= 2;
+  }
+  return nextLength;
+}
+
+/// [List] based [BufferLine], used in browser where ByteData is not avaliable.
+class ListBufferLine with BufferLine {
+  ListBufferLine(int length, this.isWrapped) {
+    _maxCols = _nextLength(length);
+    _cells = List.filled(_maxCols * _cellSize, 0);
+  }
+
+  late List<int> _cells;
+
+  bool isWrapped;
+
+  int _maxCols = 64;
+
+  void ensure(int length) {
+    if (length <= _maxCols) {
+      return;
+    }
+
+    final nextLength = _nextLength(length);
+    final newCells = List.filled(nextLength * _cellSize, 0);
+    newCells.setAll(0, _cells);
+    _cells = newCells;
+    _maxCols = nextLength;
+  }
+
+  void insert(int index) {
+    insertN(index, 1);
+  }
+
+  void removeN(int index, int count) {
+    final moveStart = index * _cellSize;
+    final moveOffset = count * _cellSize;
+    final moveEnd = (_maxCols - count) * _cellSize;
+    final bufferEnd = _maxCols * _cellSize;
+
+    // move data backward
+    for (var i = moveStart; i < moveEnd; i++) {
+      _cells[i] = _cells[i + moveOffset];
+    }
+
+    // set empty cells to 0
+    for (var i = moveEnd; i < bufferEnd; i++) {
+      _cells[i] = 0x00;
+    }
+  }
+
+  void insertN(int index, int count) {
+    final moveStart = index * _cellSize;
+    final moveOffset = count * _cellSize;
+    final bufferEnd = _maxCols * _cellSize;
+
+    // move data forward
+    for (var i = bufferEnd - moveOffset - 1; i >= moveStart; i--) {
+      _cells[i + moveOffset] = _cells[i];
+    }
+
+    // set inserted cells to 0
+    for (var i = moveStart; i < moveStart + moveOffset; i++) {
+      _cells[i] = 0x00;
+    }
+  }
+
+  void clear() {
+    clearRange(0, _cells.length ~/ _cellSize);
+  }
+
+  void erase(Cursor cursor, int start, int end, [bool resetIsWrapped = false]) {
+    ensure(end);
+    for (var i = start; i < end; i++) {
+      cellErase(i, cursor);
+    }
+    if (resetIsWrapped) {
+      isWrapped = false;
+    }
+  }
+
+  void cellClear(int index) {
+    _cells.fillRange(index * _cellSize, index * _cellSize + _cellSize, 0);
+  }
+
+  void cellInitialize(
+    int index, {
+    required int content,
+    required int width,
+    required Cursor cursor,
+  }) {
+    final cell = index * _cellSize;
+    _cells[cell + _cellContent] = content;
+    _cells[cell + _cellFgColor] = cursor.fg;
+    _cells[cell + _cellBgColor] = cursor.bg;
+    _cells[cell + _cellAttributes] =
+        (width << _cellWidth) + (cursor.flags << _cellFlags);
+  }
+
+  bool cellHasContent(int index) {
+    return cellGetContent(index) != 0;
+  }
+
+  int cellGetContent(int index) {
+    if (index >= _maxCols) return 0;
+    return _cells[index * _cellSize + _cellContent];
+  }
+
+  void cellSetContent(int index, int content) {
+    _cells[index * _cellSize + _cellContent] = content;
+  }
+
+  int cellGetFgColor(int index) {
+    if (index >= _maxCols) return 0;
+    return _cells[index * _cellSize + _cellFgColor];
+  }
+
+  void cellSetFgColor(int index, int color) {
+    _cells[index * _cellSize + _cellFgColor] = color;
+  }
+
+  int cellGetBgColor(int index) {
+    if (index >= _maxCols) return 0;
+    return _cells[index * _cellSize + _cellBgColor];
+  }
+
+  void cellSetBgColor(int index, int color) {
+    _cells[index * _cellSize + _cellBgColor] = color;
+  }
+
+  int cellGetFlags(int index) {
+    if (index >= _maxCols) return 0;
+    final offset = index * _cellSize + _cellAttributes;
+    return (_cells[offset] >> _cellFlags) & 0xFF;
+  }
+
+  void cellSetFlags(int index, int flags) {
+    final offset = index * _cellSize + _cellAttributes;
+    var result = _cells[offset];
+    result |= 0xFF << _cellFlags;
+    result &= flags << _cellFlags;
+    _cells[offset] = result;
+  }
+
+  int cellGetWidth(int index) {
+    if (index >= _maxCols) return 0;
+    final offset = index * _cellSize + _cellAttributes;
+    return (_cells[offset] >> _cellWidth) & 0xFF;
+  }
+
+  void cellSetWidth(int index, int width) {
+    final offset = index * _cellSize + _cellAttributes;
+    var result = _cells[offset];
+    result |= 0xFF << _cellWidth;
+    result &= width << _cellWidth;
+    _cells[offset] = result;
+  }
+
+  void cellClearFlags(int index) {
+    cellSetFlags(index, 0);
+  }
+
+  bool cellHasFlag(int index, int flag) {
+    if (index >= _maxCols) {
+      return false;
+    }
+    return cellGetFlags(index) & flag != 0;
+  }
+
+  void cellSetFlag(int index, int flag) {
+    cellSetFlags(index, cellGetFlags(index) | flag);
+  }
+
+  void cellErase(int index, Cursor cursor) {
+    cellSetContent(index, 0x00);
+    cellSetFgColor(index, cursor.fg);
+    cellSetBgColor(index, cursor.bg);
+    cellSetFlags(index, cursor.flags);
+    cellSetWidth(index, 0);
+  }
+
+  int getTrimmedLength([int? cols]) {
+    if (cols == null) {
+      cols = _maxCols;
+    }
+    for (var i = cols - 1; i >= 0; i--) {
+      if (cellGetContent(i) != 0) {
+        // we are at the last cell in this line that has content.
+        // the length of this line is the index of this cell + 1
+        // the only exception is that if that last cell is wider
+        // than 1 then we have to add the diff
+        final lastCellWidth = cellGetWidth(i);
+        return i + lastCellWidth;
+      }
+    }
+    return 0;
+  }
+
+  void copyCellsFrom(ListBufferLine src, int srcCol, int dstCol, int len) {
+    ensure(dstCol + len);
+
+    final intsToCopy = len * _cellSize;
+    final srcStart = srcCol * _cellSize;
+    final dstStart = dstCol * _cellSize;
+
+    final cells = _cells;
+    final srcCells = src._cells;
+    for (var i = 0; i < intsToCopy; i++) {
+      cells[dstStart + i] = srcCells[srcStart + i];
+    }
+  }
+
+  void removeRange(int start, int end) {
+    end = min(end, _maxCols);
+    this.removeN(start, end - start);
+  }
+
+  void clearRange(int start, int end) {
+    end = min(end, _maxCols);
+    for (var index = start; index < end; index++) {
+      cellClear(index);
+    }
+  }
+
+  @override
+  String toString() {
+    final result = StringBuffer();
+    for (int i = 0; i < _maxCols; i++) {
+      final code = cellGetContent(i);
+      if (code == 0) {
+        continue;
+      }
+      result.writeCharCode(code);
+    }
+    return result.toString();
+  }
+}

+ 1 - 1
lib/buffer/reflow_strategy.dart

@@ -1,5 +1,5 @@
 import 'package:xterm/buffer/buffer.dart';
-import 'package:xterm/buffer/buffer_line.dart';
+import 'package:xterm/buffer/line/line.dart';
 import 'package:xterm/util/circular_list.dart';
 
 abstract class ReflowStrategy {

+ 1 - 1
lib/buffer/reflow_strategy_narrower.dart

@@ -1,7 +1,7 @@
 import 'dart:math';
 
 import 'package:xterm/buffer/buffer.dart';
-import 'package:xterm/buffer/buffer_line.dart';
+import 'package:xterm/buffer/line/line.dart';
 import 'package:xterm/buffer/reflow_strategy.dart';
 
 class ReflowStrategyNarrower extends ReflowStrategy {

+ 1 - 1
lib/buffer/reflow_strategy_wider.dart

@@ -1,7 +1,7 @@
 import 'dart:math';
 
 import 'package:xterm/buffer/buffer.dart';
-import 'package:xterm/buffer/buffer_line.dart';
+import 'package:xterm/buffer/line/line.dart';
 import 'package:xterm/buffer/reflow_strategy.dart';
 
 class ReflowStrategyWider extends ReflowStrategy {

+ 37 - 37
lib/frontend/input_map.dart

@@ -8,15 +8,15 @@ final _idKeyMap = {
   LogicalKeyboardKey.fnLock.keyId: TerminalKey.fnLock,
   LogicalKeyboardKey.suspend.keyId: TerminalKey.suspend,
   LogicalKeyboardKey.resume.keyId: TerminalKey.resume,
-  LogicalKeyboardKey.turbo.keyId: TerminalKey.turbo,
-  LogicalKeyboardKey.privacyScreenToggle.keyId: TerminalKey.privacyScreenToggle,
+  // LogicalKeyboardKey.turbo.keyId: TerminalKey.turbo,
+  // LogicalKeyboardKey.privacyScreenToggle.keyId: TerminalKey.privacyScreenToggle,
   LogicalKeyboardKey.sleep.keyId: TerminalKey.sleep,
   LogicalKeyboardKey.wakeUp.keyId: TerminalKey.wakeUp,
-  LogicalKeyboardKey.displayToggleIntExt.keyId: TerminalKey.displayToggleIntExt,
-  LogicalKeyboardKey.usbReserved.keyId: TerminalKey.usbReserved,
-  LogicalKeyboardKey.usbErrorRollOver.keyId: TerminalKey.usbErrorRollOver,
-  LogicalKeyboardKey.usbPostFail.keyId: TerminalKey.usbPostFail,
-  LogicalKeyboardKey.usbErrorUndefined.keyId: TerminalKey.usbErrorUndefined,
+  // LogicalKeyboardKey.displayToggleIntExt.keyId: TerminalKey.displayToggleIntExt,
+  // LogicalKeyboardKey.usbReserved.keyId: TerminalKey.usbReserved,
+  // LogicalKeyboardKey.usbErrorRollOver.keyId: TerminalKey.usbErrorRollOver,
+  // LogicalKeyboardKey.usbPostFail.keyId: TerminalKey.usbPostFail,
+  // LogicalKeyboardKey.usbErrorUndefined.keyId: TerminalKey.usbErrorUndefined,
   LogicalKeyboardKey.keyA.keyId: TerminalKey.keyA,
   LogicalKeyboardKey.keyB.keyId: TerminalKey.keyB,
   LogicalKeyboardKey.keyC.keyId: TerminalKey.keyC,
@@ -155,16 +155,16 @@ final _idKeyMap = {
   LogicalKeyboardKey.props.keyId: TerminalKey.props,
   LogicalKeyboardKey.numpadParenLeft.keyId: TerminalKey.numpadParenLeft,
   LogicalKeyboardKey.numpadParenRight.keyId: TerminalKey.numpadParenRight,
-  LogicalKeyboardKey.numpadBackspace.keyId: TerminalKey.numpadBackspace,
-  LogicalKeyboardKey.numpadMemoryStore.keyId: TerminalKey.numpadMemoryStore,
-  LogicalKeyboardKey.numpadMemoryRecall.keyId: TerminalKey.numpadMemoryRecall,
-  LogicalKeyboardKey.numpadMemoryClear.keyId: TerminalKey.numpadMemoryClear,
-  LogicalKeyboardKey.numpadMemoryAdd.keyId: TerminalKey.numpadMemoryAdd,
-  LogicalKeyboardKey.numpadMemorySubtract.keyId:
-      TerminalKey.numpadMemorySubtract,
-  LogicalKeyboardKey.numpadSignChange.keyId: TerminalKey.numpadSignChange,
-  LogicalKeyboardKey.numpadClear.keyId: TerminalKey.numpadClear,
-  LogicalKeyboardKey.numpadClearEntry.keyId: TerminalKey.numpadClearEntry,
+  // LogicalKeyboardKey.numpadBackspace.keyId: TerminalKey.numpadBackspace,
+  // LogicalKeyboardKey.numpadMemoryStore.keyId: TerminalKey.numpadMemoryStore,
+  // LogicalKeyboardKey.numpadMemoryRecall.keyId: TerminalKey.numpadMemoryRecall,
+  // LogicalKeyboardKey.numpadMemoryClear.keyId: TerminalKey.numpadMemoryClear,
+  // LogicalKeyboardKey.numpadMemoryAdd.keyId: TerminalKey.numpadMemoryAdd,
+  // LogicalKeyboardKey.numpadMemorySubtract.keyId:
+  //     TerminalKey.numpadMemorySubtract,
+  // LogicalKeyboardKey.numpadSignChange.keyId: TerminalKey.numpadSignChange,
+  // LogicalKeyboardKey.numpadClear.keyId: TerminalKey.numpadClear,
+  // LogicalKeyboardKey.numpadClearEntry.keyId: TerminalKey.numpadClearEntry,
   LogicalKeyboardKey.controlLeft.keyId: TerminalKey.controlLeft,
   LogicalKeyboardKey.shiftLeft.keyId: TerminalKey.shiftLeft,
   LogicalKeyboardKey.altLeft.keyId: TerminalKey.altLeft,
@@ -177,13 +177,13 @@ final _idKeyMap = {
   LogicalKeyboardKey.closedCaptionToggle.keyId: TerminalKey.closedCaptionToggle,
   LogicalKeyboardKey.brightnessUp.keyId: TerminalKey.brightnessUp,
   LogicalKeyboardKey.brightnessDown.keyId: TerminalKey.brightnessDown,
-  LogicalKeyboardKey.brightnessToggle.keyId: TerminalKey.brightnessToggle,
-  LogicalKeyboardKey.brightnessMinimum.keyId: TerminalKey.brightnessMinimum,
-  LogicalKeyboardKey.brightnessMaximum.keyId: TerminalKey.brightnessMaximum,
-  LogicalKeyboardKey.brightnessAuto.keyId: TerminalKey.brightnessAuto,
+  // LogicalKeyboardKey.brightnessToggle.keyId: TerminalKey.brightnessToggle,
+  // LogicalKeyboardKey.brightnessMinimum.keyId: TerminalKey.brightnessMinimum,
+  // LogicalKeyboardKey.brightnessMaximum.keyId: TerminalKey.brightnessMaximum,
+  // LogicalKeyboardKey.brightnessAuto.keyId: TerminalKey.brightnessAuto,
   LogicalKeyboardKey.mediaLast.keyId: TerminalKey.mediaLast,
   LogicalKeyboardKey.launchPhone.keyId: TerminalKey.launchPhone,
-  LogicalKeyboardKey.programGuide.keyId: TerminalKey.programGuide,
+  // LogicalKeyboardKey.programGuide.keyId: TerminalKey.programGuide,
   LogicalKeyboardKey.exit.keyId: TerminalKey.exit,
   LogicalKeyboardKey.channelUp.keyId: TerminalKey.channelUp,
   LogicalKeyboardKey.channelDown.keyId: TerminalKey.channelDown,
@@ -198,28 +198,28 @@ final _idKeyMap = {
   LogicalKeyboardKey.eject.keyId: TerminalKey.eject,
   LogicalKeyboardKey.mediaPlayPause.keyId: TerminalKey.mediaPlayPause,
   LogicalKeyboardKey.speechInputToggle.keyId: TerminalKey.speechInputToggle,
-  LogicalKeyboardKey.bassBoost.keyId: TerminalKey.bassBoost,
-  LogicalKeyboardKey.mediaSelect.keyId: TerminalKey.mediaSelect,
+  // LogicalKeyboardKey.bassBoost.keyId: TerminalKey.bassBoost,
+  // LogicalKeyboardKey.mediaSelect.keyId: TerminalKey.mediaSelect,
   LogicalKeyboardKey.launchWordProcessor.keyId: TerminalKey.launchWordProcessor,
   LogicalKeyboardKey.launchSpreadsheet.keyId: TerminalKey.launchSpreadsheet,
   LogicalKeyboardKey.launchMail.keyId: TerminalKey.launchMail,
   LogicalKeyboardKey.launchContacts.keyId: TerminalKey.launchContacts,
   LogicalKeyboardKey.launchCalendar.keyId: TerminalKey.launchCalendar,
-  LogicalKeyboardKey.launchApp2.keyId: TerminalKey.launchApp2,
-  LogicalKeyboardKey.launchApp1.keyId: TerminalKey.launchApp1,
-  LogicalKeyboardKey.launchInternetBrowser.keyId:
-      TerminalKey.launchInternetBrowser,
+  // LogicalKeyboardKey.launchApp2.keyId: TerminalKey.launchApp2,
+  // LogicalKeyboardKey.launchApp1.keyId: TerminalKey.launchApp1,
+  // LogicalKeyboardKey.launchInternetBrowser.keyId:
+  // TerminalKey.launchInternetBrowser,
   LogicalKeyboardKey.logOff.keyId: TerminalKey.logOff,
-  LogicalKeyboardKey.lockScreen.keyId: TerminalKey.lockScreen,
+  // LogicalKeyboardKey.lockScreen.keyId: TerminalKey.lockScreen,
   LogicalKeyboardKey.launchControlPanel.keyId: TerminalKey.launchControlPanel,
-  LogicalKeyboardKey.selectTask.keyId: TerminalKey.selectTask,
-  LogicalKeyboardKey.launchDocuments.keyId: TerminalKey.launchDocuments,
+  // LogicalKeyboardKey.selectTask.keyId: TerminalKey.selectTask,
+  // LogicalKeyboardKey.launchDocuments.keyId: TerminalKey.launchDocuments,
   LogicalKeyboardKey.spellCheck.keyId: TerminalKey.spellCheck,
-  LogicalKeyboardKey.launchKeyboardLayout.keyId:
-      TerminalKey.launchKeyboardLayout,
+  // LogicalKeyboardKey.launchKeyboardLayout.keyId:
+  // TerminalKey.launchKeyboardLayout,
   LogicalKeyboardKey.launchScreenSaver.keyId: TerminalKey.launchScreenSaver,
   LogicalKeyboardKey.launchAssistant.keyId: TerminalKey.launchAssistant,
-  LogicalKeyboardKey.launchAudioBrowser.keyId: TerminalKey.launchAudioBrowser,
+  // LogicalKeyboardKey.launchAudioBrowser.keyId: TerminalKey.launchAudioBrowser,
   LogicalKeyboardKey.newKey.keyId: TerminalKey.newKey,
   LogicalKeyboardKey.close.keyId: TerminalKey.close,
   LogicalKeyboardKey.save.keyId: TerminalKey.save,
@@ -238,9 +238,9 @@ final _idKeyMap = {
   LogicalKeyboardKey.mailReply.keyId: TerminalKey.mailReply,
   LogicalKeyboardKey.mailForward.keyId: TerminalKey.mailForward,
   LogicalKeyboardKey.mailSend.keyId: TerminalKey.mailSend,
-  LogicalKeyboardKey.keyboardLayoutSelect.keyId:
-      TerminalKey.keyboardLayoutSelect,
-  LogicalKeyboardKey.showAllWindows.keyId: TerminalKey.showAllWindows,
+  // LogicalKeyboardKey.keyboardLayoutSelect.keyId:
+  // TerminalKey.keyboardLayoutSelect,
+  // LogicalKeyboardKey.showAllWindows.keyId: TerminalKey.showAllWindows,
   LogicalKeyboardKey.gameButton1.keyId: TerminalKey.gameButton1,
   LogicalKeyboardKey.gameButton2.keyId: TerminalKey.gameButton2,
   LogicalKeyboardKey.gameButton3.keyId: TerminalKey.gameButton3,

+ 2 - 1
lib/frontend/terminal_view.dart

@@ -6,7 +6,7 @@ import 'package:flutter/material.dart';
 import 'package:flutter/rendering.dart';
 import 'package:flutter/scheduler.dart';
 import 'package:flutter/services.dart';
-import 'package:xterm/buffer/buffer_line.dart';
+import 'package:xterm/buffer/line/line.dart';
 import 'package:xterm/buffer/cell_flags.dart';
 import 'package:xterm/frontend/char_size.dart';
 import 'package:xterm/frontend/helpers.dart';
@@ -52,6 +52,7 @@ class TerminalView extends StatefulWidget {
 
     final text = Text(
       testString,
+      maxLines: 1,
       style: (style.textStyleProvider != null)
           ? style.textStyleProvider!(
               fontSize: style.fontSize,

+ 1 - 1
lib/terminal/terminal.dart

@@ -3,7 +3,7 @@ import 'dart:collection';
 import 'dart:math' show max, min;
 
 import 'package:xterm/buffer/buffer.dart';
-import 'package:xterm/buffer/buffer_line.dart';
+import 'package:xterm/buffer/line/line.dart';
 import 'package:xterm/mouse/position.dart';
 import 'package:xterm/mouse/selection.dart';
 import 'package:xterm/input/keys.dart';

+ 2 - 2
lib/terminal/terminal_isolate.dart

@@ -1,7 +1,7 @@
 import 'dart:async';
 import 'dart:isolate';
 
-import 'package:xterm/buffer/buffer_line.dart';
+import 'package:xterm/buffer/line/line.dart';
 import 'package:xterm/input/keys.dart';
 import 'package:xterm/mouse/position.dart';
 import 'package:xterm/mouse/selection.dart';
@@ -255,7 +255,7 @@ class TerminalIsolate with Observable implements TerminalUiInteraction {
     this.theme = TerminalThemes.defaultTheme,
     this.minRefreshDelay = const Duration(milliseconds: 16),
     required this.maxLines,
-  })   : _platform = platform,
+  })  : _platform = platform,
         _refreshEventDebouncer = EventDebouncer(minRefreshDelay);
 
   @override

+ 1 - 1
lib/terminal/terminal_ui_interaction.dart

@@ -1,4 +1,4 @@
-import 'package:xterm/buffer/buffer_line.dart';
+import 'package:xterm/buffer/line/line.dart';
 import 'package:xterm/input/keys.dart';
 import 'package:xterm/mouse/position.dart';
 import 'package:xterm/mouse/selection.dart';

+ 13 - 0
lib/util/constants.dart

@@ -0,0 +1,13 @@
+const kReleaseMode = bool.fromEnvironment(
+  'dart.vm.product',
+  defaultValue: false,
+);
+
+const kProfileMode = bool.fromEnvironment(
+  'dart.vm.profile',
+  defaultValue: false,
+);
+
+const kDebugMode = !kReleaseMode && !kProfileMode;
+
+const kIsWeb = identical(0, 0.0);