| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 |
- import 'package:xterm/mouse/mouse_mode.dart';
- import 'package:xterm/terminal/csi.dart';
- import 'package:xterm/terminal/terminal.dart';
- final _decset = 'h'.codeUnitAt(0);
- final _decrst = 'l'.codeUnitAt(0);
- bool _isEnabled(int finalByte) {
- if (finalByte == _decset) {
- return true;
- }
- if (finalByte == _decrst) {
- return false;
- }
- // print('unexpected finalByte: $finalByte');
- return true;
- }
- void csiSetModes(CSI csi, Terminal terminal) {
- if (csi.params.isEmpty) {
- // print('warning: no mode specified.');
- return;
- }
- final enabled = _isEnabled(csi.finalByte);
- if (csi.params.length == 1) {
- return csiSetMode(csi.params.first, enabled, terminal);
- }
- const decPrefix = '?';
- final isDec = csi.params.first.startsWith(decPrefix);
- for (var mode in csi.params) {
- if (isDec && !mode.startsWith(decPrefix)) {
- mode = decPrefix + mode;
- }
- csiSetMode(csi.params.first, enabled, terminal);
- }
- }
- void csiSetMode(String mode, bool enabled, Terminal terminal) {
- switch (mode) {
- case "4":
- if (enabled) {
- terminal.setInsertMode();
- } else {
- terminal.setReplaceMode();
- }
- break;
- case "20":
- if (enabled) {
- terminal.setNewLineMode();
- } else {
- terminal.setLineFeedMode();
- }
- break;
- case "?1":
- terminal.setApplicationCursorKeys(enabled);
- break;
- // case "?3":
- // if (enabled) {
- // // DECCOLM - COLumn mode, 132 characters per line
- // terminal.setSize(132, uint(lines));
- // } else {
- // // DECCOLM - 80 characters per line (erases screen)
- // terminal.setSize(80, uint(lines));
- // }
- // terminal.clear();
- // case "?4":
- // // DECSCLM
- case "?5":
- // DECSCNM
- terminal.setScreenMode(enabled);
- break;
- case "?6":
- // DECOM
- terminal.setOriginMode(enabled);
- break;
- case "?7":
- //DECAWM
- terminal.setAutoWrapMode(enabled);
- break;
- case "?9":
- if (enabled) {
- // terminal.setMouseMode(MouseMode.x10);
- } else {
- terminal.setMouseMode(MouseMode.none);
- }
- break;
- case "?12":
- case "?13":
- terminal.setBlinkingCursor(enabled);
- break;
- case "?25":
- terminal.setShowCursor(enabled);
- break;
- case "?47":
- case "?1047":
- if (enabled) {
- terminal.useAltBuffer();
- } else {
- terminal.useMainBuffer();
- }
- break;
- case "?1000":
- case "?10061000":
- // enable mouse tracking
- // 1000 refers to ext mode for extended mouse click area - otherwise only x <= 255-31
- if (enabled) {
- // terminal.setMouseMode(MouseMode.vt200);
- } else {
- terminal.setMouseMode(MouseMode.none);
- }
- break;
- case "?1002":
- // enable mouse tracking
- // 1000 refers to ext mode for extended mouse click area - otherwise only x <= 255-31
- if (enabled) {
- // terminal.setMouseMode(MouseMode.buttonEvent);
- } else {
- terminal.setMouseMode(MouseMode.none);
- }
- break;
- case "?1003":
- if (enabled) {
- // terminal.setMouseMode(MouseMode.anyEvent);
- } else {
- terminal.setMouseMode(MouseMode.none);
- }
- break;
- case "?1005":
- if (enabled) {
- // terminal.setMouseExtMode(MouseExt.utf);
- } else {
- // terminal.setMouseExtMode(MouseExt.none);
- }
- break;
- case "?1006":
- if (enabled) {
- // terminal.setMouseExtMode(MouseExt.sgr);
- } else {
- // terminal.setMouseExtMode(MouseExt.none);
- }
- break;
- case "?1048":
- if (enabled) {
- terminal.buffer.saveCursor();
- } else {
- terminal.buffer.restoreCursor();
- }
- break;
- case "?1049":
- if (enabled) {
- terminal.useAltBuffer();
- terminal.buffer.clear();
- } else {
- terminal.useMainBuffer();
- }
- break;
- case "?2004":
- terminal.setBracketedPasteMode(enabled);
- break;
- default:
- terminal.debug.onError('unsupported mode: $mode');
- return;
- }
- }
|