@@ -7,9 +7,10 @@ import { DomRendererRowFactory, RowCss } from 'browser/renderer/dom/DomRendererR
7
7
import { WidthCache } from 'browser/renderer/dom/WidthCache' ;
8
8
import { INVERTED_DEFAULT_COLOR } from 'browser/renderer/shared/Constants' ;
9
9
import { createRenderDimensions } from 'browser/renderer/shared/RendererUtils' ;
10
- import { IRenderDimensions , IRenderer , IRequestRedrawEvent } from 'browser/renderer/shared/Types' ;
10
+ import { createSelectionRenderModel } from 'browser/renderer/shared/SelectionRenderModel' ;
11
+ import { IRenderDimensions , IRenderer , IRequestRedrawEvent , ISelectionRenderModel } from 'browser/renderer/shared/Types' ;
11
12
import { ICharSizeService , ICoreBrowserService , IThemeService } from 'browser/services/Services' ;
12
- import { ILinkifier2 , ILinkifierEvent , ReadonlyColorSet } from 'browser/Types' ;
13
+ import { ILinkifier2 , ILinkifierEvent , ITerminal , ReadonlyColorSet } from 'browser/Types' ;
13
14
import { color } from 'common/Color' ;
14
15
import { EventEmitter } from 'common/EventEmitter' ;
15
16
import { Disposable , toDisposable } from 'common/Lifecycle' ;
@@ -25,7 +26,6 @@ const SELECTION_CLASS = 'xterm-selection';
25
26
26
27
let nextTerminalId = 1 ;
27
28
28
-
29
29
/**
30
30
* A fallback renderer for when canvas is slow. This is not meant to be
31
31
* particularly fast or feature complete, more just stable and usable for when
@@ -41,12 +41,14 @@ export class DomRenderer extends Disposable implements IRenderer {
41
41
private _rowElements : HTMLElement [ ] = [ ] ;
42
42
private _selectionContainer : HTMLElement ;
43
43
private _widthCache : WidthCache ;
44
+ private _selectionRenderModel : ISelectionRenderModel = createSelectionRenderModel ( ) ;
44
45
45
46
public dimensions : IRenderDimensions ;
46
47
47
48
public readonly onRequestRedraw = this . register ( new EventEmitter < IRequestRedrawEvent > ( ) ) . event ;
48
49
49
50
constructor (
51
+ private readonly _terminal : ITerminal ,
50
52
private readonly _document : Document ,
51
53
private readonly _element : HTMLElement ,
52
54
private readonly _screenElement : HTMLElement ,
@@ -291,6 +293,7 @@ export class DomRenderer extends Disposable implements IRenderer {
291
293
public handleResize ( cols : number , rows : number ) : void {
292
294
this . _refreshRowElements ( cols , rows ) ;
293
295
this . _updateDimensions ( ) ;
296
+ this . handleSelectionChanged ( this . _selectionRenderModel . selectionStart , this . _selectionRenderModel . selectionEnd , this . _selectionRenderModel . columnSelectMode ) ;
294
297
}
295
298
296
299
public handleCharSizeChanged ( ) : void {
@@ -320,11 +323,13 @@ export class DomRenderer extends Disposable implements IRenderer {
320
323
return ;
321
324
}
322
325
326
+ this . _selectionRenderModel . update ( this . _terminal , start , end , columnSelectMode ) ;
327
+
323
328
// Translate from buffer position to viewport position
324
- const viewportStartRow = start [ 1 ] - this . _bufferService . buffer . ydisp ;
325
- const viewportEndRow = end [ 1 ] - this . _bufferService . buffer . ydisp ;
326
- const viewportCappedStartRow = Math . max ( viewportStartRow , 0 ) ;
327
- const viewportCappedEndRow = Math . min ( viewportEndRow , this . _bufferService . rows - 1 ) ;
329
+ const viewportStartRow = this . _selectionRenderModel . viewportStartRow ;
330
+ const viewportEndRow = this . _selectionRenderModel . viewportEndRow ;
331
+ const viewportCappedStartRow = this . _selectionRenderModel . viewportCappedStartRow ;
332
+ const viewportCappedEndRow = this . _selectionRenderModel . viewportCappedEndRow ;
328
333
329
334
// No need to draw the selection
330
335
if ( viewportCappedStartRow >= this . _bufferService . rows || viewportCappedEndRow < 0 ) {
@@ -365,10 +370,16 @@ export class DomRenderer extends Disposable implements IRenderer {
365
370
*/
366
371
private _createSelectionElement ( row : number , colStart : number , colEnd : number , rowCount : number = 1 ) : HTMLElement {
367
372
const element = this . _document . createElement ( 'div' ) ;
373
+ const left = colStart * this . dimensions . css . cell . width ;
374
+ let width = this . dimensions . css . cell . width * ( colEnd - colStart ) ;
375
+ if ( left + width > this . dimensions . css . canvas . width ) {
376
+ width = this . dimensions . css . canvas . width - left ;
377
+ }
378
+
368
379
element . style . height = `${ rowCount * this . dimensions . css . cell . height } px` ;
369
380
element . style . top = `${ row * this . dimensions . css . cell . height } px` ;
370
- element . style . left = `${ colStart * this . dimensions . css . cell . width } px` ;
371
- element . style . width = `${ this . dimensions . css . cell . width * ( colEnd - colStart ) } px` ;
381
+ element . style . left = `${ left } px` ;
382
+ element . style . width = `${ width } px` ;
372
383
return element ;
373
384
}
374
385
0 commit comments