Преглед изворни кода

Merge remote-tracking branch 'origin/master' into feature/reflow

devmil пре 4 година
родитељ
комит
6f1c93bf68
5 измењених фајлова са 96 додато и 34 уклоњено
  1. 0 4
      lib/buffer/buffer.dart
  2. 19 19
      lib/terminal/ansi.dart
  3. 3 9
      lib/terminal/terminal.dart
  4. 2 2
      lib/utli/debug_handler.dart
  5. 72 0
      script/benchmark.dart

+ 0 - 4
lib/buffer/buffer.dart

@@ -275,17 +275,14 @@ class Buffer {
 
   void cursorGoForward() {
     setCursorX(_cursorX + 1);
-    terminal.refresh();
   }
 
   void setCursorX(int cursorX) {
     _cursorX = cursorX.clamp(0, terminal.viewWidth - 1);
-    terminal.refresh();
   }
 
   void setCursorY(int cursorY) {
     _cursorY = cursorY.clamp(0, terminal.viewHeight - 1);
-    terminal.refresh();
   }
 
   void moveCursorX(int offset) {
@@ -326,7 +323,6 @@ class Buffer {
     if (height < terminal.viewHeight) return;
     final maxOffset = height - terminal.viewHeight;
     _scrollLinesFromBottom = offset.clamp(0, maxOffset);
-    terminal.refresh();
   }
 
   void setScrollOffsetFromTop(int offset) {

+ 19 - 19
lib/terminal/ansi.dart

@@ -7,7 +7,7 @@ import 'package:xterm/terminal/terminal.dart';
 typedef AnsiHandler = void Function(Queue<int>, Terminal);
 
 void ansiHandler(Queue<int> queue, Terminal terminal) {
-  final charAfterEsc = String.fromCharCode(queue.removeFirst());
+  final charAfterEsc = queue.removeFirst();
 
   final handler = _ansiHandlers[charAfterEsc];
   if (handler != null) {
@@ -20,24 +20,24 @@ void ansiHandler(Queue<int> queue, Terminal terminal) {
   terminal.debug.onError('unsupported ansi sequence: $charAfterEsc');
 }
 
-final _ansiHandlers = <String, AnsiHandler>{
-  '[': csiHandler,
-  ']': oscHandler,
-  '7': _ansiSaveCursorHandler,
-  '8': _ansiRestoreCursorHandler,
-  'D': _ansiIndexHandler,
-  'E': _ansiNextLineHandler,
-  'H': _ansiTabSetHandler,
-  'M': _ansiReverseIndexHandler,
-  'P': _unsupportedHandler, // Sixel
-  'c': _unsupportedHandler,
-  '#': _unsupportedHandler,
-  '(': _scsHandler(0), //  G0
-  ')': _scsHandler(1), //  G1
-  '*': _voidHandler(1), // TODO: G2 (vt220)
-  '+': _voidHandler(1), // TODO: G3 (vt220)
-  '>': _voidHandler(0), // TODO: Normal Keypad
-  '=': _voidHandler(0), // TODO: Application Keypad
+final _ansiHandlers = <int, AnsiHandler>{
+  '['.codeUnitAt(0): csiHandler,
+  ']'.codeUnitAt(0): oscHandler,
+  '7'.codeUnitAt(0): _ansiSaveCursorHandler,
+  '8'.codeUnitAt(0): _ansiRestoreCursorHandler,
+  'D'.codeUnitAt(0): _ansiIndexHandler,
+  'E'.codeUnitAt(0): _ansiNextLineHandler,
+  'H'.codeUnitAt(0): _ansiTabSetHandler,
+  'M'.codeUnitAt(0): _ansiReverseIndexHandler,
+  'P'.codeUnitAt(0): _unsupportedHandler, // Sixel
+  'c'.codeUnitAt(0): _unsupportedHandler,
+  '#'.codeUnitAt(0): _unsupportedHandler,
+  '('.codeUnitAt(0): _scsHandler(0), //  G0
+  ')'.codeUnitAt(0): _scsHandler(1), //  G1
+  '*'.codeUnitAt(0): _voidHandler(1), // TODO: G2 (vt220)
+  '+'.codeUnitAt(0): _voidHandler(1), // TODO: G3 (vt220)
+  '>'.codeUnitAt(0): _voidHandler(0), // TODO: Normal Keypad
+  '='.codeUnitAt(0): _voidHandler(0), // TODO: Application Keypad
 };
 
 AnsiHandler _voidHandler(int sequenceLength) {

+ 3 - 9
lib/terminal/terminal.dart

@@ -160,19 +160,16 @@ class Terminal with Observable {
   int get cursorY => buffer.cursorY;
   int get scrollOffset => buffer.scrollOffsetFromBottom;
 
-  void write(String text) async {
+  void write(String text) {
     _queue.addAll(text.runes);
     _processInput();
-  }
-
-  void writeBytes(Iterable<int> data) async {
-    _queue.addAll(data);
-    _processInput();
+    refresh();
   }
 
   void writeChar(int codePoint) {
     _queue.addLast(codePoint);
     _processInput();
+    refresh();
   }
 
   List<BufferLine> getVisibleLines() {
@@ -190,7 +187,6 @@ class Terminal with Observable {
 
       if (char == esc && _queue.isNotEmpty) {
         ansiHandler(_queue, this);
-        refresh();
         continue;
       }
 
@@ -208,8 +204,6 @@ class Terminal with Observable {
       debug.onChar(codePoint);
       _buffer.writeChar(codePoint);
     }
-
-    refresh();
   }
 
   void refresh() {

+ 2 - 2
lib/utli/debug_handler.dart

@@ -26,10 +26,10 @@ class DebugHandler {
     print(AnsiColor.green('<CSI $csi>'));
   }
 
-  void onEsc(String charAfterEsc) {
+  void onEsc(int charAfterEsc) {
     if (!_enabled) return;
     _checkBuffer();
-    print(AnsiColor.green('<ESC $charAfterEsc>'));
+    print(AnsiColor.green('<ESC ${String.fromCharCode(charAfterEsc)}>'));
   }
 
   void onOsc(List<String> params) {

+ 72 - 0
script/benchmark.dart

@@ -0,0 +1,72 @@
+import 'package:xterm/xterm.dart';
+
+void main() {
+  BenchmarkWrite().run();
+  BenchmarkWrite2().run();
+  BenchmarkWriteBuffer().run();
+}
+
+abstract class Benchmark {
+  String explain();
+
+  void benchmark();
+
+  void run() {
+    print('benchmark: ${explain()}');
+    print('preheating...');
+    benchmark();
+    final sw = Stopwatch()..start();
+    print('running...');
+    benchmark();
+    sw.stop();
+    print('result: ${sw.elapsedMilliseconds} ms');
+  }
+}
+
+class BenchmarkWrite extends Benchmark {
+  static const cycle = 1 << 20;
+  static const data = 'hello world';
+
+  String explain() {
+    return "write '$data' to Terminal for $cycle times";
+  }
+
+  void benchmark() {
+    final terminal = Terminal();
+    for (var i = 0; i < cycle; i++) {
+      terminal.write(data);
+    }
+  }
+}
+
+class BenchmarkWrite2 extends Benchmark {
+  static const cycle = 100000;
+  static const data = '100000';
+
+  String explain() {
+    return "write '$data' to Terminal for $cycle times";
+  }
+
+  void benchmark() {
+    final terminal = Terminal();
+    for (var i = 0; i < cycle; i++) {
+      terminal.write(data);
+    }
+  }
+}
+
+class BenchmarkWriteBuffer extends Benchmark {
+  static const cycle = 1 << 20;
+  static const data = 'hello world';
+
+  String explain() {
+    return "write '$data' to StringBuffer for $cycle times";
+  }
+
+  void benchmark() {
+    final buffer = StringBuffer();
+    for (var i = 0; i < cycle; i++) {
+      buffer.write(data);
+    }
+  }
+}