10 个版本
0.1.7 | 2024年3月26日 |
---|---|
0.1.6 | 2024年3月26日 |
0.1.5 | 2023年8月9日 |
0.1.4 | 2023年6月10日 |
0.1.3 | 2023年3月13日 |
#971 在 命令行工具
每月 67 次下载
65KB
1K SLoC
桌面通知 是一些小的、被动的弹出对话框,以异步方式通知用户特定事件。这些被动弹出可以自动在短时间内消失。
runst
是 freedesktop.org - 桌面通知规范 的服务器实现,可以通过 D-Bus 接收应用程序的通知。目前仅支持 X11。
功能
- 完全可定制的通知窗口(大小、位置、文本、颜色)。
- 模板驱动的通知文本(Jinja2/Django)。
- 根据固定时间或估计阅读时间自动清除通知。
- 根据匹配的通知运行自定义操作系统命令。
路线图
runst
最初设计用于显示简单的通知窗口。在此基础上,它结合了以定制为导向的半创新功能。未来,我计划根据新想法和反馈来塑造 runst
的功能。
如果您有想法或有问题,请随时 提交问题!
安装
从 crates.io
runst
可以从 crates.io 安装。
$ cargo install runst
最低支持的 Rust 版本是 1.70.0
。
Arch Linux
runst
可以通过 extra 仓库 使用 pacman 安装。
$ pacman -S runst
或者您可以使用 AUR 软件包,通过 AUR 助手 安装。例如
$ paru -S runst-git
Alpine Linux
runst
在 Alpine Edge 上可用。启用 测试仓库 后,可以通过 apk 安装。
apk add runst
二进制发布版本
请从 发布页面 查看适用于不同操作系统/架构的可用二进制文件。
发布压缩包使用以下 PGP 密钥签名:AEF8C7261F4CEB41A448CBC41B250A9F78535D1A
从源代码构建
先决条件
说明
- 克隆仓库。
$ git clone https://github.com/orhun/runst && cd runst/
- 构建。
$ CARGO_TARGET_DIR=target cargo build --release
二进制文件位于 target/release/runst
。
使用方法
在 Xorg 启动时
您可以使用 xinitrc 或 xprofile 来自动启动 runst
。
xinitrc
如果您使用 xinit 手动启动 Xorg,您可以在 X 服务器启动时通过 xinitrc 运行 runst
。
$HOME/.xinitrc
:
runst &
长时间运行的程序(如通知守护进程)应在窗口管理器之前启动,因此它们应该自行分叉或在后台运行(通过添加 &
符号)。否则,脚本会停止并等待每个程序退出,然后执行窗口管理器或桌面环境。
如果 runst
由于启动速度比窗口管理器快而不可用,您可以在下面的示例中添加延迟
{ sleep 2; runst; } &
xprofile
如果您使用 显示管理器,您可以使用 xprofile 文件,该文件允许您在 X 用户会话开始时执行命令。
xprofile 文件(~/.xprofile
或 /etc/xprofile
)可以像 xinitrc 一样格式化。
作为 D-Bus 服务
您可以创建一个 D-Bus 服务,在第一次通知操作时自动启动 runst
。例如,您可以创建以下服务配置:
/usr/share/dbus-1/services/org.orhun.runst.service
:
[D-BUS Service]
Name=org.freedesktop.Notifications
Exec=/usr/bin/runst
每当应用程序通过向 org.freedesktop.Notifications
发送信号来发送通知时,D-Bus 将激活 runst
。
有关 systemd 集成的信息,请参阅 问题 #1。
命令
您可以通过向 D-Bus 发送命令来控制 runst
,使用 dbus-send(1)
。
dbus-send --print-reply --dest=org.freedesktop.Notifications /org/freedesktop/Notifications/ctl "org.freedesktop.Notifications.${command}"
可用的命令包括
History
:显示最后一条通知。Close
:关闭通知。CloseAll
:关闭所有通知。
例如
# show the last notification
dbus-send --print-reply \
--dest=org.freedesktop.Notifications \
/org/freedesktop/Notifications/ctl \
org.freedesktop.Notifications.History
i3 的示例用法
# Notification history
bindsym $mod+grave exec dbus-send --print-reply \
--dest=org.freedesktop.Notifications /org/freedesktop/Notifications/ctl org.freedesktop.Notifications.History
# Close notification
bindsym $mod+shift+grave exec dbus-send --print-reply \
--dest=org.freedesktop.Notifications /org/freedesktop/Notifications/ctl org.freedesktop.Notifications.Close
此外,要查看服务器版本
dbus-send --print-reply --dest=org.freedesktop.Notifications /org/freedesktop/Notifications org.freedesktop.Notifications.GetServerInformation
配置
runst
配置文件支持 TOML 格式,默认配置值可以在 这里 找到。
如果存在配置文件,则从以下默认位置读取:
$HOME/.config/runst/runst.toml
$HOME/.runst/runst.toml
您也可以通过 RUNST_CONFIG
环境变量指定路径。
全局配置
log_verbosity
设置日志详细程度。可能的值有:error
、warn
、info
、debug
和trace
。
startup_notification
如果设置为true
,则在启动时显示通知。
geometry
设置窗口的几何形状。值格式为:<width>x<height>+<x>+<y>
。
为了设置此值,我建议使用像slop这样的工具,它可以帮助查询选择并打印区域到stdout。
wrap_content
如果设置为true
,则窗口大小将调整以匹配内容。
如果内容大于窗口大小,将使用geometry
选项来确定最大宽度和高度。
font
设置窗口使用的字体。
template
设置通知消息的模板。语法基于Jinja2和Django模板。
简单来说,有三种分隔符:
{{
和}}
用于表达式{%
或{%-
和%}
或-%}
用于语句{#
和#}
用于注释
上下文
上下文是用于模板渲染所需数据的模型。以下示例中使用了JSON格式来表示上下文。
{
"app_name": "runst",
"summary": "example",
"body": "this is a notification 🦡",
"urgency": "normal",
"unread_count": 1,
"timestamp": 1672426610
}
样式
以下是一些示例:
<b>bold text</b>
:粗体文本<span foreground="blue">blue text</span>
:蓝色文本<tt>monospacetext</tt>
: monospace text
紧急程度配置
在Freedesktop规范中定义了3个紧急程度级别,它们定义了通知的重要性。
low
:例如,“joe签到了”normal
:例如,“你收到邮件”critical
:例如,“你的电脑着火了!”
您可以根据这些紧急程度配置 runst
以执行不同的操作。为此,需要在配置文件中定义3个不同的部分。每个部分都包含以下字段:
[urgency_{level}] # urgency_low, urgency_normal or urgency_critical
background = "#000000" # background color
foreground = "#ffffff" # foreground color
timeout = 10
auto_clear = true
text = "normal"
custom_commands = []
超时
这是当发送者没有指定超时时,通知的默认超时值(以秒为单位)。如果超时为0,则不会自动关闭通知(即它永远不会过期)。
自动清除
如果设置为 true
,则会计算通知的 估计阅读时间 并将其用作超时值。如果您希望阅读完通知后让通知消失,这将很有用。
text
这是紧急程度的自定义文本,可以在 模板上下文 中作为 urgency
使用。如果没有设置,则使用相应的紧急程度(例如“低”、“正常”或“关键”)。
自定义命令
使用此选项,您可以根据紧急程度和通知内容运行自定义操作系统命令。基本用法如下:
custom_commands = [
{ command = 'echo "{{app_name}} {{summary}} {{body}}"' } # echoes the notification to stdout
]
如上例所示,您可以通过 command
指定任意命令,它也通过模板引擎进行处理。这意味着您可以使用相同的 模板上下文。
过滤是通过使用 filter
和 command
匹配JSON字段来完成的。例如,如果您想为特定应用程序播放自定义通知声音
custom_commands = [
{ filter = '{ "app_name":"notify-send" }', command = 'aplay notification.wav' },
{ filter = '{ "app_name":"weechat" }', command = 'aplay irc.wav' }
]
JSON过滤器可以包含以下字段:
app_name
:发送通知的应用程序名称。summary
:通知的摘要。body
:通知的主体。
每个字段都使用正则表达式进行匹配,您可以将它们组合如下:
custom_commands = [
{ filter = '{ "app_name":"telegram|discord|.*chat$","body":"^hello.*" }', command = 'gotify push -t "{{app_name}}" "someone said hi!"' }
]
在这个假设的例子中,当有人在与我们匹配的任何聊天应用程序中说“嗨”时,我们会发送一个 Gotify 通知。
为什么会有这个功能?
我一直是 dunst 的用户。然而,他们在 v1.7.0 中做了某些 不太受欢迎的破坏性更改,这完全破坏了我的配置。那天,我拒绝更新 dunst
(我太懒了,不想重新配置),并决定用Rust编写自己的通知服务器。
我希望保持 runst
简单,因为我的 dunst
使用方法非常简单。我只是像下面这样在 i3status 上面显示一个覆盖窗口
这就是 runst
诞生的原因。
类似的项目
许可
根据您的选择,许可协议为 Apache License Version 2.0 或 MIT 许可。
版权
版权所有 © 2022-2024,Orhun Parmaksız
依赖项
~49MB
~797K SLoC