diff options
| author | user <user@clank> | 2026-09-02 16:22:03 +0200 |
|---|---|---|
| committer | user <user@clank> | 2026-09-02 16:22:03 +0200 |
| commit | f9986df0da09cc692e168e33ef9ccfab5b9d2faf (patch) | |
| tree | c0cc554269af4260a41eca2c3ea1a56efb4a730f /contrib | |
| parent | pty: fall back to xterm-256color where xterm-ghostty has no terminfo (diff) | |
| download | slosh-f9986df0da09cc692e168e33ef9ccfab5b9d2faf.tar.gz slosh-f9986df0da09cc692e168e33ef9ccfab5b9d2faf.tar.xz slosh-f9986df0da09cc692e168e33ef9ccfab5b9d2faf.zip | |
slosh --install-terminfo: the binary carries its own terminfo entry
The xterm-256color fallback works everywhere; the real entry is
better, and a tarball user on a bare box had no easy way to get it.
The entry is generated from the vendored tree (contrib/terminfo, so
it describes the terminal core we actually ship), compiled with tic,
embedded as bytes, and written to ~/.terminfo under every name it
answers to, letter and Darwin-hashed layouts both. No root, no
package, no conflict with a ghostty installed later. Proven end to
end in a mount namespace: bare box falls back, installs, and the
next pane says xterm-ghostty.
Diffstat (limited to 'contrib')
| -rw-r--r-- | contrib/terminfo/README.md | 34 | ||||
| -rw-r--r-- | contrib/terminfo/gen.zig | 11 | ||||
| -rw-r--r-- | contrib/terminfo/xterm-ghostty.terminfo | bin | 0 -> 3884 bytes | |||
| -rw-r--r-- | contrib/terminfo/xterm-ghostty.ti | 271 |
4 files changed, 316 insertions, 0 deletions
diff --git a/contrib/terminfo/README.md b/contrib/terminfo/README.md new file mode 100644 index 0000000..30d579d --- /dev/null +++ b/contrib/terminfo/README.md @@ -0,0 +1,34 @@ +# The xterm-ghostty terminfo, for machines that have never met ghostty + +Panes advertise `TERM=xterm-ghostty` when the entry resolves, and fall back +to `xterm-256color` when it does not (see `pty_term()` in `src/pty.c`). The +fallback works everywhere; the real entry is better. `slosh +--install-terminfo` writes it into `~/.terminfo`, which is the first place +curses looks, needs no root, and conflicts with no package manager. + +The files here: + +| file | what | +|---|---| +| `gen.zig` | prints the vendored libghostty-vt's terminfo *source* | +| `xterm-ghostty.ti` | that output, committed for review and provenance | +| `xterm-ghostty.terminfo` | the same, compiled with `tic -x`; what the binary embeds | + +The Makefile turns the compiled entry into `build/terminfo.h`, so the binary +carries its own copy: a static tarball on a bare box can fix that box. + +## Regenerating, on a re-vendor + +The entry is generated **from the vendored tree**, so it describes the +terminal core we actually ship, not whatever ghostty is installed here: + +```sh +cd contrib/terminfo +zig build-exe -femit-bin=/tmp/tigen --dep terminfo -Mroot=gen.zig \ + -Mterminfo=../../vendor/libghostty-vt/src/terminfo/main.zig +/tmp/tigen > xterm-ghostty.ti +tic -x -o /tmp/ti xterm-ghostty.ti && cp /tmp/ti/x/xterm-ghostty xterm-ghostty.terminfo +``` + +Commit both outputs. `tic` warning about "older tic versions" is about the +description field and harmless. diff --git a/contrib/terminfo/gen.zig b/contrib/terminfo/gen.zig new file mode 100644 index 0000000..8ed817a --- /dev/null +++ b/contrib/terminfo/gen.zig @@ -0,0 +1,11 @@ +//! Print the vendored libghostty-vt's terminfo source to stdout. +//! Run at re-vendor time (see README.md here); the output is committed. +const std = @import("std"); +const terminfo = @import("terminfo"); + +pub fn main(init: std.process.Init) !void { + var buf: [64 * 1024]u8 = undefined; + var w = std.Io.File.stdout().writerStreaming(init.io, &buf); + try terminfo.ghostty.encode(&w.interface); + try w.interface.flush(); +} diff --git a/contrib/terminfo/xterm-ghostty.terminfo b/contrib/terminfo/xterm-ghostty.terminfo Binary files differnew file mode 100644 index 0000000..f41a6d0 --- /dev/null +++ b/contrib/terminfo/xterm-ghostty.terminfo diff --git a/contrib/terminfo/xterm-ghostty.ti b/contrib/terminfo/xterm-ghostty.ti new file mode 100644 index 0000000..92cbd69 --- /dev/null +++ b/contrib/terminfo/xterm-ghostty.ti @@ -0,0 +1,271 @@ +xterm-ghostty|ghostty|Ghostty, + am, + bce, + ccc, + hs, + km, + mc5i, + mir, + msgr, + npc, + xenl, + AX, + Tc, + Su, + XT, + fullkbd, + colors#256, + cols#80, + it#8, + lines#24, + pairs#32767, + acsc=++\,\,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, + Smulx=\E[4:%p1%dm, + Smol=\E[53m, + Rmol=\E[55m, + Setulc=\E[58:2::%p1%{65536}%/%d:%p1%{256}%/%{255}%&%d:%p1%{255}%&%d%;m, + Ss=\E[%p1%d q, + Se=\E[0 q, + Ms=\E]52;%p1%s;%p2%s\007, + Sync=\E[?2026%?%p1%{1}%-%tl%eh%;, + BD=\E[?2004l, + BE=\E[?2004h, + PS=\E[200~, + PE=\E[201~, + XM=\E[?1006;1000%?%p1%{1}%=%th%el%;, + xm=\E[<%i%p3%d;%p1%d;%p2%d;%?%p4%tM%em%;, + RV=\E[>c, + rv=\E\\[[0-9]+;[0-9]+;[0-9]+c, + XR=\E[>0q, + xr=\EP>\\|[ -~]+a\E\\, + Enmg=\E[?69h, + Dsmg=\E[?69l, + Clmg=\E[s, + Cmg=\E[%i%p1%d;%p2%ds, + clear=\E[H\E[2J, + E3=\E[3J, + fe=\E[?1004h, + fd=\E[?1004l, + kxIN=\E[I, + kxOUT=\E[O, + bel=^G, + blink=\E[5m, + bold=\E[1m, + cbt=\E[Z, + civis=\E[?25l, + cnorm=\E[?12l\E[?25h, + cr=\r, + csr=\E[%i%p1%d;%p2%dr, + cub=\E[%p1%dD, + cub1=^H, + cud=\E[%p1%dB, + cud1=^J, + cuf=\E[%p1%dC, + cuf1=\E[C, + cup=\E[%i%p1%d;%p2%dH, + cuu=\E[%p1%dA, + cuu1=\E[A, + cvvis=\E[?12;25h, + dch=\E[%p1%dP, + dch1=\E[P, + dim=\E[2m, + dl=\E[%p1%dM, + dl1=\E[M, + dsl=\E]2;\007, + ech=\E[%p1%dX, + ed=\E[J, + el=\E[K, + el1=\E[1K, + flash=\E[?5h$<100/>\E[?5l, + fsl=^G, + home=\E[H, + hpa=\E[%i%p1%dG, + ht=^I, + hts=\EH, + ich=\E[%p1%d@, + ich1=\E[@, + il=\E[%p1%dL, + il1=\E[L, + ind=\n, + indn=\E[%p1%dS, + initc=\E]4;%p1%d;rgb\:%p2%{255}%*%{1000}%/%2.2X/%p3%{255}%*%{1000}%/%2.2X/%p4%{255}%*%{1000}%/%2.2X\E\\, + invis=\E[8m, + oc=\E]104\007, + op=\E[39;49m, + rc=\E8, + rep=%p1%c\E[%p2%{1}%-%db, + rev=\E[7m, + ri=\EM, + rin=\E[%p1%dT, + ritm=\E[23m, + rmacs=\E(B, + rmam=\E[?7l, + rmcup=\E[?1049l, + rmir=\E[4l, + rmkx=\E[?1l\E>, + rmso=\E[27m, + rmul=\E[24m, + rmxx=\E[29m, + setab=\E[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m, + setaf=\E[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m, + setrgbb=\E[48:2:%p1%d:%p2%d:%p3%dm, + setrgbf=\E[38:2:%p1%d:%p2%d:%p3%dm, + sgr=%?%p9%t\E(0%e\E(B%;\E[0%?%p6%t;1%;%?%p5%t;2%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p7%t;8%;m, + sgr0=\E(B\E[m, + sitm=\E[3m, + smacs=\E(0, + smam=\E[?7h, + smcup=\E[?1049h, + smir=\E[4h, + smkx=\E[?1h\E=, + smso=\E[7m, + smul=\E[4m, + smxx=\E[9m, + tbc=\E[3g, + tsl=\E]2;, + u6=\E[%i%d;%dR, + u7=\E[6n, + u8=\E[?%[;0123456789]c, + u9=\E[c, + vpa=\E[%i%p1%dd, + kDC=\E[3;2~, + kDC3=\E[3;3~, + kDC4=\E[3;4~, + kDC5=\E[3;5~, + kDC6=\E[3;6~, + kDC7=\E[3;7~, + kDN=\E[1;2B, + kDN3=\E[1;3B, + kDN4=\E[1;4B, + kDN5=\E[1;5B, + kDN6=\E[1;6B, + kDN7=\E[1;7B, + kEND=\E[1;2F, + kEND3=\E[1;3F, + kEND4=\E[1;4F, + kEND5=\E[1;5F, + kEND6=\E[1;6F, + kEND7=\E[1;7F, + kHOM=\E[1;2H, + kHOM3=\E[1;3H, + kHOM4=\E[1;4H, + kHOM5=\E[1;5H, + kHOM6=\E[1;6H, + kHOM7=\E[1;7H, + kIC=\E[2;2~, + kIC3=\E[2;3~, + kIC4=\E[2;4~, + kIC5=\E[2;5~, + kIC6=\E[2;6~, + kIC7=\E[2;7~, + kLFT=\E[1;2D, + kLFT3=\E[1;3D, + kLFT4=\E[1;4D, + kLFT5=\E[1;5D, + kLFT6=\E[1;6D, + kLFT7=\E[1;7D, + kNXT=\E[6;2~, + kNXT3=\E[6;3~, + kNXT4=\E[6;4~, + kNXT5=\E[6;5~, + kNXT6=\E[6;6~, + kNXT7=\E[6;7~, + kPRV=\E[5;2~, + kPRV3=\E[5;3~, + kPRV4=\E[5;4~, + kPRV5=\E[5;5~, + kPRV6=\E[5;6~, + kPRV7=\E[5;7~, + kRIT=\E[1;2C, + kRIT3=\E[1;3C, + kRIT4=\E[1;4C, + kRIT5=\E[1;5C, + kRIT6=\E[1;6C, + kRIT7=\E[1;7C, + kUP=\E[1;2A, + kUP3=\E[1;3A, + kUP4=\E[1;4A, + kUP5=\E[1;5A, + kUP6=\E[1;6A, + kUP7=\E[1;7A, + kbs=^?, + kcbt=\E[Z, + kcub1=\EOD, + kcud1=\EOB, + kcuf1=\EOC, + kcuu1=\EOA, + kdch1=\E[3~, + kend=\EOF, + kent=\EOM, + kf1=\EOP, + kf10=\E[21~, + kf11=\E[23~, + kf12=\E[24~, + kf13=\E[1;2P, + kf14=\E[1;2Q, + kf15=\E[1;2R, + kf16=\E[1;2S, + kf17=\E[15;2~, + kf18=\E[17;2~, + kf19=\E[18;2~, + kf2=\EOQ, + kf20=\E[19;2~, + kf21=\E[20;2~, + kf22=\E[21;2~, + kf23=\E[23;2~, + kf24=\E[24;2~, + kf25=\E[1;5P, + kf26=\E[1;5Q, + kf27=\E[1;5R, + kf28=\E[1;5S, + kf29=\E[15;5~, + kf3=\EOR, + kf30=\E[17;5~, + kf31=\E[18;5~, + kf32=\E[19;5~, + kf33=\E[20;5~, + kf34=\E[21;5~, + kf35=\E[23;5~, + kf36=\E[24;5~, + kf37=\E[1;6P, + kf38=\E[1;6Q, + kf39=\E[1;6R, + kf4=\EOS, + kf40=\E[1;6S, + kf41=\E[15;6~, + kf42=\E[17;6~, + kf43=\E[18;6~, + kf44=\E[19;6~, + kf45=\E[20;6~, + kf46=\E[21;6~, + kf47=\E[23;6~, + kf48=\E[24;6~, + kf49=\E[1;3P, + kf5=\E[15~, + kf50=\E[1;3Q, + kf51=\E[1;3R, + kf52=\E[1;3S, + kf53=\E[15;3~, + kf54=\E[17;3~, + kf55=\E[18;3~, + kf56=\E[19;3~, + kf57=\E[20;3~, + kf58=\E[21;3~, + kf59=\E[23;3~, + kf6=\E[17~, + kf60=\E[24;3~, + kf61=\E[1;4P, + kf62=\E[1;4Q, + kf63=\E[1;4R, + kf7=\E[18~, + kf8=\E[19~, + kf9=\E[20~, + khome=\EOH, + kich1=\E[2~, + kind=\E[1;2B, + kmous=\E[<, + knp=\E[6~, + kpp=\E[5~, + kri=\E[1;2A, + rs1=\E]\E\\\Ec, + sc=\E7, |
