github thaw-app/Thaw 2.1.0-beta.3

pre-release5 hours ago

Hey, we have a Discord! Come say hi: discord.gg/KDfWjWDnR4.

Please report issues at github.com/thaw-app/Thaw/issues.

Thanks to @wiper2 for the spacing report and crash logs, @lucifercraig12345-create for the search freeze, the spacer crash, and the external-drive trigger request, @Chamiu for the dropReverted report, @ppocass for tracing a menu bar that never rendered, @leos for the spacing-restart report, and @balaji-dutt for the stuck-rehide and localized-ghost diagnoses.

Spacing changes no longer kill system services that cannot be brought back, and you can now turn the restart wave off entirely. You can also sort a section alphabetically, remove stale displays from the list, type in the search panel the moment it opens, and reveal a hidden item while an external drive is mounted. Five reported bugs and four more found while fixing them are in here, plus three image-capture performance changes, and three ways automatic layout work used to fight whoever was using the mouse.


Upgrade from 2.1.0-beta.2

  1. Update in place through Sparkle on the beta channel. Stable stays on 2.0.1 until 2.1.0 leaves beta.
  2. No schema or defaults changes. Profiles, saved layouts, and hotkeys carry over untouched.
  3. Spacing changes leave some items alone, and you can turn the wave off. An item whose owner Thaw declines to restart keeps its previous spacing until that app next starts, so the bar can look uneven for a while. "When applying spacing" under Settings, Displays has a "Wait until next restart (no apps restarted)" option that stops Thaw restarting apps for a spacing change at all. FREQUENT_ISSUES.md lists what Thaw will and will not quit.
  4. An app that refuses a quit request is no longer force-terminated. If it is holding an unsaved document, it stays running and keeps its old spacing.

Spacing

  1. Changing menu bar spacing no longer kills system services that cannot be brought back (#1070, thanks @wiper2). The relaunch wave now triages each app first: indexed LaunchAgents restart through launchctl, system binaries with no label and processes with no launchable bundle are left running, and ordinary apps are quit and launched back. Anything left running is dropped from the set the wave waits to reattach.
  2. You can apply a spacing change without restarting your apps (#1071, thanks @leos). "When applying spacing" under Settings, Displays now offers "Wait until next restart (no apps restarted)", which writes the preference and leaves every app running. The new spacing appears the next time each app starts. The "Confirm before relaunching apps" toggle and its save-scope picker only appear when a relaunch wave can actually fire.

Displays

  1. Remove stale displays from the Per Display list (#1054). A Remove control on each disconnected display drops its cached name and settings. A display you connect again reappears on its own.

Menu bar layout

  1. Sort a section alphabetically (#936). Each section heading in Settings, Menu Bar Layout has a Sort A→Z button. Closed apps keep their saved slot, and the order is written to the active profile.
  2. A stuck rehide no longer freezes a position in place (#1079, thanks @balaji-dutt). An app that runs since boot never relaunches, so a failed rehide used to block the item's saved position forever. Thaw now ages that state out after a day.
  3. Localized Control Center ghosts are pruned (#1080, thanks @balaji-dutt). On a non-English system, Control Center's localized name could land in an item identifier and persist forever, duplicating the canonical entries. Thaw now drops those copies when the canonical namespace is present.

Triggers

  1. Reveal a hidden item while an external drive is mounted (#1053, thanks @lucifercraig12345-create for the request, @alvst). A trigger can now match any external drive, an exact case-insensitive drive name, a removable drive, a network volume, or a volume UUID. Thaw observes volume mount, unmount, and rename notifications and reevaluates triggers when mounted volumes change, so an NTFS helper or any drive-tied utility appears while its drive is connected and hides again when it ejects.

Layout work stays out of your way

Three separate ways an automatic batch could work against whoever was using the mouse at the time.

  1. Bulk layout work has one owner. A profile apply, a background re-sort, and a saved-order restore could all run at once and write over each other. Each claims a lease ranked by authority now: a profile you selected supersedes background work and never the reverse, and a superseded batch stops at its next move.
  2. Automatic batches wait for a pause in physical input, and check again between moves, deferring the rest when input resumes. The detector now reads HID timestamps for mouse-down, up, and dragged events across left, right, and other buttons, not just movement and scroll, so a click during a batch is still detected after the button is released.
  3. The cursor stays where you left it. Restoration now runs only when the HID timestamps show no physical pointer input since the operation took ownership, so it no longer warps the pointer back if you moved the mouse mid-batch.

Search

  1. The search panel takes your first keystroke (#969). The field is now first responder as soon as the panel opens, instead of needing a click first.
  2. Typing in the settings search field no longer freezes the app (#1055, thanks @lucifercraig12345-create). Each row in SectionedList re-measured itself on every keystroke. The per-row frame tracking is gone.

Fixes

  1. Adding a spacer to a visible section no longer crashes (#1056, thanks @lucifercraig12345-create). A zero-length status item can stay a synthetic window with no representable window ID. The status item, and now spacers too, start one point wide before taking their intended width.
  2. A move started just after an app updates no longer reverts (#1058, thanks @Chamiu). The isOnScreen bit was trusted without checking where the item actually sat, so a move that had landed was reported as dropReverted. The geometry is checked first.
  3. A menu bar that never renders because of a bad window number is caught rather than acted on (#1060, thanks @ppocass). CGWindowID(exactly:) accepted any value that fit. windowServerID(windowNumber:) rejects zero, negative, and non-representable values.
  4. Clicking one of Apple's own menu bar items opens the right thing. Activation tried AXShowMenu first, but Apple's status items read that as a contextual-menu request. Only AXPress is used now.
  5. Moves resolve their endpoints against live windows. Endpoint validation leaned on persisted PID seeds and title-matched ownership, so a stale endpoint could pass for a current one. refreshMoveEndpoints re-reads the exact windows a move will use, so a failed live resolution rejects the move.

Performance

  1. Menu bar item images refresh off the main actor. refreshImages was nonisolated, which under Approachable Concurrency kept the caller's actor, so the bounds queries, crop, and copies ran on the main thread. They run on the background pool now.
  2. Blink triggers capture only the items they watch. One enabled trigger used to make the live loop capture every concealed item. The cache now takes the identifiers the enabled triggers name and captures those alone. The global "surface items seeking attention" setting is unaffected.
  3. Those captures go out as one request instead of one round trip per watched item.

Don't miss a new Thaw release

NewReleases is sending notifications on new releases.