@@ -10,7 +10,7 @@ import { IRenderDebouncerWithCallback } from 'browser/Types';
1010import { IRenderDimensions , IRenderer } from 'browser/renderer/shared/Types' ;
1111import { ICharSizeService , ICoreBrowserService , IRenderService , IThemeService } from 'browser/services/Services' ;
1212import { EventEmitter } from 'common/EventEmitter' ;
13- import { Disposable } from 'common/Lifecycle' ;
13+ import { Disposable , MutableDisposable } from 'common/Lifecycle' ;
1414import { DebouncedIdleTask } from 'common/TaskQueue' ;
1515import { IBufferService , IDecorationService , IOptionsService } from 'common/services/Services' ;
1616
@@ -23,7 +23,7 @@ interface ISelectionState {
2323export class RenderService extends Disposable implements IRenderService {
2424 public serviceBrand : undefined ;
2525
26- private _renderer : IRenderer | undefined ;
26+ private _renderer : MutableDisposable < IRenderer > = this . register ( new MutableDisposable ( ) ) ;
2727 private _renderDebouncer : IRenderDebouncerWithCallback ;
2828 private _screenDprMonitor : ScreenDprMonitor ;
2929 private _pausedResizeTask = new DebouncedIdleTask ( ) ;
@@ -49,7 +49,7 @@ export class RenderService extends Disposable implements IRenderService {
4949 private readonly _onRefreshRequest = this . register ( new EventEmitter < { start : number , end : number } > ( ) ) ;
5050 public readonly onRefreshRequest = this . _onRefreshRequest . event ;
5151
52- public get dimensions ( ) : IRenderDimensions { return this . _renderer ! . dimensions ; }
52+ public get dimensions ( ) : IRenderDimensions { return this . _renderer . value ! . dimensions ; }
5353
5454 constructor (
5555 private _rowCount : number ,
@@ -63,8 +63,6 @@ export class RenderService extends Disposable implements IRenderService {
6363 ) {
6464 super ( ) ;
6565
66- this . register ( { dispose : ( ) => this . _renderer ?. dispose ( ) } ) ;
67-
6866 this . _renderDebouncer = new RenderDebouncer ( coreBrowserService . window , ( start , end ) => this . _renderRows ( start , end ) ) ;
6967 this . register ( this . _renderDebouncer ) ;
7068
@@ -73,7 +71,7 @@ export class RenderService extends Disposable implements IRenderService {
7371 this . register ( this . _screenDprMonitor ) ;
7472
7573 this . register ( bufferService . onResize ( ( ) => this . _fullRefresh ( ) ) ) ;
76- this . register ( bufferService . buffers . onBufferActivate ( ( ) => this . _renderer ?. clear ( ) ) ) ;
74+ this . register ( bufferService . buffers . onBufferActivate ( ( ) => this . _renderer . value ?. clear ( ) ) ) ;
7775 this . register ( optionsService . onOptionChange ( ( ) => this . _handleOptionsChanged ( ) ) ) ;
7876 this . register ( this . _charSizeService . onCharSizeChange ( ( ) => this . handleCharSizeChanged ( ) ) ) ;
7977
@@ -148,7 +146,7 @@ export class RenderService extends Disposable implements IRenderService {
148146 }
149147
150148 private _renderRows ( start : number , end : number ) : void {
151- if ( ! this . _renderer ) {
149+ if ( ! this . _renderer . value ) {
152150 return ;
153151 }
154152
@@ -159,11 +157,11 @@ export class RenderService extends Disposable implements IRenderService {
159157 end = Math . min ( end , this . _rowCount - 1 ) ;
160158
161159 // Render
162- this . _renderer . renderRows ( start , end ) ;
160+ this . _renderer . value . renderRows ( start , end ) ;
163161
164162 // Update selection if needed
165163 if ( this . _needsSelectionRefresh ) {
166- this . _renderer . handleSelectionChanged ( this . _selectionState . start , this . _selectionState . end , this . _selectionState . columnSelectMode ) ;
164+ this . _renderer . value . handleSelectionChanged ( this . _selectionState . start , this . _selectionState . end , this . _selectionState . columnSelectMode ) ;
167165 this . _needsSelectionRefresh = false ;
168166 }
169167
@@ -181,33 +179,31 @@ export class RenderService extends Disposable implements IRenderService {
181179 }
182180
183181 private _handleOptionsChanged ( ) : void {
184- if ( ! this . _renderer ) {
182+ if ( ! this . _renderer . value ) {
185183 return ;
186184 }
187185 this . refreshRows ( 0 , this . _rowCount - 1 ) ;
188186 this . _fireOnCanvasResize ( ) ;
189187 }
190188
191189 private _fireOnCanvasResize ( ) : void {
192- if ( ! this . _renderer ) {
190+ if ( ! this . _renderer . value ) {
193191 return ;
194192 }
195193 // Don't fire the event if the dimensions haven't changed
196- if ( this . _renderer . dimensions . css . canvas . width === this . _canvasWidth && this . _renderer . dimensions . css . canvas . height === this . _canvasHeight ) {
194+ if ( this . _renderer . value . dimensions . css . canvas . width === this . _canvasWidth && this . _renderer . value . dimensions . css . canvas . height === this . _canvasHeight ) {
197195 return ;
198196 }
199- this . _onDimensionsChange . fire ( this . _renderer . dimensions ) ;
197+ this . _onDimensionsChange . fire ( this . _renderer . value . dimensions ) ;
200198 }
201199
202200 public hasRenderer ( ) : boolean {
203- return ! ! this . _renderer ;
201+ return ! ! this . _renderer . value ;
204202 }
205203
206204 public setRenderer ( renderer : IRenderer ) : void {
207- // TODO: RenderService should be the only one to dispose the renderer
208- this . _renderer ?. dispose ( ) ;
209- this . _renderer = renderer ;
210- this . _renderer . onRequestRedraw ( e => this . refreshRows ( e . start , e . end , true ) ) ;
205+ this . _renderer . value = renderer ;
206+ this . _renderer . value . onRequestRedraw ( e => this . refreshRows ( e . start , e . end , true ) ) ;
211207
212208 // Force a refresh
213209 this . _needsSelectionRefresh = true ;
@@ -227,10 +223,10 @@ export class RenderService extends Disposable implements IRenderService {
227223 }
228224
229225 public clearTextureAtlas ( ) : void {
230- if ( ! this . _renderer ) {
226+ if ( ! this . _renderer . value ) {
231227 return ;
232228 }
233- this . _renderer . clearTextureAtlas ?.( ) ;
229+ this . _renderer . value . clearTextureAtlas ?.( ) ;
234230 this . _fullRefresh ( ) ;
235231 }
236232
@@ -239,50 +235,50 @@ export class RenderService extends Disposable implements IRenderService {
239235 // when devicePixelRatio changes
240236 this . _charSizeService . measure ( ) ;
241237
242- if ( ! this . _renderer ) {
238+ if ( ! this . _renderer . value ) {
243239 return ;
244240 }
245- this . _renderer . handleDevicePixelRatioChange ( ) ;
241+ this . _renderer . value . handleDevicePixelRatioChange ( ) ;
246242 this . refreshRows ( 0 , this . _rowCount - 1 ) ;
247243 }
248244
249245 public handleResize ( cols : number , rows : number ) : void {
250- if ( ! this . _renderer ) {
246+ if ( ! this . _renderer . value ) {
251247 return ;
252248 }
253249 if ( this . _isPaused ) {
254- this . _pausedResizeTask . set ( ( ) => this . _renderer ! . handleResize ( cols , rows ) ) ;
250+ this . _pausedResizeTask . set ( ( ) => this . _renderer . value ! . handleResize ( cols , rows ) ) ;
255251 } else {
256- this . _renderer . handleResize ( cols , rows ) ;
252+ this . _renderer . value . handleResize ( cols , rows ) ;
257253 }
258254 this . _fullRefresh ( ) ;
259255 }
260256
261257 // TODO: Is this useful when we have onResize?
262258 public handleCharSizeChanged ( ) : void {
263- this . _renderer ?. handleCharSizeChanged ( ) ;
259+ this . _renderer . value ?. handleCharSizeChanged ( ) ;
264260 }
265261
266262 public handleBlur ( ) : void {
267- this . _renderer ?. handleBlur ( ) ;
263+ this . _renderer . value ?. handleBlur ( ) ;
268264 }
269265
270266 public handleFocus ( ) : void {
271- this . _renderer ?. handleFocus ( ) ;
267+ this . _renderer . value ?. handleFocus ( ) ;
272268 }
273269
274270 public handleSelectionChanged ( start : [ number , number ] | undefined , end : [ number , number ] | undefined , columnSelectMode : boolean ) : void {
275271 this . _selectionState . start = start ;
276272 this . _selectionState . end = end ;
277273 this . _selectionState . columnSelectMode = columnSelectMode ;
278- this . _renderer ?. handleSelectionChanged ( start , end , columnSelectMode ) ;
274+ this . _renderer . value ?. handleSelectionChanged ( start , end , columnSelectMode ) ;
279275 }
280276
281277 public handleCursorMove ( ) : void {
282- this . _renderer ?. handleCursorMove ( ) ;
278+ this . _renderer . value ?. handleCursorMove ( ) ;
283279 }
284280
285281 public clear ( ) : void {
286- this . _renderer ?. clear ( ) ;
282+ this . _renderer . value ?. clear ( ) ;
287283 }
288284}
0 commit comments