Forráskód Böngészése

Routes exitCode via Terminal

Terminal now provides information if the backend has been terminated
Backend can be terminated via Terminal
devmil 4 éve
szülő
commit
38e6cb9341

+ 5 - 0
example/lib/main.dart

@@ -76,6 +76,11 @@ class FakeTerminalBackend implements TerminalBackend {
       _outStream.sink.add(input);
     }
   }
+
+  @override
+  void terminate() {
+    //NOOP
+  }
 }
 
 class _MyHomePageState extends State<MyHomePage> {

+ 5 - 0
example/lib/ssh.dart

@@ -93,6 +93,11 @@ class SSHTerminalBackend implements TerminalBackend {
   void write(String input) {
     client?.sendChannelData(utf8.encode(input));
   }
+
+  @override
+  void terminate() {
+    client?.disconnect('terminate');
+  }
 }
 
 class _MyHomePageState extends State<MyHomePage> {

+ 26 - 0
lib/terminal/terminal.dart

@@ -1,3 +1,4 @@
+import 'dart:async';
 import 'dart:collection';
 import 'dart:math' show max, min;
 
@@ -43,6 +44,10 @@ class Terminal with Observable implements TerminalUiInteraction {
     required int maxLines,
   }) : _maxLines = maxLines {
     backend?.init();
+    backend?.exitCode.then((value) {
+      _isTerminated = true;
+      _backendExited.complete(value);
+    });
     backend?.out.listen(write);
     _mainBuffer = Buffer(terminal: this, isAltBuffer: false);
     _altBuffer = Buffer(terminal: this, isAltBuffer: true);
@@ -574,6 +579,9 @@ class Terminal with Observable implements TerminalUiInteraction {
   @override
   int get cursorColor => theme.cursor;
 
+  @override
+  String? get selectedText => getSelectedText();
+
   @override
   bool get isReady => true;
 
@@ -611,4 +619,22 @@ class Terminal with Observable implements TerminalUiInteraction {
   void raiseOnInput(String input) {
     backend?.write(input);
   }
+
+  final _backendExited = Completer<int>();
+  @override
+  Future<int> get backendExited => _backendExited.future;
+
+  var _isTerminated = false;
+
+  @override
+  void terminateBackend() {
+    if (_isTerminated) {
+      return;
+    }
+    _isTerminated = true;
+    backend?.terminate();
+  }
+
+  @override
+  bool get isTerminated => _isTerminated;
 }

+ 2 - 0
lib/terminal/terminal_backend.dart

@@ -6,4 +6,6 @@ abstract class TerminalBackend {
 
   void write(String input);
   void resize(int width, int height);
+
+  void terminate();
 }

+ 29 - 12
lib/terminal/terminal_isolate.dart

@@ -29,6 +29,7 @@ enum _IsolateCommand {
   keyInput,
   requestNewStateWhenDirty,
   paste,
+  terminateBackend
 }
 
 enum _IsolateEvent {
@@ -75,7 +76,7 @@ void terminalMain(SendPort port) async {
             _needNotify = false;
           }
         });
-        initData.backend?.exitCode
+        _terminal.backendExited
             .then((value) => port.send([_IsolateEvent.exit, value]));
         port.send([_IsolateEvent.notifyChange]);
         break;
@@ -107,10 +108,7 @@ void terminalMain(SendPort port) async {
         _terminal?.backend?.write(msg[1]);
         break;
       case _IsolateCommand.keyInput:
-        if (_terminal == null) {
-          break;
-        }
-        _terminal.keyInput(msg[1],
+        _terminal?.keyInput(msg[1],
             ctrl: msg[2], alt: msg[3], shift: msg[4], mac: msg[5]);
         break;
       case _IsolateCommand.requestNewStateWhenDirty:
@@ -140,11 +138,10 @@ void terminalMain(SendPort port) async {
         }
         break;
       case _IsolateCommand.paste:
-        if (_terminal == null) {
-          break;
-        }
-        _terminal.paste(msg[1]);
+        _terminal?.paste(msg[1]);
         break;
+      case _IsolateCommand.terminateBackend:
+        _terminal?.terminateBackend();
     }
   }
 }
@@ -224,8 +221,6 @@ class TerminalIsolate with Observable implements TerminalUiInteraction {
   final EventDebouncer _refreshEventDebouncer;
 
   TerminalState? _lastState;
-  final _backendExited = Completer<int>();
-  Future<int> get backendExited => _backendExited.future;
 
   TerminalState? get lastState {
     return _lastState;
@@ -319,6 +314,9 @@ class TerminalIsolate with Observable implements TerminalUiInteraction {
   @override
   PlatformBehavior get platform => _platform;
 
+  @override
+  String? get selectedText => _lastState?.selectedText;
+
   @override
   bool get isReady => _lastState != null;
 
@@ -353,6 +351,7 @@ class TerminalIsolate with Observable implements TerminalUiInteraction {
           this.notifyListeners();
           break;
         case _IsolateEvent.exit:
+          _isTerminated = true;
           _backendExited.complete(message[1]);
           break;
       }
@@ -421,7 +420,7 @@ class TerminalIsolate with Observable implements TerminalUiInteraction {
   }
 
   void raiseOnInput(String text) {
-    _sendPort!.send([_IsolateCommand.onInput, text]);
+    _sendPort?.send([_IsolateCommand.onInput, text]);
   }
 
   void keyInput(
@@ -434,4 +433,22 @@ class TerminalIsolate with Observable implements TerminalUiInteraction {
   }) {
     _sendPort?.send([_IsolateCommand.keyInput, key, ctrl, alt, shift, mac]);
   }
+
+  var _isTerminated = false;
+
+  final _backendExited = Completer<int>();
+  @override
+  Future<int> get backendExited => _backendExited.future;
+
+  @override
+  void terminateBackend() {
+    if (_isTerminated) {
+      return;
+    }
+    _isTerminated = true;
+    _sendPort?.send([_IsolateCommand.terminateBackend]);
+  }
+
+  @override
+  bool get isTerminated => _isTerminated;
 }

+ 5 - 0
lib/terminal/terminal_ui_interaction.dart

@@ -23,6 +23,7 @@ abstract class TerminalUiInteraction with Observable {
   int get backgroundColor;
   bool get dirty;
   PlatformBehavior get platform;
+  String? get selectedText;
 
   bool get isReady;
 
@@ -45,4 +46,8 @@ abstract class TerminalUiInteraction with Observable {
     bool mac = false,
     // bool meta,
   });
+
+  Future<int> get backendExited;
+  void terminateBackend();
+  bool get isTerminated;
 }