et21ff/zigdc

★ 0Forks 0ZigGitHub ↗Compare

README

ZigDC

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 70

eDP-* 使用 sysfs/logind 后端;HDMI-*、DP-* 等外接 connector 使用 DDC/CI。可设置的最大值取决于相应设备,请先执行 get 查看。

单独观察 Mango 焦点事件:

zig build run -- watch-focus

daemon 与 IPC

启动 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%。

作为 systemd 用户服务运行

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 的事件处理逻辑。

Contributors

servis

Issues