tinystatus 是一个小巧的 i3bar/swaybar 的后端。
虽然本项目最初作为示例项目开发,但现在正逐步发展为实用工具。 项目中已加入动态内容检测机制(如match_content_path和regex), 以及使用PulseAudio默认设备替代硬编码的ALSA设备路径, 使得配置更灵活,适配性更强。
尽管如此,某些模块仍可能需要根据具体硬件环境进行微调。
Tips: 项目的代码并不多,十分建议在 ai 的辅助下阅读代码。
可以通过如下命令可以将项目转化为一个单文件,喂给 ai
find src -type f -exec sh -c 'echo // file: {} && cat {}' \; >out.c本项目需要以下依赖库:
libcjson- JSON处理libdbus-1- D-Bus通信libpulse- PulseAudio音频管理alsa- ALSA音频支持libpthread- POSIX线程支持
覆盖了大多数 i3status-rs 的核心功能。
如:
- 实时响应输入(鼠标单击、滚轮滑动)
- 实时监控文件
- 实时监控
dbus - 实时监控
ALSA
总的来说,由于项目采用 epoll,任何可以转换为文件描述符的资源都可以被异步监听。
使用了面向对象的思想,所有模块在初始化时,
将自己的所有信息注册到 module_t modules[] 中。
随后有匹配 module_id 的事件时,由核心模块调用模块们对应的方法。
最新版本引入了基于 PulseAudio 的音频管理模块 (pulse.c),提供了以下增强功能:
- 支持输出设备(扬声器/耳机)和输入设备(麦克风)的独立管理
- 实时监听音频设备状态变化
- 使用 PulseAudio API 替代 ALSA,提供更好的兼容性
- 支持音量精确控制和静音切换
- 提供更丰富的音频状态指示
main.c:主文件,创建epoll实例,并监听所有init中注册的文件描述符。根据子模块注册epoll项时填入的module_id,选择对应模块的update方法,来更新模块的output。timer.c:计时器,每秒激活一次,调用interval不为 0 的模块的update方法。stdin.c:处理标准输入,如按键单击、鼠标滚轮事件。并根据输入json的name字段,调用对应模块的alter方法,改变模块状态。
| 文件名 | 功能描述 |
|---|---|
battery.c |
电量、百分比、预期放电/充满时间、功耗 |
backlight.c |
显示、调节 LCD 背光亮度 |
pulse.c |
显示、调节音量大小及麦克风音量(基于PulseAudio) |
network.c |
显示网速和有线/无线网络的链路信息 |
memory.c |
内存使用率 |
cpu.c |
处理器使用率和功耗 |
temp.c |
处理器封装温度 |
date.c |
日期和时间 |
一个最小的模块如下:
void init_xxx (int epoll_fd) {
(void) epoll_fd;
INIT_BASE; // 可视为构造函数
}随后在 modules.h 中声明模块的初始化函数。
最后在 main.c 中调用,如:
init_xxx (epoll_fd);如果想为模块增加功能,请参考 main.h 中的 module_t,这里定义了模块的数据和方法:
typedef struct {
char *output; // 模块输出,各模块输出由全局的output函数统一收集输出
uint64_t interval; // 确定模块更新的时间间隔,0表示不随时间更新
uint64_t state; // 模块的状态,用于可以改变状态的模块,如支持右键单击
void (*alter) (size_t, uint64_t); // 改变模块状态时的回调函数
void (*update) (size_t); // 更新模块状态时的回调函数
void (*del) (size_t); // 析构函数
void *data; // 模块内部数据,指向各模块自定义的结构体
} module_t;