@@ -301,9 +301,39 @@ export class EscapeSequenceParser extends Disposable implements IEscapeSequenceP
301
301
this . _executeHandlerFb = callback ;
302
302
}
303
303
304
+ private _removeHandler ( array : any [ ] , callback : any ) : void {
305
+ if ( array ) {
306
+ for ( let i = array . length ; -- i >= 0 ; ) {
307
+ if ( array [ i ] == callback ) {
308
+ array . splice ( i , 1 ) ;
309
+ return ;
310
+ }
311
+ }
312
+ }
313
+ }
314
+
315
+ addCsiHandler ( flag : string , callback : ( params : number [ ] , collect : string ) => boolean ) : void {
316
+ let index = flag . charCodeAt ( 0 ) ;
317
+ let array = this . _csiHandlers [ index ] ;
318
+ if ( ! array ) { this . _csiHandlers [ index ] = array = new Array ( ) ; }
319
+ array . push ( callback ) ;
320
+ }
321
+
322
+ removeCsiHandler ( flag : string , callback : ( params : number [ ] , collect : string ) => boolean ) : void {
323
+ let index = flag . charCodeAt ( 0 ) ;
324
+ let array = this . _csiHandlers [ index ] ;
325
+ this . _removeHandler ( array , callback ) ;
326
+ if ( array && array . length == 0 )
327
+ delete this . _csiHandlers [ index ] ;
328
+ }
329
+ /* deprecated */
304
330
setCsiHandler ( flag : string , callback : ( params : number [ ] , collect : string ) => void ) : void {
305
- this . _csiHandlers [ flag . charCodeAt ( 0 ) ] = callback ;
331
+ this . clearCsiHandler ( flag ) ;
332
+ this . addCsiHandler ( flag , ( params : number [ ] , collect : string ) : boolean => {
333
+ callback ( params , collect ) ; return true ;
334
+ } ) ;
306
335
}
336
+ /* deprecated */
307
337
clearCsiHandler ( flag : string ) : void {
308
338
if ( this . _csiHandlers [ flag . charCodeAt ( 0 ) ] ) delete this . _csiHandlers [ flag . charCodeAt ( 0 ) ] ;
309
339
}
@@ -321,9 +351,25 @@ export class EscapeSequenceParser extends Disposable implements IEscapeSequenceP
321
351
this . _escHandlerFb = callback ;
322
352
}
323
353
354
+ addOscHandler ( ident : number , callback : ( data : string ) => boolean ) : void {
355
+ let array = this . _oscHandlers [ ident ] ;
356
+ if ( ! array ) { this . _oscHandlers [ ident ] = array = new Array ( ) ; }
357
+ array . push ( callback ) ;
358
+ }
359
+ removeOscHandler ( ident : number , callback : ( data : string ) => boolean ) : void {
360
+ let array = this . _oscHandlers [ ident ] ;
361
+ this . _removeHandler ( array , callback ) ;
362
+ if ( array && array . length == 0 )
363
+ delete this . _oscHandlers [ ident ] ;
364
+ }
365
+ /* deprecated */
324
366
setOscHandler ( ident : number , callback : ( data : string ) => void ) : void {
325
- this . _oscHandlers [ ident ] = callback ;
367
+ this . clearOscHandler ( ident ) ;
368
+ this . addOscHandler ( ident , ( data : string ) : boolean => {
369
+ callback ( data ) ; return true ;
370
+ } ) ;
326
371
}
372
+ /* deprecated */
327
373
clearOscHandler ( ident : number ) : void {
328
374
if ( this . _oscHandlers [ ident ] ) delete this . _oscHandlers [ ident ] ;
329
375
}
@@ -463,9 +509,15 @@ export class EscapeSequenceParser extends Disposable implements IEscapeSequenceP
463
509
}
464
510
break ;
465
511
case ParserAction . CSI_DISPATCH :
466
- callback = this . _csiHandlers [ code ] ;
467
- if ( callback ) callback ( params , collect ) ;
468
- else this . _csiHandlerFb ( collect , params , code ) ;
512
+ let cHandler = this . _csiHandlers [ code ] ;
513
+ if ( cHandler ) {
514
+ for ( let i = cHandler . length ; ; ) {
515
+ if ( -- i < 0 ) { cHandler = null ; break ; }
516
+ if ( ( cHandler [ i ] ) ( params , collect ) )
517
+ break ;
518
+ }
519
+ }
520
+ if ( ! cHandler ) this . _csiHandlerFb ( collect , params , code ) ;
469
521
break ;
470
522
case ParserAction . PARAM :
471
523
if ( code === 0x3b ) params . push ( 0 ) ;
@@ -532,9 +584,15 @@ export class EscapeSequenceParser extends Disposable implements IEscapeSequenceP
532
584
// or with an explicit NaN OSC handler
533
585
const identifier = parseInt ( osc . substring ( 0 , idx ) ) ;
534
586
const content = osc . substring ( idx + 1 ) ;
535
- callback = this . _oscHandlers [ identifier ] ;
536
- if ( callback ) callback ( content ) ;
537
- else this . _oscHandlerFb ( identifier , content ) ;
587
+ let oHandler = this . _oscHandlers [ identifier ] ;
588
+ if ( oHandler ) {
589
+ for ( let i = oHandler . length ; ; ) {
590
+ if ( -- i < 0 ) { oHandler = null ; break ; }
591
+ if ( ( oHandler [ i ] ) ( content ) )
592
+ break ;
593
+ }
594
+ }
595
+ if ( ! oHandler ) this . _oscHandlerFb ( identifier , content ) ;
538
596
}
539
597
}
540
598
if ( code === 0x1b ) transition |= ParserState . ESCAPE ;
0 commit comments