modes.dart 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. import 'package:xterm/mouse/mouse_mode.dart';
  2. import 'package:xterm/terminal/csi.dart';
  3. import 'package:xterm/terminal/terminal.dart';
  4. final _decset = 'h'.codeUnitAt(0);
  5. final _decrst = 'l'.codeUnitAt(0);
  6. bool _isEnabled(int finalByte) {
  7. if (finalByte == _decset) {
  8. return true;
  9. }
  10. if (finalByte == _decrst) {
  11. return false;
  12. }
  13. // print('unexpected finalByte: $finalByte');
  14. return true;
  15. }
  16. void csiSetModes(CSI csi, Terminal terminal) {
  17. if (csi.params.isEmpty) {
  18. // print('warning: no mode specified.');
  19. return;
  20. }
  21. final enabled = _isEnabled(csi.finalByte);
  22. if (csi.params.length == 1) {
  23. return csiSetMode(csi.params.first, enabled, terminal);
  24. }
  25. const decPrefix = '?';
  26. final isDec = csi.params.first.startsWith(decPrefix);
  27. for (var mode in csi.params) {
  28. if (isDec && !mode.startsWith(decPrefix)) {
  29. mode = decPrefix + mode;
  30. }
  31. csiSetMode(csi.params.first, enabled, terminal);
  32. }
  33. }
  34. void csiSetMode(String mode, bool enabled, Terminal terminal) {
  35. switch (mode) {
  36. case "4":
  37. if (enabled) {
  38. terminal.setInsertMode();
  39. } else {
  40. terminal.setReplaceMode();
  41. }
  42. break;
  43. case "20":
  44. if (enabled) {
  45. terminal.setNewLineMode();
  46. } else {
  47. terminal.setLineFeedMode();
  48. }
  49. break;
  50. case "?1":
  51. terminal.setApplicationCursorKeys(enabled);
  52. break;
  53. // case "?3":
  54. // if (enabled) {
  55. // // DECCOLM - COLumn mode, 132 characters per line
  56. // terminal.setSize(132, uint(lines));
  57. // } else {
  58. // // DECCOLM - 80 characters per line (erases screen)
  59. // terminal.setSize(80, uint(lines));
  60. // }
  61. // terminal.clear();
  62. // case "?4":
  63. // // DECSCLM
  64. case "?5":
  65. // DECSCNM
  66. terminal.setScreenMode(enabled);
  67. break;
  68. case "?6":
  69. // DECOM
  70. terminal.setOriginMode(enabled);
  71. break;
  72. case "?7":
  73. //DECAWM
  74. terminal.setAutoWrapMode(enabled);
  75. break;
  76. case "?9":
  77. if (enabled) {
  78. // terminal.setMouseMode(MouseMode.x10);
  79. } else {
  80. terminal.setMouseMode(MouseMode.none);
  81. }
  82. break;
  83. case "?12":
  84. case "?13":
  85. terminal.setBlinkingCursor(enabled);
  86. break;
  87. case "?25":
  88. terminal.setShowCursor(enabled);
  89. break;
  90. case "?47":
  91. case "?1047":
  92. if (enabled) {
  93. terminal.useAltBuffer();
  94. } else {
  95. terminal.useMainBuffer();
  96. }
  97. break;
  98. case "?1000":
  99. case "?10061000":
  100. // enable mouse tracking
  101. // 1000 refers to ext mode for extended mouse click area - otherwise only x <= 255-31
  102. if (enabled) {
  103. // terminal.setMouseMode(MouseMode.vt200);
  104. } else {
  105. terminal.setMouseMode(MouseMode.none);
  106. }
  107. break;
  108. case "?1002":
  109. // enable mouse tracking
  110. // 1000 refers to ext mode for extended mouse click area - otherwise only x <= 255-31
  111. if (enabled) {
  112. // terminal.setMouseMode(MouseMode.buttonEvent);
  113. } else {
  114. terminal.setMouseMode(MouseMode.none);
  115. }
  116. break;
  117. case "?1003":
  118. if (enabled) {
  119. // terminal.setMouseMode(MouseMode.anyEvent);
  120. } else {
  121. terminal.setMouseMode(MouseMode.none);
  122. }
  123. break;
  124. case "?1005":
  125. if (enabled) {
  126. // terminal.setMouseExtMode(MouseExt.utf);
  127. } else {
  128. // terminal.setMouseExtMode(MouseExt.none);
  129. }
  130. break;
  131. case "?1006":
  132. if (enabled) {
  133. // terminal.setMouseExtMode(MouseExt.sgr);
  134. } else {
  135. // terminal.setMouseExtMode(MouseExt.none);
  136. }
  137. break;
  138. case "?1048":
  139. if (enabled) {
  140. terminal.buffer.saveCursor();
  141. } else {
  142. terminal.buffer.restoreCursor();
  143. }
  144. break;
  145. case "?1049":
  146. if (enabled) {
  147. terminal.useAltBuffer();
  148. terminal.buffer.clear();
  149. } else {
  150. terminal.useMainBuffer();
  151. }
  152. break;
  153. case "?2004":
  154. terminal.setBracketedPasteMode(enabled);
  155. break;
  156. default:
  157. terminal.debug.onError('unsupported mode: $mode');
  158. return;
  159. }
  160. }