github fukuyori/wtmux 1.2.5

16 hours ago

[1.2.5] - 2026-03-05

Added

  • [font] suppress_bold config option:
    When the installed Nerd Font lacks a Bold face, the OS font-fallback
    substitutes a non-Nerd-Font Bold face for PUA code points, causing
    Powerline separators and icons to render incorrectly. Setting
    suppress_bold = true tells wtmux never to emit SGR 1 (Bold), keeping
    all glyphs in the Regular face that contains the PUA glyphs.

  • --vt-trace flag: records every raw byte received from the PTY
    to %LOCALAPPDATA%\wtmux\vt_trace.log in hex-dump + UTF-8 annotation
    format. Useful for diagnosing prompt and colour rendering issues.

  • VtParser::feed_char(): new method that routes decoded Unicode
    characters through the parser state machine. Prevents multi-byte UTF-8
    characters from bypassing string-body states (DCS, APC, …) and being
    written directly to the screen buffer.

Fixed

  • SGR 7 (Reverse Video) ignored by renderer — root cause of Powerline
    colour rendering failure:
    oh-my-posh draws every Powerline separator arrow with ESC[7m (Reverse
    Video). AttrFlags::INVERSE was set correctly by the parser but
    apply_attrs_with_selection() never emitted it. Fixed by passing
    ESC[7m plus the original FG/BG colours through to the host terminal,
    letting the host perform the colour swap using its own background colour
    (theme-dependent; cannot be computed inside wtmux).

  • Font config breaking Powerline rendering when family is set:
    Windows Terminal implements OSC 50 and switches to the named font when
    received. If that font lacks Nerd Font / Powerline glyphs the arrows and
    icons break. apply_font_config() no longer emits OSC 50. Font must be
    configured in Windows Terminal's settings.json using a Nerd Font variant.

  • DCS / APC / SOS / PM string sequences not consumed by VT parser:
    ESC P (DCS), ESC _ (APC), ESC X (SOS), and ESC ^ (PM) had no
    handling; the parser fell through to Ground and wrote the body bytes as
    visible characters. Added DcsString, ApcString, SosString, and
    PmString states that consume content until ST (ESC 0x5C) or BEL.

  • Multi-byte UTF-8 characters bypassing parser state machine:
    session::feed_bytes() decoded multi-byte sequences and called
    put_char() directly, skipping the parser. Characters inside DCS/APC
    bodies were therefore rendered on screen instead of being discarded.
    All characters now go through VtParser::feed_char().

  • PUA glyph cell-width tracking (unicode_width returns 0 for PUA):
    Characters in U+E000–U+F8FF were treated as combining characters (width 0)
    and merged into the previous cell. PUA range is now always treated as
    width 1, matching Windows Terminal behaviour.

  • Per-drift-cell MoveTo anchor for PUA glyphs:
    When the host terminal renders a PUA glyph wider than the internal
    tracking width, subsequent cells drift right. Cells containing a PUA
    codepoint now flush their run, emit MoveTo(col_idx), write the glyph,
    and start a fresh run — resetting drift at every PUA glyph boundary.

Don't miss a new wtmux release

NewReleases is sending notifications on new releases.