Change:
I would like to see the release notes when there's an update, because there are always useful additions that I want to know about, but currently VS Code: re-opens release notes that I have already read, release notes in EVERY SINGLE WINDOW. ! These have been happening for years. Please fix them before I jump off a bridge! There should never be any reason to automatically open them more than ONE time. Perhaps consider using the OS notification system to send ONE notification. If you can't do that, please open ONE window with the release notes, instead of one tab in every window.
/needsMoreInfo does this reproduce if you run with all extensions disabled?
Since some of the conditions to reproduce it (a new release) are outside of my control, and outside of my knowledge until I see the release notes, that's very hard to answer. Are you trying to tell me that you do not have the release notes appear in every single window when you reopen Visual Studio Code and there's a new release? And that you never have them appear again after you've already read them? Since I've seen this happen SO many times, I guessed it happened quite widely.
This seems to be triggered from update, moving to Joao.
Yes there is a known issue: when opening release notes, every window opens them. It's pretty dramatic in your case since you seem to have ~20 windows open. But release notes should not appear twice, unless there's been a recovery update. There was one yesterday: 1.42.1... so that might explain it?
I could swear this issue had been fixed in the past... and I was right. Original issue is and fix was This got broken by
Muito obrigado João!
De nada! Make sure you let us know when stuff annoys you. Sometimes it seems obvious that an issue would annoy everyone but sometimes it just doesn't. :+1:
is there a good way to verify this? If not, I have already verified by code review.
Code review should be

Discussion:
@IHostService hostService: IHostService, @IProductService productService: IProductService ) { <del> if (!hostService.hasFocus) { return; } </del> <ins> hostService.hadLastFocus().then(hadLastFocus => { if (!hadLastFocus) { return; } </ins> <del> const lastVersion = storageService.get(ProductContribution.KEY, StorageScope.GLOBAL, ''); const shouldShowReleaseNotes = configurationService.getValue<boolean>('update.showReleaseNotes'); // was there an update? if so, open release notes const releaseNotesUrl = productService.releaseNotesUrl; if (shouldShowReleaseNotes && !environmentService.args['skip-release-notes'] && releaseNotesUrl && lastVersion && productService.version !== lastVersion) { showReleaseNotes(instantiationService, productService.version) .then(undefined, () => { notificationService.prompt( severity.Info, nls.localize('read the release notes', "Welcome to {0} v{1}! Would you like to read the Release Notes?", productService.nameLong, productService.version), [{ label: nls.localize('releaseNotes', "Release Notes"), run: () => { const uri = URI.parse(releaseNotesUrl); openerService.open(uri); } }], { sticky: true } ); }); } </del> <ins> const lastVersion = storageService.get(ProductContribution.KEY, StorageScope.GLOBAL, ''); const shouldShowReleaseNotes = configurationService.getValue<boolean>('update.showReleaseNotes'); // was there an update? if so, open release notes const releaseNotesUrl = productService.releaseNotesUrl; if (shouldShowReleaseNotes && !environmentService.args['skip-release-notes'] && releaseNotesUrl && lastVersion && productService.version !== lastVersion) { showReleaseNotes(instantiationService, productService.version) .then(undefined, () => { notificationService.prompt( severity.Info, nls.localize('read the release notes', "Welcome to {0} v{1}! Would you like to read the Release Notes?", productService.nameLong, productService.version), [{ label: nls.localize('releaseNotes', "Release Notes"), run: () => { const uri = URI.parse(releaseNotesUrl); openerService.open(uri); } }], { sticky: true } ); }); } </ins> <del> // should we show the new license? if (productService.licenseUrl && lastVersion && semver.satisfies(lastVersion, '<1.0.0') && semver.satisfies(productService.version, '>=1.0.0')) { notificationService.info(nls.localize('licenseChanged', "Our license terms have changed, please click [here]({0}) to go through them.", productService.licenseUrl)); } </del> <ins> // should we show the new license? if (productService.licenseUrl && lastVersion && semver.satisfies(lastVersion, '<1.0.0') && semver.satisfies(productService.version, '>=1.0.0')) { notificationService.info(nls.localize('licenseChanged', "Our license terms have changed, please click [here]({0}) to go through them.", productService.licenseUrl)); } </ins> <del> storageService.store(ProductContribution.KEY, productService.version, StorageScope.GLOBAL); </del> <ins> storageService.store(ProductContribution.KEY, productService.version, StorageScope.GLOBAL); }); </ins> } }

return document.hasFocus(); } <ins> async hadLastFocus(): Promise<boolean> { return true; } </ins> async focus(): Promise<void> { window.focus(); }

readonly hasFocus: boolean; /** <ins> * Find out if the window had the last focus. */ hadLastFocus(): Promise<boolean>; /** </ins> * Attempt to bring the window to the foreground and focus it. */ focus(): Promise<void>;

return document.hasFocus(); } <ins> async hadLastFocus(): Promise<boolean> { const activeWindowId = await this.electronService.getActiveWindowId(); if (typeof activeWindowId === 'undefined') { return false; } return activeWindowId === this.electronEnvironmentService.windowId; } </ins> openWindow(options?: IOpenEmptyWindowOptions): Promise<void>; openWindow(toOpen: IWindowOpenable[], options?: IOpenWindowOptions): Promise<void>; openWindow(arg1?: IOpenEmptyWindowOptions | IWindowOpenable[], arg2?: IOpenWindowOptions): Promise<void> {

_serviceBrand: undefined; readonly hasFocus: boolean = true; <ins> async hadLastFocus(): Promise<boolean> { return true; } </ins> readonly onDidChangeFocus: Event<boolean> = Event.None; async restart(): Promise<void> { }