提交 6cf6af3e 编写于 作者: D Daniel Imms 提交者: GitHub

Merge pull request #22751 from Microsoft/tyriar/22413

Polish terminal link hover hint
...@@ -52,15 +52,16 @@ ...@@ -52,15 +52,16 @@
.monaco-workbench .panel.integrated-terminal .xterm a { .monaco-workbench .panel.integrated-terminal .xterm a {
color: inherit; color: inherit;
cursor: text;
text-decoration: none; text-decoration: none;
} }
.monaco-workbench .panel.integrated-terminal .xterm a:hover { .monaco-workbench .panel.integrated-terminal.ctrl-held .xterm a:hover {
cursor: pointer; cursor: pointer;
text-decoration: underline; text-decoration: underline;
} }
.monaco-workbench .panel.integrated-terminal .xterm a.xterm-invalid-link:hover { .monaco-workbench .panel.integrated-terminal.ctrl-held .xterm a.xterm-invalid-link:hover {
cursor: text; cursor: text;
text-decoration: none; text-decoration: none;
} }
......
...@@ -489,6 +489,8 @@ export class TerminalInstance implements ITerminalInstance { ...@@ -489,6 +489,8 @@ export class TerminalInstance implements ITerminalInstance {
private _sendPtyDataToXterm(message: { type: string, content: string }): void { private _sendPtyDataToXterm(message: { type: string, content: string }): void {
if (message.type === 'data') { if (message.type === 'data') {
this._widgetManager.closeMessage();
this._linkHandler.disposeTooltipListeners();
this._xterm.write(message.content); this._xterm.write(message.content);
} }
} }
......
...@@ -3,11 +3,13 @@ ...@@ -3,11 +3,13 @@
* Licensed under the MIT License. See License.txt in the project root for license information. * Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/ *--------------------------------------------------------------------------------------------*/
import * as dom from 'vs/base/browser/dom';
import * as nls from 'vs/nls'; import * as nls from 'vs/nls';
import * as path from 'path'; import * as path from 'path';
import * as platform from 'vs/base/common/platform'; import * as platform from 'vs/base/common/platform';
import * as pfs from 'vs/base/node/pfs'; import * as pfs from 'vs/base/node/pfs';
import Uri from 'vs/base/common/uri'; import Uri from 'vs/base/common/uri';
import { dispose, IDisposable } from 'vs/base/common/lifecycle';
import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService';
import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace';
import { TerminalWidgetManager } from 'vs/workbench/parts/terminal/browser/terminalWidgetManager'; import { TerminalWidgetManager } from 'vs/workbench/parts/terminal/browser/terminalWidgetManager';
...@@ -35,6 +37,8 @@ export type XtermLinkMatcherHandler = (event: MouseEvent, uri: string) => boolea ...@@ -35,6 +37,8 @@ export type XtermLinkMatcherHandler = (event: MouseEvent, uri: string) => boolea
export type XtermLinkMatcherValidationCallback = (uri: string, element: HTMLElement, callback: (isValid: boolean) => void) => void; export type XtermLinkMatcherValidationCallback = (uri: string, element: HTMLElement, callback: (isValid: boolean) => void) => void;
export class TerminalLinkHandler { export class TerminalLinkHandler {
private _tooltipDisposables: IDisposable[] = [];
constructor( constructor(
private _widgetManager: TerminalWidgetManager, private _widgetManager: TerminalWidgetManager,
private _xterm: any, private _xterm: any,
...@@ -68,6 +72,10 @@ export class TerminalLinkHandler { ...@@ -68,6 +72,10 @@ export class TerminalLinkHandler {
}); });
} }
public disposeTooltipListeners(): void {
this._tooltipDisposables = dispose(this._tooltipDisposables);
}
private _wrapLinkHandler(handler: (uri: string) => boolean | void): XtermLinkMatcherHandler { private _wrapLinkHandler(handler: (uri: string) => boolean | void): XtermLinkMatcherHandler {
return (event: MouseEvent, uri: string) => { return (event: MouseEvent, uri: string) => {
// Require ctrl/cmd on click // Require ctrl/cmd on click
...@@ -112,7 +120,8 @@ export class TerminalLinkHandler { ...@@ -112,7 +120,8 @@ export class TerminalLinkHandler {
private _addTooltipEventListeners(element: HTMLElement) { private _addTooltipEventListeners(element: HTMLElement) {
let timeout = null; let timeout = null;
element.addEventListener('mouseenter', () => { let isMessageShowing = false;
this._tooltipDisposables.push(dom.addDisposableListener(element, dom.EventType.MOUSE_OVER, () => {
timeout = setTimeout(() => { timeout = setTimeout(() => {
let message: string; let message: string;
if (platform.isMacintosh) { if (platform.isMacintosh) {
...@@ -121,12 +130,14 @@ export class TerminalLinkHandler { ...@@ -121,12 +130,14 @@ export class TerminalLinkHandler {
message = nls.localize('terminalLinkHandler.followLinkCtrl', 'Ctrl + click to follow link'); message = nls.localize('terminalLinkHandler.followLinkCtrl', 'Ctrl + click to follow link');
} }
this._widgetManager.showMessage(element.offsetLeft, element.offsetTop, message); this._widgetManager.showMessage(element.offsetLeft, element.offsetTop, message);
isMessageShowing = true;
}, 500); }, 500);
}); }));
element.addEventListener('mouseleave', () => { this._tooltipDisposables.push(dom.addDisposableListener(element, dom.EventType.MOUSE_OUT, () => {
clearTimeout(timeout); clearTimeout(timeout);
this._widgetManager.closeMessage(); this._widgetManager.closeMessage();
}); isMessageShowing = false;
}));
} }
private _resolvePath(link: string): TPromise<string> { private _resolvePath(link: string): TPromise<string> {
......
...@@ -145,6 +145,9 @@ export class TerminalPanel extends Panel { ...@@ -145,6 +145,9 @@ export class TerminalPanel extends Panel {
} }
private _attachEventListeners(): void { private _attachEventListeners(): void {
this._register(DOM.addDisposableListener(window, DOM.EventType.KEY_DOWN, (e: KeyboardEvent) => this._refreshCtrlHeld(e.ctrlKey)));
this._register(DOM.addDisposableListener(window, DOM.EventType.KEY_UP, (e: KeyboardEvent) => this._refreshCtrlHeld(e.ctrlKey)));
this._register(DOM.addDisposableListener(window, DOM.EventType.FOCUS, (e: KeyboardEvent) => this._refreshCtrlHeld(e.ctrlKey)));
this._register(DOM.addDisposableListener(this._parentDomElement, 'mousedown', (event: MouseEvent) => { this._register(DOM.addDisposableListener(this._parentDomElement, 'mousedown', (event: MouseEvent) => {
if (this._terminalService.terminalInstances.length === 0) { if (this._terminalService.terminalInstances.length === 0) {
return; return;
...@@ -197,6 +200,10 @@ export class TerminalPanel extends Panel { ...@@ -197,6 +200,10 @@ export class TerminalPanel extends Panel {
})); }));
} }
private _refreshCtrlHeld(ctrlKey: boolean): void {
this._parentDomElement.classList.toggle('ctrl-held', ctrlKey);
}
private _updateTheme(theme?: ITheme): void { private _updateTheme(theme?: ITheme): void {
if (!theme) { if (!theme) {
theme = this.themeService.getTheme(); theme = this.themeService.getTheme();
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册