Skip to content

Commit 17dd260

Browse files
authored
aux window - improve window focus management (microsoft#196576)
* aux window - improve window focus management * .
1 parent aae10b4 commit 17dd260

File tree

35 files changed

+86
-52
lines changed

35 files changed

+86
-52
lines changed

src/vs/workbench/browser/composite.ts

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -168,13 +168,6 @@ export abstract class Composite extends Component implements IComposite {
168168
*/
169169
abstract setBoundarySashes(sashes: IBoundarySashes): void;
170170

171-
/**
172-
* Update the styles of the contents of this composite.
173-
*/
174-
override updateStyles(): void {
175-
super.updateStyles();
176-
}
177-
178171
/**
179172
*
180173
* @returns the action runner for this composite

src/vs/workbench/browser/layout.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
import { Disposable, DisposableStore, toDisposable } from 'vs/base/common/lifecycle';
77
import { Event, Emitter } from 'vs/base/common/event';
8-
import { EventType, addDisposableListener, getClientArea, Dimension, position, size, IDimension, isAncestorUsingFlowTo, computeScreenAwareSize, getActiveDocument, getWindows, getActiveWindow } from 'vs/base/browser/dom';
8+
import { EventType, addDisposableListener, getClientArea, Dimension, position, size, IDimension, isAncestorUsingFlowTo, computeScreenAwareSize, getActiveDocument, getWindows, getActiveWindow, focusWindow } from 'vs/base/browser/dom';
99
import { onDidChangeFullscreen, isFullscreen, isWCOEnabled } from 'vs/base/browser/browser';
1010
import { IWorkingCopyBackupService } from 'vs/workbench/services/workingCopy/common/workingCopyBackup';
1111
import { isWindows, isLinux, isMacintosh, isWeb, isNative, isIOS } from 'vs/base/common/platform';
@@ -1031,6 +1031,11 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi
10311031
}
10321032

10331033
focusPart(part: Parts): void {
1034+
const container = this.getContainer(part);
1035+
if (container) {
1036+
focusWindow(container);
1037+
}
1038+
10341039
switch (part) {
10351040
case Parts.EDITOR_PART:
10361041
this.editorGroupService.activeGroup.focus();
@@ -1051,8 +1056,6 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi
10511056
case Parts.STATUSBAR_PART:
10521057
this.statusBarService.focus();
10531058
default: {
1054-
// Title Bar & Banner simply pass focus to container
1055-
const container = this.getContainer(part);
10561059
container?.focus();
10571060
}
10581061
}

src/vs/workbench/browser/panecomposite.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ export abstract class PaneComposite extends Composite implements IPaneComposite
4141
}
4242

4343
override create(parent: HTMLElement): void {
44+
super.create(parent);
4445
this.viewPaneContainer = this._register(this.createViewPaneContainer(parent));
4546
this._register(this.viewPaneContainer.onTitleAreaUpdate(() => this.updateTitleArea()));
4647
this.viewPaneContainer.create(parent);
@@ -148,9 +149,8 @@ export abstract class PaneComposite extends Composite implements IPaneComposite
148149
}
149150

150151
override focus(): void {
151-
this.viewPaneContainer?.focus();
152-
153152
super.focus();
153+
this.viewPaneContainer?.focus();
154154
}
155155

156156
protected abstract createViewPaneContainer(parent: HTMLElement): ViewPaneContainer;

src/vs/workbench/browser/parts/editor/editorGroupView.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import { EditorInput } from 'vs/workbench/common/editor/editorInput';
1111
import { SideBySideEditorInput } from 'vs/workbench/common/editor/sideBySideEditorInput';
1212
import { Emitter, Relay } from 'vs/base/common/event';
1313
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
14-
import { Dimension, trackFocus, addDisposableListener, EventType, EventHelper, findParentWithClass, isAncestor, IDomNodePagePosition, isMouseEvent, isActiveElement } from 'vs/base/browser/dom';
14+
import { Dimension, trackFocus, addDisposableListener, EventType, EventHelper, findParentWithClass, isAncestor, IDomNodePagePosition, isMouseEvent, isActiveElement, focusWindow } from 'vs/base/browser/dom';
1515
import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection';
1616
import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey';
1717
import { ProgressBar } from 'vs/base/browser/ui/progressbar/progressbar';
@@ -899,6 +899,9 @@ export class EditorGroupView extends Themable implements IEditorGroupView {
899899

900900
focus(): void {
901901

902+
// Ensure window focus
903+
focusWindow(this.element);
904+
902905
// Pass focus to editor panes
903906
if (this.activeEditorPane) {
904907
this.activeEditorPane.focus();

src/vs/workbench/browser/parts/editor/editorPlaceholder.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -166,9 +166,9 @@ export abstract class EditorPlaceholder extends EditorPane {
166166
}
167167

168168
override focus(): void {
169-
this.container?.focus();
170-
171169
super.focus();
170+
171+
this.container?.focus();
172172
}
173173

174174
override dispose(): void {

src/vs/workbench/browser/parts/editor/sideBySideEditor.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -418,9 +418,9 @@ export class SideBySideEditor extends AbstractEditorWithViewState<ISideBySideEdi
418418
}
419419

420420
override focus(): void {
421-
this.getLastFocusedEditorPane()?.focus();
422-
423421
super.focus();
422+
423+
this.getLastFocusedEditorPane()?.focus();
424424
}
425425

426426
private getLastFocusedEditorPane(): EditorPane | undefined {

src/vs/workbench/browser/parts/editor/textCodeEditor.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,9 +89,9 @@ export abstract class AbstractTextCodeEditor<T extends IEditorViewState> extends
8989
}
9090

9191
override focus(): void {
92-
this.editorControl?.focus();
93-
9492
super.focus();
93+
94+
this.editorControl?.focus();
9595
}
9696

9797
override hasFocus(): boolean {

src/vs/workbench/browser/parts/editor/textDiffEditor.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -338,9 +338,9 @@ export class TextDiffEditor extends AbstractTextEditor<IDiffEditorViewState> imp
338338
}
339339

340340
override focus(): void {
341-
this.diffEditorControl?.focus();
342-
343341
super.focus();
342+
343+
this.diffEditorControl?.focus();
344344
}
345345

346346
override hasFocus(): boolean {

src/vs/workbench/browser/parts/views/viewPane.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import * as nls from 'vs/nls';
88
import { Event, Emitter } from 'vs/base/common/event';
99
import { asCssVariable, foreground } from 'vs/platform/theme/common/colorRegistry';
1010
import { PANEL_BACKGROUND, SIDE_BAR_BACKGROUND } from 'vs/workbench/common/theme';
11-
import { after, append, $, trackFocus, EventType, addDisposableListener, createCSSRule, asCSSUrl, Dimension, reset, asCssValueWithDefault } from 'vs/base/browser/dom';
11+
import { after, append, $, trackFocus, EventType, addDisposableListener, createCSSRule, asCSSUrl, Dimension, reset, asCssValueWithDefault, focusWindow } from 'vs/base/browser/dom';
1212
import { DisposableStore, toDisposable } from 'vs/base/common/lifecycle';
1313
import { Action, IAction, IActionRunner } from 'vs/base/common/actions';
1414
import { ActionsOrientation, IActionViewItem, prepareActions } from 'vs/base/browser/ui/actionbar/actionbar';
@@ -622,6 +622,8 @@ export abstract class ViewPane extends Pane implements IView {
622622
}
623623

624624
focus(): void {
625+
focusWindow(this.element);
626+
625627
if (this.viewWelcomeController.enabled) {
626628
this.viewWelcomeController.focus();
627629
} else if (this.element) {

src/vs/workbench/browser/parts/views/viewPaneContainer.ts

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* Licensed under the MIT License. See License.txt in the project root for license information.
44
*--------------------------------------------------------------------------------------------*/
55

6-
import { addDisposableListener, Dimension, DragAndDropObserver, EventType, isAncestor } from 'vs/base/browser/dom';
6+
import { addDisposableListener, Dimension, DragAndDropObserver, EventType, focusWindow, isAncestor } from 'vs/base/browser/dom';
77
import { StandardMouseEvent } from 'vs/base/browser/mouseEvent';
88
import { EventType as TouchEventType, Gesture } from 'vs/base/browser/touch';
99
import { IActionViewItem } from 'vs/base/browser/ui/actionbar/actionbar';
@@ -600,16 +600,21 @@ export class ViewPaneContainer extends Component implements IViewPaneContainer {
600600
}
601601

602602
focus(): void {
603+
let paneToFocus: ViewPane | undefined = undefined;
603604
if (this.lastFocusedPane) {
604-
this.lastFocusedPane.focus();
605+
paneToFocus = this.lastFocusedPane;
605606
} else if (this.paneItems.length > 0) {
606-
for (const { pane: pane } of this.paneItems) {
607+
for (const { pane } of this.paneItems) {
607608
if (pane.isExpanded()) {
608-
pane.focus();
609-
return;
609+
paneToFocus = pane;
610+
break;
610611
}
611612
}
612613
}
614+
if (paneToFocus) {
615+
focusWindow(paneToFocus.element);
616+
paneToFocus.focus();
617+
}
613618
}
614619

615620
private get orientation(): Orientation {

0 commit comments

Comments
 (0)