diff --git a/src/vs/editor/contrib/hover/browser/contentHoverController.ts b/src/vs/editor/contrib/hover/browser/contentHoverController.ts index 8d7421d990693..1378ed5e2bb1e 100644 --- a/src/vs/editor/contrib/hover/browser/contentHoverController.ts +++ b/src/vs/editor/contrib/hover/browser/contentHoverController.ts @@ -17,7 +17,7 @@ import { IKeybindingService } from '../../../../platform/keybinding/common/keybi import { ResultKind } from '../../../../platform/keybinding/common/keybindingResolver.js'; import { HoverVerbosityAction } from '../../../common/languages.js'; import { RunOnceScheduler } from '../../../../base/common/async.js'; -import { isMousePositionWithinElement, shouldShowHover } from './hoverUtils.js'; +import { isMousePositionWithinElement, shouldShowHover, isTriggerModifierPressed } from './hoverUtils.js'; import { ContentHoverWidgetWrapper } from './contentHoverWidgetWrapper.js'; import './hover.css'; import { Emitter } from '../../../../base/common/event.js'; @@ -266,12 +266,18 @@ export class ContentHoverController extends Disposable implements IEditorContrib } private _onKeyDown(e: IKeyboardEvent): void { - if (this._ignoreMouseEvents) { + if (this._ignoreMouseEvents || !this._contentWidget) { return; } - if (!this._contentWidget) { - return; + + if (this._hoverSettings.enabled === 'onKeyboardModifier' + && isTriggerModifierPressed(this._editor.getOption(EditorOption.multiCursorModifier), e) + && this._mouseMoveEvent) { + if (!this._contentWidget.isVisible) { + this._contentWidget.showsOrWillShow(this._mouseMoveEvent); + } } + const isPotentialKeyboardShortcut = this._isPotentialKeyboardShortcut(e); const isModifierKeyPressed = isModifierKey(e.keyCode); if (isPotentialKeyboardShortcut || isModifierKeyPressed) { diff --git a/src/vs/editor/contrib/hover/browser/glyphHoverController.ts b/src/vs/editor/contrib/hover/browser/glyphHoverController.ts index e26f82ccf57d1..cfafc88cfc2f9 100644 --- a/src/vs/editor/contrib/hover/browser/glyphHoverController.ts +++ b/src/vs/editor/contrib/hover/browser/glyphHoverController.ts @@ -12,7 +12,7 @@ import { IEditorContribution, IScrollEvent } from '../../../common/editorCommon. import { IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js'; import { IHoverWidget } from './hoverTypes.js'; import { RunOnceScheduler } from '../../../../base/common/async.js'; -import { isMousePositionWithinElement, shouldShowHover } from './hoverUtils.js'; +import { isMousePositionWithinElement, isTriggerModifierPressed, shouldShowHover } from './hoverUtils.js'; import './hover.css'; import { GlyphHoverWidget } from './glyphHoverWidget.js'; @@ -206,6 +206,15 @@ export class GlyphHoverController extends Disposable implements IEditorContribut if (!this._editor.hasModel()) { return; } + + if (this._hoverSettings.enabled === 'onKeyboardModifier' + && isTriggerModifierPressed(this._editor.getOption(EditorOption.multiCursorModifier), e) + && this._mouseMoveEvent) { + if (this._tryShowHoverWidget(this._mouseMoveEvent)) { + return; + } + } + if (isModifierKey(e.keyCode)) { // Do not hide hover when a modifier key is pressed return; diff --git a/src/vs/editor/contrib/hover/browser/hoverUtils.ts b/src/vs/editor/contrib/hover/browser/hoverUtils.ts index 669b36fbbb746..997d4512c1a94 100644 --- a/src/vs/editor/contrib/hover/browser/hoverUtils.ts +++ b/src/vs/editor/contrib/hover/browser/hoverUtils.ts @@ -37,9 +37,19 @@ export function shouldShowHover( if (hoverEnabled === 'off') { return false; } + return isTriggerModifierPressed(multiCursorModifier, mouseEvent.event); +} + +/** + * Returns true if the trigger modifier (inverse of multi-cursor modifier) is pressed. + * This works with both mouse and keyboard events by relying only on the modifier flags. + */ +export function isTriggerModifierPressed( + multiCursorModifier: 'altKey' | 'ctrlKey' | 'metaKey', + event: { ctrlKey: boolean; metaKey: boolean; altKey: boolean } +): boolean { if (multiCursorModifier === 'altKey') { - return mouseEvent.event.ctrlKey || mouseEvent.event.metaKey; - } else { - return mouseEvent.event.altKey; + return event.ctrlKey || event.metaKey; } + return event.altKey; // multiCursorModifier is ctrlKey or metaKey }