From 94de0c2d64d59158961359414f4d2629cc955b80 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Thu, 7 Dec 2023 09:51:30 -0800 Subject: [PATCH] Don't copy on selection when terminal find is focused Fixes #151902 --- .../workbench/contrib/terminal/browser/terminal.ts | 6 ++++++ .../contrib/terminal/browser/terminalInstance.ts | 12 ++++++++++++ .../find/browser/terminalFindWidget.ts | 7 +++++++ 3 files changed, 25 insertions(+) diff --git a/src/vs/workbench/contrib/terminal/browser/terminal.ts b/src/vs/workbench/contrib/terminal/browser/terminal.ts index 01bf7056e28..b0af54e551d 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminal.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminal.ts @@ -842,6 +842,12 @@ export interface ITerminalInstance extends IBaseTerminalInstance { */ pasteSelection(): Promise; + /** + * Override the copy on selection feature with a custom value. + * @param value Whether to enable copySelection. + */ + overrideCopyOnSelection(value: boolean): IDisposable; + /** * Send text to the terminal instance. The text is written to the stdin of the underlying pty * process (shell) of the terminal instance. diff --git a/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts b/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts index 31d6349a788..97b0c3a602b 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts @@ -1745,12 +1745,24 @@ export class TerminalInstance extends Disposable implements ITerminalInstance { private async _onSelectionChange(): Promise { this._onDidChangeSelection.fire(this); if (this._configurationService.getValue(TerminalSettingId.CopyOnSelection)) { + if (this._overrideCopySelection === false) { + return; + } if (this.hasSelection()) { await this.copySelection(); } } } + private _overrideCopySelection: boolean | undefined = undefined; + overrideCopyOnSelection(value: boolean): IDisposable { + if (this._overrideCopySelection !== undefined) { + throw new Error('Cannot set a copy on selection override multiple times'); + } + this._overrideCopySelection = value; + return toDisposable(() => this._overrideCopySelection = undefined); + } + @debounce(2000) private async _updateProcessCwd(): Promise { if (this.isDisposed || this.shellLaunchConfig.customPtyImplementation) { diff --git a/src/vs/workbench/contrib/terminalContrib/find/browser/terminalFindWidget.ts b/src/vs/workbench/contrib/terminalContrib/find/browser/terminalFindWidget.ts index 59b05ccdd36..076e3fab52b 100644 --- a/src/vs/workbench/contrib/terminalContrib/find/browser/terminalFindWidget.ts +++ b/src/vs/workbench/contrib/terminalContrib/find/browser/terminalFindWidget.ts @@ -17,6 +17,7 @@ import type { ISearchOptions } from '@xterm/addon-search'; import { TerminalCommandId } from 'vs/workbench/contrib/terminal/common/terminal'; import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; import { openContextMenu } from 'vs/workbench/contrib/terminalContrib/find/browser/textInputContextMenu'; +import { IDisposable } from 'vs/base/common/lifecycle'; const TERMINAL_FIND_WIDGET_INITIAL_WIDTH = 419; @@ -25,6 +26,8 @@ export class TerminalFindWidget extends SimpleFindWidget { private _findWidgetFocused: IContextKey; private _findWidgetVisible: IContextKey; + private _overrideCopyOnSelectionDisposable: IDisposable | undefined; + constructor( private _instance: ITerminalInstance | IDetachedTerminalInstance, @IContextViewService _contextViewService: IContextViewService, @@ -143,10 +146,14 @@ export class TerminalFindWidget extends SimpleFindWidget { } protected _onFocusTrackerFocus() { + if ('overrideCopyOnSelection' in this._instance) { + this._overrideCopyOnSelectionDisposable = this._instance.overrideCopyOnSelection(false); + } this._findWidgetFocused.set(true); } protected _onFocusTrackerBlur() { + this._overrideCopyOnSelectionDisposable?.dispose(); this._instance.xterm?.clearActiveSearchDecoration(); this._findWidgetFocused.reset(); }