Skip to content

Releases: charsen/moo-RDM

RDM-ARM 1.4.2 —— Studio Display 常用模式、跨屏匹配与镜像守卫

Choose a tag to compare

@charsen charsen released this 31 Oct 01:47

RDM-ARM 1.4.2 —— Studio Display 常用模式、跨屏匹配与镜像守卫

状态:双源已发布。Gitee(origin)与 GitHub 的 master、dev、tag 1.4.2
与 Release 附件一致。
feat-rdm-usability、dev、master 指向同一提交;build/RDM-ARM-1.4.2-universal.dmg
已 Developer ID 签名、Apple 公证并 staple。

起因

目标是让新接入的 Studio Display 与 BenQ PD2705U 都能稳定使用 2304 × 1296 ⚡️ @ 60 Hz。
Studio Display 的系统模式表原本没有这一档,通过 /Library 下的 scale-resolutions
override 补齐;随后把注意力转到 RDM-ARM 本身的可用性、性能和边界行为。

这一轮从 1.3.0 累积到 1.4.2,没有把中间版本单独发出去。

本轮范围

版本 内容
1.3.0 设置窗口按 tab 懒加载、偏好原地更新;显示配置预设(分辨率/旋转/镜像/排列/亮度);按屏记忆启动恢复与折衷提示;能力审计修正;亮度滑杆、登录时启动、全局快捷键;菜单/动作性能优化;自定义分辨率 CLI 与菜单入口
1.3.1 修复 SLSSetDisplayRotation 在改过分辨率后静默失效:setter 成功后提交一次空显示配置;CFBundleVersion 与版本号拆开
1.3.2 暂时隐藏自定义缩放分辨率入口(实现与自检保留),记入 TODOS;CI 断言帮助里不再出现该参数
1.4.0 Studio Display 常用组(原生 5K/默认/更多空间/更大界面/兼容);单一刷新率时隐藏刷新率子菜单;每屏“匹配另一块显示器”;亮度 25/50/75/100% 快捷档
1.4.1 镜像从屏不再提供单屏分辨率/刷新率/匹配,提示先停止镜像,动作层加守卫;新增“启动时恢复模式”开关;Studio 旋转子菜单加标准支架提示
1.4.2 DisplayNameCache:按显示身份持久化名称,镜像从屏不再退化成“显示器 2”

版本与构建号:1.4.2 (build 8),build.sh / AppInfo.swift / Resources/Info.plist
三处一致。

真机验证

硬件:本机 M4 Max / macOS 27.0.1,Studio Display + BenQ PD2705U。

  • 1.4.1 两回合:针对性 21 项 + 完整回归 51 项,全部通过。
    • 镜像从屏无分辨率/刷新/匹配;主屏保留分辨率;旋转提示;启动恢复 off 不动作、on 生效;设置复选框读写与禁用状态。
    • 单屏切换、双屏同分辨率、镜像/停止、预设、亮度滑杆与快捷档、改分辨率后旋转、跨屏匹配只改目标、自定义分辨率校验、最终模式/排列/旋转/亮度恢复。
  • 1.4.2 两回合:名称专项 10 项 + 核心回归 27 项,全部通过。
    • 在线名称写入缓存 → 镜像后从屏仍为 BenQ PD2705U,菜单标题一致;缓存按身份持久化。
    • 镜像守卫、单屏切换、匹配只改目标、亮度 50%、旋转与最终恢复均正常。
  • 最终自检:--selftest-timing 74 PASS / 1 SKIP;--selftest 通过。
  • 安装态:/Applications/RDM-ARM.app 为 1.4.2 (build 8),两块屏均为 2304 × 1296 ⚡️ @ 60 Hz。

交付物

build/RDM-ARM-1.4.2-universal.dmg
arch      x86_64 arm64
size      3.6M
sha256    57577fdf3a939813a12687e8678e56b1cc11565e10df4f69d7671eb51d41fa3b

spctl:Notarized Developer ID。DMG 内包含 App 与「应用程序」快捷方式。

升级注意

  • Bundle ID 保持 com.mooeen.rdm;1.2.1 的旧域 io.rdmarm.RDM-ARM 仍会在新域为空时一次性迁移。
  • 自定义缩放分辨率入口自 1.3.2 起隐藏;已经写入 /Library 的 scale-resolutions
    override 不受影响,Studio Display 的 2304 × 1296 仍可用。
  • “按屏记忆”默认开启;若不想启动时覆盖在系统设置里手改的模式,关闭
    “启动时恢复模式”即可,重插与唤醒的记忆仍保留。
  • 镜像从屏跟随主屏时序;先“停止镜像”,再改单屏分辨率或做跨屏匹配。
  • Studio Display 标准支架不能旋转;菜单会提示,VESA 版本仍可使用角度。

未做/限制

  • 自定义缩放分辨率重新放出:实现保留,重放前需补管理员写入的真机验证(TODOS)。
  • 预设记录主屏指定:macOS 27 没有公开/可用的私有主屏设置符号(TODOS)。
  • 虚拟屏支持:CGVirtualDisplay + 硬件镜像成本较高,暂不纳入(TODOS)。
  • Mac App Store:当前功能依赖私有 API 与 /Library 提权写入,不适合直接上架;
    要上架需单独的沙盒、公开 API Lite 版。
  • 5K 自定义时序仍受 EDID 描述符 655.35 MHz 像素时钟上限限制。

RDM-ARM 1.2.2 —— 首个签名并公证的版本,交付改为 DMG

Choose a tag to compare

@charsen charsen released this 28 Oct 02:33

RDM-ARM 1.2.2 —— 首个签名并公证的版本,交付物改为 DMG

状态:双源已发布。origin(Gitee)与 github 的分支、tag、Release 与附件一致。

起因

1.2.1 已经发布过,但它的产物是 ad-hoc 签名 + 未公证 的 zip。别人下载后第一次打开会被
Gatekeeper 拦下,提示「已损坏」或「无法验证开发者」,安装说明里还得教用户跑一句
xattr -dr com.apple.quarantine——一个显示器工具不该要求用户先绕过系统安全机制才能用。

这一版把三件事一次做完:Developer ID 签名、Apple 公证、交付物换成 DMG。

版本号必须换:1.2.1 的包已经发出去了,重新签名后同名不同字节会让老 release 的校验和失效。

改了什么

位置 变化
build.sh 新增磁盘映像步骤:stage(App + 应用程序 软链 + 安装说明)→ hdiutil UDZO → 签 DMG → 公证 → staple → SHA256SUMS
build.sh 版本 1.2.1 → 1.2.2;CFBundleVersion 同步递增
build.sh --help 的注释区间从写死的 2,21p 改成按 set -euo pipefail 定位,加注释不会再被静默截断
Tools/package-release.sh 从「打 zip」改成薄封装:调 build.sh、断言 universal 与版本一致、报告 sha256。原来那份 stage/zip 逻辑与 build.sh 重复,删掉
.github/workflows/build.yml 产物上传路径与 artifact 名改 .dmg
Sources/Core/AppInfo.swift version → 1.2.2;bundleIdentifier 从 io.rdmarm.RDM-ARM 改为 com.mooeen.rdm(改包名那轮漏了它)
Resources/Info.plist 版本 1.2.2;键被 PlistBuddy 按字母重排,内容等价

为什么 DMG 的公证顺序不能反

先公证并 staple .app,再打 DMG,最后对 DMG 自己再签一次、再公证一次。

Gatekeeper 评估 DMG 是在用户双击映像那一刻发生的。一个装在未公证映像里的、
本身已经 staple 过的 app,在那一步照样会弹「无法验证开发者」。反过来只公证 App 不公证 DMG,
用户会以为包坏了。

安装说明为什么跟着搬进 DMG

原来它躺在 zip 里。zip 被去掉后,那段说明会一起消失——而其中「本应用没有主窗口,
它是菜单栏应用,打开后请看屏幕顶部菜单栏」是「装了没反应」这类反馈的唯一解释。
所以它搬进了 DMG,同时把「没有签名与公证、请跑 xattr」那段改成按是否公证条件输出:
对已公证的包教用户绕过 Gatekeeper 是有害的。

清理偏好设置那条命令也顺手修了,之前还写着 io.rdmarm.RDM-ARM。

验证

  • codesign --verify --strict 通过;stapler validate 对 DMG 与包内 .app 都通过
    (挂载后验的是包内副本,证明票据随包走)。
  • spctl -a -vv -t open --context context:primary-signature → source=Notarized Developer ID。
  • 包内 Info.plist:1.2.2 / build 1.2.2 / com.mooeen.rdm;lipo 确认 x86_64 arm64。
  • 硬化运行时下实跑 --version 与 -ld(走 DisplayServices 私有路径读真实显示器),均正常。
    Apple 自己签的私有框架不受库校验限制,不需要额外 entitlement。
  • Tools/package-release.sh --no-build 对已出产物复验通过:universal + 版本一致 + sha256。

未验证 / 已知边界

  • 没有跨机验收。 构建机的 Gatekeeper 评估是关闭的(spctl 输出里
    override=security disabled),本机 accepted 只能证明票据存在。
  • Developer ID 证书有效期到 2027-02-01(被 Apple 的 Developer ID CA 根证书卡住,
    不是一年)。到期前要换证书并重新公证。

发布物

项 值
文件 RDM-ARM-1.2.2-universal.dmg
大小 2,409,658 B
sha256 7c02f47cb87e5041ad6004abe74637513c797f3682a06c390dcccce05063bc86
架构 x86_64 + arm64
签名 Developer ID Application: Charsen Fung (S967RUU99W)
公证 已公证,App 与 DMG 均已 staple

包内:RDM-ARM.app、应用程序(软链)、安装说明.txt。

Gitee 侧每个 Release 还会自动附带源码包(1.2.2.zip / 1.2.2.tar.gz),
那是平台行为,不是我们传的,比对哈希时不算进来。

RDM-ARM 1.2.1

Choose a tag to compare

@charsen charsen released this 19 Oct 02:52

1.2.0 发布后收到一个很具体的反馈:接上电视,用 60 Hz 的 1080p 切过去,菜单里刚找到的那个分组就没了;随便改个分辨率,60 Hz 又不见了。

根子在两处。

标准分辨率子菜单按「快不快」决定去留。 上一版只在「某个标准模式比同尺寸 HiDPI 更快」时才单列标准模式。于是用户在 30 Hz 下靠着这个子菜单找到 60 Hz 的 1080p,切过去之后同尺寸 HiDPI 也有 60 了,标准模式不再「更快」,子菜单连同刚找到的入口一起消失。要不要显示是显示器的属性,能不能更快是当前时序的属性——两者不该绑在一起。

私有模式表绕过了可用性开关。 allModes(includeUnusable:) 在开关关着的时候仍然把私有表的模式并了进来。公开枚举那条路径有可用性判定,私有表这条没有——不是漏了门控,是那批记录根本没经过 CoreGraphics,也就不带判定。结果菜单里出现点不动的行:这台电视的链路只在 1× 1080p 下带得动 60 Hz,私有表却给出若干 60 Hz 的 HiDPI 尺寸,点下去 CoreGraphics 报 1001。

改了什么

  • 「标准分辨率(非 HiDPI)」改为无条件生成,只要开着 HiDPI 过滤就存在,不再随当前时序忽隐忽现。当前停在 1× 模式时,打勾落在这个子菜单标题上(主列表里没有任何一条是当前)
  • 分辨率行后缀该尺寸最快的刷新率,形如 1920 × 1080 ⚡️ · 30 Hz。两个并列子菜单的代价是挑分辨率时刷新率不在视野里,很容易落到一个只有 30 Hz 的尺寸上还以为面板做不到 60;点击也一定落到行上写的那个刷新率,否则标签就在骗人
  • 刷新率菜单改用未过滤的模式表。HiDPI 过滤只决定一条记录进哪个列表;人已经坐在 1× 模式上时,他要的是当前几何的刷新率,过滤之后那个菜单会是空的
  • 当前尺寸缺一档更高刷新率时,刷新率菜单底部给出可直接点的跨界条目,形如 60 Hz @ 1920 × 1080。刷新率和时序本来就绑在一起,把代价写进标题比让用户自己去找更直接。只在目标尺寸不比当前小时才出现——拿 2304 × 1296 换 1024 × 768 的 75 Hz 不算「同一块屏更快」
  • 私有表改由「显示 macOS 隐藏的模式」把关。这个开关就叫这个名字,打开的人接受这批模式的代价,关着的人不该在菜单里看到点不动的行

命令行接口没有变化,所以按补丁号走。

装

  1. 把 RDM-ARM.app 拖进「应用程序」
  2. 首次打开会被拦下(提示「已损坏」或「无法验证开发者」)——本应用没有 Apple 开发者签名与公证,只做了 ad-hoc 签名。终端里执行一次即可:
xattr -dr com.apple.quarantine /Applications/RDM-ARM.app
  1. 打开后看屏幕顶部菜单栏的显示器图标——这是菜单栏应用,没有主窗口

校验

SHA-256  4ed8e24ce0556a9b6ad080f8f111f0abe2c4b9ab7ed765fb3c766f4386a569b6
架构      x86_64 arm64(通用二进制)
签名      ad-hoc
系统      macOS 13.0+

--selftest-timing 45 项全过;--selftest --roundtrip 真实切换一次模式并还原通过;CI(macos-14 干净机器)构建通过。GitHub 与 Gitee 两侧附件与本地构建产物哈希一致。

1.2.0

Choose a tag to compare

@charsen charsen released this 18 Oct 15:19

这一版做了什么

1. 审计结果可以给脚本读了

--refresh-audit --json 与 --capabilities --json。文本表只印 8 行是终端可读性限制,
JSON 里 geometries 全量不截断。recommendation.kind 直接给出该走哪条路,
computesOnly 标出这条命令在 Apple 芯片上只算不写——脚本据此跳过,而不是等一次空跑。

rdm-arm --refresh-audit -r 75 --json | jq '.verdict, .recommendation'
rdm-arm --capabilities --json | jq '.link, .nativeCeiling'

--edid --json 现在明确报错(exit 2)并指向 --emit-edid。EDID 是二进制,接受这个
参数再照旧打印文本表才是真的坑。

2. 结论先给「现在就能用」的那条

以前 -r 75 会先讲需要合成时序、要管理员密码的路,而 2048 × 1536 早就列着同一个
75 Hz。现在结论直接说 available now at 2048 × 1536;面板在更大几何上声明过、只是
macOS 不列的,另起一行说明那是切换而不是改写。

3. 「读不到预算」不再冒充「链路够不着」

所有行都是 unknown 时,输出 no link budget to compare against — cannot tell,
而不是替一份没有的测量编一个天花板数字。

4. 自检脱离硬件依赖

--selftest-timing 拆成合成段与真机段:合成段用一个替身面板(首选 DTD 取真实 18 字节)
走完 EDID 解码、重定时、打补丁和整条审计装配链。45 条断言,无头环境下 41 条 + 1 SKIP,
exit 0——CI 第一次能跑这套逻辑。虚拟屏(VM、无头 runner、屏幕共享)不再被判成 EDID 缺陷,
而「整机有 EDID、这个显示器却取不到」仍然算失败。

安装

解压后把 RDM-ARM.app 拖进「应用程序」。首次打开会被 Gatekeeper 拦下(ad-hoc 签名),
按 安装说明.txt 里的一行命令去掉 quarantine 即可。

已知边界

  • Apple 芯片上写 EDID override 仍然无效(1.1.0 的真机结论),--write 在弹密码前拦住,
    退出码 3。时序仍可算、可 --emit-edid 导出。
  • hidden 分支只有合成样本覆盖,本机造不出「EDID 声明但系统未列」的现场。
  • 链路预算读不到时只报「判不了」,不猜数。

RDM-ARM 1.1.0

Choose a tag to compare

@charsen charsen released this 18 Oct 10:37

1.1.0 —— EDID 能力分析

这一版回答一个问题:某些刷新率 macOS 不给,BetterDisplay 却给得出来,差在哪。

新增

  • --edid:读出面板自己声明的全部时序(基准 DTD + CEA 短格式)、厂商/型号/序号、块校验和
  • --capabilities:三方对比「面板声明了什么 / 系统给了什么 / 链路够到多少」
  • --custom-timing:沿用面板已经在用的 blanking 合成时序,只改像素时钟;越限带数字拒绝
    (4K@75 报「约 67 Hz」而不是「做不到」)
  • 菜单每屏新增「EDID 与刷新上限」子菜单
  • --selftest-timing:18 项纯逻辑断言

实测结论(M4 Max / macOS 27 / 外接 4K)

  • 未声明的 CGDisplayModeCreate 符号存在,但连「原样重建当前模式」都返回 NULL
  • 写 /Library/Displays/.../Overrides 写得进、校验得对,系统却不读:热插拔、
    显示器休眠唤醒、整机睡眠唤醒三种触发后,模式表始终不变,实时 EDID 仍是原厂值
  • 所以 Apple 芯片上 --write 在弹管理员密码之前就拒绝(退出码 3),不假装支持;
    Intel 行为保持原样

安装

解压 RDM-ARM-1.1.0-universal.zip,把 RDM-ARM.app 拖进「应用程序」。
应用只做了 ad-hoc 签名、没有公证,首次打开前执行一次:

xattr -dr com.apple.quarantine /Applications/RDM-ARM.app

系统要求 macOS 13.0 或更高;通用二进制(arm64 + x86_64)。

RDM-ARM 1.0.5

Choose a tag to compare

@charsen charsen released this 16 Oct 02:26

这一版把交互收回「点一下就换」:选分辨率不再弹确认框、不再自动还原。

变化

  • 选中即切换:去掉切换后的 15 秒确认框与「不确认就回滚」。以前切一次会闪黑两回,现在点一下就是结果。
  • 去掉全局快捷键:设置里的「快捷键」标签页一并移除。
  • 去掉手动记忆项:菜单里不再有「记住 / 忘记 / 恢复已记住的模式」。自动记忆照旧 —— 换过的分辨率仍按屏记住,重插后自动恢复。
  • 补回 macOS 隐藏的超采样 HiDPI 模式:macOS 会生成比面板像素更多的 HiDPI 模式(例如 2560×1600 的面板上,1920×1200 的 HiDPI 用 3840×2400 渲染再缩回面板),但不通过公开接口返回。本版把它们也列进菜单(带 ⚡️)。实测某台 2560×1600 便携屏可选模式从 46 个增到 55 个。可在设置里关掉。
  • 刷新率菜单不再消失:只有一档刷新率时也照常显示并把那一档打勾,而不是整个藏起来。
  • 默认更克制:默认只列 HiDPI,且不列 macOS 标记为「不可用于桌面 GUI」的模式。

安装

下载 zip,解压后把 RDM-ARM.app 拖进「应用程序」。
首次打开前需要执行一次(本应用只有 ad-hoc 签名,没有开发者签名与公证):

xattr -dr com.apple.quarantine /Applications/RDM-ARM.app

它是菜单栏应用,没有主窗口 —— 打开后请看屏幕顶部的显示器图标。
想切分辨率:点图标 → 你的显示器 → 分辨率 → 选一个;带 ⚡️ 的是 HiDPI 模式。

系统要求:macOS 13.0 或更高。通用二进制(arm64 + x86_64)。

SHA-256:

f818fbbf3c720b6106da28b7a2688ad35300ec4d8f7182a83fd87842a12db252

RDM-ARM 1.0.4(移除配置文件功能)

Choose a tag to compare

@charsen charsen released this 16 Oct 00:31

移除配置文件功能

同事试用后确认:配置文件这套东西实际没人用,却占着菜单和偏好设置的位置。这一版整块去掉。

变化

  • 菜单:去掉「配置文件」子菜单(含「将当前布局存为配置文件…」)
  • 偏好设置:去掉「配置文件」标签页
  • 命令行:去掉 --save / --apply / --list-profiles
  • 顺带:去掉「打开支持文件夹」按钮与 Preferences.supportDirectory —— 那个文件夹此前只用来放 profiles.json,配置文件没了它就只会是个空目录,留着正是项目自己禁止的「点不动的死控件」

每屏模式记忆不受影响:它走的是 Preferences.rememberedModes,与 ProfileStore 无关,重插显示器后仍会自动恢复你选的分辨率。

安装

下载 RDM-ARM-1.0.4-universal.zip(通用二进制,arm64 + x86_64),解压后把 RDM-ARM.app 拖进「应用程序」文件夹。

首次打开会被 macOS 拦下并提示「已损坏」——这是正常的,本应用没有 Apple 开发者签名与公证,只做了 ad-hoc 签名。在「终端」里执行一次即可解除:

xattr -dr com.apple.quarantine /Applications/RDM-ARM.app

它是菜单栏应用、没有主窗口,打开后请看屏幕顶部菜单栏。

系统要求:macOS 13.0 或更高。

校验和

SHA-256  a7fbb36a4aad95f62015aa489b69ec08a2f720bcd27dd5bb4ab1c5150d29e93c
字节数   1448070

RDM-ARM 1.0.3(分辨率/刷新率拆分 · 默认只显示 HiDPI)

Choose a tag to compare

@charsen charsen released this 15 Oct 14:03

这一版改了什么

同事试用后的三条反馈,都做完了。

1. 去掉配置文件的导出与导入

菜单项、偏好设置里的按钮、以及底层实现全部移除,本地化文案一并清理,没有留下死代码。配置文件的保存 / 应用 / 删除不受影响。

2. 分辨率和刷新率分开选

原来是刷新率嵌在每个分辨率下面当二级菜单:同一个分辨率有四个刷新率就占四行,列表很难扫;只想改刷新率还得再钻一层。现在拆成两个并列菜单:

说明
分辨率 只列几何尺寸,每个只出现一次。切换时尽量保留你当前的刷新率——目标分辨率没有这一档,才退回它支持的最高值
刷新率 只列当前这个分辨率支持的档位。当前分辨率只有一个刷新率时,这个菜单整个不出现,而不是显示一个没得选的死菜单

顺带修了一个因拆分才暴露的措辞问题:黑屏保护的描述原本只给分辨率,改刷新率时会报回同一个分辨率,看起来像什么都没发生。现在会带上刷新率,确认框标题也从「保持这个分辨率?」改成「保持这个设置?」。

3. 默认只显示 HiDPI 模式

macOS 报 257 个模式,其中 137 个是 HiDPI——这些才是装 RDM 的理由,但它们和上百个标准分辨率混在一张列表里就被淹没了。现在默认只列 HiDPI,标准分辨率在菜单里一个开关(「仅显示 HiDPI 模式」)或偏好设置里就能放出来。

这只是改默认值。你手动切换过的选择照旧保留。


安装

  1. 下载下面的 RDM-ARM-1.0.3-universal.zip,解压得到 RDM-ARM.app 和 安装说明.txt。

  2. 把 RDM-ARM.app 拖进「应用程序」。

  3. 首次打开前必须做一件事。 本应用只有 ad-hoc 签名(没有 Apple 开发者签名与公证),macOS 会拦下它并提示「已损坏」或「无法验证开发者」——这是预期的,不是文件真的坏了。在「终端」里执行一次:

    xattr -dr com.apple.quarantine /Applications/RDM-ARM.app
  4. 它是菜单栏应用,没有主窗口。 打开后请看屏幕顶部菜单栏,会多出一个显示器图标。如果菜单栏图标太多看不到,在菜单栏空白处按住 Command 再拖动可以调整顺序。


验证

项 结果
通用构建 x86_64 arm64,2.4 MB
CI(Xcode 15.4 / Swift 5.10) 全绿
分辨率条目载荷 从 2304×1296@60 看各条目分别携带 60 Hz;576×435 与 416×312 因无 60 Hz 档落到 75 Hz
刷新率菜单作用域 四个档位全部停在 2304 × 1296 [4608 × 2592],只有刷新率不同
单档刷新率 840×525 下该菜单不出现,回到 2304×1296 后重新出现
HiDPI 默认 菜单中「仅显示 HiDPI 模式」为勾选状态
黑屏保护 --selftest --roundtrip 还原往返 PASS
包体 1.4 MB,SHA-256 9eaadf97d2fa7e26fe0ebd313f3f9331943f5fc329c598d05c232e7c9fe3f8e7

系统要求

macOS 13.0 或更高。通用二进制,Apple silicon 与 Intel 都能跑。

RDM-ARM 1.0.2(黑屏保护)

Pre-release

Choose a tag to compare

@charsen charsen released this 15 Oct 12:44

这一版解决什么

1.0.1 让同事能下载到能跑的东西;1.0.2 解决「跑起来可能回不去」的问题。

本机 macOS 报告 257 个模式,其中 77 个被标记为「不适合桌面 GUI 使用」。而 RDM 的价值恰恰在于把它们全部列出来——不列出来就没有可解锁的东西。

风险在于:显示器如果真显示不了这个模式,画面会全黑。而能让你改回来的菜单栏图标,正好画在这块黑掉的屏幕上。除了等系统超时或强制重启,没有别的办法。原版 RDM 没有处理这件事。

黑屏保护(新增)

每次切换分辨率或旋转后弹出 15 秒确认框:

操作 结果
什么都不做 15 秒后自动还原到切换前的模式和旋转角度
点「保留」 采用新模式
点「立即还原」 立刻退回
  • 选中的就是当前模式时不会弹框。
  • 设置 → 通用里可以关掉。
  • 命令行也有保护,但只在选中的模式被标记为不可用时才询问,而且要求标准输入是终端。每次切换都问会让脚本白白卡 15 秒;一个动不动就拦人的保护最后一定会被永久关掉。要显式跳过用 -y / --no-confirm。

顺带修掉的两个真问题

  • 打包脚本会把非通用二进制标成 "universal":原本只检查 arm64 切片,于是复用一次 arm64-only 构建时会产出文件名和安装说明都写着「通用二进制」、实际只能在 Apple silicon 上跑的 zip。现在两个切片都强制检查。
  • Info.plist 里的模板版本长期停在 1.0.0:构建时会被覆盖所以本地看不出来,但任何跳过 build.sh 的打包路径都会带着错版本出去。现在三处版本号都核对。

安装

  1. 下载下面的 RDM-ARM-1.0.2-universal.zip,解压得到 RDM-ARM.app 和 安装说明.txt。

  2. 把 RDM-ARM.app 拖进「应用程序」。

  3. 首次打开前必须做一件事。 本应用只有 ad-hoc 签名(没有 Apple 开发者签名与公证),macOS 会拦下它并提示「已损坏」或「无法验证开发者」——这是预期的,不是文件真的坏了。在「终端」里执行一次:

    xattr -dr com.apple.quarantine /Applications/RDM-ARM.app
  4. 它是菜单栏应用,没有主窗口。 打开后请看屏幕顶部菜单栏,会多出一个显示器图标。如果菜单栏图标太多看不到,在菜单栏空白处按住 Command 再拖动可以调整顺序。


验证

项 结果
通用构建 x86_64 arm64,2.4 MB
CI(Xcode 15.4 / Swift 5.10) 12 步全绿,含新增的版本号一致性检查
还原往返 2304×1296 ⚡️ → 2304×1296 → 2304×1296 ⚡️,PASS
倒计时自动还原 实测 3.5 秒返回、退出码 3、显示器无变化
非终端不阻塞 -w 2304 -h 1296 -s 2 < /dev/null 0.036 秒返回,无弹框
包体 1.5 MB,SHA-256 810609208af04a8666395e0bf79bad9ad0efb7863385d68d88fcf5fdf60dc060

没验到的:「保留」按钮路径没有实测——按下它需要真实键盘事件,合成事件打进自己进程需要辅助功能权限(本机未授予)。代码上它与「立即还原」共用同一个回调,只差 stopModal(.OK) / .cancel;超时路径已验证定时器确实在模态循环里触发,所以风险很低,但没有端到端跑过。


系统要求

macOS 13.0 或更高。通用二进制,Apple silicon 与 Intel 都能跑。

RDM-ARM 1.0.1(测试版)

Pre-release

Choose a tag to compare

@charsen charsen released this 15 Oct 12:11

同事测试版。下载下面的 RDM-ARM-1.0.1-universal.zip,解压后把 RDM-ARM.app 拖进「应用程序」。


⚠️ 首次打开前必看

应用是 ad-hoc 签名(没有 Apple 开发者签名与公证),macOS 会拦下并提示「已损坏」或
「无法验证开发者」。这是预期行为,不是文件真的坏了。 在「终端」里执行一次即可:

xattr -dr com.apple.quarantine /Applications/RDM-ARM.app

然后双击打开。

它是菜单栏应用,没有主窗口。 打开后请看屏幕顶部菜单栏,会多出一个显示器图标。
如果菜单栏图标太多看不到,在菜单栏空白处按住 Command 再拖动可以调整顺序。

怎么用

点菜单栏图标 → 你的显示器 → 分辨率 → 选一个。

带 ⚡️ 的是 HiDPI 模式(画面更细腻),这些模式 macOS 自己不会显示出来 —— 这也是这个工具存在的意义。

这版是什么

RDM 的原生 Apple 芯片重写版。原版停止维护后在新版 macOS 上只能「凑合能用」:分辨率列得出来,
但刷新率和色彩深度是错的(根因是它依赖的私有结构体布局过期,不是「不支持 ARM」)。

重写版改用公开 CoreGraphics API。实测在 4K 显示器上,可解锁的模式从 macOS 默认的
120 个提升到 257 个(含 137 个 HiDPI)。

  • 通用二进制,Apple 芯片与 Intel 都能跑,不需要 Rosetta
  • 不需要关闭 SIP,不需要任何特殊权限
  • 系统要求 macOS 13.0 或更高

请重点帮我测

  • 分辨率能不能正常列出、切换后画面是否正常(尤其选大分辨率后)
  • 带 ⚡️ 的 HiDPI 模式能不能选、选了之后是否清晰
  • 「旋转」在你机器上是否可用(有些显示器不支持)
  • 多显示器的话,每块屏的子菜单是否都对
  • 有没有哪个菜单项点了没反应

有问题直接开 issue,附上「偏好设置 → 复制诊断信息」的输出,定位会快很多。

校验

SHA-256  08fccd90fa2926fc1884418129b631205746f484f4e57da5c836984103a18aa4

本版修复了配置文件导入/导出静默失败的问题(原来 JSON 格式不对时界面毫无反应)。