modes.dart 4.0 KB

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