From 8ffd4d78fc8a741fad7d3d0e4e8b76824fe6ffed Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Tue, 20 Jun 2017 17:27:45 -0700 Subject: [PATCH] Fix escape to close terminal find widget Fixes #28770 --- src/vs/workbench/parts/terminal/common/terminal.ts | 5 +++++ .../terminal/electron-browser/terminal.contribution.ts | 5 +++-- .../parts/terminal/electron-browser/terminalFindWidget.ts | 4 ++++ .../parts/terminal/electron-browser/terminalInstance.ts | 7 +++++++ 4 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/parts/terminal/common/terminal.ts b/src/vs/workbench/parts/terminal/common/terminal.ts index 34cf3aaac1d..449cf29d2fc 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 06bc9b95a8f..b5938b23eb3 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 8e8493811b8..40d6f4a3192 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 c8a60018d1c..b07b464ae67 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(); -- GitLab