Skip to content

Commit

Permalink
Migrate Terminal Panel to ViewPane (#90252)
Browse files Browse the repository at this point in the history
* migrate terminal to new view infra

* rename terminal file

* rename to view pane

* address PR comments

* remove import
  • Loading branch information
sbatten authored Feb 10, 2020
1 parent d2d82a0 commit 542de19
Show file tree
Hide file tree
Showing 10 changed files with 126 additions and 118 deletions.
6 changes: 3 additions & 3 deletions src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ import Constants from 'vs/workbench/contrib/markers/browser/constants';
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';

import { IConfigurationResolverService } from 'vs/workbench/services/configurationResolver/common/configurationResolver';
import { IShellLaunchConfig, TERMINAL_PANEL_ID } from 'vs/workbench/contrib/terminal/common/terminal';
import { IShellLaunchConfig, TERMINAL_VIEW_ID } from 'vs/workbench/contrib/terminal/common/terminal';
import { ITerminalService, ITerminalInstanceService, ITerminalInstance } from 'vs/workbench/contrib/terminal/browser/terminal';
import { IOutputService } from 'vs/workbench/contrib/output/common/output';
import { StartStopProblemCollector, WatchingProblemCollector, ProblemCollectorEventKind, ProblemHandlingStrategy } from 'vs/workbench/contrib/tasks/common/problemCollectors';
Expand Down Expand Up @@ -289,7 +289,7 @@ export class TerminalTaskSystem implements ITaskSystem {
return false;
}
const activeTerminalInstance = this.terminalService.getActiveInstance();
const isPanelShowingTerminal = this.panelService.getActivePanel()?.getId() === TERMINAL_PANEL_ID;
const isPanelShowingTerminal = !!this.viewsService.getActiveViewWithId(TERMINAL_VIEW_ID);
return isPanelShowingTerminal && (activeTerminalInstance?.id === terminalData.terminal.id);
}

Expand All @@ -312,7 +312,7 @@ export class TerminalTaskSystem implements ITaskSystem {
this.previousTerminalInstance = undefined;
} else {
this.previousPanelId = this.panelService.getActivePanel()?.getId();
if (this.previousPanelId === TERMINAL_PANEL_ID) {
if (this.previousPanelId === TERMINAL_VIEW_ID) {
this.previousTerminalInstance = this.terminalService.getActiveInstance() ?? undefined;
}
this.terminalService.setActiveInstance(terminalData.terminal);
Expand Down
20 changes: 10 additions & 10 deletions src/vs/workbench/contrib/terminal/browser/media/scrollbar.css
Original file line number Diff line number Diff line change
Expand Up @@ -3,39 +3,39 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/

.monaco-workbench .panel.integrated-terminal .xterm-viewport {
.monaco-workbench .pane-body.integrated-terminal .xterm-viewport {
/* Use the hack presented in http://stackoverflow.com/a/38748186/1156119 to get opacity transitions working on the scrollbar */
-webkit-background-clip: text;
background-clip: text;
-webkit-text-fill-color: transparent;
transition: background-color 800ms linear;
}

.monaco-workbench .panel.integrated-terminal .xterm-viewport::-webkit-scrollbar {
.monaco-workbench .pane-body.integrated-terminal .xterm-viewport::-webkit-scrollbar {
width: 10px;
}

.monaco-workbench .panel.integrated-terminal .xterm-viewport::-webkit-scrollbar-track {
.monaco-workbench .pane-body.integrated-terminal .xterm-viewport::-webkit-scrollbar-track {
opacity: 0;
}

.monaco-workbench .panel.integrated-terminal .xterm-viewport::-webkit-scrollbar-thumb {
.monaco-workbench .pane-body.integrated-terminal .xterm-viewport::-webkit-scrollbar-thumb {
min-height: 20px;
background-color: inherit;
}

.monaco-workbench .panel.integrated-terminal .find-focused .xterm .xterm-viewport,
.monaco-workbench .panel.integrated-terminal .xterm.focus .xterm-viewport,
.monaco-workbench .panel.integrated-terminal .xterm:focus .xterm-viewport,
.monaco-workbench .panel.integrated-terminal .xterm:hover .xterm-viewport {
.monaco-workbench .pane-body.integrated-terminal .find-focused .xterm .xterm-viewport,
.monaco-workbench .pane-body.integrated-terminal .xterm.focus .xterm-viewport,
.monaco-workbench .pane-body.integrated-terminal .xterm:focus .xterm-viewport,
.monaco-workbench .pane-body.integrated-terminal .xterm:hover .xterm-viewport {
transition: opacity 100ms linear;
cursor: default;
}

.monaco-workbench .panel.integrated-terminal .xterm .xterm-viewport::-webkit-scrollbar-thumb:hover {
.monaco-workbench .pane-body.integrated-terminal .xterm .xterm-viewport::-webkit-scrollbar-thumb:hover {
transition: opacity 0ms linear;
}

.monaco-workbench .panel.integrated-terminal .xterm .xterm-viewport::-webkit-scrollbar-thumb:window-inactive {
.monaco-workbench .pane-body.integrated-terminal .xterm .xterm-viewport::-webkit-scrollbar-thumb:window-inactive {
background-color: inherit;
}
60 changes: 30 additions & 30 deletions src/vs/workbench/contrib/terminal/browser/media/terminal.css
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/

.monaco-workbench .panel.integrated-terminal {
.monaco-workbench .pane-body.integrated-terminal {
align-content: flex-start;
align-items: baseline;
display: flex;
Expand All @@ -14,51 +14,51 @@
position: relative;
}

.monaco-workbench .panel.integrated-terminal .terminal-outer-container {
.monaco-workbench .pane-body.integrated-terminal .terminal-outer-container {
height: 100%;
width: 100%;
box-sizing: border-box;
overflow: hidden;
}

.monaco-workbench .panel.integrated-terminal .terminal-tab {
.monaco-workbench .pane-body.integrated-terminal .terminal-tab {
height: 100%;
}

.monaco-workbench .panel.integrated-terminal .terminal-wrapper {
.monaco-workbench .pane-body.integrated-terminal .terminal-wrapper {
display: none;
margin: 0 10px;
}
.monaco-workbench .panel.integrated-terminal .terminal-wrapper.active {
.monaco-workbench .pane-body.integrated-terminal .terminal-wrapper.active {
display: block;
position: absolute;
bottom: 2px; /* Matches padding-bottom on .terminal-outer-container */
top: 0;
}
.monaco-workbench .panel.integrated-terminal .monaco-split-view2.horizontal .split-view-view:first-child .terminal-wrapper {
.monaco-workbench .pane-body.integrated-terminal .monaco-split-view2.horizontal .split-view-view:first-child .terminal-wrapper {
margin-left: 20px;
}
.monaco-workbench .panel.integrated-terminal .monaco-split-view2.horizontal .split-view-view:last-child .terminal-wrapper {
.monaco-workbench .pane-body.integrated-terminal .monaco-split-view2.horizontal .split-view-view:last-child .terminal-wrapper {
margin-right: 20px;
}

.monaco-workbench .panel.integrated-terminal .xterm a:not(.xterm-invalid-link) {
.monaco-workbench .pane-body.integrated-terminal .xterm a:not(.xterm-invalid-link) {
/* To support message box sizing */
position: relative;
}

.monaco-workbench .panel.integrated-terminal .terminal-wrapper > div {
.monaco-workbench .pane-body.integrated-terminal .terminal-wrapper > div {
height: 100%;
}

.monaco-workbench .panel.integrated-terminal .xterm-viewport {
.monaco-workbench .pane-body.integrated-terminal .xterm-viewport {
margin-right: -10px;
}
.monaco-workbench .panel.integrated-terminal .monaco-split-view2.horizontal .split-view-view:last-child .xterm-viewport {
.monaco-workbench .pane-body.integrated-terminal .monaco-split-view2.horizontal .split-view-view:last-child .xterm-viewport {
margin-right: -20px;
}

.monaco-workbench .panel.integrated-terminal canvas {
.monaco-workbench .pane-body.integrated-terminal canvas {
/* Align the viewport and canvases to the bottom of the panel */
position: absolute;
right: -20px;
Expand All @@ -68,58 +68,58 @@
top: auto;
}

.monaco-workbench .panel.integrated-terminal {
.monaco-workbench .pane-body.integrated-terminal {
font-variant-ligatures: none;
}

.monaco-workbench .panel.integrated-terminal .split-view-view {
.monaco-workbench .pane-body.integrated-terminal .split-view-view {
box-sizing: border-box;
}

/* border-color is set by theme key terminal.border */
.monaco-workbench .panel.integrated-terminal .monaco-split-view2.horizontal .split-view-view:not(:first-child) {
.monaco-workbench .pane-body.integrated-terminal .monaco-split-view2.horizontal .split-view-view:not(:first-child) {
border-left-width: 1px;
border-left-style: solid;
}
.monaco-workbench .panel.integrated-terminal .monaco-split-view2.vertical .split-view-view:not(:first-child) {
.monaco-workbench .pane-body.integrated-terminal .monaco-split-view2.vertical .split-view-view:not(:first-child) {
border-top-width: 1px;
border-top-style: solid;
}

.monaco-workbench .panel.integrated-terminal.enable-ligatures {
.monaco-workbench .pane-body.integrated-terminal.enable-ligatures {
font-variant-ligatures: normal;
}


.monaco-workbench .panel.integrated-terminal.disable-bold .xterm-bold {
.monaco-workbench .pane-body.integrated-terminal.disable-bold .xterm-bold {
font-weight: normal !important;
}

/* Use the default cursor when alt is active to help with clicking to move cursor */
.monaco-workbench .panel.integrated-terminal .terminal-outer-container.alt-active .xterm {
.monaco-workbench .pane-body.integrated-terminal .terminal-outer-container.alt-active .xterm {
cursor: default;
}

.monaco-workbench .panel.integrated-terminal .xterm {
.monaco-workbench .pane-body.integrated-terminal .xterm {
position: absolute;
bottom: 0;
left: 0;
user-select: none;
-webkit-user-select: none;
}
.monaco-workbench .panel.integrated-terminal .monaco-split-view2.vertical .split-view-view:not(:last-child) .xterm {
.monaco-workbench .pane-body.integrated-terminal .monaco-split-view2.vertical .split-view-view:not(:last-child) .xterm {
/* When vertical and NOT the bottom terminal, align to the top instead to prevent the output jumping around erratically */
top: 0;
bottom: auto;
}

.monaco-workbench .panel.integrated-terminal .xterm:focus {
.monaco-workbench .pane-body.integrated-terminal .xterm:focus {
/* Hide outline when focus jumps from xterm to the text area */
outline: none;
}

.hc-black .monaco-workbench .panel.integrated-terminal .xterm.focus::before,
.hc-black .monaco-workbench .panel.integrated-terminal .xterm:focus::before {
.hc-black .monaco-workbench .pane-body.integrated-terminal .xterm.focus::before,
.hc-black .monaco-workbench .pane-body.integrated-terminal .xterm:focus::before {
display: block;
content: "";
border: 1px solid;
Expand All @@ -131,23 +131,23 @@
z-index: 10;
}

.hc-black .monaco-workbench .panel.integrated-terminal .monaco-split-view2.horizontal .split-view-view:not(:only-child) .xterm.focus::before,
.hc-black .monaco-workbench .panel.integrated-terminal .monaco-split-view2.horizontal .split-view-view:not(:only-child) .xterm:focus::before {
.hc-black .monaco-workbench .pane-body.integrated-terminal .monaco-split-view2.horizontal .split-view-view:not(:only-child) .xterm.focus::before,
.hc-black .monaco-workbench .pane-body.integrated-terminal .monaco-split-view2.horizontal .split-view-view:not(:only-child) .xterm:focus::before {
right: 0;
}

.monaco-workbench .panel.integrated-terminal .xterm .xterm-helpers {
.monaco-workbench .pane-body.integrated-terminal .xterm .xterm-helpers {
position: absolute;
top: 0;
}

.monaco-workbench .panel.integrated-terminal .xterm .xterm-helper-textarea:focus {
.monaco-workbench .pane-body.integrated-terminal .xterm .xterm-helper-textarea:focus {
/* Override the general vscode style applies `opacity:1!important` to textareas */
opacity: 0 !important;
}

.vs-dark .monaco-workbench.mac .panel.integrated-terminal .terminal-outer-container:not(.alt-active) .terminal:not(.enable-mouse-events),
.hc-black .monaco-workbench.mac .panel.integrated-terminal .terminal-outer-container:not(.alt-active) .terminal:not(.enable-mouse-events) {
.vs-dark .monaco-workbench.mac .pane-body.integrated-terminal .terminal-outer-container:not(.alt-active) .terminal:not(.enable-mouse-events),
.hc-black .monaco-workbench.mac .pane-body.integrated-terminal .terminal-outer-container:not(.alt-active) .terminal:not(.enable-mouse-events) {
cursor: -webkit-image-set(url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAL0lEQVQoz2NgCD3x//9/BhBYBWdhgFVAiVW4JBFKGIa4AqD0//9D3pt4I4tAdAMAHTQ/j5Zom30AAAAASUVORK5CYII=') 1x, url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAAAz0lEQVRIx2NgYGBY/R8I/vx5eelX3n82IJ9FxGf6tksvf/8FiTMQAcAGQMDvSwu09abffY8QYSAScNk45G198eX//yev73/4///701eh//kZSARckrNBRvz//+8+6ZohwCzjGNjdgQxkAg7B9WADeBjIBqtJCbhRA0YNoIkBSNmaPEMoNmA0FkYNoFKhapJ6FGyAH3nauaSmPfwI0v/3OukVi0CIZ+F25KrtYcx/CTIy0e+rC7R1Z4KMICVTQQ14feVXIbR695u14+Ir4gwAAD49E54wc1kWAAAAAElFTkSuQmCC') 2x) 5 8, text;
}

Expand Down
30 changes: 19 additions & 11 deletions src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,11 @@ import * as panel from 'vs/workbench/browser/panel';
import { getQuickNavigateHandler } from 'vs/workbench/browser/parts/quickopen/quickopen';
import { Extensions as QuickOpenExtensions, IQuickOpenRegistry, QuickOpenHandlerDescriptor } from 'vs/workbench/browser/quickopen';
import { Extensions as ActionExtensions, IWorkbenchActionRegistry } from 'vs/workbench/common/actions';
import { Extensions as ViewContainerExtensions, IViewContainersRegistry, ViewContainerLocation, IViewsRegistry } from 'vs/workbench/common/views';
import { ClearSelectionTerminalAction, ClearTerminalAction, CopyTerminalSelectionAction, CreateNewInActiveWorkspaceTerminalAction, CreateNewTerminalAction, DeleteToLineStartTerminalAction, DeleteWordLeftTerminalAction, DeleteWordRightTerminalAction, FindNext, FindPrevious, FocusActiveTerminalAction, FocusNextPaneTerminalAction, FocusNextTerminalAction, FocusPreviousPaneTerminalAction, FocusPreviousTerminalAction, FocusTerminalFindWidgetAction, HideTerminalFindWidgetAction, KillTerminalAction, MoveToLineEndTerminalAction, MoveToLineStartTerminalAction, QuickOpenActionTermContributor, QuickOpenTermAction, RenameTerminalAction, ResizePaneDownTerminalAction, ResizePaneLeftTerminalAction, ResizePaneRightTerminalAction, ResizePaneUpTerminalAction, RunActiveFileInTerminalAction, RunSelectedTextInTerminalAction, ScrollDownPageTerminalAction, ScrollDownTerminalAction, ScrollToBottomTerminalAction, ScrollToNextCommandAction, ScrollToPreviousCommandAction, ScrollToTopTerminalAction, ScrollUpPageTerminalAction, ScrollUpTerminalAction, SelectAllTerminalAction, SelectDefaultShellWindowsTerminalAction, SelectToNextCommandAction, SelectToNextLineAction, SelectToPreviousCommandAction, SelectToPreviousLineAction, SplitInActiveWorkspaceTerminalAction, SplitTerminalAction, TerminalPasteAction, TERMINAL_PICKER_PREFIX, ToggleCaseSensitiveCommand, ToggleEscapeSequenceLoggingAction, ToggleRegexCommand, ToggleTerminalAction, ToggleWholeWordCommand, NavigationModeFocusPreviousTerminalAction, NavigationModeFocusNextTerminalAction, NavigationModeExitTerminalAction, ManageWorkspaceShellPermissionsTerminalCommand, CreateNewWithCwdTerminalAction, RenameWithArgTerminalAction, SendSequenceTerminalAction } from 'vs/workbench/contrib/terminal/browser/terminalActions';
import { TerminalPanel } from 'vs/workbench/contrib/terminal/browser/terminalPanel';
import { TerminalViewPane } from 'vs/workbench/contrib/terminal/browser/terminalView';
import { TerminalPickerHandler } from 'vs/workbench/contrib/terminal/browser/terminalQuickOpen';
import { KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_FOCUSED, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_NOT_VISIBLE, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_VISIBLE, KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_TEXT_SELECTED, TERMINAL_PANEL_ID, DEFAULT_LETTER_SPACING, DEFAULT_LINE_HEIGHT, TerminalCursorStyle, TERMINAL_ACTION_CATEGORY, KEYBINDING_CONTEXT_TERMINAL_A11Y_TREE_FOCUS, TERMINAL_COMMAND_ID } from 'vs/workbench/contrib/terminal/common/terminal';
import { KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_FOCUSED, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_NOT_VISIBLE, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_VISIBLE, KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_TEXT_SELECTED, TERMINAL_VIEW_ID, DEFAULT_LETTER_SPACING, DEFAULT_LINE_HEIGHT, TerminalCursorStyle, TERMINAL_ACTION_CATEGORY, KEYBINDING_CONTEXT_TERMINAL_A11Y_TREE_FOCUS, TERMINAL_COMMAND_ID } from 'vs/workbench/contrib/terminal/common/terminal';
import { registerColors } from 'vs/workbench/contrib/terminal/common/terminalColorRegistry';
import { setupTerminalCommands } from 'vs/workbench/contrib/terminal/browser/terminalCommands';
import { setupTerminalMenu } from 'vs/workbench/contrib/terminal/common/terminalMenu';
Expand All @@ -36,6 +37,8 @@ import { registerShellConfiguration } from 'vs/workbench/contrib/terminal/common
import { CONTEXT_ACCESSIBILITY_MODE_ENABLED } from 'vs/platform/accessibility/common/accessibility';
import { ITerminalService } from 'vs/workbench/contrib/terminal/browser/terminal';
import { BrowserFeatures } from 'vs/base/browser/canIUse';
import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors';
import { ViewPaneContainer } from 'vs/workbench/browser/parts/views/viewPaneContainer';

registerSingleton(ITerminalService, TerminalService, true);

Expand Down Expand Up @@ -362,15 +365,20 @@ registry.registerWorkbenchAction(SyncActionDescriptor.create(QuickOpenTermAction
const actionBarRegistry = Registry.as<IActionBarRegistry>(ActionBarExtensions.Actionbar);
actionBarRegistry.registerActionBarContributor(Scope.VIEWER, QuickOpenActionTermContributor);

(<panel.PanelRegistry>Registry.as(panel.Extensions.Panels)).registerPanel(panel.PanelDescriptor.create(
TerminalPanel,
TERMINAL_PANEL_ID,
nls.localize('terminal', "Terminal"),
'terminal',
40,
TERMINAL_COMMAND_ID.TOGGLE
));
Registry.as<panel.PanelRegistry>(panel.Extensions.Panels).setDefaultPanelId(TERMINAL_PANEL_ID);
const VIEW_CONTAINER = Registry.as<IViewContainersRegistry>(ViewContainerExtensions.ViewContainersRegistry).registerViewContainer({
id: TERMINAL_VIEW_ID,
name: nls.localize('terminal', "Terminal"),
ctorDescriptor: new SyncDescriptor(ViewPaneContainer, [TERMINAL_VIEW_ID, TERMINAL_VIEW_ID, { mergeViewWithContainerWhenSingleView: true, donotShowContainerTitleWhenMergedWithContainer: true }]),
focusCommand: { id: TERMINAL_COMMAND_ID.FOCUS }
}, ViewContainerLocation.Panel);
Registry.as<panel.PanelRegistry>(panel.Extensions.Panels).setDefaultPanelId(TERMINAL_VIEW_ID);

Registry.as<IViewsRegistry>(ViewContainerExtensions.ViewsRegistry).registerViews([{
id: TERMINAL_VIEW_ID,
name: nls.localize('terminal', "Terminal"),
canToggleVisibility: false,
ctorDescriptor: new SyncDescriptor(TerminalViewPane)
}], VIEW_CONTAINER);

// On mac cmd+` is reserved to cycle between windows, that's why the keybindings use WinCtrl
const category = TERMINAL_ACTION_CATEGORY;
Expand Down
4 changes: 2 additions & 2 deletions src/vs/workbench/contrib/terminal/browser/terminalActions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import * as nls from 'vs/nls';
import { Action, IAction } from 'vs/base/common/actions';
import { EndOfLinePreference } from 'vs/editor/common/model';
import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService';
import { TERMINAL_PANEL_ID, ITerminalConfigHelper, TitleEventSource, TERMINAL_COMMAND_ID } from 'vs/workbench/contrib/terminal/common/terminal';
import { TERMINAL_VIEW_ID, ITerminalConfigHelper, TitleEventSource, TERMINAL_COMMAND_ID } from 'vs/workbench/contrib/terminal/common/terminal';
import { SelectActionViewItem } from 'vs/base/browser/ui/actionbar/actionbar';
import { TogglePanelAction } from 'vs/workbench/browser/panel';
import { IWorkbenchLayoutService } from 'vs/workbench/services/layout/browser/layoutService';
Expand Down Expand Up @@ -78,7 +78,7 @@ export class ToggleTerminalAction extends TogglePanelAction {
@IWorkbenchLayoutService layoutService: IWorkbenchLayoutService,
@ITerminalService private readonly terminalService: ITerminalService
) {
super(id, label, TERMINAL_PANEL_ID, panelService, layoutService);
super(id, label, TERMINAL_VIEW_ID, panelService, layoutService);
}

public run(event?: any): Promise<any> {
Expand Down
Loading

0 comments on commit 542de19

Please sign in to comment.