Skip to content

acd407/tinystatus

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

78 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

tinystatus

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:处理标准输入,如按键单击、鼠标滚轮事件。并根据输入 jsonname 字段,调用对应模块的 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;

About

a i3bar backend

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors