-
Notifications
You must be signed in to change notification settings - Fork 29.4k
/
partsSplash.contribution.ts
126 lines (111 loc) · 6.01 KB
/
partsSplash.contribution.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { join } from 'vs/base/common/path';
import { onDidChangeFullscreen, isFullscreen } from 'vs/base/browser/browser';
import { getTotalHeight, getTotalWidth } from 'vs/base/browser/dom';
import { Color } from 'vs/base/common/color';
import { Event } from 'vs/base/common/event';
import { dispose, IDisposable } from 'vs/base/common/lifecycle';
import { IBroadcastService } from 'vs/workbench/services/broadcast/common/broadcast';
import { ILifecycleService, LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle';
import { Registry } from 'vs/platform/registry/common/platform';
import { ColorIdentifier, editorBackground, foreground } from 'vs/platform/theme/common/colorRegistry';
import { getThemeTypeSelector, IThemeService } from 'vs/platform/theme/common/themeService';
import { DEFAULT_EDITOR_MIN_DIMENSIONS } from 'vs/workbench/browser/parts/editor/editor';
import { Extensions, IWorkbenchContributionsRegistry } from 'vs/workbench/common/contributions';
import * as themes from 'vs/workbench/common/theme';
import { IWorkbenchLayoutService, Parts, Position } from 'vs/workbench/services/layout/browser/layoutService';
import { IEnvironmentService } from 'vs/platform/environment/common/environment';
import { IFileService } from 'vs/platform/files/common/files';
import { URI } from 'vs/base/common/uri';
import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService';
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
class PartsSplash {
private static readonly _splashElementId = 'monaco-parts-splash';
private readonly _disposables: IDisposable[] = [];
private _didChangeTitleBarStyle: boolean;
private _lastBaseTheme: string;
private _lastBackground?: string;
constructor(
@IThemeService private readonly _themeService: IThemeService,
@IWorkbenchLayoutService private readonly _layoutService: IWorkbenchLayoutService,
@IFileService private readonly _fileService: IFileService,
@IEnvironmentService private readonly _envService: IEnvironmentService,
@IBroadcastService private readonly _broadcastService: IBroadcastService,
@ILifecycleService lifecycleService: ILifecycleService,
@IEditorGroupsService editorGroupsService: IEditorGroupsService,
@IConfigurationService configService: IConfigurationService,
) {
lifecycleService.when(LifecyclePhase.Restored).then(_ => this._removePartsSplash());
Event.debounce(Event.any<any>(
onDidChangeFullscreen,
editorGroupsService.onDidLayout
), () => { }, 800)(this._savePartsSplash, this, this._disposables);
configService.onDidChangeConfiguration(e => {
this._didChangeTitleBarStyle = e.affectsConfiguration('window.titleBarStyle');
}, this, this._disposables);
}
dispose(): void {
dispose(this._disposables);
}
private _savePartsSplash() {
const baseTheme = getThemeTypeSelector(this._themeService.getTheme().type);
const colorInfo = {
foreground: this._getThemeColor(foreground),
editorBackground: this._getThemeColor(editorBackground),
titleBarBackground: this._getThemeColor(themes.TITLE_BAR_ACTIVE_BACKGROUND),
activityBarBackground: this._getThemeColor(themes.ACTIVITY_BAR_BACKGROUND),
sideBarBackground: this._getThemeColor(themes.SIDE_BAR_BACKGROUND),
statusBarBackground: this._getThemeColor(themes.STATUS_BAR_BACKGROUND),
statusBarNoFolderBackground: this._getThemeColor(themes.STATUS_BAR_NO_FOLDER_BACKGROUND),
};
const layoutInfo = !this._shouldSaveLayoutInfo() ? undefined : {
sideBarSide: this._layoutService.getSideBarPosition() === Position.RIGHT ? 'right' : 'left',
editorPartMinWidth: DEFAULT_EDITOR_MIN_DIMENSIONS.width,
titleBarHeight: getTotalHeight(this._layoutService.getContainer(Parts.TITLEBAR_PART)),
activityBarWidth: getTotalWidth(this._layoutService.getContainer(Parts.ACTIVITYBAR_PART)),
sideBarWidth: getTotalWidth(this._layoutService.getContainer(Parts.SIDEBAR_PART)),
statusBarHeight: getTotalHeight(this._layoutService.getContainer(Parts.STATUSBAR_PART)),
};
this._fileService.updateContent(
URI.file(join(this._envService.userDataPath, 'rapid_render.json')),
JSON.stringify({
id: PartsSplash._splashElementId,
colorInfo,
layoutInfo,
baseTheme
}),
{ encoding: 'utf8' }
);
if (baseTheme !== this._lastBaseTheme || colorInfo.editorBackground !== this._lastBackground) {
// notify the main window on background color changes: the main window sets the background color to new windows
this._lastBaseTheme = baseTheme;
this._lastBackground = colorInfo.editorBackground;
// the color needs to be in hex
const backgroundColor = this._themeService.getTheme().getColor(editorBackground) || themes.WORKBENCH_BACKGROUND(this._themeService.getTheme());
this._broadcastService.broadcast({ channel: 'vscode:changeColorTheme', payload: JSON.stringify({ baseTheme, background: Color.Format.CSS.formatHex(backgroundColor) }) });
}
}
private _getThemeColor(id: ColorIdentifier): string | undefined {
const theme = this._themeService.getTheme();
const color = theme.getColor(id);
return color ? color.toString() : undefined;
}
private _shouldSaveLayoutInfo(): boolean {
return !isFullscreen() && !this._envService.isExtensionDevelopment && !this._didChangeTitleBarStyle;
}
private _removePartsSplash(): void {
let element = document.getElementById(PartsSplash._splashElementId);
if (element) {
element.style.display = 'none';
}
// remove initial colors
let defaultStyles = document.head.getElementsByClassName('initialShellColors');
if (defaultStyles.length) {
document.head.removeChild(defaultStyles[0]);
}
}
}
Registry.as<IWorkbenchContributionsRegistry>(Extensions.Workbench).registerWorkbenchContribution(PartsSplash, LifecyclePhase.Starting);