Unison v0.93.0 - DPI and Layout Fixes
Unison v0.93.0 was published on June 28, 2026, with a practical set of layout, table, dock, and window fixes. The main user impact is better behavior around cached table row heights, dock redraws, Linux frame sizing, and Windows mixed DPI setups.
The full release notes and downloads are on the GitHub release page.
Table layout hooks are now public
The main API addition in Unison v0.93.0 is Table.SyncRowHeights(). This new public method recalculates cached row heights based on the current column widths.
That matters for code that changes table column widths directly. Before this release, the row height recalculation lived inside the three SizeColumns* methods. If an application bypassed those paths, it could adjust columns without running the same cached height update. That is the sort of layout bug that looks random until someone checks the table cache.
With this method exposed, callers can make column changes and then ask the table to sync its cached row heights explicitly. It is a small API surface change, but it makes custom table sizing code less dependent on private behavior.
The release also adds table theme fields that control whether the first and last divider lines are drawn. Both are enabled by default. This gives applications more control over table edge rendering without forcing custom drawing code for a narrow visual case.
Dock and label sizing fixes remove visual drift
The dock header now calls FlushDrawing() after MarkForRedraw() during drag update and drag exit events. The reason is specific: native drag & drop does not provide a continuous redraw loop. Without the flush, the tab insertion indicator could be marked for redraw but still fail to appear at the useful moment.
That fix is not glamorous, but it is the correct kind of UI maintenance. Drag feedback has to show while the user is dragging, not after the event path has already moved on.
LabelContentSizes also gets a text measurement fix. Empty lines now report the same height as lines containing text. Previously, empty text could take its height from the passed in font parameter, while real text used the font from its own TextDecoration. If those fonts differed, line height could drift inside the same label.
The dock divider behavior changes too. The divider position is now clamped only for layout purposes. Earlier behavior could overwrite the stored divider value with the clamped value while the view was being resized. Now, if a user shrinks a view and later grows it back, the divider can restore to the intended position instead of keeping the temporary constrained value.
Linux frame detection avoids stale geometry
The Linux only fixes focus on window frame border widths and resize geometry. Unison now sends _NET_REQUEST_FRAME_EXTENTS only when the window manager advertises support through _NET_SUPPORTED.
That avoids a needless stall during window creation under window managers that ignore the request, including bare xwayland. When the protocol is supported, the wait timeout is longer, which gives a busy window manager more time to respond.
The border width cache is also stricter. Zero placeholder values are no longer treated as valid frame sizes before the window manager reports real data. During pending resize work, the content rect is held at the last known value while waiting for the matching ConfigureNotify. The practical effect is fewer reads of stale window geometry during resize paths.
Windows DPI handling gets cleaned up
The Windows fixes are all about mixed monitor setups. Mouse wheel events now work correctly when the target display is positioned to the left of or above the primary display. That is a common enough desk layout to deserve boring, correct behavior.
Custom cursors are no longer rasterized once at the primary display scale and reused everywhere. Unison now creates a cursor sized for the monitor DPI where it is shown, then refreshes it when a window moves between monitors.
Window resizing across monitors with different DPI values also gets a correction. The calculation for WM_GETDPISCALEDSIZE now scales the client area instead of the whole window rect. The release notes say the old path could overshoot by roughly half the window frame.
Packaged Windows apps now declare Per-Monitor V2 DPI awareness in their manifest, matching the runtime request. This matters because the manifest setting can take precedence. The old system DPI manifest could leave distributed apps blurry or incorrectly scaled on a secondary display.
Where to get it
- Release page: Unison v0.93.0
- Repository: richardwilkes/unison
- Tag:
v0.93.0