osc.dart 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. import 'package:async/async.dart';
  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. Future<List<String>> _parseOsc(
  9. StreamQueue<int> queue,
  10. Set<int> terminators,
  11. ) async {
  12. final params = <String>[];
  13. final param = StringBuffer();
  14. while (true) {
  15. final char = await queue.next;
  16. if (terminators.contains(char)) {
  17. params.add(param.toString());
  18. break;
  19. }
  20. const semicolon = 59;
  21. if (char == semicolon) {
  22. params.add(param.toString());
  23. param.clear();
  24. continue;
  25. }
  26. param.writeCharCode(char);
  27. }
  28. return params;
  29. }
  30. Future<void> oscHandler(StreamQueue<int> queue, Terminal terminal) async {
  31. final params = await _parseOsc(queue, terminal.platform.oscTerminators);
  32. terminal.debug.onOsc(params);
  33. if (params.isEmpty) {
  34. terminal.debug.onError('osc with no params');
  35. return;
  36. }
  37. if (params.length < 2) {
  38. return;
  39. }
  40. final ps = params[0];
  41. final pt = params[1];
  42. switch (ps) {
  43. case '0':
  44. case '2':
  45. if (terminal.onTitleChange != null) {
  46. terminal.onTitleChange(pt);
  47. }
  48. break;
  49. case '1':
  50. if (terminal.onIconChange != null) {
  51. terminal.onIconChange(pt);
  52. }
  53. break;
  54. default:
  55. terminal.debug.onError('unknown osc ps: $ps');
  56. }
  57. }