Skip to content

Commit 6bda74d

Browse files
committed
aux window - track fullscreen state per window (#197325)
1 parent 14d0156 commit 6bda74d

File tree

20 files changed

+139
-109
lines changed

20 files changed

+139
-109
lines changed

src/vs/base/browser/browser.ts

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

6-
import { $window } from 'vs/base/browser/window';
6+
import { $window, CodeWindow } from 'vs/base/browser/window';
77
import { Emitter, Event } from 'vs/base/common/event';
88
import { Disposable, markAsSingleton } from 'vs/base/common/lifecycle';
99

1010
class WindowManager {
1111

12-
public static readonly INSTANCE = new WindowManager();
12+
static readonly INSTANCE = new WindowManager();
1313

1414
// --- Zoom Level
15+
1516
private _zoomLevel: number = 0;
1617

17-
public getZoomLevel(): number {
18+
getZoomLevel(): number {
1819
return this._zoomLevel;
1920
}
20-
public setZoomLevel(zoomLevel: number): void {
21+
setZoomLevel(zoomLevel: number): void {
2122
if (this._zoomLevel === zoomLevel) {
2223
return;
2324
}
2425
this._zoomLevel = zoomLevel;
2526
}
2627

2728
// --- Zoom Factor
29+
2830
private _zoomFactor: number = 1;
2931

30-
public getZoomFactor(): number {
32+
getZoomFactor(): number {
3133
return this._zoomFactor;
3234
}
33-
public setZoomFactor(zoomFactor: number): void {
35+
setZoomFactor(zoomFactor: number): void {
3436
this._zoomFactor = zoomFactor;
3537
}
3638

3739
// --- Fullscreen
38-
private _fullscreen: boolean = false;
39-
private readonly _onDidChangeFullscreen = new Emitter<void>();
4040

41-
public readonly onDidChangeFullscreen: Event<void> = this._onDidChangeFullscreen.event;
42-
public setFullscreen(fullscreen: boolean): void {
43-
if (this._fullscreen === fullscreen) {
41+
private readonly _onDidChangeFullscreen = new Emitter<number>();
42+
readonly onDidChangeFullscreen = this._onDidChangeFullscreen.event;
43+
44+
private readonly mapWindowIdToFullScreen = new Map<number, boolean>();
45+
46+
setFullscreen(fullscreen: boolean, targetWindow: Window): void {
47+
if (this.isFullscreen(targetWindow) === fullscreen) {
4448
return;
4549
}
4650

47-
this._fullscreen = fullscreen;
48-
this._onDidChangeFullscreen.fire();
51+
const windowId = this.getWindowId(targetWindow);
52+
this.mapWindowIdToFullScreen.set(windowId, fullscreen);
53+
this._onDidChangeFullscreen.fire(windowId);
54+
}
55+
isFullscreen(targetWindow: Window): boolean {
56+
return !!this.mapWindowIdToFullScreen.get(this.getWindowId(targetWindow));
4957
}
50-
public isFullscreen(): boolean {
51-
return this._fullscreen;
58+
59+
private getWindowId(targetWindow: Window): number {
60+
return (targetWindow as CodeWindow).vscodeWindowId;
5261
}
5362
}
5463

@@ -58,7 +67,7 @@ class WindowManager {
5867
class DevicePixelRatioMonitor extends Disposable {
5968

6069
private readonly _onDidChange = this._register(new Emitter<void>());
61-
public readonly onDidChange = this._onDidChange.event;
70+
readonly onDidChange = this._onDidChange.event;
6271

6372
private readonly _listener: () => void;
6473
private _mediaQueryList: MediaQueryList | null;
@@ -86,11 +95,11 @@ class DevicePixelRatioMonitor extends Disposable {
8695
class PixelRatioImpl extends Disposable {
8796

8897
private readonly _onDidChange = this._register(new Emitter<number>());
89-
public readonly onDidChange = this._onDidChange.event;
98+
readonly onDidChange = this._onDidChange.event;
9099

91100
private _value: number;
92101

93-
public get value(): number {
102+
get value(): number {
94103
return this._value;
95104
}
96105

@@ -131,14 +140,14 @@ class PixelRatioFacade {
131140
/**
132141
* Get the current value.
133142
*/
134-
public get value(): number {
143+
get value(): number {
135144
return this._getOrCreatePixelRatioMonitor().value;
136145
}
137146

138147
/**
139148
* Listen for changes.
140149
*/
141-
public get onDidChange(): Event<number> {
150+
get onDidChange(): Event<number> {
142151
return this._getOrCreatePixelRatioMonitor().onDidChange;
143152
}
144153
}
@@ -175,11 +184,11 @@ export function setZoomFactor(zoomFactor: number): void {
175184
WindowManager.INSTANCE.setZoomFactor(zoomFactor);
176185
}
177186

178-
export function setFullscreen(fullscreen: boolean): void {
179-
WindowManager.INSTANCE.setFullscreen(fullscreen);
187+
export function setFullscreen(fullscreen: boolean, targetWindow: Window): void {
188+
WindowManager.INSTANCE.setFullscreen(fullscreen, targetWindow);
180189
}
181-
export function isFullscreen(): boolean {
182-
return WindowManager.INSTANCE.isFullscreen();
190+
export function isFullscreen(targetWindow: Window): boolean {
191+
return WindowManager.INSTANCE.isFullscreen(targetWindow);
183192
}
184193
export const onDidChangeFullscreen = WindowManager.INSTANCE.onDidChangeFullscreen;
185194

src/vs/base/browser/ui/menu/menubar.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import { isMacintosh } from 'vs/base/common/platform';
2222
import * as strings from 'vs/base/common/strings';
2323
import 'vs/css!./menubar';
2424
import * as nls from 'vs/nls';
25+
import { mainWindow } from 'vs/base/browser/window';
2526

2627
const $ = DOM.$;
2728

@@ -786,7 +787,7 @@ export class MenuBar extends Disposable {
786787
private setUnfocusedState(): void {
787788
if (this.options.visibility === 'toggle' || this.options.visibility === 'hidden') {
788789
this.focusState = MenubarState.HIDDEN;
789-
} else if (this.options.visibility === 'classic' && browser.isFullscreen()) {
790+
} else if (this.options.visibility === 'classic' && browser.isFullscreen(mainWindow)) {
790791
this.focusState = MenubarState.HIDDEN;
791792
} else {
792793
this.focusState = MenubarState.VISIBLE;

src/vs/workbench/browser/actions/layoutActions.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import { IPaneCompositePartService } from 'vs/workbench/services/panecomposite/b
2121
import { ToggleAuxiliaryBarAction } from 'vs/workbench/browser/parts/auxiliarybar/auxiliaryBarActions';
2222
import { TogglePanelAction } from 'vs/workbench/browser/parts/panel/panelActions';
2323
import { ICommandService } from 'vs/platform/commands/common/commands';
24-
import { AuxiliaryBarVisibleContext, PanelAlignmentContext, PanelVisibleContext, SideBarVisibleContext, FocusedViewContext, InEditorZenModeContext, IsCenteredLayoutContext, MainEditorAreaVisibleContext, IsFullscreenContext, PanelPositionContext, IsAuxiliaryWindowFocusedContext } from 'vs/workbench/common/contextkeys';
24+
import { AuxiliaryBarVisibleContext, PanelAlignmentContext, PanelVisibleContext, SideBarVisibleContext, FocusedViewContext, InEditorZenModeContext, IsCenteredLayoutContext, MainEditorAreaVisibleContext, IsMainWindowFullscreenContext, PanelPositionContext, IsAuxiliaryWindowFocusedContext } from 'vs/workbench/common/contextkeys';
2525
import { Codicon } from 'vs/base/common/codicons';
2626
import { ThemeIcon } from 'vs/base/common/themables';
2727
import { DisposableStore } from 'vs/base/common/lifecycle';
@@ -1387,7 +1387,7 @@ const AlignPanelActions: CustomizeLayoutItem[] = [
13871387
];
13881388

13891389
const MiscLayoutOptions: CustomizeLayoutItem[] = [
1390-
CreateOptionLayoutItem('workbench.action.toggleFullScreen', IsFullscreenContext, localize('fullscreen', "Full Screen"), fullscreenIcon),
1390+
CreateOptionLayoutItem('workbench.action.toggleFullScreen', IsMainWindowFullscreenContext, localize('fullscreen', "Full Screen"), fullscreenIcon),
13911391
CreateOptionLayoutItem('workbench.action.toggleZenMode', InEditorZenModeContext, localize('zenMode', "Zen Mode"), zenModeIcon),
13921392
CreateOptionLayoutItem('workbench.action.toggleCenteredLayout', IsCenteredLayoutContext, localize('centeredLayout', "Centered Layout"), centerLayoutIcon),
13931393
];

src/vs/workbench/browser/actions/windowActions.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import { IWindowOpenable } from 'vs/platform/window/common/window';
88
import { IDialogService } from 'vs/platform/dialogs/common/dialogs';
99
import { MenuRegistry, MenuId, Action2, registerAction2, IAction2Options } from 'vs/platform/actions/common/actions';
1010
import { KeyChord, KeyCode, KeyMod } from 'vs/base/common/keyCodes';
11-
import { IsAuxiliaryWindowFocusedContext, IsFullscreenContext } from 'vs/workbench/common/contextkeys';
11+
import { IsAuxiliaryWindowFocusedContext, IsMainWindowFullscreenContext } from 'vs/workbench/common/contextkeys';
1212
import { IsMacNativeContext, IsDevelopmentContext, IsWebContext, IsIOSContext } from 'vs/platform/contextkey/common/contextkeys';
1313
import { Categories } from 'vs/platform/action/common/actionCommonCategories';
1414
import { KeybindingsRegistry, KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry';
@@ -298,7 +298,7 @@ class ToggleFullScreenAction extends Action2 {
298298
}
299299
},
300300
precondition: IsIOSContext.toNegated(),
301-
toggled: IsFullscreenContext,
301+
toggled: IsMainWindowFullscreenContext,
302302
menu: [{
303303
id: MenuId.MenubarAppearanceMenu,
304304
group: '1_toggle_view',

src/vs/workbench/browser/contextkeys.ts

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { Event } from 'vs/base/common/event';
77
import { Disposable } from 'vs/base/common/lifecycle';
88
import { IContextKeyService, IContextKey, setConstant as setConstantContextKey } from 'vs/platform/contextkey/common/contextkey';
99
import { InputFocusedContext, IsMacContext, IsLinuxContext, IsWindowsContext, IsWebContext, IsMacNativeContext, IsDevelopmentContext, IsIOSContext, ProductQualityContext, IsMobileContext } from 'vs/platform/contextkey/common/contextkeys';
10-
import { SplitEditorsVertically, InEditorZenModeContext, ActiveEditorCanRevertContext, ActiveEditorGroupLockedContext, ActiveEditorCanSplitInGroupContext, SideBySideEditorActiveContext, AuxiliaryBarVisibleContext, SideBarVisibleContext, PanelAlignmentContext, PanelMaximizedContext, PanelVisibleContext, ActiveEditorContext, EditorsVisibleContext, TextCompareEditorVisibleContext, TextCompareEditorActiveContext, ActiveEditorGroupEmptyContext, EmbedderIdentifierContext, EditorTabsVisibleContext, IsCenteredLayoutContext, ActiveEditorGroupIndexContext, ActiveEditorGroupLastContext, ActiveEditorReadonlyContext, MainEditorAreaVisibleContext, ActiveEditorAvailableEditorIdsContext, DirtyWorkingCopiesContext, EmptyWorkspaceSupportContext, EnterMultiRootWorkspaceSupportContext, HasWebFileSystemAccess, IsFullscreenContext, OpenFolderWorkspaceSupportContext, RemoteNameContext, VirtualWorkspaceContext, WorkbenchStateContext, WorkspaceFolderCountContext, PanelPositionContext, TemporaryWorkspaceContext, ActiveEditorCanToggleReadonlyContext, applyAvailableEditorIds, TitleBarVisibleContext, TitleBarStyleContext, MultipleEditorGroupsContext, IsAuxiliaryWindowFocusedContext, ActiveCompareEditorOriginalWriteableContext } from 'vs/workbench/common/contextkeys';
10+
import { SplitEditorsVertically, InEditorZenModeContext, ActiveEditorCanRevertContext, ActiveEditorGroupLockedContext, ActiveEditorCanSplitInGroupContext, SideBySideEditorActiveContext, AuxiliaryBarVisibleContext, SideBarVisibleContext, PanelAlignmentContext, PanelMaximizedContext, PanelVisibleContext, ActiveEditorContext, EditorsVisibleContext, TextCompareEditorVisibleContext, TextCompareEditorActiveContext, ActiveEditorGroupEmptyContext, EmbedderIdentifierContext, EditorTabsVisibleContext, IsCenteredLayoutContext, ActiveEditorGroupIndexContext, ActiveEditorGroupLastContext, ActiveEditorReadonlyContext, MainEditorAreaVisibleContext, ActiveEditorAvailableEditorIdsContext, DirtyWorkingCopiesContext, EmptyWorkspaceSupportContext, EnterMultiRootWorkspaceSupportContext, HasWebFileSystemAccess, IsMainWindowFullscreenContext, OpenFolderWorkspaceSupportContext, RemoteNameContext, VirtualWorkspaceContext, WorkbenchStateContext, WorkspaceFolderCountContext, PanelPositionContext, TemporaryWorkspaceContext, ActiveEditorCanToggleReadonlyContext, applyAvailableEditorIds, TitleBarVisibleContext, TitleBarStyleContext, MultipleEditorGroupsContext, IsAuxiliaryWindowFocusedContext, ActiveCompareEditorOriginalWriteableContext } from 'vs/workbench/common/contextkeys';
1111
import { TEXT_DIFF_EDITOR_ID, EditorInputCapabilities, SIDE_BY_SIDE_EDITOR_ID, EditorResourceAccessor, SideBySideEditor } from 'vs/workbench/common/editor';
1212
import { trackFocus, addDisposableListener, EventType, onDidRegisterWindow, getActiveWindow } from 'vs/base/browser/dom';
1313
import { preferredSideBySideGroupDirection, GroupDirection, IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService';
@@ -28,6 +28,7 @@ import { FileSystemProviderCapabilities, IFileService } from 'vs/platform/files/
2828
import { getTitleBarStyle } from 'vs/platform/window/common/window';
2929
import { mainWindow } from 'vs/base/browser/window';
3030
import { DiffEditorInput } from 'vs/workbench/common/editor/diffEditorInput';
31+
import { isFullscreen, onDidChangeFullscreen } from 'vs/base/browser/browser';
3132

3233
export class WorkbenchContextKeysHandler extends Disposable {
3334
private inputFocusedContext: IContextKey<boolean>;
@@ -68,7 +69,7 @@ export class WorkbenchContextKeysHandler extends Disposable {
6869
private temporaryWorkspaceContext: IContextKey<boolean>;
6970

7071
private inZenModeContext: IContextKey<boolean>;
71-
private isFullscreenContext: IContextKey<boolean>;
72+
private isMainWindowFullscreenContext: IContextKey<boolean>;
7273
private isAuxiliaryWindowFocusedContext: IContextKey<boolean>;
7374
private isCenteredLayoutContext: IContextKey<boolean>;
7475
private sideBarVisibleContext: IContextKey<boolean>;
@@ -188,7 +189,7 @@ export class WorkbenchContextKeysHandler extends Disposable {
188189
this.updateSplitEditorsVerticallyContext();
189190

190191
// Window
191-
this.isFullscreenContext = IsFullscreenContext.bindTo(this.contextKeyService);
192+
this.isMainWindowFullscreenContext = IsMainWindowFullscreenContext.bindTo(this.contextKeyService);
192193
this.isAuxiliaryWindowFocusedContext = IsAuxiliaryWindowFocusedContext.bindTo(this.contextKeyService);
193194

194195
// Zen Mode
@@ -260,7 +261,11 @@ export class WorkbenchContextKeysHandler extends Disposable {
260261

261262
this._register(this.layoutService.onDidChangeZenMode(enabled => this.inZenModeContext.set(enabled)));
262263
this._register(this.layoutService.onDidChangeActiveContainer(() => this.isAuxiliaryWindowFocusedContext.set(this.layoutService.activeContainer !== this.layoutService.mainContainer)));
263-
this._register(this.layoutService.onDidChangeFullscreen(fullscreen => this.isFullscreenContext.set(fullscreen)));
264+
this._register(onDidChangeFullscreen(windowId => {
265+
if (windowId === mainWindow.vscodeWindowId) {
266+
this.isMainWindowFullscreenContext.set(isFullscreen(mainWindow));
267+
}
268+
}));
264269
this._register(this.layoutService.onDidChangeCenteredLayout(centered => this.isCenteredLayoutContext.set(centered)));
265270
this._register(this.layoutService.onDidChangePanelPosition(position => this.panelPositionContext.set(position)));
266271

0 commit comments

Comments
 (0)