handler.dart 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. import 'package:xterm/src/core/buffer/cell_offset.dart';
  2. import 'package:xterm/src/core/mouse/mode.dart';
  3. import 'package:xterm/src/core/mouse/button.dart';
  4. import 'package:xterm/src/core/mouse/reporter.dart';
  5. import 'package:xterm/src/utils/platform.dart';
  6. import 'package:xterm/src/core/state.dart';
  7. import 'button_state.dart';
  8. class TerminalMouseEvent {
  9. /// The button that is pressed or released.
  10. final TerminalMouseButton button;
  11. /// The current state of the button.
  12. final TerminalMouseButtonState buttonState;
  13. /// The position of button state change.
  14. final CellOffset position;
  15. /// The state of the terminal.
  16. final TerminalState state;
  17. /// The platform of the terminal.
  18. final TerminalTargetPlatform platform;
  19. TerminalMouseEvent({
  20. required this.button,
  21. required this.buttonState,
  22. required this.position,
  23. required this.state,
  24. required this.platform,
  25. });
  26. }
  27. const defaultMouseHandler = CascadeMouseHandler([
  28. ClickMouseHandler(),
  29. UpDownMouseHandler(),
  30. ]);
  31. abstract class TerminalMouseHandler {
  32. const TerminalMouseHandler();
  33. String? call(TerminalMouseEvent event);
  34. }
  35. class CascadeMouseHandler implements TerminalMouseHandler {
  36. final List<TerminalMouseHandler> _handlers;
  37. const CascadeMouseHandler(this._handlers);
  38. @override
  39. String? call(TerminalMouseEvent event) {
  40. for (var handler in _handlers) {
  41. final result = handler(event);
  42. if (result != null) {
  43. return result;
  44. }
  45. }
  46. return null;
  47. }
  48. }
  49. class ClickMouseHandler implements TerminalMouseHandler {
  50. const ClickMouseHandler();
  51. @override
  52. String? call(TerminalMouseEvent event) {
  53. switch (event.state.mouseMode) {
  54. case MouseMode.clickOnly:
  55. // Only clicks and only the first 3 buttons are reported.
  56. if (event.buttonState == TerminalMouseButtonState.down &&
  57. (event.button.id < 3)) {
  58. return MouseReporter.report(
  59. event.button,
  60. event.buttonState,
  61. event.position,
  62. event.state.mouseReportMode,
  63. );
  64. }
  65. return null;
  66. case MouseMode.none:
  67. case MouseMode.upDownScroll:
  68. case MouseMode.upDownScrollDrag:
  69. case MouseMode.upDownScrollMove:
  70. return null;
  71. }
  72. }
  73. }
  74. class UpDownMouseHandler implements TerminalMouseHandler {
  75. const UpDownMouseHandler();
  76. @override
  77. String? call(TerminalMouseEvent event) {
  78. switch (event.state.mouseMode) {
  79. case MouseMode.none:
  80. case MouseMode.clickOnly:
  81. return null;
  82. case MouseMode.upDownScroll:
  83. case MouseMode.upDownScrollDrag:
  84. case MouseMode.upDownScrollMove:
  85. return MouseReporter.report(
  86. event.button,
  87. event.buttonState,
  88. event.position,
  89. event.state.mouseReportMode,
  90. );
  91. }
  92. }
  93. }