ZigDC 是一个面向 Mango 的显示器亮度控制 daemon。它扫描 Linux DRM
connector,将外接屏映射到 DDC/CI I²C bus;内置屏则通过
systemd-logind 的 backlight API 调整亮度。
daemon 维护 Mango 当前聚焦的 output,因此同一个快捷键可以自动调整当前 正在使用的屏幕。
- Nix(推荐通过 flake 使用)
- Linux DRM 与 sysfs backlight
- Mango 与
mmsg - 外接屏 DDC/CI 需要显示器、线缆与显卡驱动暴露 I²C bus
进入开发环境:
nix develop扫描 connector,以及它们的连接状态和 I²C 映射:
zig build run直接读取或设置指定屏幕的亮度:
zig build run -- get eDP-1
zig build run -- set eDP-1 30000
zig build run -- get HDMI-A-1
zig build run -- set HDMI-A-1 70eDP-* 使用 sysfs/logind 后端;HDMI-*、DP-* 等外接 connector
使用 DDC/CI。可设置的最大值取决于相应设备,请先执行 get 查看。
单独观察 Mango 焦点事件:
zig build run -- watch-focus启动 daemon:
zig build run -- daemon它监听:
$XDG_RUNTIME_DIR/zigdc.sock
另一个终端可发送请求:
zig build run -- ctl get focused
zig build run -- ctl get brightness # 当前聚焦屏幕的缓存百分比:0..100
zig build run -- ctl set focused 30000
zig build run -- ctl inc focused 1000
zig build run -- ctl dec focused 1000
zig build run -- ctl set-percent focused 50
zig build run -- ctl inc-percent focused 5
zig build run -- ctl dec-percent focused 5所有 ctl 响应(包括 get focused 与 get brightness)写到标准输出;
诊断与错误信息写到标准错误。因此 Mangobar 等状态栏可以直接执行
zigdc ctl get brightness,无需 2>&1。
focused 由 mmsg watch all-monitors 事件驱动更新。Mango 暂时不可用、
重启或 watch 连接关闭时,daemon 会每秒自动重连。
亮度请求采用每台显示器独立的内存缓存。daemon 启动时读取一次原生亮度;
之后 set、inc、dec 及其百分比变体会立即更新目标值并返回。后台 worker
每 20ms 检查一次请求,对同一显示器至少间隔 60ms 写入硬件,并合并期间的连续
操作。这避免高频滚轮或长按时反复进行 DDC 读写;硬件写入失败会记录在 daemon
日志中,并在下一轮继续尝试。
set、inc 和 dec 使用设备原生亮度单位。要在内置屏和外接屏之间使用
统一的 0..100% 范围,请使用 set-percent、inc-percent、
dec-percent。例如 inc-percent focused 5 按当前设备最大亮度的 5% 调整;
set-percent focused 50 设为最大亮度的 50%。
flake 导出了一个 Home Manager module。将本仓库加入你的 flake:
inputs.zigdc.url = "github:et21ff/zigdc";然后在 Home Manager 配置中导入:
home-manager.users.nix = {
imports = [ inputs.zigdc.homeManagerModules.default ];
};应用配置后,服务会在图形会话中自动运行:
systemctl --user status zigdc.service
journalctl --user -u zigdc.service -f也可在不注销的情况下立即启动:
systemctl --user start zigdc.service该 module 使用 Nix store 中的 zigdc 绝对路径,并为 systemd service
设置 Home Manager profile 的 PATH,以便找到 mmsg。
zig build test
nix build .#default测试包含模拟 Mango watch 事件:即使没有外接显示器,也会验证焦点从
eDP-1 更新为 HDMI-A-1 的事件处理逻辑。