osc.dart 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import 'dart:collection';
  2. import 'package:xterm/terminal/terminal.dart';
  3. // bool _isOscTerminator(int codePoint) {
  4. // final terminator = {0x07, 0x00};
  5. // // final terminator = {0x07, 0x5c};
  6. // return terminator.contains(codePoint);
  7. // }
  8. List<String>? _parseOsc(Queue<int> queue, Set<int> terminators) {
  9. // TODO: add tests for cases such as incomplete sequence.
  10. final params = <String>[];
  11. final param = StringBuffer();
  12. // Keep track of how many characters should be taken from the queue.
  13. var readOffset = 0;
  14. while (true) {
  15. // The sequence isn't completed, just ignore it.
  16. if (queue.length <= readOffset) {
  17. return null;
  18. }
  19. final char = queue.elementAt(readOffset++);
  20. // final char = queue.removeFirst();
  21. if (terminators.contains(char)) {
  22. params.add(param.toString());
  23. break;
  24. }
  25. const semicolon = 59;
  26. if (char == semicolon) {
  27. params.add(param.toString());
  28. param.clear();
  29. continue;
  30. }
  31. param.writeCharCode(char);
  32. }
  33. // The sequence is complete. So we consume it from the queue.
  34. for (var i = 0; i < readOffset; i++) {
  35. queue.removeFirst();
  36. }
  37. return params;
  38. }
  39. /// OSC - Operating System Command: sequence starting with ESC ] (7bit) or OSC
  40. /// (\x9D, 8bit)
  41. bool oscHandler(Queue<int> queue, Terminal terminal) {
  42. final params = _parseOsc(queue, terminal.platform.oscTerminators);
  43. if (params == null) {
  44. return false;
  45. }
  46. terminal.debug.onOsc(params);
  47. if (params.isEmpty) {
  48. terminal.debug.onError('osc with no params');
  49. return true;
  50. }
  51. if (params.length < 2) {
  52. return true;
  53. }
  54. final ps = params[0];
  55. final pt = params[1];
  56. switch (ps) {
  57. case '0':
  58. case '2':
  59. terminal.onTitleChange(pt);
  60. break;
  61. case '1':
  62. terminal.onIconChange(pt);
  63. break;
  64. default:
  65. terminal.debug.onError('unknown osc ps: $ps');
  66. }
  67. return true;
  68. }