Skip to content

Releases: Lv-0/plumb

2.1.3

Choose a tag to compare

@Lv-0 Lv-0 released this 28 Aug 12:04

2.1.3

EN

Fixed: windows no longer get flung to a wrong screen's edge when activated right as the app is restoring them.

  • Root cause of the Raycast reproduction: while Finder was still animating its window restore, the Accessibility read and the window-server bounds sampled different moments. That transient mismatch made the coordinate-space resolver pick a wrong space, the solver concluded "window not at target", and the tile write flung the window onto the main screen's edge where the interruption guard then locked it — off-screen, never centered or tiled.
  • A tile write is now gated on an AX↔CG consistency check: the position solved via the detected space must match the window server's actual bounds (24px quality gate). Mid-transition reads skip the cycle instead of writing; a stable retry judges correctly, and a window already at its target is left alone.
  • New windows now follow the mouse's screen: a window created on the wrong display (e.g. opening Finder from Raycast on the external display while Finder remembered a main-screen frame) is tiled on the display you were operating. Windows you placed yourself are unaffected. New setting newWindowsFollowMouse (default on).
  • Off-screen windows whose center lies outside every display anchor to the mouse's screen instead of whichever display they barely overlap.

465 tests pass. Diagnosis and evidence: docs/fix-plan-finder-tile-misjudgment.md.

中文

修复:应用恢复窗口的瞬间激活它,窗口不再被抛到错误屏幕的边缘。

  • Raycast 复现场景的根因:Finder 还在播放窗口恢复动画时,辅助功能读数与窗口服务器 bounds 采样自不同时刻。这一瞬时偏差让坐标空间推断选错空间,解算得出「窗口不在目标位」,随后的平铺写入把窗口抛到主屏边缘悬空处,又被中断保护锁死——不居中、不平铺。
  • 现在平铺写入前必须通过 AX↔CG 一致性校验:按探测空间解算的位置须与窗口服务器真实 bounds 吻合(24px 质量门)。过渡态读数直接跳过本周期;窗口稳定后的重试判定正确,已就位的窗口不会被惊动。
  • 新窗口跟随鼠标屏:窗口创建在错误屏幕时(如 Finder 记住了主屏 frame,而你在副屏用 Raycast 打开),平铺会落在你操作的屏幕。自行放置过的窗口不受影响。新增设置 newWindowsFollowMouse(默认开启)。
  • 中心落在所有屏幕之外的悬空窗口改为锚定鼠标所在屏,不再按擦边重叠偏置。

465 项测试通过。诊断与证据:docs/fix-plan-finder-tile-misjudgment.md

2.1.2

Choose a tag to compare

@Lv-0 Lv-0 released this 28 Aug 11:09

2.1.2

EN

Fixed: Finder windows no longer get stuck half-tiled.

  • With two overlapping Finder windows, the tiling completion check could borrow an already-tiled sibling window's geometry, wrongly declare the window done and never retry. CG window evidence is now bound to the exact window (identity gate + size-delta gate for occluded windows that macOS drops from the CG list).
  • Windows whose size writes are silently rejected by the app (macOS 26, e.g. some Finder states) now degrade to centered instead of being pinned half-tiled to the tile origin; later tile attempts short-circuit instead of replaying the move-fail-recenter loop.
  • Off-screen / overhanging windows are pulled back to center, and same-app windows across multiple displays are each laid out with their own screen's context (coordinate-space ties now resolve to the canonical global top-left semantics).
  • Same-pattern CGWindowList misuse fixed in the UI snapshot and self-test tooling.

462 tests pass. Plan and evidence: docs/fix-plan-finder-tile-misjudgment.md.

中文

修复:Finder 窗口不再卡在半平铺状态。

  • 两个 Finder 窗口重叠时,平铺完成判定可能借用已平铺兄弟窗口的几何,误判完成且永不重试。CG 窗口证据现在绑定到确切窗口(身份门 + 被遮挡窗口剔除列表的尺寸差分门)。
  • 被应用静默拒绝尺寸写入的窗口(macOS 26 的部分 Finder 状态)改为降级居中,而不是缺一块钉在平铺原点;后续平铺尝试直接短路,不再重演「滑过去—失败—拉回来」。
  • 屏幕外/悬空窗口会被拉回居中;同一应用跨多屏的多窗口各自使用所在屏幕的上下文正确布局(坐标空间平票时回归全局 top-left 规范语义)。
  • UI 截图与自测工具中的同款 CGWindowList 误用一并修复。

462 项测试通过。方案与证据:docs/fix-plan-finder-tile-misjudgment.md

2.1.1

Choose a tag to compare

@Lv-0 Lv-0 released this 28 Aug 01:43

What's new / 本次更新

en

  • Fixed windows that were moved across displays being laid out against the wrong screen after re-activation (reported as "NetEase Cloud Music's first positioning is inaccurate"): the tile/center target is now locked to the screen the window is actually on, using window-server (CG) evidence when AX readings are inconsistent.
  • Fixed the Accessibility permission banner in Settings never appearing.
  • Fixed the app list showing "no matching apps" while the catalog was still loading.
  • The UI snapshot harness no longer touches the real settings store.

Validated with 430 unit tests plus a 5-hour live soak: 1000+ activation rounds across 25+ apps on a dual-display setup, 1053 tile locks, zero write failures, no memory growth.

zh

  • 修复窗口跨显示器移动后重新激活时按错误屏幕排版的问题(即"网易云音乐第一次定位不准"):当 AX 读数与窗口服务器证据不一致时,改用 CG 证据锁定窗口实际所在屏幕,再在该屏上重新解析坐标空间。
  • 修复设置界面的辅助功能权限引导横幅从不显示的问题。
  • 修复应用目录尚在加载时列表误报"没有匹配的应用"的问题。
  • UI 快照工具不再接触真实设置存储。

经过 430 项单元测试与 5 小时真机长跑验证:双显示器环境 25+ 应用、1000+ 轮激活循环、1053 次平铺锁定,零写入失败、无内存增长。

2.1.0

Choose a tag to compare

@Lv-0 Lv-0 released this 27 Aug 08:07

What's new

2.0.69

Choose a tag to compare

@Lv-0 Lv-0 released this 27 Aug 02:32

What's new

2.0.68

Choose a tag to compare

@Lv-0 Lv-0 released this 19 Aug 06:50

What's Changed

  • Fix DMG mount tracking when two DMG volumes share the same name: mounts are now reference-counted per volume and unmount removes by mount-point identity, so installer-window handling stays reliable.
  • Remove the obsolete "hide system apps in picker" setting and clean up its leftover UserDefaults mirror key.
  • Debounce settings persistence while dragging sliders — UI stays live while disk writes are coalesced; pending changes flush immediately when the Settings window closes.
  • Scan nested subfolders at any depth when listing installed apps for the tiling picker.
  • Release safety test now matches the fail-closed curl invocations (--http1.1 --fail-with-body) in the publish script.

Full Changelog: v2.0.67...v2.0.68

2.0.67

Choose a tag to compare

@Lv-0 Lv-0 released this 30 Jul 05:59

Plumb v2.0.67

English

Maintenance rebuild after validating single-instance window-layout stability.

No user-facing behavior changes are included in this release.

This release provides regenerated signed release artifacts following validation of the existing window-layout behavior.

Requires macOS 26 or later.

中文

维护性重构建:已完成单实例窗口布局稳定性验证。

本版本不包含面向用户的功能或行为变更。

本版本重新生成并签名发布构建产物,用于保持发布流程和更新链路的一致性。

需要 macOS 26 或更高版本。

2.0.66

Choose a tag to compare

@Lv-0 Lv-0 released this 30 Jul 03:27

What's new

2.0.65

Choose a tag to compare

@Lv-0 Lv-0 released this 30 Jul 02:56

What's new

2.0.64

Choose a tag to compare

@Lv-0 Lv-0 released this 30 Jul 02:55

What's new