Pārlūkot izejas kodu

feat: define handler for mouse inputs to a terminal

The current default mouse handler only supports reporting click or
up/down events for mouse buttons and the scroll wheel.
Drag and movement handling is currently not supported by any handler.
Georg Wechslberger 3 gadi atpakaļ
vecāks
revīzija
3bcee88cd7
2 mainītis faili ar 111 papildinājumiem un 0 dzēšanām
  1. 1 0
      lib/core.dart
  2. 110 0
      lib/src/core/mouse/handler.dart

+ 1 - 0
lib/core.dart

@@ -11,6 +11,7 @@ export 'src/core/escape/handler.dart';
 export 'src/core/escape/parser.dart';
 export 'src/core/input/handler.dart';
 export 'src/core/input/keys.dart';
+export 'src/core/mouse/handler.dart';
 export 'src/core/mouse/mode.dart';
 export 'src/core/state.dart';
 export 'src/terminal.dart';

+ 110 - 0
lib/src/core/mouse/handler.dart

@@ -0,0 +1,110 @@
+import 'package:xterm/src/core/buffer/cell_offset.dart';
+import 'package:xterm/src/core/mouse/mode.dart';
+import 'package:xterm/src/core/mouse/button.dart';
+import 'package:xterm/src/core/mouse/reporter.dart';
+import 'package:xterm/src/utils/platform.dart';
+import 'package:xterm/src/core/state.dart';
+
+import 'button_state.dart';
+
+class TerminalMouseEvent {
+  /// The button that is pressed or released.
+  final TerminalMouseButton button;
+
+  /// The current state of the button.
+  final TerminalMouseButtonState buttonState;
+
+  /// The position of button state change.
+  final CellOffset position;
+
+  /// The state of the terminal.
+  final TerminalState state;
+
+  /// The platform of the terminal.
+  final TerminalTargetPlatform platform;
+
+  TerminalMouseEvent({
+    required this.button,
+    required this.buttonState,
+    required this.position,
+    required this.state,
+    required this.platform,
+  });
+}
+
+const defaultMouseHandler = CascadeMouseHandler([
+  ClickMouseHandler(),
+  UpDownMouseHandler(),
+]);
+
+abstract class TerminalMouseHandler {
+  const TerminalMouseHandler();
+
+  String? call(TerminalMouseEvent event);
+}
+
+class CascadeMouseHandler implements TerminalMouseHandler {
+  final List<TerminalMouseHandler> _handlers;
+
+  const CascadeMouseHandler(this._handlers);
+
+  @override
+  String? call(TerminalMouseEvent event) {
+    for (var handler in _handlers) {
+      final result = handler(event);
+      if (result != null) {
+        return result;
+      }
+    }
+    return null;
+  }
+}
+
+class ClickMouseHandler implements TerminalMouseHandler {
+  const ClickMouseHandler();
+
+  @override
+  String? call(TerminalMouseEvent event) {
+    switch (event.state.mouseMode) {
+      case MouseMode.clickOnly:
+        // Only clicks and only the first 3 buttons are reported.
+        if (event.buttonState == TerminalMouseButtonState.down &&
+            (event.button.id < 3)) {
+          return MouseReporter.report(
+            event.button,
+            event.buttonState,
+            event.position,
+            event.state.mouseReportMode,
+          );
+        }
+        return null;
+      case MouseMode.none:
+      case MouseMode.upDownScroll:
+      case MouseMode.upDownScrollDrag:
+      case MouseMode.upDownScrollMove:
+        return null;
+    }
+  }
+}
+
+class UpDownMouseHandler implements TerminalMouseHandler {
+  const UpDownMouseHandler();
+
+  @override
+  String? call(TerminalMouseEvent event) {
+    switch (event.state.mouseMode) {
+      case MouseMode.none:
+      case MouseMode.clickOnly:
+        return null;
+      case MouseMode.upDownScroll:
+      case MouseMode.upDownScrollDrag:
+      case MouseMode.upDownScrollMove:
+        return MouseReporter.report(
+          event.button,
+          event.buttonState,
+          event.position,
+          event.state.mouseReportMode,
+        );
+    }
+  }
+}