@opentui/core 0.5.9 → 0.5.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/audio.d.ts +6 -1
- package/{chunk-bun-b0662dgp.js → chunk-bun-37s3zwb6.js} +1216 -1038
- package/{chunk-bun-b0662dgp.js.map → chunk-bun-37s3zwb6.js.map} +7 -7
- package/{chunk-bun-jxfx3h5k.js → chunk-bun-bwjmgnxw.js} +773 -621
- package/chunk-bun-bwjmgnxw.js.map +32 -0
- package/{chunk-node-dcyj0dm5.js → chunk-node-54dhb2fr.js} +773 -621
- package/chunk-node-54dhb2fr.js.map +32 -0
- package/{chunk-node-zcz10bhr.js → chunk-node-70eg2nhg.js} +1223 -1042
- package/chunk-node-70eg2nhg.js.map +63 -0
- package/image.d.ts +25 -1
- package/index.bun.js +1642 -1374
- package/index.bun.js.map +8 -8
- package/index.node.js +1642 -1374
- package/index.node.js.map +8 -8
- package/lib/detect-links.d.ts +5 -0
- package/lib/tree-sitter/update-assets.js +4 -4
- package/lib/tree-sitter/update-assets.js.map +2 -2
- package/lib/tree-sitter-styled-text.d.ts +4 -0
- package/package.json +13 -9
- package/parser.worker.js +7 -10
- package/parser.worker.js.map +2 -2
- package/renderables/Code.d.ts +6 -0
- package/renderables/Diff.d.ts +1 -2
- package/renderables/Markdown.d.ts +6 -0
- package/renderables/TextBufferRenderable.d.ts +2 -0
- package/renderer.d.ts +23 -2
- package/testing.bun.js +23 -23
- package/testing.bun.js.map +2 -2
- package/testing.js +23 -23
- package/testing.js.map +2 -2
- package/text-buffer-view.d.ts +1 -0
- package/types.d.ts +1 -0
- package/yoga.bun.js +187 -187
- package/yoga.bun.js.map +1 -1
- package/yoga.js +187 -187
- package/yoga.js.map +1 -1
- package/zig-structs.d.ts +8 -1
- package/zig.d.ts +15 -1
- package/chunk-bun-jxfx3h5k.js.map +0 -32
- package/chunk-node-dcyj0dm5.js.map +0 -32
- package/chunk-node-zcz10bhr.js.map +0 -63
|
@@ -1,46 +1,242 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
3
|
-
InternalKeyHandler,
|
|
4
|
-
KeyHandler,
|
|
5
|
-
NativeMeasureTargetKind,
|
|
6
|
-
OptimizedBuffer,
|
|
7
|
-
RGBA,
|
|
8
|
-
Selection,
|
|
9
|
-
SpanInfoStruct,
|
|
10
|
-
StdinParser,
|
|
11
|
-
StyledText,
|
|
12
|
-
SystemClock,
|
|
13
|
-
TextBuffer,
|
|
14
|
-
borderCharsToArray,
|
|
15
|
-
buildTerminalPaletteSignature,
|
|
16
|
-
convertGlobalToLocalSelection,
|
|
17
|
-
createExtmarksController,
|
|
18
|
-
createTerminalPalette,
|
|
19
|
-
createTextAttributes,
|
|
20
|
-
destroyTreeSitterClient,
|
|
21
|
-
env,
|
|
22
|
-
getBorderSides,
|
|
23
|
-
getTreeSitterClient,
|
|
24
|
-
isStyledText,
|
|
25
|
-
normalizeTerminalPalette,
|
|
26
|
-
parseAlign,
|
|
27
|
-
parseAlignItems,
|
|
28
|
-
parseBorderStyle,
|
|
29
|
-
parseColor,
|
|
30
|
-
parseFlexDirection,
|
|
31
|
-
parseJustify,
|
|
32
|
-
parseOverflow,
|
|
33
|
-
parsePositionType,
|
|
34
|
-
parseWrap,
|
|
35
|
-
registerEnvVar,
|
|
36
|
-
resolveRenderLib,
|
|
2
|
+
toArrayBuffer,
|
|
37
3
|
singleton,
|
|
4
|
+
registerEnvVar2,
|
|
5
|
+
env2,
|
|
38
6
|
sleep,
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
7
|
+
RGBA2,
|
|
8
|
+
parseColor2,
|
|
9
|
+
parseBorderStyle2,
|
|
10
|
+
getBorderSides2,
|
|
11
|
+
borderCharsToArray2,
|
|
12
|
+
KeyHandler2,
|
|
13
|
+
InternalKeyHandler2,
|
|
14
|
+
createTextAttributes2,
|
|
15
|
+
getLinkId2,
|
|
16
|
+
isStyledText2,
|
|
17
|
+
StyledText2,
|
|
18
|
+
stringToStyledText2,
|
|
19
|
+
SystemClock2,
|
|
20
|
+
parseAlign2,
|
|
21
|
+
parseAlignItems2,
|
|
22
|
+
parseFlexDirection2,
|
|
23
|
+
parseJustify2,
|
|
24
|
+
parseOverflow2,
|
|
25
|
+
parsePositionType2,
|
|
26
|
+
parseWrap2,
|
|
27
|
+
Selection2,
|
|
28
|
+
convertGlobalToLocalSelection2,
|
|
29
|
+
StdinParser2,
|
|
30
|
+
treeSitterToTextChunks2,
|
|
31
|
+
getTreeSitterClient2,
|
|
32
|
+
destroyTreeSitterClient2,
|
|
33
|
+
createExtmarksController2,
|
|
34
|
+
createTerminalPalette2,
|
|
35
|
+
normalizeTerminalPalette2,
|
|
36
|
+
buildTerminalPaletteSignature2,
|
|
37
|
+
Clipboard2,
|
|
38
|
+
OptimizedBuffer2,
|
|
39
|
+
TextBuffer2,
|
|
40
|
+
SpanInfoStruct,
|
|
41
|
+
NativeMeasureTargetKind2,
|
|
42
|
+
resolveRenderLib2,
|
|
42
43
|
yoga_default
|
|
43
|
-
} from "./chunk-node-
|
|
44
|
+
} from "./chunk-node-70eg2nhg.js";
|
|
45
|
+
|
|
46
|
+
// src/syntax-style.ts
|
|
47
|
+
function convertThemeToStyles2(theme) {
|
|
48
|
+
const flatStyles = {};
|
|
49
|
+
for (const tokenStyle of theme) {
|
|
50
|
+
const styleDefinition = {};
|
|
51
|
+
if (tokenStyle.style.foreground) {
|
|
52
|
+
styleDefinition.fg = parseColor2(tokenStyle.style.foreground);
|
|
53
|
+
}
|
|
54
|
+
if (tokenStyle.style.background) {
|
|
55
|
+
styleDefinition.bg = parseColor2(tokenStyle.style.background);
|
|
56
|
+
}
|
|
57
|
+
if (tokenStyle.style.bold !== undefined) {
|
|
58
|
+
styleDefinition.bold = tokenStyle.style.bold;
|
|
59
|
+
}
|
|
60
|
+
if (tokenStyle.style.italic !== undefined) {
|
|
61
|
+
styleDefinition.italic = tokenStyle.style.italic;
|
|
62
|
+
}
|
|
63
|
+
if (tokenStyle.style.underline !== undefined) {
|
|
64
|
+
styleDefinition.underline = tokenStyle.style.underline;
|
|
65
|
+
}
|
|
66
|
+
if (tokenStyle.style.dim !== undefined) {
|
|
67
|
+
styleDefinition.dim = tokenStyle.style.dim;
|
|
68
|
+
}
|
|
69
|
+
for (const scope of tokenStyle.scope) {
|
|
70
|
+
flatStyles[scope] = styleDefinition;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return flatStyles;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
class SyntaxStyle2 {
|
|
77
|
+
lib;
|
|
78
|
+
stylePtr;
|
|
79
|
+
_destroyed = false;
|
|
80
|
+
nameCache = new Map;
|
|
81
|
+
styleDefs = new Map;
|
|
82
|
+
mergedCache = new Map;
|
|
83
|
+
constructor(lib, ptr) {
|
|
84
|
+
this.lib = lib;
|
|
85
|
+
this.stylePtr = ptr;
|
|
86
|
+
}
|
|
87
|
+
static create() {
|
|
88
|
+
const lib = resolveRenderLib2();
|
|
89
|
+
const ptr = lib.createSyntaxStyle();
|
|
90
|
+
return new SyntaxStyle2(lib, ptr);
|
|
91
|
+
}
|
|
92
|
+
static fromTheme(theme) {
|
|
93
|
+
const style = SyntaxStyle2.create();
|
|
94
|
+
const flatStyles = convertThemeToStyles2(theme);
|
|
95
|
+
for (const [name, styleDef] of Object.entries(flatStyles)) {
|
|
96
|
+
style.registerStyle(name, styleDef);
|
|
97
|
+
}
|
|
98
|
+
return style;
|
|
99
|
+
}
|
|
100
|
+
static fromStyles(styles) {
|
|
101
|
+
const style = SyntaxStyle2.create();
|
|
102
|
+
for (const [name, styleDef] of Object.entries(styles)) {
|
|
103
|
+
style.registerStyle(name, styleDef);
|
|
104
|
+
}
|
|
105
|
+
return style;
|
|
106
|
+
}
|
|
107
|
+
guard() {
|
|
108
|
+
if (this._destroyed)
|
|
109
|
+
throw new Error("NativeSyntaxStyle is destroyed");
|
|
110
|
+
}
|
|
111
|
+
registerStyle(name, style) {
|
|
112
|
+
this.guard();
|
|
113
|
+
const attributes = createTextAttributes2({
|
|
114
|
+
bold: style.bold,
|
|
115
|
+
italic: style.italic,
|
|
116
|
+
underline: style.underline,
|
|
117
|
+
dim: style.dim
|
|
118
|
+
});
|
|
119
|
+
const fg = style.fg ? parseColor2(style.fg) : null;
|
|
120
|
+
const bg = style.bg ? parseColor2(style.bg) : null;
|
|
121
|
+
const id = this.lib.syntaxStyleRegister(this.stylePtr, name, fg, bg, attributes);
|
|
122
|
+
this.nameCache.set(name, id);
|
|
123
|
+
this.styleDefs.set(name, { ...style, fg: fg ?? undefined, bg: bg ?? undefined });
|
|
124
|
+
return id;
|
|
125
|
+
}
|
|
126
|
+
resolveStyleId(name) {
|
|
127
|
+
this.guard();
|
|
128
|
+
const cached = this.nameCache.get(name);
|
|
129
|
+
if (cached !== undefined)
|
|
130
|
+
return cached;
|
|
131
|
+
const id = this.lib.syntaxStyleResolveByName(this.stylePtr, name);
|
|
132
|
+
if (id !== null) {
|
|
133
|
+
this.nameCache.set(name, id);
|
|
134
|
+
}
|
|
135
|
+
return id;
|
|
136
|
+
}
|
|
137
|
+
getStyleId(name) {
|
|
138
|
+
this.guard();
|
|
139
|
+
const id = this.resolveStyleId(name);
|
|
140
|
+
if (id !== null)
|
|
141
|
+
return id;
|
|
142
|
+
if (name.includes(".")) {
|
|
143
|
+
const baseName = name.split(".")[0];
|
|
144
|
+
return this.resolveStyleId(baseName);
|
|
145
|
+
}
|
|
146
|
+
return null;
|
|
147
|
+
}
|
|
148
|
+
get ptr() {
|
|
149
|
+
this.guard();
|
|
150
|
+
return this.stylePtr;
|
|
151
|
+
}
|
|
152
|
+
getStyleCount() {
|
|
153
|
+
this.guard();
|
|
154
|
+
return this.lib.syntaxStyleGetStyleCount(this.stylePtr);
|
|
155
|
+
}
|
|
156
|
+
clearNameCache() {
|
|
157
|
+
this.nameCache.clear();
|
|
158
|
+
}
|
|
159
|
+
getStyle(name) {
|
|
160
|
+
this.guard();
|
|
161
|
+
if (Object.prototype.hasOwnProperty.call(this.styleDefs, name)) {
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
const style = this.styleDefs.get(name);
|
|
165
|
+
if (style)
|
|
166
|
+
return style;
|
|
167
|
+
if (name.includes(".")) {
|
|
168
|
+
const baseName = name.split(".")[0];
|
|
169
|
+
if (Object.prototype.hasOwnProperty.call(this.styleDefs, baseName)) {
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
return this.styleDefs.get(baseName);
|
|
173
|
+
}
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
mergeStyles(...styleNames) {
|
|
177
|
+
this.guard();
|
|
178
|
+
const cacheKey = styleNames.join(":");
|
|
179
|
+
const cached = this.mergedCache.get(cacheKey);
|
|
180
|
+
if (cached)
|
|
181
|
+
return cached;
|
|
182
|
+
const styleDefinition = {};
|
|
183
|
+
for (const name of styleNames) {
|
|
184
|
+
const style = this.getStyle(name);
|
|
185
|
+
if (!style)
|
|
186
|
+
continue;
|
|
187
|
+
if (style.fg)
|
|
188
|
+
styleDefinition.fg = style.fg;
|
|
189
|
+
if (style.bg)
|
|
190
|
+
styleDefinition.bg = style.bg;
|
|
191
|
+
if (style.bold !== undefined)
|
|
192
|
+
styleDefinition.bold = style.bold;
|
|
193
|
+
if (style.italic !== undefined)
|
|
194
|
+
styleDefinition.italic = style.italic;
|
|
195
|
+
if (style.underline !== undefined)
|
|
196
|
+
styleDefinition.underline = style.underline;
|
|
197
|
+
if (style.dim !== undefined)
|
|
198
|
+
styleDefinition.dim = style.dim;
|
|
199
|
+
}
|
|
200
|
+
const attributes = createTextAttributes2({
|
|
201
|
+
bold: styleDefinition.bold,
|
|
202
|
+
italic: styleDefinition.italic,
|
|
203
|
+
underline: styleDefinition.underline,
|
|
204
|
+
dim: styleDefinition.dim
|
|
205
|
+
});
|
|
206
|
+
const merged = {
|
|
207
|
+
fg: styleDefinition.fg,
|
|
208
|
+
bg: styleDefinition.bg,
|
|
209
|
+
attributes
|
|
210
|
+
};
|
|
211
|
+
this.mergedCache.set(cacheKey, merged);
|
|
212
|
+
return merged;
|
|
213
|
+
}
|
|
214
|
+
clearCache() {
|
|
215
|
+
this.guard();
|
|
216
|
+
this.mergedCache.clear();
|
|
217
|
+
}
|
|
218
|
+
getCacheSize() {
|
|
219
|
+
this.guard();
|
|
220
|
+
return this.mergedCache.size;
|
|
221
|
+
}
|
|
222
|
+
getAllStyles() {
|
|
223
|
+
this.guard();
|
|
224
|
+
return new Map(this.styleDefs);
|
|
225
|
+
}
|
|
226
|
+
getRegisteredNames() {
|
|
227
|
+
this.guard();
|
|
228
|
+
return Array.from(this.styleDefs.keys());
|
|
229
|
+
}
|
|
230
|
+
destroy() {
|
|
231
|
+
if (this._destroyed)
|
|
232
|
+
return;
|
|
233
|
+
this._destroyed = true;
|
|
234
|
+
this.nameCache.clear();
|
|
235
|
+
this.styleDefs.clear();
|
|
236
|
+
this.mergedCache.clear();
|
|
237
|
+
this.lib.destroySyntaxStyle(this.stylePtr);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
44
240
|
|
|
45
241
|
// src/Renderable.ts
|
|
46
242
|
import { EventEmitter } from "events";
|
|
@@ -120,22 +316,22 @@ function isSizeType(value) {
|
|
|
120
316
|
|
|
121
317
|
// src/Renderable.ts
|
|
122
318
|
var BrandedRenderable = Symbol.for("@opentui/core/Renderable");
|
|
123
|
-
var
|
|
124
|
-
((
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
})(
|
|
128
|
-
var
|
|
129
|
-
((
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
})(
|
|
134
|
-
function
|
|
319
|
+
var LayoutEvents2;
|
|
320
|
+
((LayoutEvents) => {
|
|
321
|
+
LayoutEvents["LAYOUT_CHANGED"] = "layout-changed";
|
|
322
|
+
LayoutEvents["RESIZED"] = "resized";
|
|
323
|
+
})(LayoutEvents2 ||= {});
|
|
324
|
+
var RenderableEvents2;
|
|
325
|
+
((RenderableEvents) => {
|
|
326
|
+
RenderableEvents["FOCUSED"] = "focused";
|
|
327
|
+
RenderableEvents["BLURRED"] = "blurred";
|
|
328
|
+
RenderableEvents["DESTROYED"] = "destroyed";
|
|
329
|
+
})(RenderableEvents2 ||= {});
|
|
330
|
+
function isRenderable2(obj) {
|
|
135
331
|
return !!obj?.[BrandedRenderable];
|
|
136
332
|
}
|
|
137
333
|
|
|
138
|
-
class
|
|
334
|
+
class BaseRenderable2 extends EventEmitter {
|
|
139
335
|
[BrandedRenderable] = true;
|
|
140
336
|
static renderableNumber = 1;
|
|
141
337
|
_id;
|
|
@@ -145,7 +341,7 @@ class BaseRenderable extends EventEmitter {
|
|
|
145
341
|
_visible = true;
|
|
146
342
|
constructor(options) {
|
|
147
343
|
super();
|
|
148
|
-
this.num =
|
|
344
|
+
this.num = BaseRenderable2.renderableNumber++;
|
|
149
345
|
this._id = options.id ?? `renderable-${this.num}`;
|
|
150
346
|
}
|
|
151
347
|
get id() {
|
|
@@ -189,7 +385,7 @@ function bumpRenderListRevision(ctx) {
|
|
|
189
385
|
generationContext.__otuiRenderListRevision = getRenderListRevision(ctx) + 1;
|
|
190
386
|
}
|
|
191
387
|
|
|
192
|
-
class
|
|
388
|
+
class Renderable2 extends BaseRenderable2 {
|
|
193
389
|
static renderablesByNumber = new Map;
|
|
194
390
|
_isDestroyed = false;
|
|
195
391
|
_ctx;
|
|
@@ -239,7 +435,7 @@ class Renderable extends BaseRenderable {
|
|
|
239
435
|
constructor(ctx, options) {
|
|
240
436
|
super(options);
|
|
241
437
|
this._ctx = ctx;
|
|
242
|
-
|
|
438
|
+
Renderable2.renderablesByNumber.set(this.num, this);
|
|
243
439
|
validateOptions(this.id, options);
|
|
244
440
|
this.renderBefore = options.renderBefore;
|
|
245
441
|
this.renderAfter = options.renderAfter;
|
|
@@ -411,7 +607,7 @@ class Renderable extends BaseRenderable {
|
|
|
411
607
|
for (const child of this._childrenInLayoutOrder) {
|
|
412
608
|
if (child.id === id)
|
|
413
609
|
return child;
|
|
414
|
-
if (
|
|
610
|
+
if (isRenderable2(child)) {
|
|
415
611
|
const found = child.findDescendantById(id);
|
|
416
612
|
if (found)
|
|
417
613
|
return found;
|
|
@@ -600,11 +796,11 @@ class Renderable extends BaseRenderable {
|
|
|
600
796
|
this._flexShrink = hasExplicitWidth || hasExplicitHeight ? 0 : 1;
|
|
601
797
|
node.setFlexShrink(this._flexShrink);
|
|
602
798
|
}
|
|
603
|
-
node.setFlexDirection(
|
|
604
|
-
node.setFlexWrap(
|
|
605
|
-
node.setAlignItems(
|
|
606
|
-
node.setJustifyContent(
|
|
607
|
-
node.setAlignSelf(
|
|
799
|
+
node.setFlexDirection(parseFlexDirection2(options.flexDirection));
|
|
800
|
+
node.setFlexWrap(parseWrap2(options.flexWrap));
|
|
801
|
+
node.setAlignItems(parseAlignItems2(options.alignItems));
|
|
802
|
+
node.setJustifyContent(parseJustify2(options.justifyContent));
|
|
803
|
+
node.setAlignSelf(parseAlign2(options.alignSelf));
|
|
608
804
|
if (isDimensionType(options.width)) {
|
|
609
805
|
this._width = options.width;
|
|
610
806
|
this.yogaNode.setWidth(options.width);
|
|
@@ -615,11 +811,11 @@ class Renderable extends BaseRenderable {
|
|
|
615
811
|
}
|
|
616
812
|
this._positionType = options.position === "absolute" ? "absolute" : "relative";
|
|
617
813
|
if (this._positionType !== "relative") {
|
|
618
|
-
node.setPositionType(
|
|
814
|
+
node.setPositionType(parsePositionType2(this._positionType));
|
|
619
815
|
}
|
|
620
816
|
this._overflow = options.overflow === "hidden" ? "hidden" : options.overflow === "scroll" ? "scroll" : "visible";
|
|
621
817
|
if (this._overflow !== "visible") {
|
|
622
|
-
node.setOverflow(
|
|
818
|
+
node.setOverflow(parseOverflow2(this._overflow));
|
|
623
819
|
}
|
|
624
820
|
const hasPositionProps = options.top !== undefined || options.right !== undefined || options.bottom !== undefined || options.left !== undefined;
|
|
625
821
|
if (hasPositionProps) {
|
|
@@ -688,7 +884,7 @@ class Renderable extends BaseRenderable {
|
|
|
688
884
|
if (!isPositionTypeType(positionType) || this._positionType === positionType)
|
|
689
885
|
return;
|
|
690
886
|
this._positionType = positionType;
|
|
691
|
-
this.yogaNode.setPositionType(
|
|
887
|
+
this.yogaNode.setPositionType(parsePositionType2(positionType));
|
|
692
888
|
this.requestRender();
|
|
693
889
|
}
|
|
694
890
|
get overflow() {
|
|
@@ -698,7 +894,7 @@ class Renderable extends BaseRenderable {
|
|
|
698
894
|
if (!isOverflowType(overflow) || this._overflow === overflow)
|
|
699
895
|
return;
|
|
700
896
|
this._overflow = overflow;
|
|
701
|
-
this.yogaNode.setOverflow(
|
|
897
|
+
this.yogaNode.setOverflow(parseOverflow2(overflow));
|
|
702
898
|
bumpRenderListRevision(this._ctx);
|
|
703
899
|
this.requestRender();
|
|
704
900
|
}
|
|
@@ -754,23 +950,23 @@ class Renderable extends BaseRenderable {
|
|
|
754
950
|
this.requestRender();
|
|
755
951
|
}
|
|
756
952
|
set flexDirection(direction) {
|
|
757
|
-
this.yogaNode.setFlexDirection(
|
|
953
|
+
this.yogaNode.setFlexDirection(parseFlexDirection2(direction));
|
|
758
954
|
this.requestRender();
|
|
759
955
|
}
|
|
760
956
|
set flexWrap(wrap) {
|
|
761
|
-
this.yogaNode.setFlexWrap(
|
|
957
|
+
this.yogaNode.setFlexWrap(parseWrap2(wrap));
|
|
762
958
|
this.requestRender();
|
|
763
959
|
}
|
|
764
960
|
set alignItems(alignItems) {
|
|
765
|
-
this.yogaNode.setAlignItems(
|
|
961
|
+
this.yogaNode.setAlignItems(parseAlignItems2(alignItems));
|
|
766
962
|
this.requestRender();
|
|
767
963
|
}
|
|
768
964
|
set justifyContent(justifyContent) {
|
|
769
|
-
this.yogaNode.setJustifyContent(
|
|
965
|
+
this.yogaNode.setJustifyContent(parseJustify2(justifyContent));
|
|
770
966
|
this.requestRender();
|
|
771
967
|
}
|
|
772
968
|
set alignSelf(alignSelf) {
|
|
773
|
-
this.yogaNode.setAlignSelf(
|
|
969
|
+
this.yogaNode.setAlignSelf(parseAlign2(alignSelf));
|
|
774
970
|
this.requestRender();
|
|
775
971
|
}
|
|
776
972
|
set flexBasis(basis) {
|
|
@@ -955,7 +1151,7 @@ class Renderable extends BaseRenderable {
|
|
|
955
1151
|
}
|
|
956
1152
|
try {
|
|
957
1153
|
const widthMethod = this._ctx.widthMethod;
|
|
958
|
-
this.frameBuffer =
|
|
1154
|
+
this.frameBuffer = OptimizedBuffer2.create(w, h, widthMethod, {
|
|
959
1155
|
respectAlpha: true,
|
|
960
1156
|
id: `framebuffer-${this.id}`
|
|
961
1157
|
});
|
|
@@ -978,7 +1174,7 @@ class Renderable extends BaseRenderable {
|
|
|
978
1174
|
if (!obj) {
|
|
979
1175
|
return -1;
|
|
980
1176
|
}
|
|
981
|
-
const renderable =
|
|
1177
|
+
const renderable = maybeMakeRenderable2(this._ctx, obj);
|
|
982
1178
|
if (!renderable) {
|
|
983
1179
|
return -1;
|
|
984
1180
|
}
|
|
@@ -1023,7 +1219,7 @@ class Renderable extends BaseRenderable {
|
|
|
1023
1219
|
if (!obj) {
|
|
1024
1220
|
return -1;
|
|
1025
1221
|
}
|
|
1026
|
-
const renderable =
|
|
1222
|
+
const renderable = maybeMakeRenderable2(this._ctx, obj);
|
|
1027
1223
|
if (!renderable) {
|
|
1028
1224
|
return -1;
|
|
1029
1225
|
}
|
|
@@ -1033,7 +1229,7 @@ class Renderable extends BaseRenderable {
|
|
|
1033
1229
|
}
|
|
1034
1230
|
return -1;
|
|
1035
1231
|
}
|
|
1036
|
-
if (!
|
|
1232
|
+
if (!isRenderable2(anchor)) {
|
|
1037
1233
|
throw new Error("Anchor must be a Renderable");
|
|
1038
1234
|
}
|
|
1039
1235
|
if (anchor.isDestroyed) {
|
|
@@ -1082,7 +1278,7 @@ class Renderable extends BaseRenderable {
|
|
|
1082
1278
|
return this._childrenInLayoutOrder.find((child) => child.id === id);
|
|
1083
1279
|
}
|
|
1084
1280
|
remove(child) {
|
|
1085
|
-
if (!(child instanceof
|
|
1281
|
+
if (!(child instanceof BaseRenderable2)) {
|
|
1086
1282
|
throw new Error("remove expects a renderable child object");
|
|
1087
1283
|
}
|
|
1088
1284
|
const index = this._childrenInLayoutOrder.indexOf(child);
|
|
@@ -1199,13 +1395,13 @@ class Renderable extends BaseRenderable {
|
|
|
1199
1395
|
}
|
|
1200
1396
|
}
|
|
1201
1397
|
_hasVisibleChildFilter() {
|
|
1202
|
-
return this._getVisibleChildren !==
|
|
1398
|
+
return this._getVisibleChildren !== Renderable2.prototype._getVisibleChildren;
|
|
1203
1399
|
}
|
|
1204
1400
|
_getVisibleChildren() {
|
|
1205
1401
|
return this._childrenInZIndexOrder.map((child) => child.num);
|
|
1206
1402
|
}
|
|
1207
1403
|
canReuseRenderCommandList() {
|
|
1208
|
-
return this.onUpdate ===
|
|
1404
|
+
return this.onUpdate === Renderable2.prototype.onUpdate && (this._overflow === "visible" || this.getScissorRect === Renderable2.prototype.getScissorRect) && !this._hasVisibleChildFilter();
|
|
1209
1405
|
}
|
|
1210
1406
|
onUpdate(deltaTime) {}
|
|
1211
1407
|
getScissorRect() {
|
|
@@ -1239,7 +1435,7 @@ class Renderable extends BaseRenderable {
|
|
|
1239
1435
|
this._childrenInLayoutOrder = [];
|
|
1240
1436
|
this._childrenInZIndexOrder = [];
|
|
1241
1437
|
this._shouldUpdateBefore.clear();
|
|
1242
|
-
|
|
1438
|
+
Renderable2.renderablesByNumber.delete(this.num);
|
|
1243
1439
|
this.blur();
|
|
1244
1440
|
this.removeAllListeners();
|
|
1245
1441
|
this.destroySelf();
|
|
@@ -1363,7 +1559,7 @@ class Renderable extends BaseRenderable {
|
|
|
1363
1559
|
}
|
|
1364
1560
|
}
|
|
1365
1561
|
|
|
1366
|
-
class
|
|
1562
|
+
class RootRenderable2 extends Renderable2 {
|
|
1367
1563
|
renderList = [];
|
|
1368
1564
|
_currentRenderable;
|
|
1369
1565
|
appliedLayoutGeneration = -1;
|
|
@@ -1490,7 +1686,7 @@ class RootRenderable extends Renderable {
|
|
|
1490
1686
|
import util from "node:util";
|
|
1491
1687
|
var BrandedVNode = Symbol.for("@opentui/core/VNode");
|
|
1492
1688
|
function isRenderableConstructor(value) {
|
|
1493
|
-
return typeof value === "function" && value.prototype &&
|
|
1689
|
+
return typeof value === "function" && value.prototype && Renderable2.prototype.isPrototypeOf(value.prototype);
|
|
1494
1690
|
}
|
|
1495
1691
|
function flattenChildren(children) {
|
|
1496
1692
|
const result = [];
|
|
@@ -1503,7 +1699,7 @@ function flattenChildren(children) {
|
|
|
1503
1699
|
}
|
|
1504
1700
|
return result;
|
|
1505
1701
|
}
|
|
1506
|
-
function
|
|
1702
|
+
function h2(type, props, ...children) {
|
|
1507
1703
|
if (typeof type !== "function") {
|
|
1508
1704
|
throw new TypeError("h() received an invalid vnode type");
|
|
1509
1705
|
}
|
|
@@ -1549,20 +1745,20 @@ function h(type, props, ...children) {
|
|
|
1549
1745
|
}
|
|
1550
1746
|
return vnode;
|
|
1551
1747
|
}
|
|
1552
|
-
function
|
|
1748
|
+
function isVNode2(node) {
|
|
1553
1749
|
return node && node[BrandedVNode];
|
|
1554
1750
|
}
|
|
1555
|
-
function
|
|
1556
|
-
if (
|
|
1751
|
+
function maybeMakeRenderable2(ctx, node) {
|
|
1752
|
+
if (isRenderable2(node))
|
|
1557
1753
|
return node;
|
|
1558
|
-
if (
|
|
1559
|
-
return
|
|
1754
|
+
if (isVNode2(node))
|
|
1755
|
+
return instantiate2(ctx, node);
|
|
1560
1756
|
if (true) {
|
|
1561
1757
|
console.warn("maybeMakeRenderable received an invalid node", util.inspect(node, { depth: 2 }));
|
|
1562
1758
|
}
|
|
1563
1759
|
return null;
|
|
1564
1760
|
}
|
|
1565
|
-
function
|
|
1761
|
+
function wrapWithDelegates2(instance, delegateMap) {
|
|
1566
1762
|
if (!delegateMap || Object.keys(delegateMap).length === 0)
|
|
1567
1763
|
return instance;
|
|
1568
1764
|
const getDescendant = (id) => {
|
|
@@ -1594,8 +1790,8 @@ function wrapWithDelegates(instance, delegateMap) {
|
|
|
1594
1790
|
});
|
|
1595
1791
|
return proxy;
|
|
1596
1792
|
}
|
|
1597
|
-
function
|
|
1598
|
-
if (
|
|
1793
|
+
function instantiate2(ctx, node) {
|
|
1794
|
+
if (isRenderable2(node))
|
|
1599
1795
|
return node;
|
|
1600
1796
|
if (!node || typeof node !== "object") {
|
|
1601
1797
|
throw new TypeError("mount() received an invalid vnode");
|
|
@@ -1607,14 +1803,14 @@ function instantiate(ctx, node) {
|
|
|
1607
1803
|
if (isRenderableConstructor(type)) {
|
|
1608
1804
|
const instance = new type(ctx, props || {});
|
|
1609
1805
|
for (const child of children) {
|
|
1610
|
-
if (
|
|
1806
|
+
if (isRenderable2(child)) {
|
|
1611
1807
|
instance.add(child);
|
|
1612
1808
|
} else {
|
|
1613
|
-
const mounted =
|
|
1809
|
+
const mounted = instantiate2(ctx, child);
|
|
1614
1810
|
instance.add(mounted);
|
|
1615
1811
|
}
|
|
1616
1812
|
}
|
|
1617
|
-
const delegatedInstance =
|
|
1813
|
+
const delegatedInstance = wrapWithDelegates2(instance, delegateMap);
|
|
1618
1814
|
const pendingCalls = vnode.__pendingCalls;
|
|
1619
1815
|
if (pendingCalls) {
|
|
1620
1816
|
for (const call of pendingCalls) {
|
|
@@ -1628,12 +1824,12 @@ function instantiate(ctx, node) {
|
|
|
1628
1824
|
return delegatedInstance;
|
|
1629
1825
|
}
|
|
1630
1826
|
const resolved = type(props || {}, children);
|
|
1631
|
-
const inst =
|
|
1632
|
-
return
|
|
1827
|
+
const inst = instantiate2(ctx, resolved);
|
|
1828
|
+
return wrapWithDelegates2(inst, delegateMap);
|
|
1633
1829
|
}
|
|
1634
|
-
function
|
|
1635
|
-
if (
|
|
1636
|
-
return
|
|
1830
|
+
function delegate2(mapping, vnode) {
|
|
1831
|
+
if (isRenderable2(vnode)) {
|
|
1832
|
+
return wrapWithDelegates2(vnode, mapping);
|
|
1637
1833
|
}
|
|
1638
1834
|
if (!vnode || typeof vnode !== "object")
|
|
1639
1835
|
return vnode;
|
|
@@ -1642,7 +1838,7 @@ function delegate(mapping, vnode) {
|
|
|
1642
1838
|
}
|
|
1643
1839
|
|
|
1644
1840
|
// src/text-buffer-view.ts
|
|
1645
|
-
class
|
|
1841
|
+
class TextBufferView2 {
|
|
1646
1842
|
lib;
|
|
1647
1843
|
viewPtr;
|
|
1648
1844
|
textBuffer;
|
|
@@ -1653,9 +1849,9 @@ class TextBufferView {
|
|
|
1653
1849
|
this.textBuffer = textBuffer;
|
|
1654
1850
|
}
|
|
1655
1851
|
static create(textBuffer) {
|
|
1656
|
-
const lib =
|
|
1852
|
+
const lib = resolveRenderLib2();
|
|
1657
1853
|
const viewPtr = lib.createTextBufferView(textBuffer.ptr);
|
|
1658
|
-
return new
|
|
1854
|
+
return new TextBufferView2(lib, viewPtr, textBuffer);
|
|
1659
1855
|
}
|
|
1660
1856
|
guard() {
|
|
1661
1857
|
if (this._destroyed)
|
|
@@ -1733,6 +1929,10 @@ class TextBufferView {
|
|
|
1733
1929
|
this.guard();
|
|
1734
1930
|
return this.lib.textBufferViewGetLogicalLineInfo(this.viewPtr);
|
|
1735
1931
|
}
|
|
1932
|
+
getLineSources(startLine, lineCount) {
|
|
1933
|
+
this.guard();
|
|
1934
|
+
return this.lib.textBufferViewGetLineSources(this.viewPtr, startLine, lineCount);
|
|
1935
|
+
}
|
|
1736
1936
|
getSelectedText() {
|
|
1737
1937
|
this.guard();
|
|
1738
1938
|
const byteSize = this.textBuffer.byteSize;
|
|
@@ -1785,7 +1985,7 @@ class TextBufferView {
|
|
|
1785
1985
|
// src/edit-buffer.ts
|
|
1786
1986
|
import { EventEmitter as EventEmitter2 } from "events";
|
|
1787
1987
|
|
|
1788
|
-
class
|
|
1988
|
+
class EditBuffer2 extends EventEmitter2 {
|
|
1789
1989
|
static registry = new Map;
|
|
1790
1990
|
static nativeEventsSubscribed = false;
|
|
1791
1991
|
lib;
|
|
@@ -1803,23 +2003,23 @@ class EditBuffer extends EventEmitter2 {
|
|
|
1803
2003
|
this.bufferPtr = ptr;
|
|
1804
2004
|
this.textBufferPtr = lib.editBufferGetTextBuffer(ptr);
|
|
1805
2005
|
this.id = lib.editBufferGetId(ptr);
|
|
1806
|
-
|
|
1807
|
-
|
|
2006
|
+
EditBuffer2.registry.set(this.id, this);
|
|
2007
|
+
EditBuffer2.subscribeToNativeEvents(lib);
|
|
1808
2008
|
}
|
|
1809
2009
|
static create(widthMethod) {
|
|
1810
|
-
const lib =
|
|
2010
|
+
const lib = resolveRenderLib2();
|
|
1811
2011
|
const ptr = lib.createEditBuffer(widthMethod);
|
|
1812
|
-
return new
|
|
2012
|
+
return new EditBuffer2(lib, ptr);
|
|
1813
2013
|
}
|
|
1814
2014
|
static subscribeToNativeEvents(lib) {
|
|
1815
|
-
if (
|
|
2015
|
+
if (EditBuffer2.nativeEventsSubscribed)
|
|
1816
2016
|
return;
|
|
1817
|
-
|
|
2017
|
+
EditBuffer2.nativeEventsSubscribed = true;
|
|
1818
2018
|
lib.onAnyNativeEvent((name, data) => {
|
|
1819
2019
|
const buffer = new Uint16Array(data);
|
|
1820
2020
|
if (name.startsWith("eb_") && buffer.length >= 1) {
|
|
1821
2021
|
const id = buffer[0];
|
|
1822
|
-
const instance =
|
|
2022
|
+
const instance = EditBuffer2.registry.get(id);
|
|
1823
2023
|
if (instance) {
|
|
1824
2024
|
const eventName = name.slice(3);
|
|
1825
2025
|
const eventData = data.slice(2);
|
|
@@ -2098,13 +2298,13 @@ class EditBuffer extends EventEmitter2 {
|
|
|
2098
2298
|
if (this._destroyed)
|
|
2099
2299
|
return;
|
|
2100
2300
|
this._destroyed = true;
|
|
2101
|
-
|
|
2301
|
+
EditBuffer2.registry.delete(this.id);
|
|
2102
2302
|
this.lib.destroyEditBuffer(this.bufferPtr);
|
|
2103
2303
|
}
|
|
2104
2304
|
}
|
|
2105
2305
|
|
|
2106
2306
|
// src/editor-view.ts
|
|
2107
|
-
class
|
|
2307
|
+
class EditorView2 {
|
|
2108
2308
|
lib;
|
|
2109
2309
|
viewPtr;
|
|
2110
2310
|
editBuffer;
|
|
@@ -2117,9 +2317,9 @@ class EditorView {
|
|
|
2117
2317
|
this.editBuffer = editBuffer;
|
|
2118
2318
|
}
|
|
2119
2319
|
static create(editBuffer, viewportWidth, viewportHeight) {
|
|
2120
|
-
const lib =
|
|
2320
|
+
const lib = resolveRenderLib2();
|
|
2121
2321
|
const viewPtr = lib.createEditorView(editBuffer.ptr, viewportWidth, viewportHeight);
|
|
2122
|
-
return new
|
|
2322
|
+
return new EditorView2(lib, viewPtr, editBuffer);
|
|
2123
2323
|
}
|
|
2124
2324
|
guard() {
|
|
2125
2325
|
if (this._destroyed)
|
|
@@ -2284,7 +2484,7 @@ class EditorView {
|
|
|
2284
2484
|
}
|
|
2285
2485
|
get extmarks() {
|
|
2286
2486
|
if (!this._extmarksController) {
|
|
2287
|
-
this._extmarksController =
|
|
2487
|
+
this._extmarksController = createExtmarksController2(this.editBuffer, this);
|
|
2288
2488
|
}
|
|
2289
2489
|
return this._extmarksController;
|
|
2290
2490
|
}
|
|
@@ -2318,201 +2518,6 @@ class EditorView {
|
|
|
2318
2518
|
}
|
|
2319
2519
|
}
|
|
2320
2520
|
|
|
2321
|
-
// src/syntax-style.ts
|
|
2322
|
-
function convertThemeToStyles(theme) {
|
|
2323
|
-
const flatStyles = {};
|
|
2324
|
-
for (const tokenStyle of theme) {
|
|
2325
|
-
const styleDefinition = {};
|
|
2326
|
-
if (tokenStyle.style.foreground) {
|
|
2327
|
-
styleDefinition.fg = parseColor(tokenStyle.style.foreground);
|
|
2328
|
-
}
|
|
2329
|
-
if (tokenStyle.style.background) {
|
|
2330
|
-
styleDefinition.bg = parseColor(tokenStyle.style.background);
|
|
2331
|
-
}
|
|
2332
|
-
if (tokenStyle.style.bold !== undefined) {
|
|
2333
|
-
styleDefinition.bold = tokenStyle.style.bold;
|
|
2334
|
-
}
|
|
2335
|
-
if (tokenStyle.style.italic !== undefined) {
|
|
2336
|
-
styleDefinition.italic = tokenStyle.style.italic;
|
|
2337
|
-
}
|
|
2338
|
-
if (tokenStyle.style.underline !== undefined) {
|
|
2339
|
-
styleDefinition.underline = tokenStyle.style.underline;
|
|
2340
|
-
}
|
|
2341
|
-
if (tokenStyle.style.dim !== undefined) {
|
|
2342
|
-
styleDefinition.dim = tokenStyle.style.dim;
|
|
2343
|
-
}
|
|
2344
|
-
for (const scope of tokenStyle.scope) {
|
|
2345
|
-
flatStyles[scope] = styleDefinition;
|
|
2346
|
-
}
|
|
2347
|
-
}
|
|
2348
|
-
return flatStyles;
|
|
2349
|
-
}
|
|
2350
|
-
|
|
2351
|
-
class SyntaxStyle {
|
|
2352
|
-
lib;
|
|
2353
|
-
stylePtr;
|
|
2354
|
-
_destroyed = false;
|
|
2355
|
-
nameCache = new Map;
|
|
2356
|
-
styleDefs = new Map;
|
|
2357
|
-
mergedCache = new Map;
|
|
2358
|
-
constructor(lib, ptr) {
|
|
2359
|
-
this.lib = lib;
|
|
2360
|
-
this.stylePtr = ptr;
|
|
2361
|
-
}
|
|
2362
|
-
static create() {
|
|
2363
|
-
const lib = resolveRenderLib();
|
|
2364
|
-
const ptr = lib.createSyntaxStyle();
|
|
2365
|
-
return new SyntaxStyle(lib, ptr);
|
|
2366
|
-
}
|
|
2367
|
-
static fromTheme(theme) {
|
|
2368
|
-
const style = SyntaxStyle.create();
|
|
2369
|
-
const flatStyles = convertThemeToStyles(theme);
|
|
2370
|
-
for (const [name, styleDef] of Object.entries(flatStyles)) {
|
|
2371
|
-
style.registerStyle(name, styleDef);
|
|
2372
|
-
}
|
|
2373
|
-
return style;
|
|
2374
|
-
}
|
|
2375
|
-
static fromStyles(styles) {
|
|
2376
|
-
const style = SyntaxStyle.create();
|
|
2377
|
-
for (const [name, styleDef] of Object.entries(styles)) {
|
|
2378
|
-
style.registerStyle(name, styleDef);
|
|
2379
|
-
}
|
|
2380
|
-
return style;
|
|
2381
|
-
}
|
|
2382
|
-
guard() {
|
|
2383
|
-
if (this._destroyed)
|
|
2384
|
-
throw new Error("NativeSyntaxStyle is destroyed");
|
|
2385
|
-
}
|
|
2386
|
-
registerStyle(name, style) {
|
|
2387
|
-
this.guard();
|
|
2388
|
-
const attributes = createTextAttributes({
|
|
2389
|
-
bold: style.bold,
|
|
2390
|
-
italic: style.italic,
|
|
2391
|
-
underline: style.underline,
|
|
2392
|
-
dim: style.dim
|
|
2393
|
-
});
|
|
2394
|
-
const fg = style.fg ? parseColor(style.fg) : null;
|
|
2395
|
-
const bg = style.bg ? parseColor(style.bg) : null;
|
|
2396
|
-
const id = this.lib.syntaxStyleRegister(this.stylePtr, name, fg, bg, attributes);
|
|
2397
|
-
this.nameCache.set(name, id);
|
|
2398
|
-
this.styleDefs.set(name, { ...style, fg: fg ?? undefined, bg: bg ?? undefined });
|
|
2399
|
-
return id;
|
|
2400
|
-
}
|
|
2401
|
-
resolveStyleId(name) {
|
|
2402
|
-
this.guard();
|
|
2403
|
-
const cached = this.nameCache.get(name);
|
|
2404
|
-
if (cached !== undefined)
|
|
2405
|
-
return cached;
|
|
2406
|
-
const id = this.lib.syntaxStyleResolveByName(this.stylePtr, name);
|
|
2407
|
-
if (id !== null) {
|
|
2408
|
-
this.nameCache.set(name, id);
|
|
2409
|
-
}
|
|
2410
|
-
return id;
|
|
2411
|
-
}
|
|
2412
|
-
getStyleId(name) {
|
|
2413
|
-
this.guard();
|
|
2414
|
-
const id = this.resolveStyleId(name);
|
|
2415
|
-
if (id !== null)
|
|
2416
|
-
return id;
|
|
2417
|
-
if (name.includes(".")) {
|
|
2418
|
-
const baseName = name.split(".")[0];
|
|
2419
|
-
return this.resolveStyleId(baseName);
|
|
2420
|
-
}
|
|
2421
|
-
return null;
|
|
2422
|
-
}
|
|
2423
|
-
get ptr() {
|
|
2424
|
-
this.guard();
|
|
2425
|
-
return this.stylePtr;
|
|
2426
|
-
}
|
|
2427
|
-
getStyleCount() {
|
|
2428
|
-
this.guard();
|
|
2429
|
-
return this.lib.syntaxStyleGetStyleCount(this.stylePtr);
|
|
2430
|
-
}
|
|
2431
|
-
clearNameCache() {
|
|
2432
|
-
this.nameCache.clear();
|
|
2433
|
-
}
|
|
2434
|
-
getStyle(name) {
|
|
2435
|
-
this.guard();
|
|
2436
|
-
if (Object.prototype.hasOwnProperty.call(this.styleDefs, name)) {
|
|
2437
|
-
return;
|
|
2438
|
-
}
|
|
2439
|
-
const style = this.styleDefs.get(name);
|
|
2440
|
-
if (style)
|
|
2441
|
-
return style;
|
|
2442
|
-
if (name.includes(".")) {
|
|
2443
|
-
const baseName = name.split(".")[0];
|
|
2444
|
-
if (Object.prototype.hasOwnProperty.call(this.styleDefs, baseName)) {
|
|
2445
|
-
return;
|
|
2446
|
-
}
|
|
2447
|
-
return this.styleDefs.get(baseName);
|
|
2448
|
-
}
|
|
2449
|
-
return;
|
|
2450
|
-
}
|
|
2451
|
-
mergeStyles(...styleNames) {
|
|
2452
|
-
this.guard();
|
|
2453
|
-
const cacheKey = styleNames.join(":");
|
|
2454
|
-
const cached = this.mergedCache.get(cacheKey);
|
|
2455
|
-
if (cached)
|
|
2456
|
-
return cached;
|
|
2457
|
-
const styleDefinition = {};
|
|
2458
|
-
for (const name of styleNames) {
|
|
2459
|
-
const style = this.getStyle(name);
|
|
2460
|
-
if (!style)
|
|
2461
|
-
continue;
|
|
2462
|
-
if (style.fg)
|
|
2463
|
-
styleDefinition.fg = style.fg;
|
|
2464
|
-
if (style.bg)
|
|
2465
|
-
styleDefinition.bg = style.bg;
|
|
2466
|
-
if (style.bold !== undefined)
|
|
2467
|
-
styleDefinition.bold = style.bold;
|
|
2468
|
-
if (style.italic !== undefined)
|
|
2469
|
-
styleDefinition.italic = style.italic;
|
|
2470
|
-
if (style.underline !== undefined)
|
|
2471
|
-
styleDefinition.underline = style.underline;
|
|
2472
|
-
if (style.dim !== undefined)
|
|
2473
|
-
styleDefinition.dim = style.dim;
|
|
2474
|
-
}
|
|
2475
|
-
const attributes = createTextAttributes({
|
|
2476
|
-
bold: styleDefinition.bold,
|
|
2477
|
-
italic: styleDefinition.italic,
|
|
2478
|
-
underline: styleDefinition.underline,
|
|
2479
|
-
dim: styleDefinition.dim
|
|
2480
|
-
});
|
|
2481
|
-
const merged = {
|
|
2482
|
-
fg: styleDefinition.fg,
|
|
2483
|
-
bg: styleDefinition.bg,
|
|
2484
|
-
attributes
|
|
2485
|
-
};
|
|
2486
|
-
this.mergedCache.set(cacheKey, merged);
|
|
2487
|
-
return merged;
|
|
2488
|
-
}
|
|
2489
|
-
clearCache() {
|
|
2490
|
-
this.guard();
|
|
2491
|
-
this.mergedCache.clear();
|
|
2492
|
-
}
|
|
2493
|
-
getCacheSize() {
|
|
2494
|
-
this.guard();
|
|
2495
|
-
return this.mergedCache.size;
|
|
2496
|
-
}
|
|
2497
|
-
getAllStyles() {
|
|
2498
|
-
this.guard();
|
|
2499
|
-
return new Map(this.styleDefs);
|
|
2500
|
-
}
|
|
2501
|
-
getRegisteredNames() {
|
|
2502
|
-
this.guard();
|
|
2503
|
-
return Array.from(this.styleDefs.keys());
|
|
2504
|
-
}
|
|
2505
|
-
destroy() {
|
|
2506
|
-
if (this._destroyed)
|
|
2507
|
-
return;
|
|
2508
|
-
this._destroyed = true;
|
|
2509
|
-
this.nameCache.clear();
|
|
2510
|
-
this.styleDefs.clear();
|
|
2511
|
-
this.mergedCache.clear();
|
|
2512
|
-
this.lib.destroySyntaxStyle(this.stylePtr);
|
|
2513
|
-
}
|
|
2514
|
-
}
|
|
2515
|
-
|
|
2516
2521
|
// src/renderables/Box.ts
|
|
2517
2522
|
function isGapType(value) {
|
|
2518
2523
|
if (value === undefined) {
|
|
@@ -2524,7 +2529,7 @@ function isGapType(value) {
|
|
|
2524
2529
|
return isValidPercentage(value);
|
|
2525
2530
|
}
|
|
2526
2531
|
|
|
2527
|
-
class
|
|
2532
|
+
class BoxRenderable2 extends Renderable2 {
|
|
2528
2533
|
_backgroundColor;
|
|
2529
2534
|
_border;
|
|
2530
2535
|
_borderStyle;
|
|
@@ -2554,20 +2559,20 @@ class BoxRenderable extends Renderable {
|
|
|
2554
2559
|
if (options.focusable === true) {
|
|
2555
2560
|
this._focusable = true;
|
|
2556
2561
|
}
|
|
2557
|
-
this._backgroundColor =
|
|
2562
|
+
this._backgroundColor = parseColor2(options.backgroundColor || this._defaultOptions.backgroundColor);
|
|
2558
2563
|
this._border = options.border ?? this._defaultOptions.border;
|
|
2559
2564
|
if (!options.border && (options.borderStyle || options.borderColor || options.focusedBorderColor || options.customBorderChars)) {
|
|
2560
2565
|
this._border = true;
|
|
2561
2566
|
}
|
|
2562
|
-
this._borderStyle =
|
|
2563
|
-
this._borderColor =
|
|
2564
|
-
this._focusedBorderColor =
|
|
2567
|
+
this._borderStyle = parseBorderStyle2(options.borderStyle, this._defaultOptions.borderStyle);
|
|
2568
|
+
this._borderColor = parseColor2(options.borderColor || this._defaultOptions.borderColor);
|
|
2569
|
+
this._focusedBorderColor = parseColor2(options.focusedBorderColor || this._defaultOptions.focusedBorderColor);
|
|
2565
2570
|
this._customBorderCharsObj = options.customBorderChars;
|
|
2566
|
-
this._customBorderChars = this._customBorderCharsObj ?
|
|
2567
|
-
this.borderSides =
|
|
2571
|
+
this._customBorderChars = this._customBorderCharsObj ? borderCharsToArray2(this._customBorderCharsObj) : undefined;
|
|
2572
|
+
this.borderSides = getBorderSides2(this._border);
|
|
2568
2573
|
this.shouldFill = options.shouldFill ?? this._defaultOptions.shouldFill;
|
|
2569
2574
|
this._title = options.title;
|
|
2570
|
-
this._titleColor = options.titleColor ?
|
|
2575
|
+
this._titleColor = options.titleColor ? parseColor2(options.titleColor) : undefined;
|
|
2571
2576
|
this._titleAlignment = options.titleAlignment || this._defaultOptions.titleAlignment;
|
|
2572
2577
|
this._bottomTitle = options.bottomTitle;
|
|
2573
2578
|
this._bottomTitleAlignment = options.bottomTitleAlignment || this._defaultOptions.bottomTitleAlignment;
|
|
@@ -2580,7 +2585,7 @@ class BoxRenderable extends Renderable {
|
|
|
2580
2585
|
initializeBorder() {
|
|
2581
2586
|
if (this._border === false) {
|
|
2582
2587
|
this._border = true;
|
|
2583
|
-
this.borderSides =
|
|
2588
|
+
this.borderSides = getBorderSides2(this._border);
|
|
2584
2589
|
this.applyYogaBorders();
|
|
2585
2590
|
}
|
|
2586
2591
|
}
|
|
@@ -2589,14 +2594,14 @@ class BoxRenderable extends Renderable {
|
|
|
2589
2594
|
}
|
|
2590
2595
|
set customBorderChars(value) {
|
|
2591
2596
|
this._customBorderCharsObj = value;
|
|
2592
|
-
this._customBorderChars = value ?
|
|
2597
|
+
this._customBorderChars = value ? borderCharsToArray2(value) : undefined;
|
|
2593
2598
|
this.requestRender();
|
|
2594
2599
|
}
|
|
2595
2600
|
get backgroundColor() {
|
|
2596
2601
|
return this._backgroundColor;
|
|
2597
2602
|
}
|
|
2598
2603
|
set backgroundColor(value) {
|
|
2599
|
-
const newColor =
|
|
2604
|
+
const newColor = parseColor2(value ?? this._defaultOptions.backgroundColor);
|
|
2600
2605
|
if (this._backgroundColor !== newColor) {
|
|
2601
2606
|
this._backgroundColor = newColor;
|
|
2602
2607
|
this.requestRender();
|
|
@@ -2608,7 +2613,7 @@ class BoxRenderable extends Renderable {
|
|
|
2608
2613
|
set border(value) {
|
|
2609
2614
|
if (this._border !== value) {
|
|
2610
2615
|
this._border = value;
|
|
2611
|
-
this.borderSides =
|
|
2616
|
+
this.borderSides = getBorderSides2(value);
|
|
2612
2617
|
this.applyYogaBorders();
|
|
2613
2618
|
this.requestRender();
|
|
2614
2619
|
}
|
|
@@ -2617,7 +2622,7 @@ class BoxRenderable extends Renderable {
|
|
|
2617
2622
|
return this._borderStyle;
|
|
2618
2623
|
}
|
|
2619
2624
|
set borderStyle(value) {
|
|
2620
|
-
const _value =
|
|
2625
|
+
const _value = parseBorderStyle2(value, this._defaultOptions.borderStyle);
|
|
2621
2626
|
if (this._borderStyle !== _value || !this._border) {
|
|
2622
2627
|
this._borderStyle = _value;
|
|
2623
2628
|
this._customBorderChars = undefined;
|
|
@@ -2629,7 +2634,7 @@ class BoxRenderable extends Renderable {
|
|
|
2629
2634
|
return this._borderColor;
|
|
2630
2635
|
}
|
|
2631
2636
|
set borderColor(value) {
|
|
2632
|
-
const newColor =
|
|
2637
|
+
const newColor = parseColor2(value ?? this._defaultOptions.borderColor);
|
|
2633
2638
|
if (this._borderColor !== newColor) {
|
|
2634
2639
|
this._borderColor = newColor;
|
|
2635
2640
|
this.initializeBorder();
|
|
@@ -2640,7 +2645,7 @@ class BoxRenderable extends Renderable {
|
|
|
2640
2645
|
return this._focusedBorderColor;
|
|
2641
2646
|
}
|
|
2642
2647
|
set focusedBorderColor(value) {
|
|
2643
|
-
const newColor =
|
|
2648
|
+
const newColor = parseColor2(value ?? this._defaultOptions.focusedBorderColor);
|
|
2644
2649
|
if (this._focusedBorderColor !== newColor) {
|
|
2645
2650
|
this._focusedBorderColor = newColor;
|
|
2646
2651
|
this.initializeBorder();
|
|
@@ -2662,7 +2667,7 @@ class BoxRenderable extends Renderable {
|
|
|
2662
2667
|
return this._titleColor;
|
|
2663
2668
|
}
|
|
2664
2669
|
set titleColor(value) {
|
|
2665
|
-
const newColor = value ?
|
|
2670
|
+
const newColor = value ? parseColor2(value) : undefined;
|
|
2666
2671
|
if (this._titleColor !== newColor) {
|
|
2667
2672
|
this._titleColor = newColor;
|
|
2668
2673
|
this.requestRender();
|
|
@@ -2780,7 +2785,7 @@ class BoxRenderable extends Renderable {
|
|
|
2780
2785
|
}
|
|
2781
2786
|
|
|
2782
2787
|
// src/renderables/TextBufferRenderable.ts
|
|
2783
|
-
class
|
|
2788
|
+
class TextBufferRenderable2 extends Renderable2 {
|
|
2784
2789
|
selectable = true;
|
|
2785
2790
|
_defaultFg;
|
|
2786
2791
|
_defaultBg;
|
|
@@ -2800,8 +2805,8 @@ class TextBufferRenderable extends Renderable {
|
|
|
2800
2805
|
_textBufferSyntaxStyle;
|
|
2801
2806
|
nativeRenderable = null;
|
|
2802
2807
|
_defaultOptions = {
|
|
2803
|
-
fg:
|
|
2804
|
-
bg:
|
|
2808
|
+
fg: RGBA2.fromValues(1, 1, 1, 1),
|
|
2809
|
+
bg: RGBA2.fromValues(0, 0, 0, 0),
|
|
2805
2810
|
selectionBg: undefined,
|
|
2806
2811
|
selectionFg: undefined,
|
|
2807
2812
|
selectable: true,
|
|
@@ -2813,20 +2818,20 @@ class TextBufferRenderable extends Renderable {
|
|
|
2813
2818
|
};
|
|
2814
2819
|
constructor(ctx, options) {
|
|
2815
2820
|
super(ctx, options);
|
|
2816
|
-
this._defaultFg =
|
|
2817
|
-
this._defaultBg =
|
|
2821
|
+
this._defaultFg = parseColor2(options.fg ?? this._defaultOptions.fg);
|
|
2822
|
+
this._defaultBg = parseColor2(options.bg ?? this._defaultOptions.bg);
|
|
2818
2823
|
this._defaultAttributes = options.attributes ?? this._defaultOptions.attributes;
|
|
2819
|
-
this._selectionBg = options.selectionBg ?
|
|
2820
|
-
this._selectionFg = options.selectionFg ?
|
|
2824
|
+
this._selectionBg = options.selectionBg ? parseColor2(options.selectionBg) : this._defaultOptions.selectionBg;
|
|
2825
|
+
this._selectionFg = options.selectionFg ? parseColor2(options.selectionFg) : this._defaultOptions.selectionFg;
|
|
2821
2826
|
this.selectable = options.selectable ?? this._defaultOptions.selectable;
|
|
2822
2827
|
this._wrapMode = options.wrapMode ?? this._defaultOptions.wrapMode;
|
|
2823
2828
|
this._tabIndicator = options.tabIndicator ?? this._defaultOptions.tabIndicator;
|
|
2824
|
-
this._tabIndicatorColor = options.tabIndicatorColor ?
|
|
2829
|
+
this._tabIndicatorColor = options.tabIndicatorColor ? parseColor2(options.tabIndicatorColor) : this._defaultOptions.tabIndicatorColor;
|
|
2825
2830
|
this._truncate = options.truncate ?? this._defaultOptions.truncate;
|
|
2826
|
-
this.textBuffer =
|
|
2827
|
-
this.textBufferView =
|
|
2831
|
+
this.textBuffer = TextBuffer2.create(this._ctx.widthMethod);
|
|
2832
|
+
this.textBufferView = TextBufferView2.create(this.textBuffer);
|
|
2828
2833
|
this._firstLineOffset = ctx.claimFirstLineOffset?.(this) ?? 0;
|
|
2829
|
-
this._textBufferSyntaxStyle =
|
|
2834
|
+
this._textBufferSyntaxStyle = SyntaxStyle2.create();
|
|
2830
2835
|
this.textBuffer.setSyntaxStyle(this._textBufferSyntaxStyle);
|
|
2831
2836
|
this.textBufferView.setWrapMode(this._wrapMode);
|
|
2832
2837
|
this.textBufferView.setFirstLineOffset(this._firstLineOffset);
|
|
@@ -2874,6 +2879,23 @@ class TextBufferRenderable extends Renderable {
|
|
|
2874
2879
|
get lineInfo() {
|
|
2875
2880
|
return this.textBufferView.logicalLineInfo;
|
|
2876
2881
|
}
|
|
2882
|
+
getLineSources(startLine, lineCount) {
|
|
2883
|
+
if (this.needsLineInfoFallback(TextBufferRenderable2.prototype)) {
|
|
2884
|
+
return this.lineInfo.lineSources.slice(startLine, startLine + lineCount);
|
|
2885
|
+
}
|
|
2886
|
+
return this.textBufferView.getLineSources(startLine, lineCount);
|
|
2887
|
+
}
|
|
2888
|
+
needsLineInfoFallback(owner) {
|
|
2889
|
+
let prototype = this;
|
|
2890
|
+
while (prototype && prototype !== owner) {
|
|
2891
|
+
if (Object.hasOwn(prototype, "getLineSources"))
|
|
2892
|
+
return false;
|
|
2893
|
+
if (Object.hasOwn(prototype, "lineInfo"))
|
|
2894
|
+
return true;
|
|
2895
|
+
prototype = Object.getPrototypeOf(prototype);
|
|
2896
|
+
}
|
|
2897
|
+
return false;
|
|
2898
|
+
}
|
|
2877
2899
|
get lineCount() {
|
|
2878
2900
|
return this.textBuffer.getLineCount();
|
|
2879
2901
|
}
|
|
@@ -2908,7 +2930,7 @@ class TextBufferRenderable extends Renderable {
|
|
|
2908
2930
|
return this.lineInfo.lineWidthColsMax;
|
|
2909
2931
|
}
|
|
2910
2932
|
get scrollHeight() {
|
|
2911
|
-
return this.
|
|
2933
|
+
return this.virtualLineCount;
|
|
2912
2934
|
}
|
|
2913
2935
|
get maxScrollY() {
|
|
2914
2936
|
return Math.max(0, this.scrollHeight - this.height);
|
|
@@ -2931,7 +2953,7 @@ class TextBufferRenderable extends Renderable {
|
|
|
2931
2953
|
return this._defaultFg;
|
|
2932
2954
|
}
|
|
2933
2955
|
set fg(value) {
|
|
2934
|
-
const newColor =
|
|
2956
|
+
const newColor = parseColor2(value ?? this._defaultOptions.fg);
|
|
2935
2957
|
if (this._defaultFg !== newColor) {
|
|
2936
2958
|
this._defaultFg = newColor;
|
|
2937
2959
|
this.textBuffer.setDefaultFg(this._defaultFg);
|
|
@@ -2943,7 +2965,7 @@ class TextBufferRenderable extends Renderable {
|
|
|
2943
2965
|
return this._selectionBg;
|
|
2944
2966
|
}
|
|
2945
2967
|
set selectionBg(value) {
|
|
2946
|
-
const newColor = value ?
|
|
2968
|
+
const newColor = value ? parseColor2(value) : this._defaultOptions.selectionBg;
|
|
2947
2969
|
if (this._selectionBg !== newColor) {
|
|
2948
2970
|
this._selectionBg = newColor;
|
|
2949
2971
|
if (this.lastLocalSelection) {
|
|
@@ -2956,7 +2978,7 @@ class TextBufferRenderable extends Renderable {
|
|
|
2956
2978
|
return this._selectionFg;
|
|
2957
2979
|
}
|
|
2958
2980
|
set selectionFg(value) {
|
|
2959
|
-
const newColor = value ?
|
|
2981
|
+
const newColor = value ? parseColor2(value) : this._defaultOptions.selectionFg;
|
|
2960
2982
|
if (this._selectionFg !== newColor) {
|
|
2961
2983
|
this._selectionFg = newColor;
|
|
2962
2984
|
if (this.lastLocalSelection) {
|
|
@@ -2969,7 +2991,7 @@ class TextBufferRenderable extends Renderable {
|
|
|
2969
2991
|
return this._defaultBg;
|
|
2970
2992
|
}
|
|
2971
2993
|
set bg(value) {
|
|
2972
|
-
const newColor =
|
|
2994
|
+
const newColor = parseColor2(value ?? this._defaultOptions.bg);
|
|
2973
2995
|
if (this._defaultBg !== newColor) {
|
|
2974
2996
|
this._defaultBg = newColor;
|
|
2975
2997
|
this.textBuffer.setDefaultBg(this._defaultBg);
|
|
@@ -3018,7 +3040,7 @@ class TextBufferRenderable extends Renderable {
|
|
|
3018
3040
|
return this._tabIndicatorColor;
|
|
3019
3041
|
}
|
|
3020
3042
|
set tabIndicatorColor(value) {
|
|
3021
|
-
const newColor = value ?
|
|
3043
|
+
const newColor = value ? parseColor2(value) : undefined;
|
|
3022
3044
|
if (this._tabIndicatorColor !== newColor) {
|
|
3023
3045
|
this._tabIndicatorColor = newColor;
|
|
3024
3046
|
if (newColor !== undefined) {
|
|
@@ -3065,13 +3087,13 @@ class TextBufferRenderable extends Renderable {
|
|
|
3065
3087
|
this.emit("line-info-change");
|
|
3066
3088
|
}
|
|
3067
3089
|
setupNativeRenderable() {
|
|
3068
|
-
const lib =
|
|
3090
|
+
const lib = resolveRenderLib2();
|
|
3069
3091
|
const nativeRenderable = lib.createNativeRenderable();
|
|
3070
3092
|
if (!lib.nativeRenderableAttachYogaNode(nativeRenderable, this.yogaNode.ptr)) {
|
|
3071
3093
|
lib.destroyNativeRenderable(nativeRenderable);
|
|
3072
3094
|
throw new Error("Failed to attach native renderable Yoga node");
|
|
3073
3095
|
}
|
|
3074
|
-
if (!lib.nativeRenderableSetMeasureTarget(nativeRenderable,
|
|
3096
|
+
if (!lib.nativeRenderableSetMeasureTarget(nativeRenderable, NativeMeasureTargetKind2.TextBufferView, this.textBufferView.ptr)) {
|
|
3075
3097
|
lib.destroyNativeRenderable(nativeRenderable);
|
|
3076
3098
|
throw new Error("Failed to attach text buffer native measure target");
|
|
3077
3099
|
}
|
|
@@ -3085,7 +3107,7 @@ class TextBufferRenderable extends Renderable {
|
|
|
3085
3107
|
return localX >= 0 && localX < this.width && localY >= 0 && localY < this.height;
|
|
3086
3108
|
}
|
|
3087
3109
|
onSelectionChanged(selection) {
|
|
3088
|
-
const localSelection =
|
|
3110
|
+
const localSelection = convertGlobalToLocalSelection2(selection, this.x, this.y);
|
|
3089
3111
|
this.lastLocalSelection = localSelection;
|
|
3090
3112
|
let changed;
|
|
3091
3113
|
if (!localSelection?.isActive) {
|
|
@@ -3131,7 +3153,7 @@ class TextBufferRenderable extends Renderable {
|
|
|
3131
3153
|
if (this.isDestroyed)
|
|
3132
3154
|
return;
|
|
3133
3155
|
if (this.nativeRenderable) {
|
|
3134
|
-
|
|
3156
|
+
resolveRenderLib2().destroyNativeRenderable(this.nativeRenderable);
|
|
3135
3157
|
this.nativeRenderable = null;
|
|
3136
3158
|
}
|
|
3137
3159
|
this.textBuffer.setSyntaxStyle(null);
|
|
@@ -3146,7 +3168,7 @@ class TextBufferRenderable extends Renderable {
|
|
|
3146
3168
|
}
|
|
3147
3169
|
|
|
3148
3170
|
// src/renderables/Code.ts
|
|
3149
|
-
class
|
|
3171
|
+
class CodeRenderable2 extends TextBufferRenderable2 {
|
|
3150
3172
|
_content;
|
|
3151
3173
|
_filetype;
|
|
3152
3174
|
_syntaxStyle;
|
|
@@ -3181,7 +3203,7 @@ class CodeRenderable extends TextBufferRenderable {
|
|
|
3181
3203
|
this._content = options.content ?? this._contentDefaultOptions.content;
|
|
3182
3204
|
this._filetype = options.filetype;
|
|
3183
3205
|
this._syntaxStyle = options.syntaxStyle;
|
|
3184
|
-
this._treeSitterClient = options.treeSitterClient ??
|
|
3206
|
+
this._treeSitterClient = options.treeSitterClient ?? getTreeSitterClient2();
|
|
3185
3207
|
this._conceal = options.conceal ?? this._contentDefaultOptions.conceal;
|
|
3186
3208
|
this._drawUnstyledText = options.drawUnstyledText ?? this._contentDefaultOptions.drawUnstyledText;
|
|
3187
3209
|
this._streaming = options.streaming ?? this._contentDefaultOptions.streaming;
|
|
@@ -3215,7 +3237,7 @@ class CodeRenderable extends TextBufferRenderable {
|
|
|
3215
3237
|
this.requestRender();
|
|
3216
3238
|
return;
|
|
3217
3239
|
}
|
|
3218
|
-
if (this._initialStyledText && this._drawUnstyledText) {
|
|
3240
|
+
if (value && this._initialStyledText && this._drawUnstyledText) {
|
|
3219
3241
|
this.textBuffer.setStyledText(this._initialStyledText);
|
|
3220
3242
|
} else {
|
|
3221
3243
|
this.textBuffer.setText(value);
|
|
@@ -3224,6 +3246,14 @@ class CodeRenderable extends TextBufferRenderable {
|
|
|
3224
3246
|
this.updateTextInfo();
|
|
3225
3247
|
}
|
|
3226
3248
|
}
|
|
3249
|
+
updateStreamingPreview(content, initialStyledText) {
|
|
3250
|
+
this._content = content;
|
|
3251
|
+
this._initialStyledText = initialStyledText;
|
|
3252
|
+
this.invalidateHighlights();
|
|
3253
|
+
this.textBuffer.setStyledText(initialStyledText);
|
|
3254
|
+
this.setRenderedLineSources(undefined);
|
|
3255
|
+
this.updateTextInfo();
|
|
3256
|
+
}
|
|
3227
3257
|
get lineInfo() {
|
|
3228
3258
|
if (!this._renderedLineSources)
|
|
3229
3259
|
return super.lineInfo;
|
|
@@ -3237,6 +3267,14 @@ class CodeRenderable extends TextBufferRenderable {
|
|
|
3237
3267
|
};
|
|
3238
3268
|
return this._mappedLineInfo;
|
|
3239
3269
|
}
|
|
3270
|
+
getLineSources(startLine, lineCount) {
|
|
3271
|
+
if (this.needsLineInfoFallback(CodeRenderable2.prototype)) {
|
|
3272
|
+
return this.lineInfo.lineSources.slice(startLine, startLine + lineCount);
|
|
3273
|
+
}
|
|
3274
|
+
const sources = this.textBufferView.getLineSources(startLine, lineCount);
|
|
3275
|
+
const renderedLineSources = this._renderedLineSources;
|
|
3276
|
+
return renderedLineSources ? sources.map((line) => renderedLineSources[line] ?? line) : sources;
|
|
3277
|
+
}
|
|
3240
3278
|
get wrapMode() {
|
|
3241
3279
|
return super.wrapMode;
|
|
3242
3280
|
}
|
|
@@ -3295,6 +3333,10 @@ class CodeRenderable extends TextBufferRenderable {
|
|
|
3295
3333
|
}
|
|
3296
3334
|
set initialStyledText(value) {
|
|
3297
3335
|
if (this._initialStyledText !== value) {
|
|
3336
|
+
if (value && this._streaming && this._drawUnstyledText && this._isHighlighting) {
|
|
3337
|
+
this.updateStreamingPreview(this._content, value);
|
|
3338
|
+
return;
|
|
3339
|
+
}
|
|
3298
3340
|
this._initialStyledText = value;
|
|
3299
3341
|
this.invalidateHighlights();
|
|
3300
3342
|
}
|
|
@@ -3422,15 +3464,18 @@ class CodeRenderable extends TextBufferRenderable {
|
|
|
3422
3464
|
}
|
|
3423
3465
|
}
|
|
3424
3466
|
if (highlights.length > 0 || this._onChunks || this._baseHighlight) {
|
|
3467
|
+
const sourceRanges = this._onChunks ? [] : undefined;
|
|
3425
3468
|
const context = {
|
|
3426
3469
|
content,
|
|
3427
3470
|
filetype,
|
|
3428
3471
|
syntaxStyle: this._syntaxStyle,
|
|
3429
|
-
highlights
|
|
3472
|
+
highlights,
|
|
3473
|
+
sourceRanges
|
|
3430
3474
|
};
|
|
3431
|
-
let chunks =
|
|
3475
|
+
let chunks = treeSitterToTextChunks2(content, highlights, this._syntaxStyle, {
|
|
3432
3476
|
enabled: this._conceal,
|
|
3433
|
-
baseHighlight: this._baseHighlight
|
|
3477
|
+
baseHighlight: this._baseHighlight,
|
|
3478
|
+
ranges: sourceRanges
|
|
3434
3479
|
});
|
|
3435
3480
|
const renderedLineSources = this._onChunks ? undefined : this.getConcealLinesSourceMap(content, highlights);
|
|
3436
3481
|
chunks = await this.transformChunks(chunks, context);
|
|
@@ -3440,7 +3485,7 @@ class CodeRenderable extends TextBufferRenderable {
|
|
|
3440
3485
|
}
|
|
3441
3486
|
if (this.isDestroyed)
|
|
3442
3487
|
return;
|
|
3443
|
-
const styledText = new
|
|
3488
|
+
const styledText = new StyledText2(chunks);
|
|
3444
3489
|
this.textBuffer.setStyledText(styledText);
|
|
3445
3490
|
this.setRenderedLineSources(renderedLineSources);
|
|
3446
3491
|
} else {
|
|
@@ -3529,7 +3574,7 @@ class CodeRenderable extends TextBufferRenderable {
|
|
|
3529
3574
|
getConcealLinesSourceMap(content, highlights) {
|
|
3530
3575
|
if (!this._conceal || content.length === 0)
|
|
3531
3576
|
return;
|
|
3532
|
-
const concealLineRanges =
|
|
3577
|
+
const concealLineRanges = CodeRenderable2.getMergedConcealLineRanges(highlights);
|
|
3533
3578
|
if (concealLineRanges.length === 0)
|
|
3534
3579
|
return;
|
|
3535
3580
|
const lineSources = [];
|
|
@@ -3571,7 +3616,7 @@ class CodeRenderable extends TextBufferRenderable {
|
|
|
3571
3616
|
break;
|
|
3572
3617
|
lineStart = newlineOffset + 1;
|
|
3573
3618
|
}
|
|
3574
|
-
if (lineSources.length === 0 ||
|
|
3619
|
+
if (lineSources.length === 0 || CodeRenderable2.isIdentityLineSources(lineSources))
|
|
3575
3620
|
return;
|
|
3576
3621
|
return lineSources;
|
|
3577
3622
|
}
|
|
@@ -3633,12 +3678,12 @@ class CodeRenderable extends TextBufferRenderable {
|
|
|
3633
3678
|
|
|
3634
3679
|
// src/renderables/TextNode.ts
|
|
3635
3680
|
var BrandedTextNodeRenderable = Symbol.for("@opentui/core/TextNodeRenderable");
|
|
3636
|
-
function
|
|
3681
|
+
function isTextNodeRenderable2(obj) {
|
|
3637
3682
|
return !!obj?.[BrandedTextNodeRenderable];
|
|
3638
3683
|
}
|
|
3639
3684
|
function styledTextToTextNodes(styledText) {
|
|
3640
3685
|
return styledText.chunks.map((chunk) => {
|
|
3641
|
-
const node = new
|
|
3686
|
+
const node = new TextNodeRenderable2({
|
|
3642
3687
|
fg: chunk.fg,
|
|
3643
3688
|
bg: chunk.bg,
|
|
3644
3689
|
attributes: chunk.attributes,
|
|
@@ -3649,7 +3694,7 @@ function styledTextToTextNodes(styledText) {
|
|
|
3649
3694
|
});
|
|
3650
3695
|
}
|
|
3651
3696
|
|
|
3652
|
-
class
|
|
3697
|
+
class TextNodeRenderable2 extends BaseRenderable2 {
|
|
3653
3698
|
[BrandedTextNodeRenderable] = true;
|
|
3654
3699
|
_fg;
|
|
3655
3700
|
_bg;
|
|
@@ -3659,8 +3704,8 @@ class TextNodeRenderable extends BaseRenderable {
|
|
|
3659
3704
|
parent = null;
|
|
3660
3705
|
constructor(options) {
|
|
3661
3706
|
super(options);
|
|
3662
|
-
this._fg = options.fg ?
|
|
3663
|
-
this._bg = options.bg ?
|
|
3707
|
+
this._fg = options.fg ? parseColor2(options.fg) : undefined;
|
|
3708
|
+
this._bg = options.bg ? parseColor2(options.bg) : undefined;
|
|
3664
3709
|
this._attributes = options.attributes ?? 0;
|
|
3665
3710
|
this._link = options.link;
|
|
3666
3711
|
}
|
|
@@ -3669,12 +3714,12 @@ class TextNodeRenderable extends BaseRenderable {
|
|
|
3669
3714
|
}
|
|
3670
3715
|
set children(children) {
|
|
3671
3716
|
for (const child of this._children) {
|
|
3672
|
-
if (
|
|
3717
|
+
if (isTextNodeRenderable2(child) && child.parent === this) {
|
|
3673
3718
|
child.parent = null;
|
|
3674
3719
|
}
|
|
3675
3720
|
}
|
|
3676
3721
|
for (const child of children) {
|
|
3677
|
-
if (
|
|
3722
|
+
if (isTextNodeRenderable2(child)) {
|
|
3678
3723
|
if (child.parent && child.parent !== this) {
|
|
3679
3724
|
child.parent.remove(child);
|
|
3680
3725
|
}
|
|
@@ -3700,14 +3745,14 @@ class TextNodeRenderable extends BaseRenderable {
|
|
|
3700
3745
|
this.requestRender();
|
|
3701
3746
|
return insertIndex;
|
|
3702
3747
|
}
|
|
3703
|
-
if (
|
|
3748
|
+
if (isTextNodeRenderable2(obj)) {
|
|
3704
3749
|
const insertIndex = this.prepareChildInsert(obj, index);
|
|
3705
3750
|
this._children.splice(insertIndex, 0, obj);
|
|
3706
3751
|
obj.parent = this;
|
|
3707
3752
|
this.requestRender();
|
|
3708
3753
|
return insertIndex;
|
|
3709
3754
|
}
|
|
3710
|
-
if (
|
|
3755
|
+
if (isStyledText2(obj)) {
|
|
3711
3756
|
const textNodes = styledTextToTextNodes(obj);
|
|
3712
3757
|
if (index !== undefined) {
|
|
3713
3758
|
this._children.splice(index, 0, ...textNodes);
|
|
@@ -3739,10 +3784,10 @@ class TextNodeRenderable extends BaseRenderable {
|
|
|
3739
3784
|
}
|
|
3740
3785
|
replace(obj, index) {
|
|
3741
3786
|
const existing = this._children[index];
|
|
3742
|
-
if (
|
|
3787
|
+
if (isTextNodeRenderable2(existing) && existing.parent === this) {
|
|
3743
3788
|
existing.parent = null;
|
|
3744
3789
|
}
|
|
3745
|
-
if (
|
|
3790
|
+
if (isTextNodeRenderable2(obj)) {
|
|
3746
3791
|
if (obj.parent && obj.parent !== this) {
|
|
3747
3792
|
obj.parent.remove(obj);
|
|
3748
3793
|
} else if (obj.parent === this) {
|
|
@@ -3759,7 +3804,7 @@ class TextNodeRenderable extends BaseRenderable {
|
|
|
3759
3804
|
this.requestRender();
|
|
3760
3805
|
}
|
|
3761
3806
|
insertBefore(child, anchorNode) {
|
|
3762
|
-
if (!anchorNode || !
|
|
3807
|
+
if (!anchorNode || !isTextNodeRenderable2(anchorNode)) {
|
|
3763
3808
|
throw new Error("Anchor must be a TextNodeRenderable");
|
|
3764
3809
|
}
|
|
3765
3810
|
const anchorIndex = this._children.indexOf(anchorNode);
|
|
@@ -3769,13 +3814,13 @@ class TextNodeRenderable extends BaseRenderable {
|
|
|
3769
3814
|
if (child === anchorNode) {
|
|
3770
3815
|
return this;
|
|
3771
3816
|
}
|
|
3772
|
-
if (
|
|
3817
|
+
if (isTextNodeRenderable2(child)) {
|
|
3773
3818
|
this.add(child, anchorIndex);
|
|
3774
3819
|
return this;
|
|
3775
3820
|
}
|
|
3776
3821
|
if (typeof child === "string") {
|
|
3777
3822
|
this._children.splice(anchorIndex, 0, child);
|
|
3778
|
-
} else if (
|
|
3823
|
+
} else if (isStyledText2(child)) {
|
|
3779
3824
|
const textNodes = styledTextToTextNodes(child);
|
|
3780
3825
|
this._children.splice(anchorIndex, 0, ...textNodes);
|
|
3781
3826
|
textNodes.forEach((node) => node.parent = this);
|
|
@@ -3786,7 +3831,7 @@ class TextNodeRenderable extends BaseRenderable {
|
|
|
3786
3831
|
return this;
|
|
3787
3832
|
}
|
|
3788
3833
|
remove(child) {
|
|
3789
|
-
if (!
|
|
3834
|
+
if (!isTextNodeRenderable2(child)) {
|
|
3790
3835
|
throw new Error("remove expects a TextNodeRenderable child object");
|
|
3791
3836
|
}
|
|
3792
3837
|
const childIndex = this._children.indexOf(child);
|
|
@@ -3802,7 +3847,7 @@ class TextNodeRenderable extends BaseRenderable {
|
|
|
3802
3847
|
}
|
|
3803
3848
|
clear() {
|
|
3804
3849
|
for (const child of this._children) {
|
|
3805
|
-
if (
|
|
3850
|
+
if (isTextNodeRenderable2(child) && child.parent === this) {
|
|
3806
3851
|
child.parent = null;
|
|
3807
3852
|
}
|
|
3808
3853
|
}
|
|
@@ -3843,12 +3888,12 @@ class TextNodeRenderable extends BaseRenderable {
|
|
|
3843
3888
|
return chunks;
|
|
3844
3889
|
}
|
|
3845
3890
|
static fromString(text, options = {}) {
|
|
3846
|
-
const node = new
|
|
3891
|
+
const node = new TextNodeRenderable2(options);
|
|
3847
3892
|
node.add(text);
|
|
3848
3893
|
return node;
|
|
3849
3894
|
}
|
|
3850
3895
|
static fromNodes(nodes, options = {}) {
|
|
3851
|
-
const node = new
|
|
3896
|
+
const node = new TextNodeRenderable2(options);
|
|
3852
3897
|
for (const childNode of nodes) {
|
|
3853
3898
|
node.add(childNode);
|
|
3854
3899
|
}
|
|
@@ -3871,7 +3916,7 @@ class TextNodeRenderable extends BaseRenderable {
|
|
|
3871
3916
|
return this._children.find((child) => typeof child !== "string" && child.id === id);
|
|
3872
3917
|
}
|
|
3873
3918
|
getRenderableIndex(id) {
|
|
3874
|
-
return this._children.findIndex((child) =>
|
|
3919
|
+
return this._children.findIndex((child) => isTextNodeRenderable2(child) && child.id === id);
|
|
3875
3920
|
}
|
|
3876
3921
|
get fg() {
|
|
3877
3922
|
return this._fg;
|
|
@@ -3882,7 +3927,7 @@ class TextNodeRenderable extends BaseRenderable {
|
|
|
3882
3927
|
this.requestRender();
|
|
3883
3928
|
return;
|
|
3884
3929
|
}
|
|
3885
|
-
this._fg =
|
|
3930
|
+
this._fg = parseColor2(fg);
|
|
3886
3931
|
this.requestRender();
|
|
3887
3932
|
}
|
|
3888
3933
|
set bg(bg) {
|
|
@@ -3891,7 +3936,7 @@ class TextNodeRenderable extends BaseRenderable {
|
|
|
3891
3936
|
this.requestRender();
|
|
3892
3937
|
return;
|
|
3893
3938
|
}
|
|
3894
|
-
this._bg =
|
|
3939
|
+
this._bg = parseColor2(bg);
|
|
3895
3940
|
this.requestRender();
|
|
3896
3941
|
}
|
|
3897
3942
|
get bg() {
|
|
@@ -3916,7 +3961,7 @@ class TextNodeRenderable extends BaseRenderable {
|
|
|
3916
3961
|
}
|
|
3917
3962
|
}
|
|
3918
3963
|
|
|
3919
|
-
class
|
|
3964
|
+
class RootTextNodeRenderable2 extends TextNodeRenderable2 {
|
|
3920
3965
|
ctx;
|
|
3921
3966
|
textParent;
|
|
3922
3967
|
constructor(ctx, options, textParent) {
|
|
@@ -3931,7 +3976,7 @@ class RootTextNodeRenderable extends TextNodeRenderable {
|
|
|
3931
3976
|
}
|
|
3932
3977
|
|
|
3933
3978
|
// src/renderables/Text.ts
|
|
3934
|
-
class
|
|
3979
|
+
class TextRenderable2 extends TextBufferRenderable2 {
|
|
3935
3980
|
_text;
|
|
3936
3981
|
_hasManualStyledText = false;
|
|
3937
3982
|
rootTextNode;
|
|
@@ -3941,10 +3986,10 @@ class TextRenderable extends TextBufferRenderable {
|
|
|
3941
3986
|
constructor(ctx, options) {
|
|
3942
3987
|
super(ctx, options);
|
|
3943
3988
|
const content = options.content ?? this._contentDefaultOptions.content;
|
|
3944
|
-
const styledText = typeof content === "string" ?
|
|
3989
|
+
const styledText = typeof content === "string" ? stringToStyledText2(content) : content;
|
|
3945
3990
|
this._text = styledText;
|
|
3946
3991
|
this._hasManualStyledText = options.content !== undefined && content !== "";
|
|
3947
|
-
this.rootTextNode = new
|
|
3992
|
+
this.rootTextNode = new RootTextNodeRenderable2(ctx, {
|
|
3948
3993
|
id: `${this.id}-root`,
|
|
3949
3994
|
fg: this._defaultFg,
|
|
3950
3995
|
bg: this._defaultBg,
|
|
@@ -3968,7 +4013,7 @@ class TextRenderable extends TextBufferRenderable {
|
|
|
3968
4013
|
}
|
|
3969
4014
|
set content(value) {
|
|
3970
4015
|
this._hasManualStyledText = true;
|
|
3971
|
-
const styledText = typeof value === "string" ?
|
|
4016
|
+
const styledText = typeof value === "string" ? stringToStyledText2(value) : value;
|
|
3972
4017
|
if (this._text !== styledText) {
|
|
3973
4018
|
this._text = styledText;
|
|
3974
4019
|
this.updateTextBuffer(styledText);
|
|
@@ -3983,7 +4028,7 @@ class TextRenderable extends TextBufferRenderable {
|
|
|
3983
4028
|
attributes: this._defaultAttributes,
|
|
3984
4029
|
link: undefined
|
|
3985
4030
|
});
|
|
3986
|
-
this.textBuffer.setStyledText(new
|
|
4031
|
+
this.textBuffer.setStyledText(new StyledText2(chunks));
|
|
3987
4032
|
this.refreshLocalSelection();
|
|
3988
4033
|
this.yogaNode.markDirty();
|
|
3989
4034
|
}
|
|
@@ -4003,7 +4048,7 @@ class TextRenderable extends TextBufferRenderable {
|
|
|
4003
4048
|
}
|
|
4004
4049
|
clear() {
|
|
4005
4050
|
this.rootTextNode.clear();
|
|
4006
|
-
const emptyStyledText =
|
|
4051
|
+
const emptyStyledText = stringToStyledText2("");
|
|
4007
4052
|
this._text = emptyStyledText;
|
|
4008
4053
|
this.updateTextBuffer(emptyStyledText);
|
|
4009
4054
|
this.updateTextInfo();
|
|
@@ -4033,11 +4078,11 @@ function toNumber(value) {
|
|
|
4033
4078
|
}
|
|
4034
4079
|
var canThrowAcrossNativeCallback = typeof process !== "undefined" && typeof process.versions === "object" && process.versions !== null && typeof process.versions.bun === "string";
|
|
4035
4080
|
|
|
4036
|
-
class
|
|
4081
|
+
class NativeSpanFeed2 {
|
|
4037
4082
|
static create(options) {
|
|
4038
|
-
const lib =
|
|
4083
|
+
const lib = resolveRenderLib2();
|
|
4039
4084
|
const streamPtr = lib.createNativeSpanFeed(options);
|
|
4040
|
-
const stream = new
|
|
4085
|
+
const stream = new NativeSpanFeed2(streamPtr);
|
|
4041
4086
|
lib.registerNativeSpanFeedStream(streamPtr, stream.eventHandler);
|
|
4042
4087
|
const status = lib.attachNativeSpanFeed(streamPtr);
|
|
4043
4088
|
if (status !== 0) {
|
|
@@ -4048,8 +4093,8 @@ class NativeSpanFeed {
|
|
|
4048
4093
|
return stream;
|
|
4049
4094
|
}
|
|
4050
4095
|
static attach(streamPtr, _options) {
|
|
4051
|
-
const lib =
|
|
4052
|
-
const stream = new
|
|
4096
|
+
const lib = resolveRenderLib2();
|
|
4097
|
+
const stream = new NativeSpanFeed2(streamPtr);
|
|
4053
4098
|
lib.registerNativeSpanFeedStream(streamPtr, stream.eventHandler);
|
|
4054
4099
|
const status = lib.attachNativeSpanFeed(streamPtr);
|
|
4055
4100
|
if (status !== 0) {
|
|
@@ -4059,7 +4104,7 @@ class NativeSpanFeed {
|
|
|
4059
4104
|
return stream;
|
|
4060
4105
|
}
|
|
4061
4106
|
streamPtr;
|
|
4062
|
-
lib =
|
|
4107
|
+
lib = resolveRenderLib2();
|
|
4063
4108
|
eventHandler;
|
|
4064
4109
|
chunkMap = new Map;
|
|
4065
4110
|
chunkSizes = new Map;
|
|
@@ -4533,14 +4578,14 @@ function getCallerInfo() {
|
|
|
4533
4578
|
const columnNumber = parseInt(match[4], 10) || 0;
|
|
4534
4579
|
return { functionName, fullPath, fileName, lineNumber, columnNumber };
|
|
4535
4580
|
}
|
|
4536
|
-
var
|
|
4537
|
-
|
|
4581
|
+
var capture2 = singleton("ConsoleCapture", () => new Capture);
|
|
4582
|
+
registerEnvVar2({
|
|
4538
4583
|
name: "OTUI_USE_CONSOLE",
|
|
4539
4584
|
description: "Whether to use the console. Will not capture console output if set to false.",
|
|
4540
4585
|
type: "boolean",
|
|
4541
4586
|
default: true
|
|
4542
4587
|
});
|
|
4543
|
-
|
|
4588
|
+
registerEnvVar2({
|
|
4544
4589
|
name: "SHOW_CONSOLE",
|
|
4545
4590
|
description: "Show the console at startup if set to true.",
|
|
4546
4591
|
type: "boolean",
|
|
@@ -4560,7 +4605,7 @@ class TerminalConsoleCache extends EventEmitter4 {
|
|
|
4560
4605
|
super();
|
|
4561
4606
|
}
|
|
4562
4607
|
activate() {
|
|
4563
|
-
if (!
|
|
4608
|
+
if (!env2.OTUI_USE_CONSOLE)
|
|
4564
4609
|
return;
|
|
4565
4610
|
if (!this._originalConsole) {
|
|
4566
4611
|
this._originalConsole = global.console;
|
|
@@ -4569,10 +4614,10 @@ class TerminalConsoleCache extends EventEmitter4 {
|
|
|
4569
4614
|
this.overrideConsoleMethods();
|
|
4570
4615
|
}
|
|
4571
4616
|
setupConsoleCapture() {
|
|
4572
|
-
if (!
|
|
4617
|
+
if (!env2.OTUI_USE_CONSOLE)
|
|
4573
4618
|
return;
|
|
4574
|
-
const mockStdout = new CapturedWritableStream("stdout",
|
|
4575
|
-
const mockStderr = new CapturedWritableStream("stderr",
|
|
4619
|
+
const mockStdout = new CapturedWritableStream("stdout", capture2);
|
|
4620
|
+
const mockStderr = new CapturedWritableStream("stderr", capture2);
|
|
4576
4621
|
global.console = new Console({
|
|
4577
4622
|
stdout: mockStdout,
|
|
4578
4623
|
stderr: mockStderr,
|
|
@@ -4644,19 +4689,19 @@ class TerminalConsoleCache extends EventEmitter4 {
|
|
|
4644
4689
|
}
|
|
4645
4690
|
}
|
|
4646
4691
|
var terminalConsoleCache = singleton("TerminalConsoleCache", () => {
|
|
4647
|
-
const
|
|
4692
|
+
const terminalConsoleCache = new TerminalConsoleCache;
|
|
4648
4693
|
process.on("exit", () => {
|
|
4649
|
-
|
|
4694
|
+
terminalConsoleCache.destroy();
|
|
4650
4695
|
});
|
|
4651
|
-
return
|
|
4696
|
+
return terminalConsoleCache;
|
|
4652
4697
|
});
|
|
4653
|
-
var
|
|
4654
|
-
((
|
|
4655
|
-
|
|
4656
|
-
|
|
4657
|
-
|
|
4658
|
-
|
|
4659
|
-
})(
|
|
4698
|
+
var ConsolePosition2;
|
|
4699
|
+
((ConsolePosition) => {
|
|
4700
|
+
ConsolePosition["TOP"] = "top";
|
|
4701
|
+
ConsolePosition["BOTTOM"] = "bottom";
|
|
4702
|
+
ConsolePosition["LEFT"] = "left";
|
|
4703
|
+
ConsolePosition["RIGHT"] = "right";
|
|
4704
|
+
})(ConsolePosition2 ||= {});
|
|
4660
4705
|
var defaultConsoleKeybindings = [
|
|
4661
4706
|
{ name: "up", action: "scroll-up" },
|
|
4662
4707
|
{ name: "down", action: "scroll-down" },
|
|
@@ -4679,10 +4724,10 @@ var DEFAULT_CONSOLE_OPTIONS = {
|
|
|
4679
4724
|
colorError: "#FF0000",
|
|
4680
4725
|
colorDebug: "#808080",
|
|
4681
4726
|
colorDefault: "#FFFFFF",
|
|
4682
|
-
backgroundColor:
|
|
4727
|
+
backgroundColor: RGBA2.fromValues(0.1, 0.1, 0.1, 0.7),
|
|
4683
4728
|
startInDebugMode: false,
|
|
4684
4729
|
title: "Console",
|
|
4685
|
-
titleBarColor:
|
|
4730
|
+
titleBarColor: RGBA2.fromValues(0.05, 0.05, 0.05, 0.7),
|
|
4686
4731
|
titleBarTextColor: "#FFFFFF",
|
|
4687
4732
|
cursorColor: "#00A0FF",
|
|
4688
4733
|
maxStoredLogs: 2000,
|
|
@@ -4690,12 +4735,12 @@ var DEFAULT_CONSOLE_OPTIONS = {
|
|
|
4690
4735
|
onCopySelection: undefined,
|
|
4691
4736
|
keyBindings: undefined,
|
|
4692
4737
|
keyAliasMap: undefined,
|
|
4693
|
-
selectionColor:
|
|
4738
|
+
selectionColor: RGBA2.fromValues(0.3, 0.5, 0.8, 0.5),
|
|
4694
4739
|
copyButtonColor: "#00A0FF"
|
|
4695
4740
|
};
|
|
4696
4741
|
var INDENT_WIDTH = 2;
|
|
4697
4742
|
|
|
4698
|
-
class
|
|
4743
|
+
class TerminalConsole2 extends EventEmitter4 {
|
|
4699
4744
|
isVisible = false;
|
|
4700
4745
|
isFocused = false;
|
|
4701
4746
|
renderer;
|
|
@@ -4764,23 +4809,23 @@ class TerminalConsole extends EventEmitter4 {
|
|
|
4764
4809
|
constructor(renderer, options = {}) {
|
|
4765
4810
|
super();
|
|
4766
4811
|
this.renderer = renderer;
|
|
4767
|
-
this.clock = options.clock ?? new
|
|
4812
|
+
this.clock = options.clock ?? new SystemClock2;
|
|
4768
4813
|
this.options = { ...DEFAULT_CONSOLE_OPTIONS, ...options };
|
|
4769
4814
|
this.keyHandler = this.handleKeyPress.bind(this);
|
|
4770
4815
|
this._debugModeEnabled = this.options.startInDebugMode;
|
|
4771
4816
|
terminalConsoleCache.setCollectCallerInfo(this._debugModeEnabled);
|
|
4772
|
-
this._rgbaInfo =
|
|
4773
|
-
this._rgbaWarn =
|
|
4774
|
-
this._rgbaError =
|
|
4775
|
-
this._rgbaDebug =
|
|
4776
|
-
this._rgbaDefault =
|
|
4777
|
-
this.backgroundColor =
|
|
4778
|
-
this._rgbaTitleBar =
|
|
4779
|
-
this._rgbaTitleBarText =
|
|
4817
|
+
this._rgbaInfo = parseColor2(this.options.colorInfo);
|
|
4818
|
+
this._rgbaWarn = parseColor2(this.options.colorWarn);
|
|
4819
|
+
this._rgbaError = parseColor2(this.options.colorError);
|
|
4820
|
+
this._rgbaDebug = parseColor2(this.options.colorDebug);
|
|
4821
|
+
this._rgbaDefault = parseColor2(this.options.colorDefault);
|
|
4822
|
+
this.backgroundColor = parseColor2(this.options.backgroundColor);
|
|
4823
|
+
this._rgbaTitleBar = parseColor2(this.options.titleBarColor);
|
|
4824
|
+
this._rgbaTitleBarText = parseColor2(this.options.titleBarTextColor || this.options.colorDefault);
|
|
4780
4825
|
this._title = this.options.title;
|
|
4781
|
-
this._rgbaCursor =
|
|
4782
|
-
this._rgbaSelection =
|
|
4783
|
-
this._rgbaCopyButton =
|
|
4826
|
+
this._rgbaCursor = parseColor2(this.options.cursorColor);
|
|
4827
|
+
this._rgbaSelection = parseColor2(this.options.selectionColor);
|
|
4828
|
+
this._rgbaCopyButton = parseColor2(this.options.copyButtonColor);
|
|
4784
4829
|
this._keyAliasMap = mergeKeyAliases(defaultKeyAliases, options.keyAliasMap || {});
|
|
4785
4830
|
this._keyBindings = options.keyBindings || [];
|
|
4786
4831
|
this._mergedKeyBindings = mergeKeyBindings(defaultConsoleKeybindings, this._keyBindings);
|
|
@@ -4792,7 +4837,7 @@ class TerminalConsole extends EventEmitter4 {
|
|
|
4792
4837
|
this._handleNewLog(logEntry);
|
|
4793
4838
|
};
|
|
4794
4839
|
terminalConsoleCache.on("entry", this._entryListener);
|
|
4795
|
-
if (
|
|
4840
|
+
if (env2.SHOW_CONSOLE) {
|
|
4796
4841
|
this.show();
|
|
4797
4842
|
}
|
|
4798
4843
|
}
|
|
@@ -5051,7 +5096,7 @@ class TerminalConsole extends EventEmitter4 {
|
|
|
5051
5096
|
this._processCachedLogs();
|
|
5052
5097
|
terminalConsoleCache.setCachingEnabled(false);
|
|
5053
5098
|
if (!this.frameBuffer) {
|
|
5054
|
-
this.frameBuffer =
|
|
5099
|
+
this.frameBuffer = OptimizedBuffer2.create(this.consoleWidth, this.consoleHeight, this.renderer.widthMethod, {
|
|
5055
5100
|
respectAlpha: this.backgroundColor.a < 1,
|
|
5056
5101
|
id: "console framebuffer"
|
|
5057
5102
|
});
|
|
@@ -5098,7 +5143,7 @@ class TerminalConsole extends EventEmitter4 {
|
|
|
5098
5143
|
const copyButtonX = this.consoleWidth - copyLabel.length - 1;
|
|
5099
5144
|
if (copyButtonX >= 0) {
|
|
5100
5145
|
const copyButtonEnabled = this.hasSelection();
|
|
5101
|
-
const disabledColor =
|
|
5146
|
+
const disabledColor = RGBA2.fromInts(100, 100, 100, 255);
|
|
5102
5147
|
const copyColor = copyButtonEnabled ? this._rgbaCopyButton : disabledColor;
|
|
5103
5148
|
this.frameBuffer.drawText(copyLabel, copyButtonX, 0, copyColor, this._rgbaTitleBar);
|
|
5104
5149
|
this._copyButtonBounds = { x: copyButtonX, y: 0, width: copyLabel.length, height: 1 };
|
|
@@ -5487,10 +5532,10 @@ class TerminalConsole extends EventEmitter4 {
|
|
|
5487
5532
|
|
|
5488
5533
|
// src/renderables/EditBufferRenderable.ts
|
|
5489
5534
|
var BrandedEditBufferRenderable = Symbol.for("@opentui/core/EditBufferRenderable");
|
|
5490
|
-
var
|
|
5491
|
-
((
|
|
5492
|
-
|
|
5493
|
-
})(
|
|
5535
|
+
var EditBufferRenderableEvents2;
|
|
5536
|
+
((EditBufferRenderableEvents) => {
|
|
5537
|
+
EditBufferRenderableEvents["TRAITS_CHANGED"] = "traits-changed";
|
|
5538
|
+
})(EditBufferRenderableEvents2 ||= {});
|
|
5494
5539
|
function sameCapture(a, b) {
|
|
5495
5540
|
if (a === b)
|
|
5496
5541
|
return true;
|
|
@@ -5503,11 +5548,11 @@ function sameCapture(a, b) {
|
|
|
5503
5548
|
function sameTraits(a, b) {
|
|
5504
5549
|
return a.suspend === b.suspend && a.status === b.status && sameCapture(a.capture, b.capture);
|
|
5505
5550
|
}
|
|
5506
|
-
function
|
|
5551
|
+
function isEditBufferRenderable2(obj) {
|
|
5507
5552
|
return !!(obj && typeof obj === "object" && (BrandedEditBufferRenderable in obj));
|
|
5508
5553
|
}
|
|
5509
5554
|
|
|
5510
|
-
class
|
|
5555
|
+
class EditBufferRenderable2 extends Renderable2 {
|
|
5511
5556
|
[BrandedEditBufferRenderable] = true;
|
|
5512
5557
|
_focusable = true;
|
|
5513
5558
|
selectable = true;
|
|
@@ -5535,7 +5580,7 @@ class EditBufferRenderable extends Renderable {
|
|
|
5535
5580
|
editorView;
|
|
5536
5581
|
nativeRenderable = null;
|
|
5537
5582
|
_defaultOptions = {
|
|
5538
|
-
textColor:
|
|
5583
|
+
textColor: RGBA2.fromValues(1, 1, 1, 1),
|
|
5539
5584
|
backgroundColor: "transparent",
|
|
5540
5585
|
selectionBg: undefined,
|
|
5541
5586
|
selectionFg: undefined,
|
|
@@ -5545,7 +5590,7 @@ class EditBufferRenderable extends Renderable {
|
|
|
5545
5590
|
scrollMargin: 0.2,
|
|
5546
5591
|
scrollSpeed: 16,
|
|
5547
5592
|
showCursor: true,
|
|
5548
|
-
cursorColor:
|
|
5593
|
+
cursorColor: RGBA2.fromValues(1, 1, 1, 1),
|
|
5549
5594
|
cursorStyle: {
|
|
5550
5595
|
style: "block",
|
|
5551
5596
|
blinking: true
|
|
@@ -5555,22 +5600,22 @@ class EditBufferRenderable extends Renderable {
|
|
|
5555
5600
|
};
|
|
5556
5601
|
constructor(ctx, options) {
|
|
5557
5602
|
super(ctx, options);
|
|
5558
|
-
this._textColor =
|
|
5559
|
-
this._backgroundColor =
|
|
5603
|
+
this._textColor = parseColor2(options.textColor ?? this._defaultOptions.textColor);
|
|
5604
|
+
this._backgroundColor = parseColor2(options.backgroundColor ?? this._defaultOptions.backgroundColor);
|
|
5560
5605
|
this._defaultAttributes = options.attributes ?? this._defaultOptions.attributes;
|
|
5561
|
-
this._selectionBg = options.selectionBg ?
|
|
5562
|
-
this._selectionFg = options.selectionFg ?
|
|
5606
|
+
this._selectionBg = options.selectionBg ? parseColor2(options.selectionBg) : this._defaultOptions.selectionBg;
|
|
5607
|
+
this._selectionFg = options.selectionFg ? parseColor2(options.selectionFg) : this._defaultOptions.selectionFg;
|
|
5563
5608
|
this.selectable = options.selectable ?? this._defaultOptions.selectable;
|
|
5564
5609
|
this._wrapMode = options.wrapMode ?? this._defaultOptions.wrapMode;
|
|
5565
5610
|
this._scrollMargin = options.scrollMargin ?? this._defaultOptions.scrollMargin;
|
|
5566
5611
|
this._scrollSpeed = options.scrollSpeed ?? this._defaultOptions.scrollSpeed;
|
|
5567
5612
|
this._showCursor = options.showCursor ?? this._defaultOptions.showCursor;
|
|
5568
|
-
this._cursorColor =
|
|
5613
|
+
this._cursorColor = parseColor2(options.cursorColor ?? this._defaultOptions.cursorColor);
|
|
5569
5614
|
this._cursorStyle = options.cursorStyle ?? this._defaultOptions.cursorStyle;
|
|
5570
5615
|
this._tabIndicator = options.tabIndicator ?? this._defaultOptions.tabIndicator;
|
|
5571
|
-
this._tabIndicatorColor = options.tabIndicatorColor ?
|
|
5572
|
-
this.editBuffer =
|
|
5573
|
-
this.editorView =
|
|
5616
|
+
this._tabIndicatorColor = options.tabIndicatorColor ? parseColor2(options.tabIndicatorColor) : this._defaultOptions.tabIndicatorColor;
|
|
5617
|
+
this.editBuffer = EditBuffer2.create(this._ctx.widthMethod);
|
|
5618
|
+
this.editorView = EditorView2.create(this.editBuffer, this.width || 80, this.height || 24);
|
|
5574
5619
|
this.editorView.setWrapMode(this._wrapMode);
|
|
5575
5620
|
this.editorView.setScrollMargin(this._scrollMargin);
|
|
5576
5621
|
if (options.selectionOccupancy === "boundary") {
|
|
@@ -5662,7 +5707,7 @@ class EditBufferRenderable extends Renderable {
|
|
|
5662
5707
|
return this._textColor;
|
|
5663
5708
|
}
|
|
5664
5709
|
set textColor(value) {
|
|
5665
|
-
const newColor =
|
|
5710
|
+
const newColor = parseColor2(value ?? this._defaultOptions.textColor);
|
|
5666
5711
|
if (this._textColor !== newColor) {
|
|
5667
5712
|
this._textColor = newColor;
|
|
5668
5713
|
this.editBuffer.setDefaultFg(newColor);
|
|
@@ -5683,7 +5728,7 @@ class EditBufferRenderable extends Renderable {
|
|
|
5683
5728
|
this.emit("traits-changed" /* TRAITS_CHANGED */, value, prev);
|
|
5684
5729
|
}
|
|
5685
5730
|
set selectionBg(value) {
|
|
5686
|
-
const newColor = value ?
|
|
5731
|
+
const newColor = value ? parseColor2(value) : this._defaultOptions.selectionBg;
|
|
5687
5732
|
if (this._selectionBg !== newColor) {
|
|
5688
5733
|
this._selectionBg = newColor;
|
|
5689
5734
|
this.refreshSelectionStyle();
|
|
@@ -5694,7 +5739,7 @@ class EditBufferRenderable extends Renderable {
|
|
|
5694
5739
|
return this._selectionFg;
|
|
5695
5740
|
}
|
|
5696
5741
|
set selectionFg(value) {
|
|
5697
|
-
const newColor = value ?
|
|
5742
|
+
const newColor = value ? parseColor2(value) : this._defaultOptions.selectionFg;
|
|
5698
5743
|
if (this._selectionFg !== newColor) {
|
|
5699
5744
|
this._selectionFg = newColor;
|
|
5700
5745
|
this.refreshSelectionStyle();
|
|
@@ -5705,7 +5750,7 @@ class EditBufferRenderable extends Renderable {
|
|
|
5705
5750
|
return this._backgroundColor;
|
|
5706
5751
|
}
|
|
5707
5752
|
set backgroundColor(value) {
|
|
5708
|
-
const newColor =
|
|
5753
|
+
const newColor = parseColor2(value ?? this._defaultOptions.backgroundColor);
|
|
5709
5754
|
if (this._backgroundColor !== newColor) {
|
|
5710
5755
|
this._backgroundColor = newColor;
|
|
5711
5756
|
this.editBuffer.setDefaultBg(newColor);
|
|
@@ -5749,7 +5794,7 @@ class EditBufferRenderable extends Renderable {
|
|
|
5749
5794
|
return this._cursorColor;
|
|
5750
5795
|
}
|
|
5751
5796
|
set cursorColor(value) {
|
|
5752
|
-
const newColor =
|
|
5797
|
+
const newColor = parseColor2(value);
|
|
5753
5798
|
if (this._cursorColor !== newColor) {
|
|
5754
5799
|
this._cursorColor = newColor;
|
|
5755
5800
|
if (this._focused) {
|
|
@@ -5795,7 +5840,7 @@ class EditBufferRenderable extends Renderable {
|
|
|
5795
5840
|
return this._tabIndicatorColor;
|
|
5796
5841
|
}
|
|
5797
5842
|
set tabIndicatorColor(value) {
|
|
5798
|
-
const newColor = value ?
|
|
5843
|
+
const newColor = value ? parseColor2(value) : undefined;
|
|
5799
5844
|
if (this._tabIndicatorColor !== newColor) {
|
|
5800
5845
|
this._tabIndicatorColor = newColor;
|
|
5801
5846
|
if (newColor !== undefined) {
|
|
@@ -5867,7 +5912,7 @@ class EditBufferRenderable extends Renderable {
|
|
|
5867
5912
|
return localX >= 0 && localX < this.width && localY >= 0 && localY < this.height;
|
|
5868
5913
|
}
|
|
5869
5914
|
onSelectionChanged(selection) {
|
|
5870
|
-
const localSelection =
|
|
5915
|
+
const localSelection = convertGlobalToLocalSelection2(selection, this.x, this.y);
|
|
5871
5916
|
this.lastLocalSelection = localSelection;
|
|
5872
5917
|
const updateCursor = true;
|
|
5873
5918
|
const followCursor = this._keyboardSelectionActive;
|
|
@@ -6239,13 +6284,13 @@ class EditBufferRenderable extends Renderable {
|
|
|
6239
6284
|
return true;
|
|
6240
6285
|
}
|
|
6241
6286
|
setupNativeRenderable() {
|
|
6242
|
-
const lib =
|
|
6287
|
+
const lib = resolveRenderLib2();
|
|
6243
6288
|
const nativeRenderable = lib.createNativeRenderable();
|
|
6244
6289
|
if (!lib.nativeRenderableAttachYogaNode(nativeRenderable, this.yogaNode.ptr)) {
|
|
6245
6290
|
lib.destroyNativeRenderable(nativeRenderable);
|
|
6246
6291
|
throw new Error("Failed to attach native renderable Yoga node");
|
|
6247
6292
|
}
|
|
6248
|
-
if (!lib.nativeRenderableSetMeasureTarget(nativeRenderable,
|
|
6293
|
+
if (!lib.nativeRenderableSetMeasureTarget(nativeRenderable, NativeMeasureTargetKind2.EditorView, this.editorView.ptr)) {
|
|
6249
6294
|
lib.destroyNativeRenderable(nativeRenderable);
|
|
6250
6295
|
throw new Error("Failed to attach editor native measure target");
|
|
6251
6296
|
}
|
|
@@ -6301,7 +6346,7 @@ class EditBufferRenderable extends Renderable {
|
|
|
6301
6346
|
this.blur();
|
|
6302
6347
|
}
|
|
6303
6348
|
if (this.nativeRenderable) {
|
|
6304
|
-
|
|
6349
|
+
resolveRenderLib2().destroyNativeRenderable(this.nativeRenderable);
|
|
6305
6350
|
this.nativeRenderable = null;
|
|
6306
6351
|
}
|
|
6307
6352
|
this.editorView.destroy();
|
|
@@ -6611,7 +6656,7 @@ function oscThemeColorToHex(r, g, b, hex6) {
|
|
|
6611
6656
|
return "#000000";
|
|
6612
6657
|
}
|
|
6613
6658
|
function inferThemeModeFromBackgroundColor(color) {
|
|
6614
|
-
const [r, g, b] =
|
|
6659
|
+
const [r, g, b] = parseColor2(color).toInts();
|
|
6615
6660
|
const brightness = (r * 299 + g * 587 + b * 114) / 1000;
|
|
6616
6661
|
return brightness > 128 ? "light" : "dark";
|
|
6617
6662
|
}
|
|
@@ -6743,51 +6788,52 @@ class RendererThemeMode {
|
|
|
6743
6788
|
}
|
|
6744
6789
|
|
|
6745
6790
|
// src/renderer.ts
|
|
6746
|
-
|
|
6791
|
+
registerEnvVar2({
|
|
6747
6792
|
name: "OTUI_DUMP_CAPTURES",
|
|
6748
6793
|
description: "Dump captured stdout and console caches when the renderer exit handler runs.",
|
|
6749
6794
|
type: "boolean",
|
|
6750
6795
|
default: false
|
|
6751
6796
|
});
|
|
6752
|
-
|
|
6797
|
+
registerEnvVar2({
|
|
6753
6798
|
name: "OTUI_NO_NATIVE_RENDER",
|
|
6754
6799
|
description: "Skip the Zig/native frame renderer. Useful for debugging the render loop; split-footer stdout flushing may still write ANSI.",
|
|
6755
6800
|
type: "boolean",
|
|
6756
6801
|
default: false
|
|
6757
6802
|
});
|
|
6758
|
-
|
|
6803
|
+
registerEnvVar2({
|
|
6759
6804
|
name: "OTUI_USE_ALTERNATE_SCREEN",
|
|
6760
6805
|
description: "When explicitly set, force screen mode selection: true=alternate-screen, false=main-screen.",
|
|
6761
6806
|
type: "boolean",
|
|
6762
6807
|
default: true
|
|
6763
6808
|
});
|
|
6764
|
-
|
|
6809
|
+
registerEnvVar2({
|
|
6765
6810
|
name: "OTUI_OVERRIDE_STDOUT",
|
|
6766
6811
|
description: "When explicitly set, force stdout routing: false=passthrough, true=capture in split-footer mode.",
|
|
6767
6812
|
type: "boolean",
|
|
6768
6813
|
default: true
|
|
6769
6814
|
});
|
|
6770
|
-
|
|
6815
|
+
registerEnvVar2({
|
|
6771
6816
|
name: "OTUI_DEBUG",
|
|
6772
6817
|
description: "Enable debug mode to capture all raw input for debugging purposes.",
|
|
6773
6818
|
type: "boolean",
|
|
6774
6819
|
default: false
|
|
6775
6820
|
});
|
|
6776
|
-
|
|
6821
|
+
registerEnvVar2({
|
|
6777
6822
|
name: "OTUI_STDIN_LOG",
|
|
6778
6823
|
description: "Write the raw stdin byte stream to this file for debugging.",
|
|
6779
6824
|
type: "string",
|
|
6780
6825
|
default: ""
|
|
6781
6826
|
});
|
|
6782
|
-
|
|
6827
|
+
registerEnvVar2({
|
|
6783
6828
|
name: "OTUI_SHOW_STATS",
|
|
6784
6829
|
description: "Show the debug overlay at startup.",
|
|
6785
6830
|
type: "boolean",
|
|
6786
6831
|
default: false
|
|
6787
6832
|
});
|
|
6833
|
+
var KITTY_IMAGE_TRANSPORTS = ["raw", "zlib", "file"];
|
|
6788
6834
|
var DEFAULT_FOOTER_HEIGHT = 12;
|
|
6789
6835
|
var MAX_SCROLLBACK_SURFACE_HEIGHT_PASSES = 4;
|
|
6790
|
-
var TRANSPARENT_RGBA =
|
|
6836
|
+
var TRANSPARENT_RGBA = RGBA2.fromValues(0, 0, 0, 0);
|
|
6791
6837
|
var scrollbackSurfaceCounter = 0;
|
|
6792
6838
|
function normalizeFooterHeight(footerHeight) {
|
|
6793
6839
|
if (footerHeight === undefined) {
|
|
@@ -6805,12 +6851,12 @@ function normalizeFooterHeight(footerHeight) {
|
|
|
6805
6851
|
function resolveModes(config) {
|
|
6806
6852
|
let screenMode = config.screenMode ?? "alternate-screen";
|
|
6807
6853
|
if (process.env.OTUI_USE_ALTERNATE_SCREEN !== undefined) {
|
|
6808
|
-
screenMode =
|
|
6854
|
+
screenMode = env2.OTUI_USE_ALTERNATE_SCREEN ? "alternate-screen" : "main-screen";
|
|
6809
6855
|
}
|
|
6810
6856
|
const footerHeight = screenMode === "split-footer" ? normalizeFooterHeight(config.footerHeight) : DEFAULT_FOOTER_HEIGHT;
|
|
6811
6857
|
let externalOutputMode = config.externalOutputMode ?? (screenMode === "split-footer" ? "capture-stdout" : "passthrough");
|
|
6812
6858
|
if (process.env.OTUI_OVERRIDE_STDOUT !== undefined) {
|
|
6813
|
-
externalOutputMode =
|
|
6859
|
+
externalOutputMode = env2.OTUI_OVERRIDE_STDOUT && screenMode === "split-footer" ? "capture-stdout" : "passthrough";
|
|
6814
6860
|
}
|
|
6815
6861
|
if (externalOutputMode === "capture-stdout" && screenMode !== "split-footer") {
|
|
6816
6862
|
throw new Error('externalOutputMode "capture-stdout" requires screenMode "split-footer"');
|
|
@@ -6840,9 +6886,9 @@ class ExternalOutputQueue {
|
|
|
6840
6886
|
}
|
|
6841
6887
|
const clampedLimit = Number.isFinite(limit) ? Math.max(1, Math.trunc(limit)) : this.commits.length;
|
|
6842
6888
|
if (clampedLimit >= this.commits.length) {
|
|
6843
|
-
const
|
|
6889
|
+
const output = this.commits;
|
|
6844
6890
|
this.commits = [];
|
|
6845
|
-
return
|
|
6891
|
+
return output;
|
|
6846
6892
|
}
|
|
6847
6893
|
const output = this.commits.slice(0, clampedLimit);
|
|
6848
6894
|
this.commits = this.commits.slice(clampedLimit);
|
|
@@ -6883,8 +6929,8 @@ class ScrollbackSnapshotRenderContext extends EventEmitter5 {
|
|
|
6883
6929
|
this.resolution = resolution;
|
|
6884
6930
|
this.capabilities = capabilities;
|
|
6885
6931
|
this.widthMethod = widthMethod;
|
|
6886
|
-
this.keyInput = new
|
|
6887
|
-
this._internalKeyInput = new
|
|
6932
|
+
this.keyInput = new KeyHandler2;
|
|
6933
|
+
this._internalKeyInput = new InternalKeyHandler2;
|
|
6888
6934
|
}
|
|
6889
6935
|
addToHitGrid(_x, _y, _width, _height, _id) {}
|
|
6890
6936
|
pushHitGridScissorRect(_x, _y, _width, _height) {}
|
|
@@ -6903,7 +6949,7 @@ class ScrollbackSnapshotRenderContext extends EventEmitter5 {
|
|
|
6903
6949
|
get currentFocusedEditor() {
|
|
6904
6950
|
if (!this.currentFocusedRenderable)
|
|
6905
6951
|
return null;
|
|
6906
|
-
if (!
|
|
6952
|
+
if (!isEditBufferRenderable2(this.currentFocusedRenderable))
|
|
6907
6953
|
return null;
|
|
6908
6954
|
return this.currentFocusedRenderable;
|
|
6909
6955
|
}
|
|
@@ -6930,6 +6976,7 @@ class ScrollbackSnapshotRenderContext extends EventEmitter5 {
|
|
|
6930
6976
|
updateSelection(_currentRenderable, _x, _y, _options) {}
|
|
6931
6977
|
}
|
|
6932
6978
|
var DEFAULT_FORWARDED_ENV_KEYS = [
|
|
6979
|
+
"TMPDIR",
|
|
6933
6980
|
"SSH_CONNECTION",
|
|
6934
6981
|
"SSH_CLIENT",
|
|
6935
6982
|
"SSH_TTY",
|
|
@@ -6969,7 +7016,7 @@ var KITTY_FLAG_ALL_KEYS_AS_ESCAPES = 8;
|
|
|
6969
7016
|
var KITTY_FLAG_REPORT_TEXT = 16;
|
|
6970
7017
|
var DEFAULT_STDIN_PARSER_MAX_BUFFER_BYTES = 64 * 1024 * 1024;
|
|
6971
7018
|
var NATIVE_PALETTE_QUERY_SIZE = 16;
|
|
6972
|
-
function
|
|
7019
|
+
function buildKittyKeyboardFlags2(config) {
|
|
6973
7020
|
if (!config) {
|
|
6974
7021
|
return 0;
|
|
6975
7022
|
}
|
|
@@ -6992,7 +7039,7 @@ function buildKittyKeyboardFlags(config) {
|
|
|
6992
7039
|
return flags;
|
|
6993
7040
|
}
|
|
6994
7041
|
|
|
6995
|
-
class
|
|
7042
|
+
class MouseEvent2 {
|
|
6996
7043
|
type;
|
|
6997
7044
|
button;
|
|
6998
7045
|
x;
|
|
@@ -7029,19 +7076,19 @@ class MouseEvent {
|
|
|
7029
7076
|
this._defaultPrevented = true;
|
|
7030
7077
|
}
|
|
7031
7078
|
}
|
|
7032
|
-
var
|
|
7033
|
-
((
|
|
7034
|
-
|
|
7035
|
-
|
|
7036
|
-
|
|
7037
|
-
|
|
7038
|
-
|
|
7039
|
-
})(
|
|
7079
|
+
var MouseButton2;
|
|
7080
|
+
((MouseButton) => {
|
|
7081
|
+
MouseButton[MouseButton["LEFT"] = 0] = "LEFT";
|
|
7082
|
+
MouseButton[MouseButton["MIDDLE"] = 1] = "MIDDLE";
|
|
7083
|
+
MouseButton[MouseButton["RIGHT"] = 2] = "RIGHT";
|
|
7084
|
+
MouseButton[MouseButton["WHEEL_UP"] = 4] = "WHEEL_UP";
|
|
7085
|
+
MouseButton[MouseButton["WHEEL_DOWN"] = 5] = "WHEEL_DOWN";
|
|
7086
|
+
})(MouseButton2 ||= {});
|
|
7040
7087
|
var rendererTracker = singleton("RendererTracker", () => ({
|
|
7041
7088
|
renderers: new Set,
|
|
7042
7089
|
streamOwners: new WeakMap
|
|
7043
7090
|
}));
|
|
7044
|
-
async function
|
|
7091
|
+
async function createCliRenderer2(config = {}) {
|
|
7045
7092
|
if (process.argv.includes("--delay-start")) {
|
|
7046
7093
|
await new Promise((resolve) => setTimeout(resolve, 5000));
|
|
7047
7094
|
}
|
|
@@ -7049,7 +7096,7 @@ async function createCliRenderer(config = {}) {
|
|
|
7049
7096
|
const stdout = config.stdout ?? process.stdout;
|
|
7050
7097
|
const width = stdout.columns || config.width || 80;
|
|
7051
7098
|
const height = stdout.rows || config.height || 24;
|
|
7052
|
-
const renderer = new
|
|
7099
|
+
const renderer = new CliRenderer2(stdin, stdout, width, height, config);
|
|
7053
7100
|
try {
|
|
7054
7101
|
await renderer.setupTerminal();
|
|
7055
7102
|
return renderer;
|
|
@@ -7062,37 +7109,37 @@ async function createCliRenderer(config = {}) {
|
|
|
7062
7109
|
throw error;
|
|
7063
7110
|
}
|
|
7064
7111
|
}
|
|
7065
|
-
var
|
|
7066
|
-
((
|
|
7067
|
-
|
|
7068
|
-
|
|
7069
|
-
|
|
7070
|
-
|
|
7071
|
-
|
|
7072
|
-
|
|
7073
|
-
|
|
7074
|
-
|
|
7075
|
-
|
|
7076
|
-
|
|
7077
|
-
|
|
7078
|
-
|
|
7079
|
-
|
|
7080
|
-
|
|
7081
|
-
|
|
7082
|
-
|
|
7083
|
-
})(
|
|
7084
|
-
var
|
|
7085
|
-
((
|
|
7086
|
-
|
|
7087
|
-
|
|
7088
|
-
|
|
7089
|
-
|
|
7090
|
-
|
|
7091
|
-
|
|
7092
|
-
})(
|
|
7112
|
+
var CliRenderEvents2;
|
|
7113
|
+
((CliRenderEvents) => {
|
|
7114
|
+
CliRenderEvents["RESIZE"] = "resize";
|
|
7115
|
+
CliRenderEvents["FRAME"] = "frame";
|
|
7116
|
+
CliRenderEvents["RENDER_ERROR"] = "render:error";
|
|
7117
|
+
CliRenderEvents["HANDLER_ERROR"] = "handler:error";
|
|
7118
|
+
CliRenderEvents["EXTERNAL_OUTPUT"] = "external_output";
|
|
7119
|
+
CliRenderEvents["FOCUS"] = "focus";
|
|
7120
|
+
CliRenderEvents["BLUR"] = "blur";
|
|
7121
|
+
CliRenderEvents["FOCUSED_RENDERABLE"] = "focused_renderable";
|
|
7122
|
+
CliRenderEvents["FOCUSED_EDITOR"] = "focused_editor";
|
|
7123
|
+
CliRenderEvents["THEME_MODE"] = "theme_mode";
|
|
7124
|
+
CliRenderEvents["PALETTE"] = "palette";
|
|
7125
|
+
CliRenderEvents["CAPABILITIES"] = "capabilities";
|
|
7126
|
+
CliRenderEvents["SELECTION"] = "selection";
|
|
7127
|
+
CliRenderEvents["DEBUG_OVERLAY_TOGGLE"] = "debugOverlay:toggle";
|
|
7128
|
+
CliRenderEvents["DESTROY"] = "destroy";
|
|
7129
|
+
CliRenderEvents["MEMORY_SNAPSHOT"] = "memory:snapshot";
|
|
7130
|
+
})(CliRenderEvents2 ||= {});
|
|
7131
|
+
var RendererControlState2;
|
|
7132
|
+
((RendererControlState) => {
|
|
7133
|
+
RendererControlState["IDLE"] = "idle";
|
|
7134
|
+
RendererControlState["AUTO_STARTED"] = "auto_started";
|
|
7135
|
+
RendererControlState["EXPLICIT_STARTED"] = "explicit_started";
|
|
7136
|
+
RendererControlState["EXPLICIT_PAUSED"] = "explicit_paused";
|
|
7137
|
+
RendererControlState["EXPLICIT_SUSPENDED"] = "explicit_suspended";
|
|
7138
|
+
RendererControlState["EXPLICIT_STOPPED"] = "explicit_stopped";
|
|
7139
|
+
})(RendererControlState2 ||= {});
|
|
7093
7140
|
var CLICK_REPEAT_INTERVAL_MS = 500;
|
|
7094
7141
|
|
|
7095
|
-
class
|
|
7142
|
+
class CliRenderer2 extends EventEmitter5 {
|
|
7096
7143
|
static animationFrameId = 0;
|
|
7097
7144
|
lib;
|
|
7098
7145
|
rendererPtr;
|
|
@@ -7127,7 +7174,7 @@ class CliRenderer extends EventEmitter5 {
|
|
|
7127
7174
|
frameTimes = [];
|
|
7128
7175
|
maxStatSamples = 300;
|
|
7129
7176
|
postProcessFns = [];
|
|
7130
|
-
backgroundColor =
|
|
7177
|
+
backgroundColor = RGBA2.fromInts(0, 0, 0, 0);
|
|
7131
7178
|
waitingForPixelResolution = false;
|
|
7132
7179
|
pixelResolutionRequeryPending = false;
|
|
7133
7180
|
clock;
|
|
@@ -7143,6 +7190,7 @@ class CliRenderer extends EventEmitter5 {
|
|
|
7143
7190
|
minTargetFrameTime = 1000 / this._maxFps;
|
|
7144
7191
|
immediateRerenderRequested = false;
|
|
7145
7192
|
updateScheduled = false;
|
|
7193
|
+
updateGeneration = 0;
|
|
7146
7194
|
liveRequestCounter = 0;
|
|
7147
7195
|
_controlState = "idle" /* IDLE */;
|
|
7148
7196
|
frameCallbacks = [];
|
|
@@ -7153,7 +7201,7 @@ class CliRenderer extends EventEmitter5 {
|
|
|
7153
7201
|
frameCallbackTime: 0
|
|
7154
7202
|
};
|
|
7155
7203
|
debugOverlay = {
|
|
7156
|
-
enabled:
|
|
7204
|
+
enabled: env2.OTUI_SHOW_STATS,
|
|
7157
7205
|
corner: 3 /* bottomRight */
|
|
7158
7206
|
};
|
|
7159
7207
|
_console;
|
|
@@ -7165,6 +7213,8 @@ class CliRenderer extends EventEmitter5 {
|
|
|
7165
7213
|
animationRequest = new Map;
|
|
7166
7214
|
resizeTimeoutId = null;
|
|
7167
7215
|
capabilityTimeoutId = null;
|
|
7216
|
+
kittyTransportTimer = null;
|
|
7217
|
+
kittyTransportMode;
|
|
7168
7218
|
terminalKeepAliveTimer = null;
|
|
7169
7219
|
xtVersionWaiters = new Set;
|
|
7170
7220
|
splitStartupSeedTimeoutId = null;
|
|
@@ -7236,8 +7286,8 @@ class CliRenderer extends EventEmitter5 {
|
|
|
7236
7286
|
themeModeHandler;
|
|
7237
7287
|
idleResolvers = [];
|
|
7238
7288
|
_debugInputs = [];
|
|
7239
|
-
_debugModeEnabled =
|
|
7240
|
-
stdinLogPath =
|
|
7289
|
+
_debugModeEnabled = env2.OTUI_DEBUG;
|
|
7290
|
+
stdinLogPath = env2.OTUI_STDIN_LOG;
|
|
7241
7291
|
handleError = ((error) => {
|
|
7242
7292
|
console.error(error);
|
|
7243
7293
|
if (this._openConsoleOnError) {
|
|
@@ -7246,7 +7296,7 @@ class CliRenderer extends EventEmitter5 {
|
|
|
7246
7296
|
}).bind(this);
|
|
7247
7297
|
dumpOutputCache(optionalMessage = "") {
|
|
7248
7298
|
const cachedLogs = this.console.getCachedLogs();
|
|
7249
|
-
const capturedConsoleOutput =
|
|
7299
|
+
const capturedConsoleOutput = capture2.claimOutput();
|
|
7250
7300
|
const capturedExternalOutputCommits = this.externalOutputQueue.claim();
|
|
7251
7301
|
let capturedExternalOutput = "";
|
|
7252
7302
|
for (const commit of capturedExternalOutputCommits) {
|
|
@@ -7280,7 +7330,7 @@ Captured external output:
|
|
|
7280
7330
|
}
|
|
7281
7331
|
exitHandler = (() => {
|
|
7282
7332
|
this.destroy();
|
|
7283
|
-
if (
|
|
7333
|
+
if (env2.OTUI_DUMP_CAPTURES) {
|
|
7284
7334
|
sleep(100).then(() => {
|
|
7285
7335
|
this.dumpOutputCache(`=== CAPTURED OUTPUT ===
|
|
7286
7336
|
`);
|
|
@@ -7295,8 +7345,7 @@ Captured external output:
|
|
|
7295
7345
|
_detachFeed = null;
|
|
7296
7346
|
_detachFeedError = null;
|
|
7297
7347
|
feedIdleRenderScheduled = false;
|
|
7298
|
-
|
|
7299
|
-
ordinaryFrameWaitControlState = null;
|
|
7348
|
+
feedIdleWaitPending = false;
|
|
7300
7349
|
get controlState() {
|
|
7301
7350
|
return this._controlState;
|
|
7302
7351
|
}
|
|
@@ -7306,12 +7355,16 @@ Captured external output:
|
|
|
7306
7355
|
this.stdout = stdout;
|
|
7307
7356
|
this._usesProcessStdout = stdout === process.stdout;
|
|
7308
7357
|
this.realStdoutWrite = stdout.write;
|
|
7309
|
-
const lib =
|
|
7358
|
+
const lib = resolveRenderLib2();
|
|
7310
7359
|
const useMemoryBufferedOutput = config.bufferedOutput === "memory";
|
|
7311
7360
|
const useFeedOutput = !this._usesProcessStdout && !useMemoryBufferedOutput;
|
|
7312
7361
|
const { screenMode, footerHeight, externalOutputMode } = resolveModes(config);
|
|
7313
7362
|
const initialGeometry = calculateRenderGeometry(screenMode, width, height, footerHeight);
|
|
7314
7363
|
const remoteMode = config.remote ?? (useFeedOutput ? true : undefined);
|
|
7364
|
+
this.kittyTransportMode = config.kittyImageTransport ?? "raw";
|
|
7365
|
+
const transportCode = KITTY_IMAGE_TRANSPORTS.indexOf(this.kittyTransportMode);
|
|
7366
|
+
if (transportCode < 0)
|
|
7367
|
+
throw new TypeError("Invalid kittyImageTransport");
|
|
7315
7368
|
if (rendererTracker.streamOwners.get(stdin)) {
|
|
7316
7369
|
throw new Error("Cannot create CliRenderer: stdin is already used by another CliRenderer");
|
|
7317
7370
|
}
|
|
@@ -7321,7 +7374,7 @@ Captured external output:
|
|
|
7321
7374
|
let feed = null;
|
|
7322
7375
|
if (useFeedOutput) {
|
|
7323
7376
|
try {
|
|
7324
|
-
feed =
|
|
7377
|
+
feed = NativeSpanFeed2.create();
|
|
7325
7378
|
} catch (error) {
|
|
7326
7379
|
throw new Error(`Failed to allocate NativeSpanFeed for custom stdout: ${error instanceof Error ? error.message : String(error)}`);
|
|
7327
7380
|
}
|
|
@@ -7341,13 +7394,14 @@ Captured external output:
|
|
|
7341
7394
|
feed?.close();
|
|
7342
7395
|
throw new Error("Failed to create renderer");
|
|
7343
7396
|
}
|
|
7397
|
+
lib.setKittyImageTransport(rendererPtr, transportCode);
|
|
7344
7398
|
if (config.useThread === undefined)
|
|
7345
7399
|
config.useThread = true;
|
|
7346
7400
|
if (process.platform === "linux")
|
|
7347
7401
|
config.useThread = false;
|
|
7348
7402
|
lib.setUseThread(rendererPtr, config.useThread);
|
|
7349
7403
|
const kittyConfig = config.useKittyKeyboard ?? {};
|
|
7350
|
-
const kittyFlags =
|
|
7404
|
+
const kittyFlags = buildKittyKeyboardFlags2(kittyConfig);
|
|
7351
7405
|
lib.setKittyKeyboardFlags(rendererPtr, kittyFlags);
|
|
7352
7406
|
this._feed = feed;
|
|
7353
7407
|
if (feed) {
|
|
@@ -7357,6 +7411,8 @@ Captured external output:
|
|
|
7357
7411
|
});
|
|
7358
7412
|
});
|
|
7359
7413
|
this._detachFeedError = feed.onError((code) => {
|
|
7414
|
+
if (this.kittyTransportTimer !== null)
|
|
7415
|
+
this.kittyOutputErrorHandler();
|
|
7360
7416
|
console.error(`[CliRenderer] NativeSpanFeed error: code=${code}`);
|
|
7361
7417
|
});
|
|
7362
7418
|
}
|
|
@@ -7391,11 +7447,11 @@ Captured external output:
|
|
|
7391
7447
|
"SIGBREAK",
|
|
7392
7448
|
"SIGBUS"
|
|
7393
7449
|
];
|
|
7394
|
-
this.clipboard = new
|
|
7450
|
+
this.clipboard = new Clipboard2(this.lib, this.rendererPtr);
|
|
7395
7451
|
this.resizeDebounceDelay = config.debounceDelay || 100;
|
|
7396
7452
|
this.targetFps = config.targetFps || 30;
|
|
7397
7453
|
this.maxFps = config.maxFps || 60;
|
|
7398
|
-
this.clock = config.clock ?? new
|
|
7454
|
+
this.clock = config.clock ?? new SystemClock2;
|
|
7399
7455
|
this.themeModeState = new RendererThemeMode({
|
|
7400
7456
|
queryThemeColors: () => {
|
|
7401
7457
|
this.lib.queryThemeColors(this.rendererPtr);
|
|
@@ -7422,7 +7478,7 @@ Captured external output:
|
|
|
7422
7478
|
this.currentRenderBuffer = this.lib.getCurrentBuffer(this.rendererPtr);
|
|
7423
7479
|
this.postProcessFns = config.postProcessFns || [];
|
|
7424
7480
|
this.prependedInputHandlers = config.prependInputHandlers || [];
|
|
7425
|
-
this.root = new
|
|
7481
|
+
this.root = new RootRenderable2(this);
|
|
7426
7482
|
if (this.memorySnapshotInterval > 0) {
|
|
7427
7483
|
this.startMemorySnapshotTimer();
|
|
7428
7484
|
}
|
|
@@ -7433,7 +7489,7 @@ Captured external output:
|
|
|
7433
7489
|
process.on("uncaughtException", this.handleError);
|
|
7434
7490
|
process.on("unhandledRejection", this.handleError);
|
|
7435
7491
|
const useKittyForParsing = kittyConfig !== null;
|
|
7436
|
-
this._keyHandler = new
|
|
7492
|
+
this._keyHandler = new InternalKeyHandler2;
|
|
7437
7493
|
this._keyHandler.on("keypress", (event) => {
|
|
7438
7494
|
if (this.exitOnCtrlC && matchesKeyBinding(event, { name: "c", ctrl: true })) {
|
|
7439
7495
|
process.nextTick(() => {
|
|
@@ -7444,7 +7500,7 @@ Captured external output:
|
|
|
7444
7500
|
});
|
|
7445
7501
|
this.addExitListeners();
|
|
7446
7502
|
const stdinParserMaxBufferBytes = config.stdinParserMaxBufferBytes ?? DEFAULT_STDIN_PARSER_MAX_BUFFER_BYTES;
|
|
7447
|
-
this.stdinParser = new
|
|
7503
|
+
this.stdinParser = new StdinParser2({
|
|
7448
7504
|
timeoutMs: 20,
|
|
7449
7505
|
maxPendingBytes: stdinParserMaxBufferBytes,
|
|
7450
7506
|
armTimeouts: true,
|
|
@@ -7461,7 +7517,7 @@ Captured external output:
|
|
|
7461
7517
|
},
|
|
7462
7518
|
clock: this.clock
|
|
7463
7519
|
});
|
|
7464
|
-
this._console = new
|
|
7520
|
+
this._console = new TerminalConsole2(this, {
|
|
7465
7521
|
...config.consoleOptions ?? {},
|
|
7466
7522
|
clock: this.clock
|
|
7467
7523
|
});
|
|
@@ -7475,20 +7531,21 @@ Captured external output:
|
|
|
7475
7531
|
this._openConsoleOnError = config.openConsoleOnError ?? true;
|
|
7476
7532
|
this._onDestroy = config.onDestroy;
|
|
7477
7533
|
global.requestAnimationFrame = (callback) => {
|
|
7478
|
-
const id =
|
|
7534
|
+
const id = CliRenderer2.animationFrameId++;
|
|
7479
7535
|
this.animationRequest.set(id, callback);
|
|
7480
7536
|
this.requestLive();
|
|
7481
7537
|
return id;
|
|
7482
7538
|
};
|
|
7483
7539
|
global.cancelAnimationFrame = (handle) => {
|
|
7484
|
-
this.animationRequest.delete(handle)
|
|
7540
|
+
if (this.animationRequest.delete(handle))
|
|
7541
|
+
this.dropLive();
|
|
7485
7542
|
};
|
|
7486
7543
|
const window = global.window;
|
|
7487
7544
|
if (!window) {
|
|
7488
7545
|
global.window = {};
|
|
7489
7546
|
}
|
|
7490
7547
|
global.window.requestAnimationFrame = requestAnimationFrame;
|
|
7491
|
-
if (
|
|
7548
|
+
if (env2.OTUI_NO_NATIVE_RENDER) {
|
|
7492
7549
|
this.renderNative = () => {
|
|
7493
7550
|
if (this._splitHeight > 0) {
|
|
7494
7551
|
this.flushStdoutCache(this._splitHeight);
|
|
@@ -7529,8 +7586,9 @@ Captured external output:
|
|
|
7529
7586
|
removeExitListeners() {
|
|
7530
7587
|
if (!this._exitListenersAdded || this.exitSignals.length === 0)
|
|
7531
7588
|
return;
|
|
7589
|
+
const processEvents = process;
|
|
7532
7590
|
this.exitSignals.forEach((signal) => {
|
|
7533
|
-
|
|
7591
|
+
processEvents.removeListener(signal, this.exitHandler);
|
|
7534
7592
|
});
|
|
7535
7593
|
this._exitListenersAdded = false;
|
|
7536
7594
|
}
|
|
@@ -7552,7 +7610,7 @@ Captured external output:
|
|
|
7552
7610
|
get currentFocusedEditor() {
|
|
7553
7611
|
if (!this._currentFocusedRenderable)
|
|
7554
7612
|
return null;
|
|
7555
|
-
if (!
|
|
7613
|
+
if (!isEditBufferRenderable2(this._currentFocusedRenderable))
|
|
7556
7614
|
return null;
|
|
7557
7615
|
return this._currentFocusedRenderable;
|
|
7558
7616
|
}
|
|
@@ -7634,27 +7692,33 @@ Captured external output:
|
|
|
7634
7692
|
}
|
|
7635
7693
|
scheduleRenderAfterFeedIdle() {
|
|
7636
7694
|
const feed = this._feed;
|
|
7637
|
-
if (!feed || this.
|
|
7695
|
+
if (!feed || this._isDestroyed || this._controlState === "explicit_suspended" /* EXPLICIT_SUSPENDED */)
|
|
7638
7696
|
return;
|
|
7639
7697
|
this.feedIdleRenderScheduled = true;
|
|
7698
|
+
if (this.feedIdleWaitPending)
|
|
7699
|
+
return;
|
|
7700
|
+
this.feedIdleWaitPending = true;
|
|
7640
7701
|
feed.idle().then(() => {
|
|
7641
|
-
this.
|
|
7642
|
-
|
|
7643
|
-
|
|
7644
|
-
|
|
7645
|
-
|
|
7646
|
-
if (this._isDestroyed || ordinaryFrameWasWaiting && this._controlState !== ordinaryFrameWaitControlState && (this._controlState === "explicit_paused" /* EXPLICIT_PAUSED */ || this._controlState === "explicit_stopped" /* EXPLICIT_STOPPED */ || this._controlState === "explicit_suspended" /* EXPLICIT_SUSPENDED */)) {
|
|
7647
|
-
this.resolveIdleIfNeeded();
|
|
7702
|
+
this.feedIdleWaitPending = false;
|
|
7703
|
+
if (!this.feedIdleRenderScheduled)
|
|
7704
|
+
return;
|
|
7705
|
+
if (feed.isBackpressured()) {
|
|
7706
|
+
this.scheduleRenderAfterFeedIdle();
|
|
7648
7707
|
return;
|
|
7649
7708
|
}
|
|
7709
|
+
this.feedIdleRenderScheduled = false;
|
|
7650
7710
|
this.scheduleRenderTimer();
|
|
7651
7711
|
this.resolveIdleIfNeeded();
|
|
7652
7712
|
});
|
|
7653
7713
|
}
|
|
7714
|
+
cancelRenderAfterFeedIdle() {
|
|
7715
|
+
if (!this.feedIdleRenderScheduled)
|
|
7716
|
+
return;
|
|
7717
|
+
this.feedIdleRenderScheduled = false;
|
|
7718
|
+
this.immediateRerenderRequested = false;
|
|
7719
|
+
}
|
|
7654
7720
|
handleNativeRenderRejection(status) {
|
|
7655
7721
|
if (status === NATIVE_RENDER_STATUS_SKIPPED && this._feed) {
|
|
7656
|
-
this.ordinaryFrameWaitingForFeed = true;
|
|
7657
|
-
this.ordinaryFrameWaitControlState = this._controlState;
|
|
7658
7722
|
this.scheduleRenderAfterFeedIdle();
|
|
7659
7723
|
return "retryable-skip";
|
|
7660
7724
|
}
|
|
@@ -7696,39 +7760,38 @@ Captured external output:
|
|
|
7696
7760
|
return;
|
|
7697
7761
|
}
|
|
7698
7762
|
if (this._isRunning) {
|
|
7699
|
-
if (!this.rendering && !this.renderTimeout
|
|
7763
|
+
if (!this.rendering && !this.renderTimeout) {
|
|
7700
7764
|
this.scheduleRenderTimer();
|
|
7701
7765
|
}
|
|
7702
7766
|
return;
|
|
7703
7767
|
}
|
|
7704
|
-
if (this.ordinaryFrameWaitingForFeed) {
|
|
7705
|
-
return;
|
|
7706
|
-
}
|
|
7707
7768
|
if (this.rendering) {
|
|
7708
7769
|
this.immediateRerenderRequested = true;
|
|
7709
7770
|
return;
|
|
7710
7771
|
}
|
|
7711
7772
|
if (!this.updateScheduled && !this.renderTimeout) {
|
|
7712
7773
|
this.updateScheduled = true;
|
|
7774
|
+
const generation = ++this.updateGeneration;
|
|
7713
7775
|
const now = this.normalizeClockTime(this.clock.now(), this.lastTime);
|
|
7714
7776
|
const elapsed = this.getElapsedMs(now, this.lastTime);
|
|
7715
7777
|
const delay = Math.max(this.minTargetFrameTime - elapsed, 0);
|
|
7716
7778
|
if (delay === 0) {
|
|
7717
|
-
process.nextTick(() => this.activateFrame());
|
|
7779
|
+
process.nextTick(() => this.activateFrame(generation));
|
|
7718
7780
|
return;
|
|
7719
7781
|
}
|
|
7720
|
-
this.clock.setTimeout(() => this.activateFrame(), delay);
|
|
7782
|
+
this.clock.setTimeout(() => this.activateFrame(generation), delay);
|
|
7721
7783
|
}
|
|
7722
7784
|
}
|
|
7723
|
-
async activateFrame() {
|
|
7724
|
-
if (!this.updateScheduled) {
|
|
7785
|
+
async activateFrame(generation) {
|
|
7786
|
+
if (generation !== this.updateGeneration || !this.updateScheduled) {
|
|
7725
7787
|
this.resolveIdleIfNeeded();
|
|
7726
7788
|
return;
|
|
7727
7789
|
}
|
|
7728
7790
|
try {
|
|
7729
7791
|
await this.loop();
|
|
7730
7792
|
} finally {
|
|
7731
|
-
this.
|
|
7793
|
+
if (generation === this.updateGeneration)
|
|
7794
|
+
this.updateScheduled = false;
|
|
7732
7795
|
this.resolveIdleIfNeeded();
|
|
7733
7796
|
}
|
|
7734
7797
|
}
|
|
@@ -7947,6 +8010,50 @@ Captured external output:
|
|
|
7947
8010
|
get capabilities() {
|
|
7948
8011
|
return this._capabilities;
|
|
7949
8012
|
}
|
|
8013
|
+
get kittyImageTransport() {
|
|
8014
|
+
return this.kittyTransportMode;
|
|
8015
|
+
}
|
|
8016
|
+
set kittyImageTransport(mode) {
|
|
8017
|
+
const code = KITTY_IMAGE_TRANSPORTS.indexOf(mode);
|
|
8018
|
+
if (code < 0)
|
|
8019
|
+
throw new TypeError("Invalid kittyImageTransport");
|
|
8020
|
+
if (this._isDestroyed || mode === this.kittyTransportMode)
|
|
8021
|
+
return;
|
|
8022
|
+
this.kittyTransportMode = mode;
|
|
8023
|
+
this.startKittyTransportPolling();
|
|
8024
|
+
this.lib.setKittyImageTransport(this.rendererPtr, code);
|
|
8025
|
+
this.requestRender();
|
|
8026
|
+
}
|
|
8027
|
+
startKittyTransportPolling() {
|
|
8028
|
+
if (!this._terminalIsSetup || this.kittyTransportMode !== "file" || this.kittyTransportTimer !== null)
|
|
8029
|
+
return;
|
|
8030
|
+
this.stdout.on("error", this.kittyOutputErrorHandler);
|
|
8031
|
+
this.kittyTransportTimer = this.clock.setInterval(() => {
|
|
8032
|
+
if (!this._isDestroyed && this.lib.pollKittyImageTransport(this.rendererPtr))
|
|
8033
|
+
this.requestRender();
|
|
8034
|
+
}, 1000);
|
|
8035
|
+
}
|
|
8036
|
+
get kittyImageTransportStatus() {
|
|
8037
|
+
const [mode, effective, fileState, fallback, pendingFiles, pendingBytes] = this.lib.getKittyImageTransport(this.rendererPtr);
|
|
8038
|
+
return {
|
|
8039
|
+
requested: KITTY_IMAGE_TRANSPORTS[mode],
|
|
8040
|
+
effective: ["raw", "zlib", "png", "file"][effective],
|
|
8041
|
+
fileState: ["disabled", "probing", "ready", "unsupported", "timeout", "io-error", "cancelled"][fileState],
|
|
8042
|
+
fallback: ["none", "not-ready", "unavailable", "budget", "busy", "preparation", "compression"][fallback],
|
|
8043
|
+
pendingFiles,
|
|
8044
|
+
pendingBytes
|
|
8045
|
+
};
|
|
8046
|
+
}
|
|
8047
|
+
cancelKittyImageTransport() {
|
|
8048
|
+
if (this._isDestroyed)
|
|
8049
|
+
return;
|
|
8050
|
+
this.lib.cancelKittyImageTransport(this.rendererPtr, false);
|
|
8051
|
+
this.requestRender();
|
|
8052
|
+
}
|
|
8053
|
+
kittyOutputErrorHandler = () => {
|
|
8054
|
+
if (!this._isDestroyed)
|
|
8055
|
+
this.lib.cancelKittyImageTransport(this.rendererPtr, true);
|
|
8056
|
+
};
|
|
7950
8057
|
triggerNotification(message, title) {
|
|
7951
8058
|
if (this._isDestroyed)
|
|
7952
8059
|
return false;
|
|
@@ -7997,8 +8104,8 @@ Captured external output:
|
|
|
7997
8104
|
enumerable: true,
|
|
7998
8105
|
configurable: true
|
|
7999
8106
|
});
|
|
8000
|
-
const internalRoot = new
|
|
8001
|
-
const publicRoot = new
|
|
8107
|
+
const internalRoot = new RootRenderable2(renderContext);
|
|
8108
|
+
const publicRoot = new BoxRenderable2(renderContext, {
|
|
8002
8109
|
id: `scrollback-surface-root-${surfaceId}`,
|
|
8003
8110
|
position: "absolute",
|
|
8004
8111
|
left: 0,
|
|
@@ -8021,12 +8128,16 @@ Captured external output:
|
|
|
8021
8128
|
let surfaceDestroyed = false;
|
|
8022
8129
|
let hasRendered = false;
|
|
8023
8130
|
let nextCommitStartOnNewLine = startOnNewLine;
|
|
8024
|
-
let backingBuffer =
|
|
8131
|
+
let backingBuffer = OptimizedBuffer2.create(surfaceWidth, surfaceHeight, surfaceWidthMethod, {
|
|
8025
8132
|
id: `scrollback-surface-buffer-${surfaceId}`
|
|
8026
8133
|
});
|
|
8027
8134
|
const destroyListener = () => {
|
|
8028
8135
|
destroySurface();
|
|
8029
8136
|
};
|
|
8137
|
+
const capabilitiesListener = (capabilities) => {
|
|
8138
|
+
snapshotContext.capabilities = capabilities;
|
|
8139
|
+
renderContext.emit("capabilities" /* CAPABILITIES */, capabilities);
|
|
8140
|
+
};
|
|
8030
8141
|
const assertNotDestroyed = () => {
|
|
8031
8142
|
if (surfaceDestroyed) {
|
|
8032
8143
|
throw new Error("ScrollbackSurface is destroyed");
|
|
@@ -8058,7 +8169,7 @@ Captured external output:
|
|
|
8058
8169
|
};
|
|
8059
8170
|
const collectPendingCodeRenderables = (node) => {
|
|
8060
8171
|
const pending = [];
|
|
8061
|
-
if (node instanceof
|
|
8172
|
+
if (node instanceof CodeRenderable2 && node.isHighlighting) {
|
|
8062
8173
|
pending.push(node);
|
|
8063
8174
|
}
|
|
8064
8175
|
for (const child of node.getChildren()) {
|
|
@@ -8115,7 +8226,7 @@ Captured external output:
|
|
|
8115
8226
|
let targetHeight = Math.max(1, surfaceHeight);
|
|
8116
8227
|
if (surfaceWidthMethod !== widthMethod) {
|
|
8117
8228
|
backingBuffer.destroy();
|
|
8118
|
-
backingBuffer =
|
|
8229
|
+
backingBuffer = OptimizedBuffer2.create(width, targetHeight, widthMethod, {
|
|
8119
8230
|
id: `scrollback-surface-buffer-${surfaceId}`
|
|
8120
8231
|
});
|
|
8121
8232
|
} else {
|
|
@@ -8175,7 +8286,7 @@ Captured external output:
|
|
|
8175
8286
|
return;
|
|
8176
8287
|
}
|
|
8177
8288
|
const rowCount = endRowExclusive - startRow;
|
|
8178
|
-
const commitBuffer =
|
|
8289
|
+
const commitBuffer = OptimizedBuffer2.create(surfaceWidth, rowCount, surfaceWidthMethod, {
|
|
8179
8290
|
id: `scrollback-surface-commit-${surfaceId}`
|
|
8180
8291
|
});
|
|
8181
8292
|
try {
|
|
@@ -8198,6 +8309,7 @@ Captured external output:
|
|
|
8198
8309
|
}
|
|
8199
8310
|
surfaceDestroyed = true;
|
|
8200
8311
|
renderer.off("destroy" /* DESTROY */, destroyListener);
|
|
8312
|
+
renderer.off("capabilities" /* CAPABILITIES */, capabilitiesListener);
|
|
8201
8313
|
let destroyError = null;
|
|
8202
8314
|
try {
|
|
8203
8315
|
internalRoot.destroyRecursively();
|
|
@@ -8218,6 +8330,7 @@ Captured external output:
|
|
|
8218
8330
|
}
|
|
8219
8331
|
};
|
|
8220
8332
|
renderer.on("destroy" /* DESTROY */, destroyListener);
|
|
8333
|
+
renderer.on("capabilities" /* CAPABILITIES */, capabilitiesListener);
|
|
8221
8334
|
return {
|
|
8222
8335
|
get renderContext() {
|
|
8223
8336
|
return renderContext;
|
|
@@ -8264,8 +8377,8 @@ Captured external output:
|
|
|
8264
8377
|
snapshotContext.width = snapshotWidth;
|
|
8265
8378
|
snapshotContext.height = snapshotHeight;
|
|
8266
8379
|
snapshotContext.widthMethod = this.widthMethod;
|
|
8267
|
-
snapshotRoot = new
|
|
8268
|
-
snapshotBuffer =
|
|
8380
|
+
snapshotRoot = new RootRenderable2(snapshotContext);
|
|
8381
|
+
snapshotBuffer = OptimizedBuffer2.create(snapshotWidth, snapshotHeight, this.widthMethod, {
|
|
8269
8382
|
id: "scrollback-snapshot-commit"
|
|
8270
8383
|
});
|
|
8271
8384
|
snapshotRoot.add(rootRenderable);
|
|
@@ -8424,8 +8537,8 @@ Captured external output:
|
|
|
8424
8537
|
const lineCells = [...line];
|
|
8425
8538
|
const rowColumns = Math.min(lineCells.length, maxWidth);
|
|
8426
8539
|
const renderedLine = lineCells.slice(0, maxWidth).join("");
|
|
8427
|
-
const snapshotRoot = new
|
|
8428
|
-
const snapshotRenderable = new
|
|
8540
|
+
const snapshotRoot = new RootRenderable2(snapshotContext);
|
|
8541
|
+
const snapshotRenderable = new TextRenderable2(snapshotContext, {
|
|
8429
8542
|
id: "captured-stdout-snapshot",
|
|
8430
8543
|
position: "absolute",
|
|
8431
8544
|
left: 0,
|
|
@@ -8434,7 +8547,7 @@ Captured external output:
|
|
|
8434
8547
|
height: 1,
|
|
8435
8548
|
content: renderedLine
|
|
8436
8549
|
});
|
|
8437
|
-
const snapshotBuffer =
|
|
8550
|
+
const snapshotBuffer = OptimizedBuffer2.create(Math.max(1, rowColumns), 1, this.widthMethod, {
|
|
8438
8551
|
id: "captured-stdout-snapshot"
|
|
8439
8552
|
});
|
|
8440
8553
|
try {
|
|
@@ -8508,7 +8621,7 @@ Captured external output:
|
|
|
8508
8621
|
const forceCommit = forceFooterRepaint && index === lastCommitIndex;
|
|
8509
8622
|
const beginFrame = index === 0;
|
|
8510
8623
|
const finalizeFrame = index === lastCommitIndex;
|
|
8511
|
-
const nativeResult = this.lib.commitSplitFooterSnapshot(this.rendererPtr, commit.snapshot, commit.rowColumns, commit.startOnNewLine, commit.trailingNewline, this.getSplitPinnedRenderOffset(), forceCommit, beginFrame, finalizeFrame);
|
|
8624
|
+
const nativeResult = this.lib.commitSplitFooterSnapshot(this.rendererPtr, commit.snapshot, commit.rowColumns, commit.startOnNewLine, commit.trailingNewline, this.getSplitPinnedRenderOffset(), forceCommit, beginFrame, finalizeFrame, drainAll);
|
|
8512
8625
|
if (nativeResult.status === NATIVE_RENDER_STATUS_SKIPPED) {
|
|
8513
8626
|
nativeBackpressured = true;
|
|
8514
8627
|
break;
|
|
@@ -8849,6 +8962,7 @@ Captured external output:
|
|
|
8849
8962
|
explicitWidthCprActive: true,
|
|
8850
8963
|
startupCursorCprActive
|
|
8851
8964
|
});
|
|
8965
|
+
this.startKittyTransportPolling();
|
|
8852
8966
|
this.lib.setupTerminal(this.rendererPtr, this._screenMode === "alternate-screen");
|
|
8853
8967
|
this._capabilities = this.lib.getTerminalCapabilities(this.rendererPtr);
|
|
8854
8968
|
if (this.debugOverlay.enabled) {
|
|
@@ -9014,6 +9128,14 @@ Captured external output:
|
|
|
9014
9128
|
});
|
|
9015
9129
|
}
|
|
9016
9130
|
handleStdinEvent(event) {
|
|
9131
|
+
if (event.type === "response" && event.sequence.startsWith("\x1B_G")) {
|
|
9132
|
+
const result = this.lib.processKittyImageReply(this.rendererPtr, event.sequence);
|
|
9133
|
+
if (result !== 0) {
|
|
9134
|
+
if (result === 2)
|
|
9135
|
+
this.requestRender();
|
|
9136
|
+
return;
|
|
9137
|
+
}
|
|
9138
|
+
}
|
|
9017
9139
|
if (this._controlState === "explicit_suspended" /* EXPLICIT_SUSPENDED */) {
|
|
9018
9140
|
if (event.type === "response" && isPixelResolutionResponse(event.sequence)) {
|
|
9019
9141
|
this.dispatchSequenceHandlers(event.sequence);
|
|
@@ -9098,7 +9220,7 @@ Captured external output:
|
|
|
9098
9220
|
this.startTerminalKeepAlive();
|
|
9099
9221
|
}
|
|
9100
9222
|
dispatchMouseEvent(target, attributes) {
|
|
9101
|
-
const event = new
|
|
9223
|
+
const event = new MouseEvent2(target, attributes);
|
|
9102
9224
|
this.sendMouseEvent(target, event);
|
|
9103
9225
|
if (this.autoFocus && event.type === "down" && event.button === 0 /* LEFT */ && !event.defaultPrevented) {
|
|
9104
9226
|
let current = target;
|
|
@@ -9135,27 +9257,27 @@ Captured external output:
|
|
|
9135
9257
|
if (this._console.visible) {
|
|
9136
9258
|
const consoleBounds = this._console.bounds;
|
|
9137
9259
|
if (mouseEvent.x >= consoleBounds.x && mouseEvent.x < consoleBounds.x + consoleBounds.width && mouseEvent.y >= consoleBounds.y && mouseEvent.y < consoleBounds.y + consoleBounds.height) {
|
|
9138
|
-
const
|
|
9139
|
-
const handled = this._console.handleMouse(
|
|
9260
|
+
const event = new MouseEvent2(null, mouseEvent);
|
|
9261
|
+
const handled = this._console.handleMouse(event);
|
|
9140
9262
|
if (handled)
|
|
9141
9263
|
return true;
|
|
9142
9264
|
}
|
|
9143
9265
|
}
|
|
9144
9266
|
if (mouseEvent.type === "scroll") {
|
|
9145
|
-
const
|
|
9146
|
-
const
|
|
9267
|
+
const maybeRenderableId = this.hitTest(mouseEvent.x, mouseEvent.y);
|
|
9268
|
+
const maybeRenderable = Renderable2.renderablesByNumber.get(maybeRenderableId);
|
|
9147
9269
|
const fallbackTarget = this._currentFocusedRenderable && !this._currentFocusedRenderable.isDestroyed && this._currentFocusedRenderable.focused ? this._currentFocusedRenderable : null;
|
|
9148
|
-
const scrollTarget =
|
|
9270
|
+
const scrollTarget = maybeRenderable ?? fallbackTarget;
|
|
9149
9271
|
if (scrollTarget) {
|
|
9150
|
-
const
|
|
9151
|
-
this.sendMouseEvent(scrollTarget,
|
|
9272
|
+
const event = new MouseEvent2(scrollTarget, mouseEvent);
|
|
9273
|
+
this.sendMouseEvent(scrollTarget, event);
|
|
9152
9274
|
}
|
|
9153
9275
|
return true;
|
|
9154
9276
|
}
|
|
9155
9277
|
const maybeRenderableId = this.hitTest(mouseEvent.x, mouseEvent.y);
|
|
9156
9278
|
const sameElement = maybeRenderableId === this.lastOverRenderableNum;
|
|
9157
9279
|
this.lastOverRenderableNum = maybeRenderableId;
|
|
9158
|
-
const maybeRenderable =
|
|
9280
|
+
const maybeRenderable = Renderable2.renderablesByNumber.get(maybeRenderableId);
|
|
9159
9281
|
if (mouseEvent.type === "down" && mouseEvent.button === 0 /* LEFT */ && !this.currentSelection?.isDragging && !mouseEvent.modifiers.ctrl) {
|
|
9160
9282
|
const canStartSelection = Boolean(maybeRenderable && maybeRenderable.selectable && !maybeRenderable.isDestroyed && maybeRenderable.shouldStartSelection(mouseEvent.x, mouseEvent.y));
|
|
9161
9283
|
if (canStartSelection && maybeRenderable) {
|
|
@@ -9167,21 +9289,21 @@ Captured external output:
|
|
|
9167
9289
|
if (mouseEvent.type === "drag" && this.currentSelection?.isDragging) {
|
|
9168
9290
|
this.updateSelection(maybeRenderable, mouseEvent.x, mouseEvent.y);
|
|
9169
9291
|
if (maybeRenderable) {
|
|
9170
|
-
const
|
|
9292
|
+
const event = new MouseEvent2(maybeRenderable, {
|
|
9171
9293
|
...mouseEvent,
|
|
9172
9294
|
isDragging: true
|
|
9173
9295
|
});
|
|
9174
|
-
this.sendMouseEvent(maybeRenderable,
|
|
9296
|
+
this.sendMouseEvent(maybeRenderable, event);
|
|
9175
9297
|
}
|
|
9176
9298
|
return true;
|
|
9177
9299
|
}
|
|
9178
9300
|
if (mouseEvent.type === "up" && mouseEvent.button === 0 /* LEFT */ && this.currentSelection?.isDragging) {
|
|
9179
9301
|
if (maybeRenderable) {
|
|
9180
|
-
const
|
|
9302
|
+
const event = new MouseEvent2(maybeRenderable, {
|
|
9181
9303
|
...mouseEvent,
|
|
9182
9304
|
isDragging: true
|
|
9183
9305
|
});
|
|
9184
|
-
this.sendMouseEvent(maybeRenderable,
|
|
9306
|
+
this.sendMouseEvent(maybeRenderable, event);
|
|
9185
9307
|
}
|
|
9186
9308
|
this.finishSelection();
|
|
9187
9309
|
return true;
|
|
@@ -9195,41 +9317,41 @@ Captured external output:
|
|
|
9195
9317
|
}
|
|
9196
9318
|
if (!sameElement && (mouseEvent.type === "drag" || mouseEvent.type === "move")) {
|
|
9197
9319
|
if (this.lastOverRenderable && this.lastOverRenderable !== this.capturedRenderable && !this.lastOverRenderable.isDestroyed) {
|
|
9198
|
-
const
|
|
9320
|
+
const event = new MouseEvent2(this.lastOverRenderable, {
|
|
9199
9321
|
...mouseEvent,
|
|
9200
9322
|
type: "out"
|
|
9201
9323
|
});
|
|
9202
|
-
this.sendMouseEvent(this.lastOverRenderable,
|
|
9324
|
+
this.sendMouseEvent(this.lastOverRenderable, event);
|
|
9203
9325
|
}
|
|
9204
9326
|
this.lastOverRenderable = maybeRenderable;
|
|
9205
9327
|
if (maybeRenderable) {
|
|
9206
|
-
const
|
|
9328
|
+
const event = new MouseEvent2(maybeRenderable, {
|
|
9207
9329
|
...mouseEvent,
|
|
9208
9330
|
type: "over",
|
|
9209
9331
|
source: this.capturedRenderable
|
|
9210
9332
|
});
|
|
9211
|
-
this.sendMouseEvent(maybeRenderable,
|
|
9333
|
+
this.sendMouseEvent(maybeRenderable, event);
|
|
9212
9334
|
}
|
|
9213
9335
|
}
|
|
9214
9336
|
if (this.capturedRenderable && mouseEvent.type !== "up") {
|
|
9215
|
-
const
|
|
9216
|
-
this.sendMouseEvent(this.capturedRenderable,
|
|
9337
|
+
const event = new MouseEvent2(this.capturedRenderable, mouseEvent);
|
|
9338
|
+
this.sendMouseEvent(this.capturedRenderable, event);
|
|
9217
9339
|
return true;
|
|
9218
9340
|
}
|
|
9219
9341
|
if (this.capturedRenderable && mouseEvent.type === "up") {
|
|
9220
|
-
const
|
|
9342
|
+
const event = new MouseEvent2(this.capturedRenderable, {
|
|
9221
9343
|
...mouseEvent,
|
|
9222
9344
|
type: "drag-end"
|
|
9223
9345
|
});
|
|
9224
|
-
this.sendMouseEvent(this.capturedRenderable,
|
|
9225
|
-
this.sendMouseEvent(this.capturedRenderable, new
|
|
9346
|
+
this.sendMouseEvent(this.capturedRenderable, event);
|
|
9347
|
+
this.sendMouseEvent(this.capturedRenderable, new MouseEvent2(this.capturedRenderable, mouseEvent));
|
|
9226
9348
|
if (maybeRenderable) {
|
|
9227
|
-
const
|
|
9349
|
+
const event = new MouseEvent2(maybeRenderable, {
|
|
9228
9350
|
...mouseEvent,
|
|
9229
9351
|
type: "drop",
|
|
9230
9352
|
source: this.capturedRenderable
|
|
9231
9353
|
});
|
|
9232
|
-
this.sendMouseEvent(maybeRenderable,
|
|
9354
|
+
this.sendMouseEvent(maybeRenderable, event);
|
|
9233
9355
|
}
|
|
9234
9356
|
this.lastOverRenderable = this.capturedRenderable;
|
|
9235
9357
|
this.lastOverRenderableNum = this.capturedRenderable.num;
|
|
@@ -9259,7 +9381,7 @@ Captured external output:
|
|
|
9259
9381
|
if (this.capturedRenderable)
|
|
9260
9382
|
return;
|
|
9261
9383
|
const hitId = this.hitTest(this._latestPointer.x, this._latestPointer.y);
|
|
9262
|
-
const hitRenderable =
|
|
9384
|
+
const hitRenderable = Renderable2.renderablesByNumber.get(hitId);
|
|
9263
9385
|
const lastOver = this.lastOverRenderable;
|
|
9264
9386
|
if (lastOver?.num === hitId) {
|
|
9265
9387
|
this.lastOverRenderableNum = hitId;
|
|
@@ -9273,13 +9395,13 @@ Captured external output:
|
|
|
9273
9395
|
modifiers: this._lastPointerModifiers
|
|
9274
9396
|
};
|
|
9275
9397
|
if (lastOver && !lastOver.isDestroyed) {
|
|
9276
|
-
const event = new
|
|
9398
|
+
const event = new MouseEvent2(lastOver, { ...baseEvent, type: "out" });
|
|
9277
9399
|
this.sendMouseEvent(lastOver, event);
|
|
9278
9400
|
}
|
|
9279
9401
|
this.lastOverRenderable = hitRenderable;
|
|
9280
9402
|
this.lastOverRenderableNum = hitId;
|
|
9281
9403
|
if (hitRenderable) {
|
|
9282
|
-
const event = new
|
|
9404
|
+
const event = new MouseEvent2(hitRenderable, {
|
|
9283
9405
|
...baseEvent,
|
|
9284
9406
|
type: "over"
|
|
9285
9407
|
});
|
|
@@ -9293,6 +9415,18 @@ Captured external output:
|
|
|
9293
9415
|
hitTest(x, y) {
|
|
9294
9416
|
return this.lib.checkHit(this.rendererPtr, x, y);
|
|
9295
9417
|
}
|
|
9418
|
+
getLinkIdAt(x, y) {
|
|
9419
|
+
if (this._isDestroyed || !Number.isInteger(x) || !Number.isInteger(y))
|
|
9420
|
+
return 0;
|
|
9421
|
+
const buffer = this.currentRenderBuffer;
|
|
9422
|
+
if (x < 0 || y < 0 || x >= buffer.width || y >= buffer.height)
|
|
9423
|
+
return 0;
|
|
9424
|
+
return getLinkId2(buffer.buffers.attributes[y * buffer.width + x]);
|
|
9425
|
+
}
|
|
9426
|
+
getLinkAt(x, y) {
|
|
9427
|
+
const linkId = this.getLinkIdAt(x, y);
|
|
9428
|
+
return linkId === 0 ? null : this.currentRenderBuffer.lib.linkGetUrl(linkId) || null;
|
|
9429
|
+
}
|
|
9296
9430
|
takeMemorySnapshot() {
|
|
9297
9431
|
if (this._isDestroyed)
|
|
9298
9432
|
return;
|
|
@@ -9407,7 +9541,7 @@ Captured external output:
|
|
|
9407
9541
|
this.processResize(width, height);
|
|
9408
9542
|
}
|
|
9409
9543
|
setBackgroundColor(color) {
|
|
9410
|
-
const parsedColor =
|
|
9544
|
+
const parsedColor = parseColor2(color);
|
|
9411
9545
|
this.lib.setBackgroundColor(this.rendererPtr, parsedColor);
|
|
9412
9546
|
this.backgroundColor = parsedColor;
|
|
9413
9547
|
this.nextRenderBuffer.clear(parsedColor);
|
|
@@ -9460,18 +9594,18 @@ Captured external output:
|
|
|
9460
9594
|
this.lib.dumpOutputBuffer(this.rendererPtr, timestamp);
|
|
9461
9595
|
}
|
|
9462
9596
|
static setCursorPosition(renderer, x, y, visible = true) {
|
|
9463
|
-
const lib =
|
|
9597
|
+
const lib = resolveRenderLib2();
|
|
9464
9598
|
lib.setCursorPosition(renderer.rendererPtr, x, y, visible);
|
|
9465
9599
|
}
|
|
9466
9600
|
static setCursorStyle(renderer, options) {
|
|
9467
|
-
const lib =
|
|
9601
|
+
const lib = resolveRenderLib2();
|
|
9468
9602
|
lib.setCursorStyleOptions(renderer.rendererPtr, options);
|
|
9469
9603
|
if (options.cursor !== undefined) {
|
|
9470
9604
|
renderer._currentMousePointerStyle = options.cursor;
|
|
9471
9605
|
}
|
|
9472
9606
|
}
|
|
9473
9607
|
static setCursorColor(renderer, color) {
|
|
9474
|
-
const lib =
|
|
9608
|
+
const lib = resolveRenderLib2();
|
|
9475
9609
|
lib.setCursorColor(renderer.rendererPtr, color);
|
|
9476
9610
|
}
|
|
9477
9611
|
setCursorPosition(x, y, visible = true) {
|
|
@@ -9512,13 +9646,21 @@ Captured external output:
|
|
|
9512
9646
|
if (this._controlState === "idle" /* IDLE */ && this.liveRequestCounter > 0) {
|
|
9513
9647
|
this._controlState = "auto_started" /* AUTO_STARTED */;
|
|
9514
9648
|
this.internalStart();
|
|
9649
|
+
} else if (this._controlState === "explicit_suspended" /* EXPLICIT_SUSPENDED */ && this._previousControlState === "idle" /* IDLE */) {
|
|
9650
|
+
this._previousControlState = "auto_started" /* AUTO_STARTED */;
|
|
9515
9651
|
}
|
|
9516
9652
|
}
|
|
9517
9653
|
dropLive() {
|
|
9518
|
-
|
|
9654
|
+
if (this.liveRequestCounter === 0)
|
|
9655
|
+
return;
|
|
9656
|
+
this.liveRequestCounter--;
|
|
9657
|
+
if (this.liveRequestCounter === 0 && this._controlState === "explicit_suspended" /* EXPLICIT_SUSPENDED */ && this._previousControlState === "auto_started" /* AUTO_STARTED */) {
|
|
9658
|
+
this._previousControlState = "idle" /* IDLE */;
|
|
9659
|
+
}
|
|
9519
9660
|
if (this._controlState === "auto_started" /* AUTO_STARTED */ && this.liveRequestCounter === 0) {
|
|
9520
9661
|
this._controlState = "idle" /* IDLE */;
|
|
9521
|
-
this.
|
|
9662
|
+
this._isRunning = false;
|
|
9663
|
+
this.resolveIdleIfNeeded();
|
|
9522
9664
|
}
|
|
9523
9665
|
}
|
|
9524
9666
|
start() {
|
|
@@ -9532,6 +9674,7 @@ Captured external output:
|
|
|
9532
9674
|
if (!this._isRunning && !this._isDestroyed) {
|
|
9533
9675
|
this._isRunning = true;
|
|
9534
9676
|
this.updateScheduled = false;
|
|
9677
|
+
this.updateGeneration++;
|
|
9535
9678
|
if (this.memorySnapshotInterval > 0) {
|
|
9536
9679
|
this.startMemorySnapshotTimer();
|
|
9537
9680
|
}
|
|
@@ -9546,6 +9689,7 @@ Captured external output:
|
|
|
9546
9689
|
this._previousControlState = this._controlState;
|
|
9547
9690
|
this._controlState = "explicit_suspended" /* EXPLICIT_SUSPENDED */;
|
|
9548
9691
|
this.updateScheduled = false;
|
|
9692
|
+
this.updateGeneration++;
|
|
9549
9693
|
this.internalPause();
|
|
9550
9694
|
if (this._terminalIsSetup) {
|
|
9551
9695
|
this.clearSplitStartupCursorSeed();
|
|
@@ -9623,6 +9767,7 @@ Captured external output:
|
|
|
9623
9767
|
}
|
|
9624
9768
|
internalPause() {
|
|
9625
9769
|
this._isRunning = false;
|
|
9770
|
+
this.cancelRenderAfterFeedIdle();
|
|
9626
9771
|
if (this.renderTimeout) {
|
|
9627
9772
|
this.clock.clearTimeout(this.renderTimeout);
|
|
9628
9773
|
this.renderTimeout = null;
|
|
@@ -9636,20 +9781,14 @@ Captured external output:
|
|
|
9636
9781
|
this.internalStop();
|
|
9637
9782
|
}
|
|
9638
9783
|
internalStop() {
|
|
9639
|
-
|
|
9640
|
-
|
|
9641
|
-
|
|
9642
|
-
|
|
9643
|
-
|
|
9644
|
-
|
|
9645
|
-
if (this.renderTimeout) {
|
|
9646
|
-
this.clock.clearTimeout(this.renderTimeout);
|
|
9647
|
-
this.renderTimeout = null;
|
|
9648
|
-
}
|
|
9649
|
-
if (!this.rendering) {
|
|
9650
|
-
this.resolveIdleIfNeeded();
|
|
9651
|
-
}
|
|
9784
|
+
this.updateScheduled = false;
|
|
9785
|
+
this.updateGeneration++;
|
|
9786
|
+
this.immediateRerenderRequested = false;
|
|
9787
|
+
if (this.memorySnapshotTimer) {
|
|
9788
|
+
this.clock.clearInterval(this.memorySnapshotTimer);
|
|
9789
|
+
this.memorySnapshotTimer = null;
|
|
9652
9790
|
}
|
|
9791
|
+
this.internalPause();
|
|
9653
9792
|
}
|
|
9654
9793
|
destroy() {
|
|
9655
9794
|
if (this._isDestroyed)
|
|
@@ -9667,12 +9806,20 @@ Captured external output:
|
|
|
9667
9806
|
if (this._destroyCleanupPrepared)
|
|
9668
9807
|
return;
|
|
9669
9808
|
this._destroyCleanupPrepared = true;
|
|
9809
|
+
this.cancelRenderAfterFeedIdle();
|
|
9810
|
+
if (this.kittyTransportTimer !== null) {
|
|
9811
|
+
this.clock.clearInterval(this.kittyTransportTimer);
|
|
9812
|
+
this.kittyTransportTimer = null;
|
|
9813
|
+
this.stdout.off("error", this.kittyOutputErrorHandler);
|
|
9814
|
+
this.lib.cancelKittyImageTransport(this.rendererPtr, false);
|
|
9815
|
+
}
|
|
9816
|
+
const processEvents = process;
|
|
9670
9817
|
if (this._usesProcessStdout) {
|
|
9671
|
-
|
|
9818
|
+
processEvents.removeListener("SIGWINCH", this.sigwinchHandler);
|
|
9672
9819
|
}
|
|
9673
|
-
|
|
9674
|
-
|
|
9675
|
-
|
|
9820
|
+
processEvents.removeListener("uncaughtException", this.handleError);
|
|
9821
|
+
processEvents.removeListener("unhandledRejection", this.handleError);
|
|
9822
|
+
processEvents.removeListener("warning", this.warningHandler);
|
|
9676
9823
|
this.removeExitListeners();
|
|
9677
9824
|
if (this.resizeTimeoutId !== null) {
|
|
9678
9825
|
this.clock.clearTimeout(this.resizeTimeoutId);
|
|
@@ -9790,7 +9937,7 @@ Captured external output:
|
|
|
9790
9937
|
}
|
|
9791
9938
|
rendererTracker.renderers.delete(this);
|
|
9792
9939
|
if (rendererTracker.renderers.size === 0) {
|
|
9793
|
-
|
|
9940
|
+
destroyTreeSitterClient2().catch((error) => {
|
|
9794
9941
|
console.error("Failed to destroy tree-sitter client:", error);
|
|
9795
9942
|
});
|
|
9796
9943
|
}
|
|
@@ -9846,6 +9993,11 @@ Captured external output:
|
|
|
9846
9993
|
this.rendering = true;
|
|
9847
9994
|
let renderFailed = false;
|
|
9848
9995
|
try {
|
|
9996
|
+
if (this._feed?.isBackpressured()) {
|
|
9997
|
+
this.handleNativeRenderRejection(NATIVE_RENDER_STATUS_SKIPPED);
|
|
9998
|
+
this.immediateRerenderRequested = false;
|
|
9999
|
+
return;
|
|
10000
|
+
}
|
|
9849
10001
|
this._frameId++;
|
|
9850
10002
|
const now = this.normalizeClockTime(this.clock.now(), this.lastTime);
|
|
9851
10003
|
const elapsed = this.getElapsedMs(now, this.lastTime);
|
|
@@ -9928,7 +10080,7 @@ Captured external output:
|
|
|
9928
10080
|
this.renderTimeout = null;
|
|
9929
10081
|
}
|
|
9930
10082
|
} else if (nativeStatus === "backpressured") {
|
|
9931
|
-
if (!startedWhileRunning || this._isRunning || this.immediateRerenderRequested) {
|
|
10083
|
+
if (!startedWhileRunning || this._isRunning || this.immediateRerenderRequested || this._controlState === "idle" /* IDLE */) {
|
|
9932
10084
|
this.scheduleRenderAfterBackpressure();
|
|
9933
10085
|
}
|
|
9934
10086
|
} else if (nativeStatus === "retryable-skip") {
|
|
@@ -10063,7 +10215,7 @@ Captured external output:
|
|
|
10063
10215
|
return;
|
|
10064
10216
|
this.clearSelectionState();
|
|
10065
10217
|
this.selectionContainers.push(renderable.parent || this.root);
|
|
10066
|
-
this.currentSelection = new
|
|
10218
|
+
this.currentSelection = new Selection2(renderable, { x, y }, { x, y }, behavior);
|
|
10067
10219
|
this.currentSelection.isStart = true;
|
|
10068
10220
|
this.notifySelectablesOfSelectionChange();
|
|
10069
10221
|
}
|
|
@@ -10105,7 +10257,7 @@ Captured external output:
|
|
|
10105
10257
|
if (this.currentSelection?.isDragging) {
|
|
10106
10258
|
const pointer = this._latestPointer;
|
|
10107
10259
|
const maybeRenderableId = this.hitTest(pointer.x, pointer.y);
|
|
10108
|
-
const maybeRenderable =
|
|
10260
|
+
const maybeRenderable = Renderable2.renderablesByNumber.get(maybeRenderableId);
|
|
10109
10261
|
this.updateSelection(maybeRenderable, pointer.x, pointer.y);
|
|
10110
10262
|
}
|
|
10111
10263
|
}
|
|
@@ -10186,7 +10338,7 @@ Captured external output:
|
|
|
10186
10338
|
if (!this._paletteDetector) {
|
|
10187
10339
|
const isTmux = Boolean(this.capabilities?.multiplexer === "tmux" || this.capabilities?.terminal?.name?.toLowerCase()?.includes("tmux"));
|
|
10188
10340
|
const isLegacyTmux = this.capabilities?.terminal?.name?.toLowerCase()?.includes("tmux") && this.capabilities?.terminal?.version?.localeCompare("3.6") < 0;
|
|
10189
|
-
this._paletteDetector =
|
|
10341
|
+
this._paletteDetector = createTerminalPalette2({
|
|
10190
10342
|
stdin: this.stdin,
|
|
10191
10343
|
stdout: this.stdout,
|
|
10192
10344
|
writeFn: (data) => this._isDestroyed ? false : this.writeOut(data),
|
|
@@ -10201,18 +10353,18 @@ Captured external output:
|
|
|
10201
10353
|
return this._paletteDetector;
|
|
10202
10354
|
}
|
|
10203
10355
|
syncNativePaletteState(colors) {
|
|
10204
|
-
const signature =
|
|
10356
|
+
const signature = buildTerminalPaletteSignature2(colors);
|
|
10205
10357
|
if (this._nativePaletteSignature !== signature) {
|
|
10206
10358
|
this._paletteEpoch = this._paletteEpoch + 1 >>> 0;
|
|
10207
10359
|
}
|
|
10208
10360
|
this._nativePaletteSignature = signature;
|
|
10209
|
-
const normalized =
|
|
10361
|
+
const normalized = normalizeTerminalPalette2(colors);
|
|
10210
10362
|
this.lib.rendererSetPaletteState(this.rendererPtr, normalized.palette, normalized.defaultForeground, normalized.defaultBackground, this._paletteEpoch);
|
|
10211
10363
|
}
|
|
10212
10364
|
emitPaletteChange(colors) {
|
|
10213
10365
|
if (this.listenerCount("palette" /* PALETTE */) === 0)
|
|
10214
10366
|
return;
|
|
10215
|
-
const signature =
|
|
10367
|
+
const signature = buildTerminalPaletteSignature2(colors);
|
|
10216
10368
|
if (this._emittedPaletteSignature === signature)
|
|
10217
10369
|
return;
|
|
10218
10370
|
this._emittedPaletteSignature = signature;
|
|
@@ -10318,7 +10470,7 @@ Captured external output:
|
|
|
10318
10470
|
}
|
|
10319
10471
|
}
|
|
10320
10472
|
|
|
10321
|
-
export {
|
|
10473
|
+
export { convertThemeToStyles2, SyntaxStyle2, h2, isVNode2, maybeMakeRenderable2, wrapWithDelegates2, instantiate2, delegate2, LayoutEvents2, RenderableEvents2, isRenderable2, BaseRenderable2, Renderable2, RootRenderable2, TextBufferView2, EditBuffer2, EditorView2, ANSI, BoxRenderable2, TextBufferRenderable2, CodeRenderable2, isTextNodeRenderable2, TextNodeRenderable2, RootTextNodeRenderable2, TextRenderable2, NativeSpanFeed2, defaultKeyAliases, mergeKeyAliases, mergeKeyBindings, getKeyBindingAction, buildKeyBindingsMap, capture2, ConsolePosition2, TerminalConsole2, getObjectsInViewport, EditBufferRenderableEvents2, isEditBufferRenderable2, EditBufferRenderable2, buildKittyKeyboardFlags2, MouseEvent2, MouseButton2, createCliRenderer2, CliRenderEvents2, RendererControlState2, CliRenderer2 };
|
|
10322
10474
|
|
|
10323
|
-
//# debugId=
|
|
10324
|
-
//# sourceMappingURL=chunk-node-
|
|
10475
|
+
//# debugId=EDE4817CFEF779F464756E2164756E21
|
|
10476
|
+
//# sourceMappingURL=chunk-node-54dhb2fr.js.map
|