Releases: mgelsinger/rivetnotes
Releases · mgelsinger/rivetnotes
Release list
v0.4.22
[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 viaSetWindowPlacement, 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
[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
InitCommonControlsExcan 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), treatsInitCommonControlsExfailure as non-fatal,
and reports the failing call by name in every startup error.
v0.4.20
[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 insettings.jsonand 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 asWords: 1,234between 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
[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.mdfirst. 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
[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 ourNM_CUSTOMDRAWbackground overwrote it
on the next frame. Fixed by callingSetWindowTheme(vertical_tabs, "DarkMode_Explorer" | "Explorer", NULL)fromupdate_tab_host_theme,
which swaps the comctl32-drawn chrome to the dark variant instead of
trying to suppress it. (TheSetWindowTheme(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/darkExplorertheme selection. - Refreshed the docstring on
dark_mode::disable_visual_stylesto describe
the v0.4.12WM_PAINTreason rather than the abandonedNM_CUSTOMDRAW
story, and added a "do not use on aLVS_REPORTListView" 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_OWNERDRAWFIXEDso Windows
auto-sizes each tab to its own filename. The custom paint moved from
WM_DRAWITEMto a fullWM_PAINTsubclass (afterNM_CUSTOMDRAW
proved unreliable forSysTabControl32), with visual styles stripped
viaSetWindowTheme. - Vertical tabs kept their
NM_CUSTOMDRAWpath but had two bugs
fixed: (1) "which row is active?" now consultsstate.activeinstead
of the unreliablenmcd.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
[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_drawback to the v0.4.12 painting model
(CDRF_NEWFONT | CDRF_NOTIFYPOSTPAINTatCDDS_ITEMPREPAINT, close glyph
inCDDS_ITEMPOSTPAINT) — letting comctl32 draw the row text again is
what brings the rows back. The v0.4.13 attempt to fully self-paint and
returnCDRF_SKIPDEFAULTreliably produces a blank ListView on the
LVS_REPORT + LVS_NOCOLUMNHEADER + LVS_EX_FULLROWSELECTconfiguration. - 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 = 1collides withLVIS_FOCUSED = 1)
with a directdoc_index == state.activetest. The active doc index is
the authoritative source of "which tab is selected" used everywhere else
in the codebase, so only one row paints withselection_bgnow.
v0.4.14
[0.4.14] - 2026-05-15
- Fixed the vertical tab strip (Left / Right placement) rendering completely
invisible after v0.4.13. v0.4.13 calleddark_mode::disable_visual_styles
on theWC_LISTVIEWWto match the v0.4.11 trick used onWC_TABCONTROLW,
but ListViews inLVS_REPORTmode 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-containedCDDS_ITEMPREPAINTpaint with
CDRF_SKIPDEFAULTis 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
[0.4.13] - 2026-05-15
- Fixed the Left / Right vertical tab strip ignoring dark mode: every row
rendered with the brightselection_bgcolor (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_CUSTOMDRAWbackground fill, because the ListView never had visual
styles stripped and the handler returnedCDRF_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, andhandle_vertical_tab_custom_drawnow owns the
full item paint atCDDS_ITEMPREPAINT— background, label viaDrawTextW,
and the close×glyph — then returnsCDRF_SKIPDEFAULTso comctl32 paints
nothing further. TheCDDS_ITEMPOSTPAINTarm is removed.
v0.4.12
[0.4.12] - 2026-05-15
- Fully took over top tab painting from
WM_PAINTin the existing
top_tabs_subclass_procinstead of trying to coaxNM_CUSTOMDRAWinto
rendering on aSysTabControl32. v0.4.11 stripped visual styles, but
comctl32 still never delivered usefulCDDS_ITEMPREPAINTnotifications,
so the strip rendered with the default light theme and the close×was
invisible. The newpaint_top_tab_stripwalks tabs viaTCM_GETITEMCOUNTTCM_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_drawand the matching
NM_CUSTOMDRAWarm inWM_NOTIFY, plus the unusedNMCUSTOMDRAW,
CDRF_SKIPDEFAULT,GetDC,ReleaseDCimports.
v0.4.11
[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 toNM_CUSTOMDRAW). Comctl32's themed
paint runs ahead ofCDRF_SKIPDEFAULTand overwrites our custom paint, so
SetWindowTheme(top_tabs, "", "")is now called right after the tab control
is subclassed. With visual styles off, the existinghandle_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 likenew 001no longer get padded out to ~120 px. Long filenames
still grow naturally. update_tab_host_themenow also invalidatestop_tabsso toggling
View → Dark Mode at runtime repaints the top strip immediately.- New
dark_mode::disable_visual_styles(hwnd)helper wrapping the
SetWindowTheme(hwnd, "", "")ffi.