一个用 Rust 写的、驻留系统托盘的待办小工具:最小化后藏在托盘里,到点自动弹窗提醒,深色现代界面。
- 添加 / 删除 / 完成 / 内联编辑待办事项
- 为事项设置提醒时间,到点自动弹出提醒窗口
- 提醒窗口支持「标记完成」「稍后提醒(5 分钟)」「知道了」
- 系统托盘图标:左键单击切换窗口显隐,右键菜单可退出
- 数据自动保存到
~/.todo-tray.json,重启不丢失 - 支持「全部 / 待办 / 已完成」筛选
| 库 | 用途 |
|---|---|
| eframe / egui | 即时模式 GUI |
| tray-icon | 系统托盘 |
| chrono | 时间与提醒 |
| serde / serde_json | 本地数据持久化 |
cargo run发布构建:
cargo build --release托盘图标基于 tray-icon,在各系统上使用各自的原生后端,同一份代码即可运行:
| 操作系统 | 托盘后端 | 中文字体 |
|---|---|---|
| Linux | appindicator / D-Bus StatusNotifierItem |
思源黑体(Noto Sans CJK SC) |
| Windows | 原生 Shell_NotifyIcon(任务栏托盘) |
微软雅黑 |
| macOS | NSStatusItem(菜单栏) |
苹方(PingFang SC) |
Linux 桌面环境能否显示托盘图标,取决于它是否实现了 StatusNotifierItem 协议(与桌面使用 GTK 还是 Qt 无关):
| 桌面 / 合成器 | 是否显示托盘 |
|---|---|
| KDE Plasma、Xfce、Cinnamon、MATE | ✅ 原生支持 |
| GNOME | |
| Sway / Hyprland 等 wlroots 合成器 |
系统托盘需要 GTK3(桌面环境一般自带)和 libayatana-appindicator:
# Arch Linux
sudo pacman -S libayatana-appindicator
# Debian / Ubuntu
sudo apt install libayatana-appindicator3-1
# Fedora
sudo dnf install libayatana-appindicator如果运行后托盘没有出现图标,按顺序排查:
- 确认桌面环境支持托盘(见上方表格)。GNOME 需装 AppIndicator 扩展;Sway / Hyprland 需 waybar 等带 tray 模块的面板。
- KDE Plasma:右键面板 → 编辑面板 → 系统托盘 → 确认「状态和通知 / Status and Notifications」已启用(默认开启)。
- D-Bus 会话一致:程序需与桌面在同一 D-Bus session bus。若在 SSH / 容器 / 其它用户下运行,环境变量
DBUS_SESSION_BUS_ADDRESS、DISPLAY可能与桌面会话不一致,导致托盘注册到错误的 bus。请在桌面终端里直接运行cargo run。 - GTK 主循环:
appindicator的托盘注册是异步的,本程序已在主循环里每帧 pump GTK 事件(gtk::main_iteration_do)以确保注册完成;若你改造本项目换用其它 GUI 框架,请保留这一步。
egui 默认只内置拉丁字体、不读取系统字体,所以中文需要手动加载,否则会显示成「豆腐块」。
本程序在启动时会加载各平台的原生中文字体并注册为字体回退——拉丁字符仍用 egui 默认字体,中文 fallback 到系统中文字体:
| 平台 | 字体 | 查找位置(带 fallback) |
|---|---|---|
| Linux | 思源黑体 | 通过 fontconfig 查找 Noto Sans CJK SC |
| Windows | 微软雅黑 | %WINDIR%\Fonts\msyh.ttc |
| macOS | 苹方 | /System/Library/Fonts/PingFang.ttc |
若所有候选字体都未找到,程序会打印提示且中文暂时显示为方块——安装对应中文字体后即可正常。
- 提醒时间格式:
YYYY-MM-DD HH:MM,例如2025-01-02 09:30 - 留空表示不提醒
- 点窗口顶部的「📥 最小化到托盘」把窗口收起,左键托盘图标恢复
- 提醒时间已过且未完成会显示为红色,到点自动弹窗
- 数据文件位置:
~/.todo-tray.json
todo-tray/
├── Cargo.toml
├── README.md
└── src/
├── main.rs # 入口、托盘图标与菜单、事件轮询
├── app.rs # 应用状态、egui 界面(列表/编辑/提醒弹窗)
└── todo_model.rs # 数据模型、JSON 持久化