refactor: resolve cross-crate integration TODOs and resources discovery

Cleanup pass over items collected in docs/rewrite/INTEGRATION_TODO.md:
- OSC 133 printf-q / percent decoders live once in
  ghostty_vt::string_encoding; ghostty-os re-exports them.
- CursorStyle and clipboard codepoint map entries have one definition
  (ghostty-terminal); ghostty-config now depends on ghostty-terminal.
- ActionKey::docs() trailing blank lines fixed at the source; cli's
  workaround removed (+list-actions --docs still byte-identical).
- x11_color exposes names in original case; cli no longer re-parses
  rgb.txt.
- One cgroup scope wait loop (ghostty_os::cgroup::wait_for_scope).
- Flatpak passwd lookup implemented in ghostty-os via a local pty.
- +version shows the rustc version captured at build time.

Resources: dev builds find <workspace>/resources automatically (keeping
Ghostty's sentinel-file detection and GHOSTTY_RESOURCES_DIR);
scripts/gen-terminfo.sh (just terminfo) regenerates the compiled
terminfo; `just install [PREFIX]` installs binary, share/ghostty,
terminfo, desktop/D-Bus/systemd/metainfo files and icons.

Test Plan:
- cargo test for vt, os, config, input, cli
- diff `+list-keybinds`, `+list-actions --docs`, `+show-config --default`
  against /usr/bin/ghostty
This commit is contained in:
ddidderr committed 2026-10-12 02:08:22 +02:00
1 parent 0c4f0ee412
commit 967e3a176d
24 files changed
+656 -513

No files matched your search

+4 -48
View File
@@ -3,7 +3,6 @@
use std::io::Write;
use ghostty_config::config_struct;
use ghostty_input::binding::ActionKey;
use crate::error::Error;
@@ -35,44 +34,12 @@ pub fn run(args: &[String]) -> Result<u8, Error> {
}
/// `helpgen_actions.generate(.plaintext, show_docs)`.
///
/// TODO(integration): this is a local copy of
/// `ghostty_input::helpgen_actions::generate`. The embedded docs of a few
/// actions in ghostty-input (`adjust_selection`, ...) end with an extra blank
/// line compared to Ghostty's `help_strings`, which adds a stray `" "` line
/// to `--docs` output. Trailing newlines are normalised here; once the data
/// is fixed in ghostty-input this should call `helpgen_actions::generate`.
#[must_use]
pub fn generate_plaintext(show_docs: bool) -> String {
let mut writer = String::new();
let mut stream = String::new();
for &key in ActionKey::ALL {
let name = key.name();
if name.starts_with('_') {
continue;
}
// Write previously stored doc comment below all related actions
if show_docs {
writer.push_str(&stream);
writer.push('\n');
stream.clear();
writer.push_str(name);
writer.push_str(":\n");
for line in key.docs().trim_end_matches('\n').split('\n') {
stream.push_str(" ");
stream.push_str(line);
stream.push('\n');
}
} else {
writer.push_str(name);
writer.push('\n');
}
}
// Write any remaining buffered documentation
writer.push_str(&stream);
writer
ghostty_input::helpgen_actions::generate_string(
ghostty_input::helpgen_actions::Format::Plaintext,
show_docs,
)
}
#[cfg(test)]
@@ -94,15 +61,4 @@ mod tests {
assert!(s.contains(" respectively.\n\njump_to_prompt:\n"));
assert!(s.ends_with('\n'));
}
#[test]
fn matches_input_crate_when_docs_are_clean() {
// The first actions have well-formed docs.
let ours = generate_plaintext(true);
let theirs = ghostty_input::helpgen_actions::generate_string(
ghostty_input::helpgen_actions::Format::Plaintext,
true,
);
assert!(ours.lines().take(100).eq(theirs.lines().take(100)));
}
}
+4 -25
View File
@@ -16,35 +16,14 @@ config_struct! {
}
cli_options!(Options, help);
/// `terminal/res/rgb.txt`, the same file `x11_color` is built from.
///
/// TODO(integration): ghostty-vt's `x11_color` only exposes lookups (and
/// lower-cases the names); expose its key list and use it instead of
/// re-parsing the data here.
const RGB_DATA: &str = include_str!("../../ghostty-vt/src/res/rgb.txt");
/// All X11 color names (with their original spelling) and values. Like the
/// case-insensitive Zig map the first spelling of a name wins.
#[must_use]
pub fn x11_colors() -> Vec<(String, (u8, u8, u8))> {
let mut seen = std::collections::HashSet::new();
let mut out = vec![];
for line in RGB_DATA.split('\n') {
if line.len() < 12 {
continue;
}
let parse = |s: &str| s.trim_matches(' ').parse::<u8>().ok();
let (Some(r), Some(g), Some(b)) =
(parse(&line[0..3]), parse(&line[4..7]), parse(&line[8..11]))
else {
continue;
};
let name = line[12..].trim_matches([' ', '\t', '\n']);
if seen.insert(name.to_ascii_lowercase()) {
out.push((name.to_string(), (r, g, b)));
}
}
out
ghostty_vt::x11_color::names()
.iter()
.map(|(n, c)| ((*n).to_string(), (c.r, c.g, c.b)))
.collect()
}
/// `std.ascii.orderIgnoreCase`.
+1 -5
View File
@@ -41,11 +41,7 @@ pub fn write_version(out: &mut dyn Write, info: &BuildInfo, tty: bool) -> std::i
writeln!(out, "Build Config")?;
// The Zig build prints its compiler version here.
writeln!(
out,
" - Rust version : {}",
option_env!("CARGO_PKG_RUST_VERSION").unwrap_or("unknown")
)?;
writeln!(out, " - Rust version : {}", env!("GHOSTTY_RUSTC_VERSION"))?;
writeln!(out, " - build mode : {}", info.build_mode)?;
writeln!(out, " - app runtime : {}", info.app_runtime)?;
writeln!(out, " - font engine : {}", info.font_backend)?;