diff --git a/src/browser/renderer/dom/DomRendererRowFactory.ts b/src/browser/renderer/dom/DomRendererRowFactory.ts index 3f9765f0..186a1eb3 100644 --- a/src/browser/renderer/dom/DomRendererRowFactory.ts +++ b/src/browser/renderer/dom/DomRendererRowFactory.ts @@ -131,6 +131,11 @@ export class DomRendererRowFactory { const isCursorCell = isCursorRow && x === cursorX; const isLinkHover = hasHover && x >= linkStart && x <= linkEnd; + let isDecorated = false; + this._decorationService.forEachDecorationAtCell(x, row, undefined, d => { + isDecorated = true; + }); + // get chars to render for this cell let chars = cell.getChars() || WHITESPACE_CELL_CHAR; if (chars === ' ' && (cell.isUnderline() || cell.isOverline())) { @@ -160,6 +165,7 @@ export class DomRendererRowFactory { && spacing === oldSpacing && !isCursorCell && !isJoined + && !isDecorated ) { // no span alterations, thus only account chars skipping all code below text += chars; @@ -386,7 +392,7 @@ export class DomRendererRowFactory { } // exclude conditions for cell merging - never merge these - if (!isCursorCell && !isInSelection && !isJoined) { + if (!isCursorCell && !isInSelection && !isJoined && !isDecorated) { cellAmount++; } else { charElement.textContent = text; diff --git a/src/common/SortedList.ts b/src/common/SortedList.ts index 737b9acb..c5e7bc36 100644 --- a/src/common/SortedList.ts +++ b/src/common/SortedList.ts @@ -28,7 +28,7 @@ export class SortedList { this._array.push(value); return; } - i = this._search(this._getKey(value), 0, this._array.length - 1); + i = this._search(this._getKey(value)); this._array.splice(i, 0, value); } @@ -40,7 +40,7 @@ export class SortedList { if (key === undefined) { return false; } - i = this._search(key, 0, this._array.length - 1); + i = this._search(key); if (i === -1) { return false; } @@ -60,7 +60,7 @@ export class SortedList { if (this._array.length === 0) { return; } - i = this._search(key, 0, this._array.length - 1); + i = this._search(key); if (i < 0 || i >= this._array.length) { return; } @@ -76,7 +76,7 @@ export class SortedList { if (this._array.length === 0) { return; } - i = this._search(key, 0, this._array.length - 1); + i = this._search(key); if (i < 0 || i >= this._array.length) { return; } @@ -92,23 +92,26 @@ export class SortedList { return this._array.values(); } - private _search(key: number, min: number, max: number): number { - if (max < min) { - return min; + private _search(key: number): number { + let min = 0; + let max = this._array.length - 1; + while (max >= min) { + let mid = (min + max) >> 1; + const midKey = this._getKey(this._array[mid]); + if (midKey > key) { + max = mid - 1; + } else if (midKey < key) { + min = mid + 1; + } else { + // key in list, walk to lowest duplicate + while (mid > 0 && this._getKey(this._array[mid - 1]) === key) { + mid--; + } + return mid; + } } - let mid = Math.floor((min + max) / 2); - const midKey = this._getKey(this._array[mid]); - if (midKey > key) { - return this._search(key, min, mid - 1); - } - if (midKey < key) { - return this._search(key, mid + 1, max); - } - // Value found! Since keys can be duplicates, move the result index back to the lowest index - // that matches the key. - while (mid > 0 && this._getKey(this._array[mid - 1]) === key) { - mid--; - } - return mid; + // key not in list + // still return closest min (also used as insert position) + return min; } }