diff --git a/src/vs/workbench/parts/terminal/common/terminal.ts b/src/vs/workbench/parts/terminal/common/terminal.ts index 34cf3aaac1dee6f2b4255e15e96444b8791bcf56..449cf29d2fc4ef83b054200d8d7cbaf30e0d0f96 100644 --- a/src/vs/workbench/parts/terminal/common/terminal.ts +++ b/src/vs/workbench/parts/terminal/common/terminal.ts @@ -252,6 +252,11 @@ export interface ITerminalInstance { */ findPrevious(term: string): boolean; + /** + * Notifies the terminal that the find widget's focus state has been changed. + */ + notifyFindWidgetFocusChanged(isFocused: boolean): void; + /** * Focuses the terminal instance. * diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.ts b/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.ts index 06bc9b95a8f8f417c4ede279d84886371aee10a0..b5938b23eb3c6126d7e438dc622aa609c84e6469 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.ts @@ -288,6 +288,7 @@ actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(FocusTerminalFin primary: KeyMod.CtrlCmd | KeyCode.KEY_F }, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Focus Find Widget', category); actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(HideTerminalFindWidgetAction, HideTerminalFindWidgetAction.ID, HideTerminalFindWidgetAction.LABEL, { - primary: KeyCode.Escape -}, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_VISIBLE), 'Terminal: Focus Find Widget', category); + primary: KeyCode.Escape, + secondary: [KeyCode.Shift | KeyCode.Escape] +}, ContextKeyExpr.and(KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_VISIBLE)), 'Terminal: Focus Find Widget', category); registerColors(); diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalFindWidget.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalFindWidget.ts index 8e8493811b879662f0d209ef19afa683a9b5e18c..40d6f4a31927441dba8f2100c7f3e4365a7ac55f 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalFindWidget.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalFindWidget.ts @@ -84,6 +84,7 @@ export class TerminalFindWidget extends Widget { private _findInput: FindInput; private _domNode: HTMLElement; private _isVisible: boolean; + private _focusTracker: dom.IFocusTracker; constructor( @IContextViewService private _contextViewService: IContextViewService, @@ -95,6 +96,9 @@ export class TerminalFindWidget extends Widget { label: NLS_FIND_INPUT_LABEL, placeholder: NLS_FIND_INPUT_PLACEHOLDER, })); + this._focusTracker = this._register(dom.trackFocus(this._findInput.inputBox.inputElement)); + this._register(this._focusTracker.addFocusListener(() => this._terminalService.getActiveInstance().notifyFindWidgetFocusChanged(true))); + this._register(this._focusTracker.addBlurListener(() => this._terminalService.getActiveInstance().notifyFindWidgetFocusChanged(false))); let find = (previous) => { let val = this._findInput.getValue(); diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts index c8a60018d1cdf23748382f6b923dde7d3f43401b..b07b464ae67ab5b576460fdd5bef240c0c22d441 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts @@ -357,6 +357,13 @@ export class TerminalInstance implements ITerminalInstance { return this._xterm.findPrevious(term); } + public notifyFindWidgetFocusChanged(isFocused: boolean): void { + // In order to support escape to close the find widget when the terminal + // is focused terminalFocus needs to be true when either the terminal or + // the find widget are focused. + this._terminalFocusContextKey.set(isFocused || document.activeElement === this._xterm.textarea); + } + public dispose(): void { if (this._linkHandler) { this._linkHandler.dispose();