Change:
Testing a workspace a tab into a new floating window in a couple times using keyboard shortcuts the zoom status bar item to zoom out. When the zoom out happens, the status bar item will move further right, as expected because everything is getting small. However, the hover itself moved further left. I would expect it to either stay under my cursor (ideal) or move with the status bar item. !
It also moves around unexpectedly when I zoom in.
My cursor isn't showing properly in this gif, but I think you can get the idea. !
<!-- AUTHORVERIFICATIONREQUEST --This bug has been fixed in the latest release of ! you can help us out by commenting if things are now working as expected. If things still don't seem right, please ensure you're on version of Insiders (today's or later - you can use in the command palette to check), and leave a comment letting us know what isn't working as expected. Happy Coding!

Discussion:
*  Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ <del> import { isFullscreen, onDidChangeFullscreen, onDidChangeZoomLevel } from 'vs/base/browser/browser'; </del> <ins> import { isFullscreen, onDidChangeFullscreen } from 'vs/base/browser/browser'; </ins> import { hide, show } from 'vs/base/browser/dom'; import { Emitter, Event } from 'vs/base/common/event'; import { DisposableStore } from 'vs/base/common/lifecycle';

hide(statusbarPart.container); } <del> updateEditorPartHeight(fromEvent); } function updateEditorPartHeight(fromEvent: boolean): void { editorPartContainer.style.height = `calc(100% - ${computeEditorPartHeightOffset()}px)`; </del> if (fromEvent) { auxiliaryWindow.layout(); }

titlebarPart = disposables.add(this.titleService.createAuxiliaryTitlebarPart(auxiliaryWindow.container, editorPart)); titlebarPartVisible = true; <del> disposables.add(titlebarPart.onDidChange(() => updateEditorPartHeight(true))); disposables.add(onDidChangeZoomLevel(targetWindowId => { if (auxiliaryWindow.window.vscodeWindowId === targetWindowId && titlebarPartVisible) { // This is a workaround for https://github.com/microsoft/vscode/issues/202377 // The title bar part prevents zooming in certain cases and when doing so, // adjusts its size accordingly. This is however not reported from the // `onDidchange` event that we listen to above, so we manually update the // editor part height here. updateEditorPartHeight(true); } })); </del> <ins> disposables.add(titlebarPart.onDidChange(() => auxiliaryWindow.layout())); </ins> disposables.add(onDidChangeFullscreen(windowId => { if (windowId !== auxiliaryWindow.window.vscodeWindowId) { return; // ignore all but our window

if (titlebarPart && oldTitlebarPartVisible !== titlebarPartVisible) { titlebarPart.container.style.display = titlebarPartVisible ? '' : 'none'; <del> updateEditorPartHeight(true); </del> <ins> auxiliaryWindow.layout(); </ins> } })); } else {

})); disposables.add(Event.once(this.lifecycleService.onDidShutdown)(() => disposables.dispose())); <del> // Layout disposables.add(auxiliaryWindow.onDidLayout(dimension => { </del> <ins> // Layout: specifically `onWillLayout` to have a chance // to build the aux editor part before other components // have a chance to react. disposables.add(auxiliaryWindow.onWillLayout(dimension => { </ins> const titlebarPartHeight = titlebarPart?.height ?? 0; titlebarPart?.layout(dimension.width, titlebarPartHeight, 0, 0);

import { localize } from 'vs/nls'; import { mark } from 'vs/base/common/performance'; import { Emitter, Event } from 'vs/base/common/event'; <del> import { Dimension, EventHelper, EventType, ModifierKeyEmitter, addDisposableListener, cloneGlobalStylesheets, copyAttributes, createLinkElement, createMetaElement, getActiveWindow, getClientArea, getWindowId, isGlobalStylesheet, position, registerWindow, sharedMutationObserver, size, trackAttributes } from 'vs/base/browser/dom'; </del> <ins> import { Dimension, EventHelper, EventType, ModifierKeyEmitter, addDisposableListener, cloneGlobalStylesheets, copyAttributes, createLinkElement, createMetaElement, getActiveWindow, getClientArea, getWindowId, isGlobalStylesheet, position, registerWindow, sharedMutationObserver, trackAttributes } from 'vs/base/browser/dom'; </ins> import { CodeWindow, ensureCodeWindow, mainWindow } from 'vs/base/browser/window'; import { Disposable, DisposableStore, IDisposable, toDisposable } from 'vs/base/common/lifecycle'; import { InstantiationType, registerSingleton } from 'vs/platform/instantiation/common/extensions';

export interface IAuxiliaryWindow extends IDisposable { <ins> readonly onWillLayout: Event<Dimension>; </ins> readonly onDidLayout: Event<Dimension>; readonly onBeforeUnload: Event<void>;

export class AuxiliaryWindow extends BaseWindow implements IAuxiliaryWindow { <ins> private readonly _onWillLayout = this._register(new Emitter<Dimension>()); readonly onWillLayout = this._onWillLayout.event; </ins> private readonly _onDidLayout = this._register(new Emitter<Dimension>()); readonly onDidLayout = this._onDidLayout.event;

} layout(): void { <del> const dimension = getClientArea(this.window.document.body, this.container); position(this.container, 0, 0, 0, 0, 'relative'); size(this.container, dimension.width, dimension.height); </del> <ins> // Split layout up into two events so that downstream components // have a chance to participate in the beginning or end of the // layout phase. // This helps to build the auxiliary window in another component // in the `onWillLayout` phase and then let other compoments // react when the overall layout has finished in `onDidLayout`. const dimension = getClientArea(this.window.document.body, this.container); this._onWillLayout.fire(dimension); </ins> this._onDidLayout.fire(dimension); }

// Create workbench container and apply classes const container = document.createElement('div'); container.setAttribute('role', 'application'); <ins> position(container, 0, 0, 0, 0, 'relative'); container.style.display = 'flex'; container.style.height = '100%'; container.style.flexDirection = 'column'; </ins> auxiliaryWindow.document.body.append(container); // Track attributes