@@ -17,10 +17,14 @@ import type { BrowserLifecycleService } from 'vs/workbench/services/lifecycle/br
1717import { ILifecycleService } from 'vs/workbench/services/lifecycle/common/lifecycle.service'
1818import { BrowserHostColorSchemeService } from 'vs/workbench/services/themes/browser/browserHostColorSchemeService'
1919import { IHostColorSchemeService } from 'vs/workbench/services/themes/common/hostColorSchemeService.service'
20+ import { Emitter , Event } from 'vs/base/common/event'
21+ import { getWindowId } from 'vs/base/browser/dom'
2022
2123class CustomBrowserHostService extends BrowserHostService {
24+ private _onDidChangeFullScreen : Event < { windowId : number ; fullscreen : boolean } >
2225 constructor (
2326 private _toggleFullScreen : ( ) => Promise < void > | undefined ,
27+ _onDidChangeFullScreen : Event < boolean > | undefined ,
2428 @ILayoutService layoutService : ILayoutService ,
2529 @IConfigurationService configurationService : IConfigurationService ,
2630 @IFileService fileService : IFileService ,
@@ -46,6 +50,29 @@ class CustomBrowserHostService extends BrowserHostService {
4650 contextService ,
4751 userDataProfilesService
4852 )
53+
54+ this . _onDidChangeFullScreen = ( ( ) => {
55+ const mainWindowId = getWindowId ( mainWindow )
56+
57+ const emitter = new Emitter < { windowId : number ; fullscreen : boolean } > ( )
58+ _onDidChangeFullScreen ?.( ( fullscreen ) => {
59+ emitter . fire ( {
60+ windowId : mainWindowId ,
61+ fullscreen
62+ } )
63+ } )
64+
65+ super . onDidChangeFullScreen ( ( event ) => {
66+ // Forward the original fullscreen event only when there is no custom handler
67+ // or when the event is for a window other than the main one.
68+ // This prevents double-handling of fullscreen changes for the main window
69+ // when a custom handler is already managing it.
70+ if ( _onDidChangeFullScreen == null || event . windowId !== mainWindowId ) {
71+ emitter . fire ( event )
72+ }
73+ } )
74+ return emitter . event
75+ } ) ( )
4976 }
5077
5178 override async toggleFullScreen ( targetWindow : Window ) : Promise < void > {
@@ -55,19 +82,25 @@ class CustomBrowserHostService extends BrowserHostService {
5582 await super . toggleFullScreen ( targetWindow )
5683 }
5784 }
85+
86+ override get onDidChangeFullScreen ( ) {
87+ return this . _onDidChangeFullScreen
88+ }
5889}
5990
6091interface BrowserHostServiceOverrideParams {
6192 toggleFullScreen ?: ( ) => Promise < void >
93+ onDidChangeFullScreen ?: Event < boolean >
6294}
6395
6496export default function getServiceOverride ( {
65- toggleFullScreen
97+ toggleFullScreen,
98+ onDidChangeFullScreen
6699} : BrowserHostServiceOverrideParams = { } ) : IEditorOverrideServices {
67100 return {
68101 [ IHostService . toString ( ) ] : new SyncDescriptor (
69102 CustomBrowserHostService ,
70- [ toggleFullScreen ] ,
103+ [ toggleFullScreen , onDidChangeFullScreen ] ,
71104 true
72105 ) ,
73106 [ IHostColorSchemeService . toString ( ) ] : new SyncDescriptor (
0 commit comments