Skip to content

Commit

Permalink
Add ignoreBracketedPasteMode option
Browse files Browse the repository at this point in the history
  • Loading branch information
Tyriar committed Aug 1, 2023
1 parent c3def09 commit 44ced27
Show file tree
Hide file tree
Showing 6 changed files with 20 additions and 8 deletions.
10 changes: 5 additions & 5 deletions src/browser/Clipboard.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
*/

import { ISelectionService } from 'browser/services/Services';
import { ICoreService } from 'common/services/Services';
import { ICoreService, IOptionsService } from 'common/services/Services';

/**
* Prepares text to be pasted into the terminal by normalizing the line endings
Expand Down Expand Up @@ -40,17 +40,17 @@ export function copyHandler(ev: ClipboardEvent, selectionService: ISelectionServ
/**
* Redirect the clipboard's data to the terminal's input handler.
*/
export function handlePasteEvent(ev: ClipboardEvent, textarea: HTMLTextAreaElement, coreService: ICoreService): void {
export function handlePasteEvent(ev: ClipboardEvent, textarea: HTMLTextAreaElement, coreService: ICoreService, optionsService: IOptionsService): void {
ev.stopPropagation();
if (ev.clipboardData) {
const text = ev.clipboardData.getData('text/plain');
paste(text, textarea, coreService);
paste(text, textarea, coreService, optionsService);
}
}

export function paste(text: string, textarea: HTMLTextAreaElement, coreService: ICoreService): void {
export function paste(text: string, textarea: HTMLTextAreaElement, coreService: ICoreService, optionsService: IOptionsService): void {
text = prepareTextForTerminal(text);
text = bracketTextForPaste(text, coreService.decPrivateModes.bracketedPasteMode);
text = bracketTextForPaste(text, coreService.decPrivateModes.bracketedPasteMode && optionsService.rawOptions.ignoreBracketedPasteMode !== true);
coreService.triggerDataEvent(text, true);
textarea.value = '';
}
Expand Down
4 changes: 2 additions & 2 deletions src/browser/Terminal.ts
Original file line number Diff line number Diff line change
Expand Up @@ -352,7 +352,7 @@ export class Terminal extends CoreTerminal implements ITerminal {
}
copyHandler(event, this._selectionService!);
}));
const pasteHandlerWrapper = (event: ClipboardEvent): void => handlePasteEvent(event, this.textarea!, this.coreService);
const pasteHandlerWrapper = (event: ClipboardEvent): void => handlePasteEvent(event, this.textarea!, this.coreService, this.optionsService);
this.register(addDisposableDomListener(this.textarea!, 'paste', pasteHandlerWrapper));
this.register(addDisposableDomListener(this.element!, 'paste', pasteHandlerWrapper));

Expand Down Expand Up @@ -878,7 +878,7 @@ export class Terminal extends CoreTerminal implements ITerminal {
}

public paste(data: string): void {
paste(data, this.textarea!, this.coreService);
paste(data, this.textarea!, this.coreService, this.optionsService);
}

/**
Expand Down
1 change: 1 addition & 0 deletions src/common/services/OptionsService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ export const DEFAULT_OPTIONS: Readonly<Required<ITerminalOptions>> = {
fontSize: 15,
fontWeight: 'normal',
fontWeightBold: 'bold',
ignoreBracketedPasteMode: false,
lineHeight: 1.0,
letterSpacing: 0,
linkHandler: null,
Expand Down
1 change: 1 addition & 0 deletions src/common/services/Services.ts
Original file line number Diff line number Diff line change
Expand Up @@ -221,6 +221,7 @@ export interface ITerminalOptions {
fontFamily?: string;
fontWeight?: FontWeight;
fontWeightBold?: FontWeight;
ignoreBracketedPasteMode?: boolean;
letterSpacing?: number;
lineHeight?: number;
linkHandler?: ILinkHandler | null;
Expand Down
5 changes: 4 additions & 1 deletion test/api/Terminal.api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -132,9 +132,12 @@ describe('API Integration Tests', function(): void {
window.term.paste('\\r\\nfoo\\nbar\\r');
window.term.write('\\x1b[?2004h', () => {
window.term.paste('foo');
window.term.options.ignoreBracketedPasteMode = true;
window.term.paste('check_mode');
});
`);
await pollFor(page, `window.calls`, ['foo', '\rfoo\rbar\r', '\x1b[200~foo\x1b[201~']);
await pollFor(page, `window.calls`, ['foo', '\rfoo\rbar\r', '\x1b[200~foo\x1b[201~', 'check_mode']);
});

it('clear', async () => {
Expand Down
7 changes: 7 additions & 0 deletions typings/xterm.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,13 @@ declare module 'xterm' {
*/
fontWeightBold?: FontWeight;

/**
* Whether to ignore the bracketed paste mode. When true, this will always
* paste without the `\x1b[200~` and `\x1b[201~` sequences, even when the
* shell enables bracketed mode.
*/
ignoreBracketedPasteMode?: boolean;

/**
* The spacing in whole pixels between characters.
*/
Expand Down

0 comments on commit 44ced27

Please sign in to comment.