Skip to content

Releases: mgelsinger/rivetnotes

v0.4.22

Choose a tag to compare

@mgelsinger mgelsinger released this 05 Jul 23:32

[0.4.22] - 2026-07-05

View

  • Window geometry is remembered across restarts. Rivet now reopens with
    the same position, size, and maximized state it was closed with. The
    placement is checkpointed with the session (every ~7 s and on exit) and
    restored via SetWindowPlacement, so a window closed while minimized
    reopens at its normal size, and one closed maximized reopens maximized
    with its pre-maximize rect intact. If the saved position no longer lands
    on a connected monitor (or the session file was hand-edited into
    nonsense), Rivet falls back to the OS default placement. Always On Top
    was already persisted and continues to work unchanged.

v0.4.21

Choose a tag to compare

@github-actions github-actions released this 04 Jul 20:21

[0.4.21] - 2026-07-04

Fixed

  • Startup failure "Invalid access to memory location (0x800703E6)" on some
    Windows 11 machines
    (#1). The executable shipped without an application
    manifest, so it ran against legacy comctl32 v5.82, where
    InitCommonControlsEx can genuinely fail — and its unreliable error code
    aborted startup with a cryptic message. Rivet now embeds a proper manifest
    (Common Controls v6, Windows 10/11 supportedOS, PerMonitorV2 DPI,
    long-path awareness), treats InitCommonControlsEx failure as non-fatal,
    and reports the failing call by name in every startup error.

v0.4.20

Choose a tag to compare

@github-actions github-actions released this 04 Jul 20:08

[0.4.20] - 2026-07-04

View

  • Zoom In / Out / Reset. Ctrl+= / Ctrl+- / Ctrl+0 (numpad +/-
    work too), plus View-menu items. One zoom level applies to every tab —
    Ctrl+mousewheel zooming is folded back into the shared level so tabs never
    drift apart. The level is persisted in settings.json and clamped to
    Scintilla's -10..20 range.
  • Word count in the status bar. The already-computed per-tab word count
    (250 ms debounce) is now shown as Words: 1,234 between the selection and
    EOL segments. Blank in Large File Mode, where counting is suppressed.

File

  • Reload from Disk. New File-menu command re-reads the active tab's file.
    Asks for confirmation before discarding unsaved changes, preserves the
    caret position (the automatic external-change reload now does too), and is
    grayed out for Untitled tabs.

v0.4.18

Choose a tag to compare

@github-actions github-actions released this 16 Jun 17:42

[0.4.18] - 2026-06-13

Markdown & syntax

  • Language menu (manual syntax override). A new View → Language
    submenu lets you force a lexer per tab — including on an unsaved Untitled
    buffer — so Markdown highlighting (bold # headings, **bold**, etc.) no
    longer requires saving the file as .md first. Auto (by extension) remains
    the default and is restorable at any time; the active tab's language is
    check-marked. Large File Mode still suppresses highlighting.

Editing

  • Enter on a collapsed block no longer types into hidden text. When the
    caret is on a collapsed user-collapse header, pressing Enter now inserts a
    new visible line below the whole collapsed region (caret placed there)
    and leaves the collapse intact, instead of inserting an invisible line inside
    the hidden range. Plain Enter only; Ctrl/Alt+Enter and multi-line selections
    are untouched.

Known issues

  • Markdown ATX (#) heading highlighting still looks slightly off and needs
    style refinement.
  • In dark mode the selected tab renders blue rather than a dark-theme color.

v0.4.16

Choose a tag to compare

@github-actions github-actions released this 16 May 03:44

[0.4.16] - 2026-05-15

  • Killed the click-flash on the Left / Right vertical tab strip. When you
    clicked a tab in dark mode, comctl32 briefly painted the light Explorer
    selection rectangle before our NM_CUSTOMDRAW background overwrote it
    on the next frame. Fixed by calling SetWindowTheme(vertical_tabs, "DarkMode_Explorer" | "Explorer", NULL) from update_tab_host_theme,
    which swaps the comctl32-drawn chrome to the dark variant instead of
    trying to suppress it. (The SetWindowTheme(hwnd, "", "") strip used on
    the top tab control would have re-broken visibility on the ListView, so
    the named-theme path is mandatory here.)
  • New helper dark_mode::apply_explorer_theme(hwnd, dark) wraps the
    light/dark Explorer theme selection.
  • Refreshed the docstring on dark_mode::disable_visual_styles to describe
    the v0.4.12 WM_PAINT reason rather than the abandoned NM_CUSTOMDRAW
    story, and added a "do not use on a LVS_REPORT ListView" warning so
    future-me doesn't repeat the v0.4.13 mistake.
  • Added docs/QA-CHECKLIST.md — a permanent manual-smoke list (top tabs,
    vertical tabs, dark mode toggle, session restore, large file mode, etc.)
    so QA before tagging doesn't depend on skimming prior release notes.

Tab + dark-mode hardening summary (v0.4.9 – v0.4.15)

The patch releases from v0.4.9 through v0.4.15 collectively rebuilt how
the tab strip renders:

  • Top tabs were switched off TCS_OWNERDRAWFIXED so Windows
    auto-sizes each tab to its own filename. The custom paint moved from
    WM_DRAWITEM to a full WM_PAINT subclass (after NM_CUSTOMDRAW
    proved unreliable for SysTabControl32), with visual styles stripped
    via SetWindowTheme.
  • Vertical tabs kept their NM_CUSTOMDRAW path but had two bugs
    fixed: (1) "which row is active?" now consults state.active instead
    of the unreliable nmcd.uItemState & CDIS_SELECTED; (2) the click-flash
    in v0.4.16 above.
  • Several false starts along the way (notably v0.4.13/v0.4.14 making the
    vertical strip invisible by stripping visual styles on a ListView) are
    preserved as individual entries for archaeology.

If you want the executive summary, this is it. Individual entries follow.

v0.4.15

Choose a tag to compare

@github-actions github-actions released this 16 May 03:21

[0.4.15] - 2026-05-15

  • Restored visibility of the Left / Right vertical tab strip (broken in
    v0.4.13, still broken after the v0.4.14 partial revert). Rolled
    handle_vertical_tab_custom_draw back to the v0.4.12 painting model
    (CDRF_NEWFONT | CDRF_NOTIFYPOSTPAINT at CDDS_ITEMPREPAINT, close glyph
    in CDDS_ITEMPOSTPAINT) — letting comctl32 draw the row text again is
    what brings the rows back. The v0.4.13 attempt to fully self-paint and
    return CDRF_SKIPDEFAULT reliably produces a blank ListView on the
    LVS_REPORT + LVS_NOCOLUMNHEADER + LVS_EX_FULLROWSELECT configuration.
  • Fixed the "all tabs appear highlighted" bug at the same time by replacing
    NMLVCUSTOMDRAW.nmcd.uItemState & CDIS_SELECTED (which is unreliable for
    ListView item state — CDIS_SELECTED = 1 collides with LVIS_FOCUSED = 1)
    with a direct doc_index == state.active test. The active doc index is
    the authoritative source of "which tab is selected" used everywhere else
    in the codebase, so only one row paints with selection_bg now.

v0.4.14

Choose a tag to compare

@github-actions github-actions released this 16 May 03:00

[0.4.14] - 2026-05-15

  • Fixed the vertical tab strip (Left / Right placement) rendering completely
    invisible after v0.4.13. v0.4.13 called dark_mode::disable_visual_styles
    on the WC_LISTVIEWW to match the v0.4.11 trick used on WC_TABCONTROLW,
    but ListViews in LVS_REPORT mode rely on visual styles for item layout
    and stripping them collapses row heights so nothing draws. Reverted just
    that one call. The v0.4.13 self-contained CDDS_ITEMPREPAINT paint with
    CDRF_SKIPDEFAULT is kept — that's what actually stops comctl32 from
    drawing themed selection chrome over our paint, and it works correctly
    with visual styles left on for ListViews.

v0.4.13

Choose a tag to compare

@github-actions github-actions released this 16 May 02:47

[0.4.13] - 2026-05-15

  • Fixed the Left / Right vertical tab strip ignoring dark mode: every row
    rendered with the bright selection_bg color (so all open files looked
    selected) and clicking briefly flashed the light-theme Explorer selection
    rectangle on top of the custom paint. Root cause was the same as the v0.4.12
    top-tab fix — comctl32's themed paint was still running on top of our
    NM_CUSTOMDRAW background fill, because the ListView never had visual
    styles stripped and the handler returned CDRF_NEWFONT | CDRF_NOTIFYPOSTPAINT
    (which leaves comctl32 in charge of the text and selection chrome).
  • dark_mode::disable_visual_styles(vertical_tabs) is now called right after
    the ListView is created, and handle_vertical_tab_custom_draw now owns the
    full item paint at CDDS_ITEMPREPAINT — background, label via DrawTextW,
    and the close × glyph — then returns CDRF_SKIPDEFAULT so comctl32 paints
    nothing further. The CDDS_ITEMPOSTPAINT arm is removed.

v0.4.12

Choose a tag to compare

@github-actions github-actions released this 16 May 02:21

[0.4.12] - 2026-05-15

  • Fully took over top tab painting from WM_PAINT in the existing
    top_tabs_subclass_proc instead of trying to coax NM_CUSTOMDRAW into
    rendering on a SysTabControl32. v0.4.11 stripped visual styles, but
    comctl32 still never delivered useful CDDS_ITEMPREPAINT notifications,
    so the strip rendered with the default light theme and the close × was
    invisible. The new paint_top_tab_strip walks tabs via TCM_GETITEMCOUNT
    • TCM_GETITEMRECT, paints background / hover / selected per item using
      the cached tab theme, draws the filename, and renders the close ×
      giving us a real dark tab strip with a visible close glyph that brightens
      on hover.
  • Removed the now-dead handle_top_tab_custom_draw and the matching
    NM_CUSTOMDRAW arm in WM_NOTIFY, plus the unused NMCUSTOMDRAW,
    CDRF_SKIPDEFAULT, GetDC, ReleaseDC imports.

v0.4.11

Choose a tag to compare

@github-actions github-actions released this 16 May 01:59

[0.4.11] - 2026-05-15

  • Fixed top tab strip ignoring dark mode and showing an invisible close ×
    (introduced by the v0.4.10 switch to NM_CUSTOMDRAW). Comctl32's themed
    paint runs ahead of CDRF_SKIPDEFAULT and overwrites our custom paint, so
    SetWindowTheme(top_tabs, "", "") is now called right after the tab control
    is subclassed. With visual styles off, the existing handle_top_tab_custom_draw
    takes full control of background/hover/selected colors plus the close glyph.
  • Lowered the minimum top-tab width from 120 to 80 DPI-scaled px so short
    labels like new 001 no longer get padded out to ~120 px. Long filenames
    still grow naturally.
  • update_tab_host_theme now also invalidates top_tabs so toggling
    View → Dark Mode at runtime repaints the top strip immediately.
  • New dark_mode::disable_visual_styles(hwnd) helper wrapping the
    SetWindowTheme(hwnd, "", "") ffi.