fix(electrobun): load CanvasAddon+ImageAddon AFTER term.open() (fixes _linkifier2 crash)
This commit is contained in:
parent
f4a51ca6c0
commit
aee772aee0
1 changed files with 24 additions and 22 deletions
|
|
@ -50,39 +50,41 @@
|
||||||
|
|
||||||
fitAddon = new FitAddon();
|
fitAddon = new FitAddon();
|
||||||
term.loadAddon(fitAddon);
|
term.loadAddon(fitAddon);
|
||||||
term.loadAddon(new CanvasAddon());
|
// NOTE: CanvasAddon and ImageAddon MUST be loaded AFTER term.open()
|
||||||
|
// because they access _linkifier2 which is created during open()
|
||||||
|
|
||||||
term.loadAddon(new ImageAddon({
|
const openAndLoadAddons = () => {
|
||||||
enableSizeReports: true,
|
term.open(termEl);
|
||||||
sixelSupport: true,
|
// Now safe to load addons that depend on _linkifier2
|
||||||
sixelScrolling: true,
|
try { term.loadAddon(new CanvasAddon()); } catch (e) {
|
||||||
sixelPaletteLimit: 4096,
|
console.warn('[Terminal] CanvasAddon failed:', (e as Error).message);
|
||||||
showPlaceholder: true,
|
|
||||||
}));
|
|
||||||
|
|
||||||
// Defer open if container isn't visible yet (e.g., behind splash)
|
|
||||||
const tryOpen = () => {
|
|
||||||
try {
|
|
||||||
term.open(termEl);
|
|
||||||
fitAddon.fit();
|
|
||||||
} catch (e) {
|
|
||||||
console.warn('[Terminal] open failed, retrying in 500ms:', (e as Error).message);
|
|
||||||
setTimeout(tryOpen, 500);
|
|
||||||
}
|
}
|
||||||
|
try {
|
||||||
|
term.loadAddon(new ImageAddon({
|
||||||
|
enableSizeReports: true,
|
||||||
|
sixelSupport: true,
|
||||||
|
sixelScrolling: true,
|
||||||
|
sixelPaletteLimit: 4096,
|
||||||
|
showPlaceholder: true,
|
||||||
|
}));
|
||||||
|
} catch (e) {
|
||||||
|
console.warn('[Terminal] ImageAddon failed:', (e as Error).message);
|
||||||
|
}
|
||||||
|
fitAddon.fit();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Defer if container isn't visible yet (e.g., behind splash)
|
||||||
if (termEl.offsetParent !== null) {
|
if (termEl.offsetParent !== null) {
|
||||||
tryOpen();
|
openAndLoadAddons();
|
||||||
} else {
|
} else {
|
||||||
// Container not visible — wait for it
|
|
||||||
const observer = new IntersectionObserver((entries) => {
|
const observer = new IntersectionObserver((entries) => {
|
||||||
if (entries[0]?.isIntersecting) {
|
if (entries[0]?.isIntersecting) {
|
||||||
observer.disconnect();
|
observer.disconnect();
|
||||||
tryOpen();
|
openAndLoadAddons();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
observer.observe(termEl);
|
observer.observe(termEl);
|
||||||
// Fallback: try after 2s regardless
|
setTimeout(() => { observer.disconnect(); openAndLoadAddons(); }, 2000);
|
||||||
setTimeout(() => { observer.disconnect(); tryOpen(); }, 2000);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ── Read cursor/scrollback settings ─────────────────────────────────
|
// ── Read cursor/scrollback settings ─────────────────────────────────
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue