Lunar 5.0.3 更新深度解析:DDC 音量滑块、曲线系数复制与唤醒亮度抖动实战指南

  • 桌面应用

【免费下载链接】Lunar

Intelligent adaptive brightness for your external monitors

项目地址: https://gitcode.com/gh_mirrors/lu/Lunar
点击查看 免费下载

Lunar 5.0.3 是一次聚焦“外部显示器 DDC 控制体验”的更新,围绕音量滑块、曲线校准、应用预设与唤醒后的亮度异常处理展开。本文以官方发布说明 ReleaseNotes/5.0.3.md 为主线,结合仓库源码逐条拆解每个新功能与修复项的实现位置、使用方式与适用边界,帮助你判断是否升级、如何在日常场景中用好这些能力。

一、新功能(Features)

5.0.3 引入了五个面向 DDC 控制与显示器状态管理的新特性,其中三项直接落在“控制菜单”与“应用预设”交互上,两项是亮度异常场景的工程化对策。

1. 外部显示器 DDC 菜单中的音量滑块显示开关

本版本在外部显示器的 DDC 菜单(应用内对应 lunar://display/ddc 入口)中新增了 Volume Slider 的显示/隐藏开关。

从源码可以确认该开关是一个持久化的全局偏好:

这意味着:只有同时满足“显示器支持 DDC 音量(VCP 控制码 AUDIO_SPEAKER_VOLUME)且用户开启开关”两个条件时,音量滑块才会出现在 DDC 菜单中,避免在不支持音量的显示器上出现无意义控件。

2. Curve Factors 的 “Copy from display”

对于使用曲线(Curve)类自适应模式的用户,本版本新增了 从另一台显示器复制 Curve Factors 的能力,用于快速把一台显示器校准好的亮度/对比度曲线系数套用到其他显示器上,省去逐台手动校准。

仓库中的曲线数据点采集逻辑佐证了这一功能的基础:在同步(Sync)模式下,Lunar 会持续把“源显示器亮度 → 目标显示器亮度/对比度”的映射写入用户曲线数据点,见 Lunar/Utils/DisplayController.swift(insertBrightnessUserDataPoint / insertContrastUserDataPoint)。这些用户校准点即所谓的 Curve Factors,复制功能就是把这些校准结果从源显示器搬运到目标显示器。

3. 滑块数值显示(Show slider values)

新增了在滑块上直接显示数值的选项。对应偏好键为 showSliderValues(定义于 Lunar/Data/DataStore.swift),在 SwiftUI 视图中通过 @Default(.showSliderValues) 注入并传递给滑块组件:

底层滑块绘制支持文字渲染:自定义 SliderCell 提供 drawText 与 valueFormatter 属性(Lunar/Views/Slider.swift),即“显示数值”本质上是对滑块绘制层文字的开关控制。

4. 应用预设:关闭 “Merge brightness and contrast” 后亮度和对比度分离保存

此前“应用预设(App Presets)”在恢复时会把亮度和对比度作为一个合并值处理;本版本在用户关闭 Merge brightness and contrast 后,改为分别记录与恢复亮度和对比度,精度更高。

源码中的恢复逻辑可以印证这条分支:

if CachedDefaults[.mergeBrightnessContrast] {
    let (br, _) = d.sliderValueToBrightnessContrast(d.preciseBrightnessContrastBeforeAppPreset)
    d.brightness = br.ns
} else {
    d.brightness = d.sliderValueToBrightness(d.preciseBrightnessBeforeAppPreset)
}

见 Lunar/AppDelegate.swift。合并开关还影响界面元素的显隐逻辑:hideManualValuesMerged / hideManualValuesNonMerged 会随 mergeBrightnessContrast 切换,见 Lunar/Data/AppException.swift。也就是说,两种模式下的预设行为、界面字段可见性均由同一偏好驱动,行为一致。

5. Jitter After Wake:解决唤醒后亮度变暗的显示器

部分显示器在 Mac 唤醒后会以“变暗后的亮度”醒来,需要一次亮度“抖动”来触发刷新。5.0.3 为此新增了 Jitter After Wake 功能,默认关闭,可通过终端启用:

defaults write fyi.lunar.Lunar jitterAfterWake 1

在后续版本源码中,该机制以偏好键 jitterBrightnessOnWake 实现,唤醒适配任务会对每台原生外部显示器执行一次“降一格 → 回原值 → 升一格 → 回原值”的精确亮度写入,见 Lunar/AppDelegate.swift:

let brDown = (br - 0.01).capped(between: 0.0, and: 1.0)
let brUp   = (br + 0.01).capped(between: 0.0, and: 1.0)
_ = control.writeBrightness(0, preciseBrightness: brDown)
_ = control.writeBrightness(0, preciseBrightness: br)
_ = control.writeBrightness(0, preciseBrightness: brUp)
_ = control.writeBrightness(0, preciseBrightness: br)

精确亮度写入对应 AppleNativeControl.writeBrightness(_:preciseBrightness:)(Lunar/Control/AppleNativeControl.swift),支持 0~1 区间的小数步进,因此能以 ±1% 的幅度“抖动”而不产生肉眼可感知的跳变。

适用前提与限制:该功能是面向特定型号显示器固件问题的临时 workaround。从后续发布说明看,Lunar 6.x(如 ReleaseNotes/6.0.4b3.md、ReleaseNotes/6.1.0.md)已声明“不再需要”并移除了该设置。升级到 6.x 后若仍遇到同类问题,请优先检查显示器固件或改用 DDC/AppleNative 控制通道。

二、改进(Improvements)

1. 对比度同步更灵敏(Snappier contrast syncing)

同步模式(Sync Mode)下,对比度的跟随响应被调快,减少源显示器对比度变化到目标显示器跟随之间的滞后。这属于行为层面的响应性优化,无需用户配置;如果你在多个显示器间做同步显示,5.0.3 后的对比度跟随会比此前更跟手。

2. CLI DDC 命令:数值解析更智能

5.0.3 让 lunar ddc 子命令(“Send raw DDC commands to connected monitors”)的值解析变得更聪明:

  • 形如 0x1F、x1F 或 1Fh 的值自动解析为十六进制;
  • 其余情况解析为十进制;
  • 显式传入 --hex 时,一律按十六进制解析。

对应的命令行定义与解析逻辑可以在 Lunar/Data/CLI.swift 中找到:

  • --hex 标志:@Flag(name: .long, help: "Parse values as hex")(Lunar/Data/CLI.swift);
  • 值解析分支:hex ? value.parseHex() : Int(value) ?? value.parseHex(strict: true)(Lunar/Data/CLI.swift)。

同时,控制码(VCP Control ID)本身也支持多种书写方式,见 Lunar/DDC/DDC.swift:

  • 0x 或 x 前缀(如 0x10、x10);
  • 不超过两位的裸数字按十六进制处理(如 10);
  • 其余情况尝试按常量名匹配(如 brightness、contrast、input source、audio speaker volume 等)。

实际用法示例:

# 十六进制写法自动识别
lunar ddc <display> 0x10 0x1F
lunar ddc <display> 0x10 x1F
lunar ddc <display> 0x10 1Fh

# 十进制写法
lunar ddc <display> 0x10 31

# 强制十六进制解析(例如传 "1F" 不带前缀时)
lunar ddc <display> 0x10 1F --hex

# 读取当前值 / 最大值
lunar ddc <display> 0x10 read
lunar ddc <display> 0x10 readmax

其中 <display> 可按序列号、名称或 all / external / main 等筛选关键字传入,解析逻辑见 Lunar/Data/CLI.swift。

3. 规避内置显示器亮度“自动回退”的系统问题

部分 MacBook 不支持亮度变化事件通知,导致手动调整内置屏亮度后,系统亮度曲线未同步更新、亮度“自动回退”到调整前。

5.0.3 的处理策略是:检测 MacBook 是否缺失该通知支持;若缺失,则不再直接控制内置屏亮度,而是把亮度按键事件转发给系统,由系统自身完成亮度变更。

需要明确边界:通过快捷键触发的调整走转发通道,行为正常;但直接用滑块拖拽调整内置屏亮度时,回退问题仍然存在——因为滑块路径无法把事件转发给系统。这是 macOS 系统层面的限制,并非 Lunar 能完全绕过的缺陷。

三、修复(Fixes)

1. 不再无条件在每次启动时请求权限

此前 Lunar 启动时会统一请求各类系统权限;5.0.3 改为按需请求:只有用户实际启用需要权限的功能时,才触发对应授权流程。这样可以减少首次启动的打断感,也避免用户为永远用不到的功能反复授予权限。如果你之前因为权限弹窗过于频繁而犹豫是否升级,这一项会明显改善体验。

2. 深色模式切换不再强制抢焦点

修复了切换深色/浅色模式时 Lunar 窗口被强制带到前台(抢焦点)的问题。现在深色模式切换只会静默更新界面外观,不会打断你正在进行的其他操作。

四、升级建议与版本注意

  • 5.0.3 适合谁升级:使用 DDC 音量控制的用户、多显示器曲线校准时希望“一校多用”的用户、以及频繁遇到外接屏“唤醒后变暗”的用户,收益最直接。
  • CLI 用户:--hex 与自动进制识别让脚本传参更少踩坑,建议把既有脚本中的 0x 写法保持原样,其余按十进制书写,或统一加 --hex 保证确定行为。
  • 版本演进提示:jitterAfterWake 在后续 6.x 版本中已被移除(见上文限制说明);升级前如依赖该参数,请先确认新版本行为已覆盖你的场景。
  • 完整的 5.0.3 更新条目同时收录于 CHANGELOG.md,可作对照。

综上,5.0.3 是一次“小而实用”的迭代:它没有改动大架构,而是把 DDC 菜单、曲线校准、预设恢复与唤醒处理这些日常高频路径打磨得更顺手,同时用智能进制解析提升了命令行可操作性。

  • 桌面应用

【免费下载链接】Lunar

Intelligent adaptive brightness for your external monitors

项目地址: https://gitcode.com/gh_mirrors/lu/Lunar
点击查看 免费下载

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值