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命令行工具

Download history 28/week @ 2024-04-02 1/week @ 2024-05-28 67/week @ 2024-07-02

每月 67 次下载

MIT/Apache

65KB
1K SLoC

runst — 一个简单的通知守护进程 🦡

GitHub Release Crate Release Continuous Integration Continuous Deployment Documentation

桌面通知 是一些小的、被动的弹出对话框,以异步方式通知用户特定事件。这些被动弹出可以自动在短时间内消失。

runstfreedesktop.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

runstAlpine Edge 上可用。启用 测试仓库 后,可以通过 apk 安装。

apk add runst

二进制发布版本

请从 发布页面 查看适用于不同操作系统/架构的可用二进制文件。

发布压缩包使用以下 PGP 密钥签名:AEF8C7261F4CEB41A448CBC41B250A9F78535D1A

从源代码构建

先决条件

说明

  1. 克隆仓库。
$ git clone https://github.com/orhun/runst && cd runst/
  1. 构建。
$ CARGO_TARGET_DIR=target cargo build --release

二进制文件位于 target/release/runst

使用方法

在 Xorg 启动时

您可以使用 xinitrcxprofile 来自动启动 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

设置日志详细程度。可能的值有:errorwarninfodebugtrace

startup_notification

如果设置为true,则在启动时显示通知。

geometry

设置窗口的几何形状。值格式为:<width>x<height>+<x>+<y>

为了设置此值,我建议使用像slop这样的工具,它可以帮助查询选择并打印区域到stdout。

wrap_content

如果设置为true,则窗口大小将调整以匹配内容。

如果内容大于窗口大小,将使用geometry选项来确定最大宽度和高度。

font

设置窗口使用的字体。

template

设置通知消息的模板。语法基于Jinja2Django模板。

简单来说,有三种分隔符:

  • {{}}用于表达式
  • {%{%-%}-%}用于语句
  • {##}用于注释

有关控制结构内置过滤器等更多信息,请参阅Tera文档

上下文

上下文是用于模板渲染所需数据的模型。以下示例中使用了JSON格式来表示上下文。

{
  "app_name": "runst",
  "summary": "example",
  "body": "this is a notification 🦡",
  "urgency": "normal",
  "unread_count": 1,
  "timestamp": 1672426610
}
样式

Pango用于文本渲染。标记文档可以在这里找到。

以下是一些示例:

  • <b>bold text</b>粗体文本
  • <span foreground="blue">blue text</span>蓝色文本
  • <tt>monospacetext</tt>: monospace text

紧急程度配置

Freedesktop规范中定义了3个紧急程度级别,它们定义了通知的重要性。

  1. low:例如,“joe签到了”
  2. normal:例如,“你收到邮件”
  3. 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 指定任意命令,它也通过模板引擎进行处理。这意味着您可以使用相同的 模板上下文

过滤是通过使用 filtercommand 匹配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 use case

这就是 runst 诞生的原因。

类似的项目

许可

根据您的选择,许可协议为 Apache License Version 2.0MIT 许可

版权所有 © 2022-2024,Orhun Parmaksız

依赖项

~49MB
~797K SLoC