Skip to content

Add experimental macOS 27 menu bar compatibility - #980

Open
PWB97 wants to merge 12 commits into
jordanbaird:macos-26from
PWB97:codex/macos-27
Open

PWB97 wants to merge 12 commits into
jordanbaird:macos-26from
PWB97:codex/macos-27

Conversation

@PWB97

@PWB97 PWB97 commented Sep 2, 2026

Copy link
Copy Markdown

Summary

Experimental macOS 27 compatibility; current development build: 0.12.0-macos27.128 (1327).

  • Restore native input: only Ice's own status item toggles hiding or opens Ice settings. No macOS 27 global click/hover/scroll proxies or simulated Notification Center gestures.
  • Remove production assessment hiding and MenuBarAgent preference rewriting. An Ice-owned native overflow boundary is withdrawn while expanded/idle to avoid a blank slot.
  • Treat physical menu-bar order as authoritative, including direct Command-drags across Ice. Serialize Layout changes and protect active drag input from boundary withdrawal.
  • Show uniformly spaced, labelled foreground glyphs extracted from real menu-bar captures. Limit capture to Layout and discard stale work.
  • Identify dynamic items by process-local AX equality, confirm withdrawal before removing tiles, and retain Layout-session owner discovery after the last item disappears.
  • Fix the C/Swift fullscreen Space-type ABI and remove ineffective polling. Ordinary toggling does not require Screen Recording.

Validation

  • Release arm64 build 1327 and strict installed-app signature verification passed on macOS 27.0 (26A5425a). The older baseline had a dual-architecture build; this revision's x86_64 slice is not revalidated.
  • 142 focused assertions passed across boundary/drag state, glyph/color/overlay geometry, Space ABI, dynamic identity and owner lifecycle.
  • Installed checks passed for repeated multi-icon Layout ordering, two-way section moves, four scoped native Command-drags with order restoration, native clock activation while Ice remains physically collapsed, and ordinary restart/order preservation.
  • The unchanged fullscreen fix passed two single-display Border/fullscreen round trips in build 1326.
  • Installed input audit found zero Ice-owned event taps; no new Ice/MenuBarAgent crash report appeared in the final tests.
  • Whitespace validation passed. Local SwiftLint 0.65.1 strict full scan reports nine pre-existing style violations, verified against the previous head. This is not an all-green CI claim.

Known limitations — not a stable release

  • Rapid-toggle visual acceptance still fails: native overflow leaves fading remnants during fast clicks. App-side delay improved, but immediate frame-perfect switching is not fixed.
  • An isolated retest of the private menu-bar assertion again broke native clock input and hid an allowed test button. It was released and rejected, not integrated into Ice.
  • The trigger of four earlier system MenuBarAgent input-loop crashes remains unproven. The separate drag cancellation fix is not claimed as their established root cause.
  • Multi-display/fullscreen configurations beyond the tested Border case, arbitrary real SwiftBar scene rebuilds, and all interactive cancellation combinations remain unvalidated.

See MACOS27.md, the installed-build record, and GitHub feedback review. Runtime paths are availability-gated; GPLv3 Thaw attribution is retained. Related reports are not automatically closed by this PR.

Replace assessment hiding and input proxies with Ice-owned native boundaries.
Improve Layout glyphs, serialized ordering, dynamic owner discovery, and drag lifecycle safety.
Fix the C/Swift fullscreen Space ABI and remove ineffective polling.
Add focused regression tests and installed build 1327 QA records.

Rapid-toggle native fade and unproven historical MenuBarAgent crash triggers remain open.
chenhaozjnubit added a commit to chenhaozjnubit/Ice that referenced this pull request Sep 16, 2026
Ice 0.11.x 在 macOS 27 上无法枚举菜单栏 item:macOS 27 移除了"一个图标
一个窗口"的模型,改由 MenuBarAgent 统一渲染整条菜单栏。
CGSGetProcessMenuBarWindowList 只返回 level == 24 的底板窗口,被
.itemsOnly 过滤后结果为空,itemCache 随即被清空,UI 永久停在
"Loading menu bar items…"。

本次直接采用上游现成修复,而非从零重写核心。

  来源:jordanbaird#980
  作者:PWB97
  分支:PWB97/Ice @ codex/macos-27
  归档:https://codeload.github.com/PWB97/Ice/tar.gz/refs/heads/codex/macos-27
  sha256:258779a5efdc5800c41c320cb70ff7ced84eb079adadc71f5d3f9fabef56c94b
  基线:macos-26 @ 6d74d25(即本提交的父提交)

内容:39 个修改 + 12 个新增 + Tests/ + docs/ + MACOS27.md,零删除,
与上游分支逐文件一致。版本 0.12.0-macos27.128 (1327)。

机制(替换原先以窗口为中心的整套实现):
- 以「Ice 控制项 + Ice 自持空白状态项」构成原生边界
- 隐藏 = 撑宽空白项至原生状态区;显示 = 完整撤回空白项
- item 身份与顺序以物理顺序为准,跨区移动走原生拖拽
- 缩略图改为合成截图 + AX frame 裁切 + 前景分离
- 移除全局输入监听、通知中心手势模拟与偏好表改写

上游自述仍未解决:快速连点(90-116ms)残留淡出图标、多显示器与其他
全屏外观配置未验证、MenuBarAgent 输入循环崩溃 4 次未定位。非 stable 级验收。

旁证与本机调查见 docs/macos27/INVESTIGATION.md。
chenhaozjnubit added a commit to chenhaozjnubit/Ice that referenced this pull request Sep 16, 2026
- 记录上游 PR jordanbaird#980 的来源、校验值与机制说明
- 记录已合入的提交 42a2316 与分支状态
- 确认 Xcode 27 / MacOSX27.sdk 为硬性要求(ScreenCapture.swift 用了
  macOS 27 专有的 SCScreenshotConfiguration / captureScreenshot(rect:))
- 记录编译后仍需处理 ad-hoc 签名的 XPC 对端校验(PR jordanbaird#950)与权限重授
- 移除误提交的探针编译产物 probe-menubar,并加入 .gitignore
chenhaozjnubit added a commit to chenhaozjnubit/Ice that referenced this pull request Sep 16, 2026
Ice 0.11.x 在 macOS 27 上无法枚举菜单栏 item:macOS 27 移除了"一个图标
一个窗口"的模型,改由 MenuBarAgent 统一渲染整条菜单栏。
CGSGetProcessMenuBarWindowList 只返回 level == 24 的底板窗口,被
.itemsOnly 过滤后结果为空,itemCache 随即被清空,UI 永久停在
"Loading menu bar items…"。

本次直接采用上游现成修复,而非从零重写核心。

  来源:jordanbaird#980
  作者:PWB97
  分支:PWB97/Ice @ codex/macos-27
  归档:https://codeload.github.com/PWB97/Ice/tar.gz/refs/heads/codex/macos-27
  sha256:258779a5efdc5800c41c320cb70ff7ced84eb079adadc71f5d3f9fabef56c94b
  基线:macos-26 @ 6d74d25(即本提交的父提交)

内容:39 个修改 + 12 个新增 + Tests/ + docs/ + MACOS27.md,零删除,
与上游分支逐文件一致。版本 0.12.0-macos27.128 (1327)。

机制(替换原先以窗口为中心的整套实现):
- 以「Ice 控制项 + Ice 自持空白状态项」构成原生边界
- 隐藏 = 撑宽空白项至原生状态区;显示 = 完整撤回空白项
- item 身份与顺序以物理顺序为准,跨区移动走原生拖拽
- 缩略图改为合成截图 + AX frame 裁切 + 前景分离
- 移除全局输入监听、通知中心手势模拟与偏好表改写

上游自述仍未解决:快速连点(90-116ms)残留淡出图标、多显示器与其他
全屏外观配置未验证、MenuBarAgent 输入循环崩溃 4 次未定位。非 stable 级验收。

旁证与本机调查见 docs/macos27/INVESTIGATION.md。
@cavaldos

Copy link
Copy Markdown

I had fixed https://github.com/cavaldos/Ice

cavaldos pushed a commit to cavaldos/Ice that referenced this pull request Sep 17, 2026
CGSSpaceGetType returns a raw uint32_t, but its Swift declaration returned
the CGSSpaceType enum. Swift reads the returned integer as the enum's case
tag, not its raw value, so isSpaceFullscreen reported a system Space (raw
type 2) as fullscreen and a real fullscreen Space (raw type 4) as not.

Declare the function as returning UInt32 and compare with the raw value.
The fix was found in jordanbaird#980.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@hitripod

Copy link
Copy Markdown

The original author hasn't been active on GitHub for over a year; here's an alternative solution forked from the “Ice” branch.

https://github.com/thaw-app/Thaw

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants