osc.dart 1.3 KB

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